Added termination signal hooks, as well as reused some code
This commit is contained in:
parent
723ede0a7d
commit
ce30e03767
4
.env.example
Normal file
4
.env.example
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
RESPONSE_TIMEOUT=5
|
||||||
|
|
||||||
|
PORT=65526
|
||||||
|
HOST=
|
@ -2,4 +2,9 @@
|
|||||||
|
|
||||||
## Sources
|
## Sources
|
||||||
|
|
||||||
- [Catch SIGTERM](https://stackoverflow.com/questions/18499497/how-to-process-sigterm-signal-gracefully#31464349)
|
### Signal catching
|
||||||
|
- [Catch SIGTERM](https://stackoverflow.com/a/31464349)
|
||||||
|
- [Get ENUM name from value](https://stackoverflow.com/a/38716384)
|
||||||
|
|
||||||
|
### Networking
|
||||||
|
- [Dynamically finding host IP address](https://stackoverflow.com/a/28950776)
|
16
poetry.lock
generated
16
poetry.lock
generated
@ -86,6 +86,20 @@ files = [
|
|||||||
docs = ["Sphinx", "furo"]
|
docs = ["Sphinx", "furo"]
|
||||||
test = ["objgraph", "psutil"]
|
test = ["objgraph", "psutil"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "python-dotenv"
|
||||||
|
version = "1.0.1"
|
||||||
|
description = "Read key-value pairs from a .env file and set them as environment variables"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.8"
|
||||||
|
files = [
|
||||||
|
{file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"},
|
||||||
|
{file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
cli = ["click (>=5.0)"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "sqlalchemy"
|
name = "sqlalchemy"
|
||||||
version = "2.0.37"
|
version = "2.0.37"
|
||||||
@ -195,4 +209,4 @@ files = [
|
|||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "2.0"
|
lock-version = "2.0"
|
||||||
python-versions = "^3.12"
|
python-versions = "^3.12"
|
||||||
content-hash = "3568ec5bd2911d0c45c9b8689c11ed6c688d07ef23b6a739b25b4f188dd8e10e"
|
content-hash = "6ac48c667aa2e9a90b4339005a250d1e664006645cd9c7b0dcec6d8a888a3e50"
|
||||||
|
@ -8,6 +8,7 @@ readme = "README.md"
|
|||||||
[tool.poetry.dependencies]
|
[tool.poetry.dependencies]
|
||||||
python = "^3.12"
|
python = "^3.12"
|
||||||
sqlalchemy = "^2.0.37"
|
sqlalchemy = "^2.0.37"
|
||||||
|
python-dotenv = "^1.0.1"
|
||||||
|
|
||||||
|
|
||||||
[build-system]
|
[build-system]
|
||||||
|
@ -0,0 +1,4 @@
|
|||||||
|
from bank_node.bank_node import BankNode
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
BankNode().start_server()
|
39
src/bank_node/bank_node.py
Normal file
39
src/bank_node/bank_node.py
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
import socket
|
||||||
|
import signal
|
||||||
|
import sys
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from core.config import BankNodeConfig
|
||||||
|
|
||||||
|
class BankNode():
|
||||||
|
def __init__(self):
|
||||||
|
self.logger = logging.getLogger(__name__)
|
||||||
|
self._setup_signals()
|
||||||
|
self.config = BankNodeConfig()
|
||||||
|
|
||||||
|
def _setup_signals(self):
|
||||||
|
self.logger.debug("Setting up exit signal hooks")
|
||||||
|
signal.signal(signal.SIGTERM, self.gracefully_exit)
|
||||||
|
signal.signal(signal.SIGINT, self.gracefully_exit)
|
||||||
|
|
||||||
|
def gracefully_exit(self, signum, frame):
|
||||||
|
signal_name = signal.Signals(signum).name
|
||||||
|
self.logger.warning("Caught %s. Cleaning up before exiting", signal_name)
|
||||||
|
self.cleanup()
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
|
||||||
|
def start_server(self):
|
||||||
|
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as socket_server:
|
||||||
|
socket_server.bind(("127.0.0.1", 6969))
|
||||||
|
socket_server.listen()
|
||||||
|
|
||||||
|
while True:
|
||||||
|
conn, addr = socket_server.accept()
|
||||||
|
with conn:
|
||||||
|
print(f"{addr} connected")
|
||||||
|
request = conn.recv(1024).decode("utf-8")
|
||||||
|
print(f"Request:\n{request}")
|
||||||
|
|
||||||
|
def cleanup(self):
|
||||||
|
pass
|
4
src/bank_node/bank_process.py
Normal file
4
src/bank_node/bank_process.py
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
from multiprocessing import Process
|
||||||
|
|
||||||
|
class BankProcess(Process):
|
||||||
|
pass
|
0
src/bank_protocol/exceptions.py
Normal file
0
src/bank_protocol/exceptions.py
Normal file
17
src/core/config.py
Normal file
17
src/core/config.py
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
import os
|
||||||
|
import logging
|
||||||
|
|
||||||
|
import dotenv
|
||||||
|
|
||||||
|
from utils import setup_logger
|
||||||
|
|
||||||
|
dotenv.load_dotenv()
|
||||||
|
|
||||||
|
class BankNodeConfig:
|
||||||
|
def __init__(self):
|
||||||
|
self.logger = logging.getLogger(__name__)
|
||||||
|
self.port = os.getenv("PORT", "6969")
|
||||||
|
|
||||||
|
self.timeout = os.getenv("RESPONSE_TIMEOUT", "5")
|
||||||
|
|
||||||
|
self.verbosity = os.getenv("VERBOSITY", "DEBUG")
|
0
src/core/exceptions.py
Normal file
0
src/core/exceptions.py
Normal file
0
src/utils/__init__.py
Normal file
0
src/utils/__init__.py
Normal file
13
src/utils/setup_logger.py
Normal file
13
src/utils/setup_logger.py
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
import sys
|
||||||
|
import logging
|
||||||
|
|
||||||
|
|
||||||
|
def setup_logger():
|
||||||
|
logger = logging.getLogger()
|
||||||
|
|
||||||
|
handler = logging.StreamHandler(sys.stdout)
|
||||||
|
|
||||||
|
formatter = logging.Formatter("[%(levelname)s] - %(name)s:%(lineno)d - %(message)s")
|
||||||
|
handler.setFormatter(formatter)
|
||||||
|
|
||||||
|
logger.addHandler(handler)
|
Loading…
x
Reference in New Issue
Block a user