From 1f5c6604d624d1c2cc543cd4b0fc792a1af0148e Mon Sep 17 00:00:00 2001 From: anti Date: Tue, 7 Apr 2026 23:30:08 -0400 Subject: [PATCH] feat: integrate API lifecycle with teardown and update dependencies --- decnet.db | Bin 69632 -> 122880 bytes decnet.log | 8 ++++++++ decnet/deployer.py | 25 +++++++++++++++++++++++++ pyproject.toml | 3 +++ 4 files changed, 36 insertions(+) diff --git a/decnet.db b/decnet.db index 43aea2cd1a8c38b35701d4e1ebaa9bf1b32310a3..880a9aa22be6800281ce02e16191aa6f72440ddf 100644 GIT binary patch delta 16387 zcmeG@33OA}m6E*SMHWs1gs|9_ZOm%_uf?(;fH4?w@FHUw12$mGmcf8mnbk4oeajF+ z5=vglGD#q0YtCdLM42>g(k5xsGA%PD%(Q9JW^0zF8Jd$aounttB+PxA{+Ddof;y+? z%#3}`|8KqbzPrEo_4eN%yZ@zxZ(SF!x9fDe=|?jb8T9tk4G)AdNz=_jTaP2V#GOi!4;V>)TN$8^ke#B|6sVCoBGj$dwCHBHHc zsZ*6H@SLKU;CY=g4xW<{fq5HT$}o%=0tMveS|$7Zm2n zd3N*M4AQ!(v!lC*bQMTWTcNoRK;?&n`Vuiv7or4ZmmD^Ug31d8^>|d2*qwG~0ZezH zd2IR=bz1^ndz;J9+lSw3n~~~5bHhiy-fqS(b*A9hBXpG9K}O99 zAC<>PJ;g>{>LH_MhmJZP+uK)Nj^Am^hQ3+azC2$BCJ;J($#_>+6`_Vfm>E8bP(wy# zb<*7+8BzRiv^+w<|e$K#S{El-v$ z1z6uU9rv|MFf>~;)P~Qpp~+;ZEzfDQNp_reW*W}zkPNdBp5AqB3_!)Vb{3>C=rBmK z+wi&0N&_+zQ1PrC7x}D4F{IET+nxCQ3ls65b|&EaeA0J|QuHsy%rz1%*R9f-=BI8k z?oD|#c}LQz#E%nW#!XAejjxG268p25_YGeeCh29}s-q~~1iDwu*38s66J=o2*D}6v zye>M$k?b_1~*2=F@JF>=u9oZEzo zeXq!P_CZ%99u}j5&>7iy`or_^8wXu8hGj#al8@{u)Zb507NW&QY℞-ky!oP5Za> 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 Dz8f8( diff --git a/decnet.log b/decnet.log index 156d569..cffe3ec 100644 --- a/decnet.log +++ b/decnet.log @@ -353,3 +353,11 @@ <134>1 2026-04-08T03:05:15.848949+00:00 decky-webmail pop3 - command [decnet@55555 src="192.168.1.5" cmd="/"] <134>1 2026-04-08T03:05:15.849007+00:00 decky-webmail pop3 - disconnect [decnet@55555 src="192.168.1.5"] <134>1 2026-04-08T03:05:15.849061+00:00 decky-webmail pop3 - disconnect [decnet@55555 src="192.168.1.5"] +<134>1 2026-04-08T03:21:44.871598+00:00 decky-webmail http - startup - HTTP server starting as decky-webmail +<134>1 2026-04-08T03:21:44.905490+00:00 decky-webmail smtp - startup - SMTP server starting as decky-webmail +<134>1 2026-04-08T03:21:44.944053+00:00 decky-webmail imap - startup - IMAP server starting as decky-webmail +<134>1 2026-04-08T03:21:45.112633+00:00 decky-webmail pop3 - startup - POP3 server starting as decky-webmail +<134>1 2026-04-08T03:29:47.393300+00:00 decky-webmail smtp - startup - SMTP server starting as decky-webmail +<134>1 2026-04-08T03:29:47.490394+00:00 decky-webmail pop3 - startup - POP3 server starting as decky-webmail +<134>1 2026-04-08T03:29:47.642795+00:00 decky-webmail imap - startup - IMAP server starting as decky-webmail +<134>1 2026-04-08T03:29:47.694889+00:00 decky-webmail http - startup - HTTP server starting as decky-webmail diff --git a/decnet/deployer.py b/decnet/deployer.py index c2324f2..846cc10 100644 --- a/decnet/deployer.py +++ b/decnet/deployer.py @@ -131,6 +131,27 @@ def deploy(config: DecnetConfig, dry_run: bool = False, no_cache: bool = False) _print_status(config) +def _kill_api() -> None: + """Find and kill any running DECNET API (uvicorn) processes.""" + import psutil + import signal + import os + + _killed: bool = False + for _proc in psutil.process_iter(['pid', 'name', 'cmdline']): + try: + _cmd = _proc.info['cmdline'] + if _cmd and "uvicorn" in _cmd and "decnet.web.api:app" in _cmd: + console.print(f"[yellow]Stopping DECNET API (PID {_proc.info['pid']})...[/]") + os.kill(_proc.info['pid'], signal.SIGTERM) + _killed = True + except (psutil.NoSuchProcess, psutil.AccessDenied): + continue + + if _killed: + console.print("[green]API stopped.[/]") + + def teardown(decky_id: str | None = None) -> None: state = load_state() if state is None: @@ -159,6 +180,10 @@ def teardown(decky_id: str | None = None) -> None: teardown_host_macvlan(decky_range) remove_macvlan_network(client) clear_state() + + # Kill API when doing full teardown + _kill_api() + net_driver = "IPvlan" if config.ipvlan else "MACVLAN" console.print(f"[green]All deckies torn down. {net_driver} network removed.[/]") diff --git a/pyproject.toml b/pyproject.toml index a91533e..3b3259f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,6 +21,9 @@ dependencies = [ "uvicorn>=0.29.0", "aiosqlite>=0.20.0", "PyJWT>=2.8.0", + "bcrypt>=4.1.0", + "psutil>=5.9.0", + "httpx>=0.27.0", ] [project.scripts]