added server-panel script
This commit is contained in:
parent
7cd1173d04
commit
5b05d2c2d1
1 changed files with 37 additions and 5 deletions
|
|
@ -112,6 +112,7 @@ class Status:
|
||||||
server_alive: bool
|
server_alive: bool
|
||||||
admin_pid: int | None
|
admin_pid: int | None
|
||||||
admin_alive: bool
|
admin_alive: bool
|
||||||
|
containers: list[tuple[str, str | None]]
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def running(self) -> bool:
|
def running(self) -> bool:
|
||||||
|
|
@ -123,15 +124,35 @@ class ServerManager:
|
||||||
dependency in here on purpose, so it stays easy to reason about /
|
dependency in here on purpose, so it stays easy to reason about /
|
||||||
reuse outside the TUI if that's ever useful."""
|
reuse outside the TUI if that's ever useful."""
|
||||||
|
|
||||||
|
def container_status(self, name: str) -> str | None:
|
||||||
|
"""Returns Docker's own State.Status (running/exited/created/...),
|
||||||
|
or None if the container doesn't exist at all."""
|
||||||
|
r = subprocess.run(
|
||||||
|
["docker", "inspect", "-f", "{{.State.Status}}", name],
|
||||||
|
capture_output=True, text=True,
|
||||||
|
)
|
||||||
|
if r.returncode != 0:
|
||||||
|
return None
|
||||||
|
return r.stdout.strip() or None
|
||||||
|
|
||||||
def status(self) -> Status:
|
def status(self) -> Status:
|
||||||
state = load_state()
|
state = load_state()
|
||||||
server_pid = state.get("server_pid")
|
server_pid = state.get("server_pid")
|
||||||
admin_pid = state.get("admin_pid")
|
admin_pid = state.get("admin_pid")
|
||||||
|
# Falls back to the cached naming decision (or the "owpengram"
|
||||||
|
# default for a never-started, fresh install) so the container list
|
||||||
|
# shows something sensible even before Start has ever run.
|
||||||
|
prefix = self.cached_docker_naming() or state.get("docker_prefix") or "owpengram"
|
||||||
|
containers = [
|
||||||
|
(f"{prefix}-{service}", self.container_status(f"{prefix}-{service}"))
|
||||||
|
for service in ("postgres", "redis")
|
||||||
|
]
|
||||||
return Status(
|
return Status(
|
||||||
server_pid=server_pid,
|
server_pid=server_pid,
|
||||||
server_alive=pid_alive(server_pid),
|
server_alive=pid_alive(server_pid),
|
||||||
admin_pid=admin_pid,
|
admin_pid=admin_pid,
|
||||||
admin_alive=pid_alive(admin_pid),
|
admin_alive=pid_alive(admin_pid),
|
||||||
|
containers=containers,
|
||||||
)
|
)
|
||||||
|
|
||||||
# -- naming migrations (interactive, must run with the real terminal) --
|
# -- naming migrations (interactive, must run with the real terminal) --
|
||||||
|
|
@ -278,11 +299,22 @@ def status_text(status: Status) -> str:
|
||||||
return f" {name}: [b red]STOPPED[/] (last PID {pid} not alive)"
|
return f" {name}: [b red]STOPPED[/] (last PID {pid} not alive)"
|
||||||
return f" {name}: [dim]not started[/]"
|
return f" {name}: [dim]not started[/]"
|
||||||
|
|
||||||
return (
|
def container_line(name: str, state: str | None) -> str:
|
||||||
line("owpengram-server", status.server_pid, status.server_alive)
|
if state == "running":
|
||||||
+ "\n"
|
return f" {name}: [b green]RUNNING[/]"
|
||||||
+ line("owpengram-admin-panel", status.admin_pid, status.admin_alive)
|
if state is None:
|
||||||
)
|
return f" {name}: [dim]not created[/]"
|
||||||
|
return f" {name}: [b red]{state.upper()}[/]"
|
||||||
|
|
||||||
|
lines = [
|
||||||
|
" Server binaries:",
|
||||||
|
line("owpengram-server", status.server_pid, status.server_alive),
|
||||||
|
line("owpengram-admin-panel", status.admin_pid, status.admin_alive),
|
||||||
|
"",
|
||||||
|
" Docker containers:",
|
||||||
|
]
|
||||||
|
lines += [container_line(name, state) for name, state in status.containers]
|
||||||
|
return "\n".join(lines)
|
||||||
|
|
||||||
|
|
||||||
class LogTailScreen(Screen):
|
class LogTailScreen(Screen):
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue