diff --git a/Dockerfile b/Dockerfile index f2323eb..5801d11 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,4 +18,4 @@ COPY . /app # easter eggs 😝 RUN echo "PS1='🕵️:\[\033[1;36m\]\h \[\033[1;34m\]\W\[\033[0;35m\]\[\033[1;36m\]$ \[\033[0m\]'" >> ~/.bashrc -ENTRYPOINT [ "/app/run.sh"] +ENTRYPOINT [ "/app/entrypoint.sh"] diff --git a/Tiltfile b/Tiltfile index b2f5799..c90dc93 100644 --- a/Tiltfile +++ b/Tiltfile @@ -19,7 +19,7 @@ k8s_yaml(secret_from_dict("mev-inspect-db-credentials", inputs = { })) docker_build_with_restart("mev-inspect-py", ".", - entrypoint="/app/run.sh", + entrypoint="/app/entrypoint.sh", live_update=[ sync(".", "/app"), run("cd /app && poetry install", diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100755 index 0000000..54f1f8a --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +python loop.py diff --git a/k8s/app.yaml b/k8s/app.yaml index d5cabc1..1c51f81 100644 --- a/k8s/app.yaml +++ b/k8s/app.yaml @@ -17,7 +17,7 @@ spec: containers: - name: mev-inspect image: mev-inspect-py - command: [ "/app/run.sh" ] + command: [ "/app/entrypoint.sh" ] env: - name: POSTGRES_USER valueFrom: diff --git a/listener b/listener new file mode 100755 index 0000000..30ebede --- /dev/null +++ b/listener @@ -0,0 +1,47 @@ +#!/bin/sh + +set -e + +NAME=listener +PIDFILE=/var/run/$NAME.pid +DAEMON=/root/.poetry/bin/poetry +DAEMON_OPTS="run python listener.py" + +case "$1" in + start) + echo -n "Starting daemon: "$NAME + start-stop-daemon \ + --background \ + --chdir /app \ + --start \ + --quiet \ + --pidfile $PIDFILE \ + --make-pidfile \ + --startas $DAEMON -- $DAEMON_OPTS + echo "." + ;; + stop) + echo -n "Stopping daemon: "$NAME + start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE + echo "." + ;; + restart) + echo -n "Restarting daemon: "$NAME + start-stop-daemon --stop --quiet --oknodo --retry 30 --pidfile $PIDFILE + start-stop-daemon \ + --background \ + --chdir /app \ + --start \ + --quiet \ + --pidfile $PIDFILE \ + --make-pidfile \ + --startas $DAEMON -- $DAEMON_OPTS + echo "." + ;; + + *) + echo "Usage: "$1" {start|stop|restart}" + exit 1 +esac + +exit 0 diff --git a/run.py b/listener.py similarity index 70% rename from run.py rename to listener.py index 2435dff..1ce3123 100644 --- a/run.py +++ b/listener.py @@ -1,6 +1,5 @@ import logging import os -import signal import time from web3 import Web3 @@ -13,32 +12,13 @@ from mev_inspect.crud.latest_block_update import ( from mev_inspect.db import get_session from mev_inspect.inspect_block import inspect_block from mev_inspect.provider import get_base_provider +from mev_inspect.signal_handler import GracefulKiller -logging.basicConfig(filename="app.log", level=logging.INFO) +logging.basicConfig(filename="listener.log", level=logging.INFO) logger = logging.getLogger(__name__) -class GracefulKiller: - """ - handle sigint / sigterm gracefully - taken from https://stackoverflow.com/a/31464349 - """ - - signal_names = {signal.SIGINT: "SIGINT", signal.SIGTERM: "SIGTERM"} - - def __init__(self): - self.kill_now = False - signal.signal(signal.SIGINT, self.exit_gracefully) - signal.signal(signal.SIGTERM, self.exit_gracefully) - - def exit_gracefully(self, signum, frame): # pylint: disable=unused-argument - signal_name = self.signal_names[signum] - logger.info(f"Received {signal_name} signal") - logger.info("Cleaning up resources. End of process") - self.kill_now = True - - def run(): rpc = os.getenv("RPC_URL") if rpc is None: diff --git a/loop.py b/loop.py new file mode 100644 index 0000000..828c4da --- /dev/null +++ b/loop.py @@ -0,0 +1,22 @@ +import logging +import time + +from mev_inspect.signal_handler import GracefulKiller + + +logging.basicConfig(filename="loop.log", level=logging.INFO) +logger = logging.getLogger(__name__) + + +def run(): + logger.info("Starting...") + + killer = GracefulKiller() + while not killer.kill_now: + time.sleep(1) + + logger.info("Stopping...") + + +if __name__ == "__main__": + run() diff --git a/mev_inspect/signal_handler.py b/mev_inspect/signal_handler.py new file mode 100644 index 0000000..dc8fc45 --- /dev/null +++ b/mev_inspect/signal_handler.py @@ -0,0 +1,24 @@ +import logging +import signal + +logger = logging.getLogger(__name__) + + +class GracefulKiller: + """ + handle sigint / sigterm gracefully + taken from https://stackoverflow.com/a/31464349 + """ + + signal_names = {signal.SIGINT: "SIGINT", signal.SIGTERM: "SIGTERM"} + + def __init__(self): + self.kill_now = False + signal.signal(signal.SIGINT, self.exit_gracefully) + signal.signal(signal.SIGTERM, self.exit_gracefully) + + def exit_gracefully(self, signum, frame): # pylint: disable=unused-argument + signal_name = self.signal_names[signum] + logger.info(f"Received {signal_name} signal") + logger.info("Cleaning up resources. End of process") + self.kill_now = True diff --git a/run.sh b/run.sh deleted file mode 100755 index 839b387..0000000 --- a/run.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -python run.py