From e0b1ed0f5edccbf31aed3f3b9b2005d0b358f9c3 Mon Sep 17 00:00:00 2001
From: Martin Mares <mj@ucw.cz>
Date: Thu, 6 Jun 2024 16:35:56 +0200
Subject: [PATCH] Colors and service helpers
---
TODO | 2 +-
debian/control | 2 +-
debian/kam-shipcat.shc@.service | 5 ++--
pyproject.toml | 3 ++
shipcat/main.py | 52 ++++++++++++++++++++-------------
shipcat/util.py | 52 +++++++++++++++++++++++++++++++++
6 files changed, 91 insertions(+), 25 deletions(-)
create mode 100644 shipcat/util.py
diff --git a/TODO b/TODO
index 7175992..9d87db7 100644
--- a/TODO
+++ b/TODO
@@ -1,4 +1,4 @@
-- colors
+- more colors
- "shc CONTAINER start" vs. "shc CONTAINER shell"
Albireo cleanup:
diff --git a/debian/control b/debian/control
index 1724ebc..c6a7759 100644
--- a/debian/control
+++ b/debian/control
@@ -10,7 +10,7 @@ Build-Depends: debhelper (>= 12.0), debhelper-compat (= 13),
Package: kam-shipcat
Architecture: any
-Depends: podman, adduser
+Depends: podman, adduser, python3-termcolor
Suggests: rsync
Description: The Ship's Cat manages containers
A simple tool for managing podman containers at KAM.
diff --git a/debian/kam-shipcat.shc@.service b/debian/kam-shipcat.shc@.service
index decd960..cb87fb0 100644
--- a/debian/kam-shipcat.shc@.service
+++ b/debian/kam-shipcat.shc@.service
@@ -9,9 +9,8 @@ Type=forking
TimeoutStopSec=60
PIDFile=%t/shc/%i.pid
-ExecStartPre=/bin/rm -f %t/shc/%i.pid
-ExecStart=/usr/bin/podman start %i
-ExecStop=/usr/bin/podman stop --ignore %i
+ExecStart=/usr/bin/shipcat-start %i
+ExecStop=/usr/bin/shipcat-stop %i
RuntimeDirectory=shc
RuntimeDirectoryPreserve=yes
diff --git a/pyproject.toml b/pyproject.toml
index 0f2d91b..461d642 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -13,6 +13,9 @@ authors = [
maintainers = [
{name="Martin Mareš", email="mj@ucw.cz"},
]
+dependencies = ["termcolor"]
[project.scripts]
shipcat = "shipcat.main:main"
+shipcat-start = "shipcat.main:main_service_start"
+shipcat-stop = "shipcat.main:main_service_stop"
diff --git a/shipcat/main.py b/shipcat/main.py
index 6399d80..1b6d023 100755
--- a/shipcat/main.py
+++ b/shipcat/main.py
@@ -7,40 +7,25 @@ import os
from pathlib import Path
from pwd import getpwnam
import socket
-import subprocess
import sys
-from typing import NoReturn, List, Optional
+from typing import List, Optional
from shipcat.config import GlobalConfig, ContainerConfig, ConfigError
+from shipcat.util import die, verbose, set_verbose, run_command
config: GlobalConfig
-verbose: int
-
-
-def die(msg: str) -> NoReturn:
- print(msg, file=sys.stderr)
- sys.exit(1)
def progress(msg: str) -> None:
print(msg, file=sys.stderr, end="", flush=True)
-def run_command(cmd: List[str], *args, **kwargs) -> None:
- if verbose:
- print('RUN: ' + " ".join(cmd))
- res = subprocess.run(cmd, *args, **kwargs)
- if res.returncode != 0:
- sys.exit(res.returncode)
-
-
def load_config() -> GlobalConfig:
try:
return GlobalConfig.load('/etc/shipcat/shipcat.toml')
except ConfigError as e:
- print(e, file=sys.stderr)
- sys.exit(1)
+ die(str(e))
def setup_container(args: argparse.Namespace, require_root: bool, container: Optional[str] = None) -> ContainerConfig:
@@ -311,6 +296,33 @@ def cmd_list(args: argparse.Namespace) -> None:
print(cc.container)
+def main_service_start():
+ # Service helper for service start, called by root
+
+ if len(sys.argv) != 2:
+ die("Expected arguments: container")
+
+ config = load_config()
+ cc = ContainerConfig.load(config, sys.argv[1])
+
+ pid_file = f'/run/shc/{cc.container}.pid'
+ Path(pid_file).unlink(missing_ok=True)
+
+ run_command(['podman', 'start', cc.container])
+
+
+def main_service_stop():
+ # Service helper for service stop, called by root
+
+ if len(sys.argv) != 2:
+ die("Expected arguments: container")
+
+ config = load_config()
+ cc = ContainerConfig.load(config, sys.argv[1])
+
+ run_command(['podman', 'stop', '--ignore', cc.container])
+
+
def parse_int_list(s: str) -> List[int]:
return list(map(int, s.split(',')))
@@ -382,8 +394,8 @@ def main() -> None:
'stop': cmd_stop,
}
- global config, verbose
+ global config
config = load_config()
- verbose = args.verbose
+ set_verbose(args.verbose)
actions[args.action](args)
diff --git a/shipcat/util.py b/shipcat/util.py
new file mode 100644
index 0000000..178448a
--- /dev/null
+++ b/shipcat/util.py
@@ -0,0 +1,52 @@
+# Utility functions
+
+import subprocess
+import sys
+from termcolor import cprint
+from typing import NoReturn, List
+
+
+verbose = 0
+
+
+def die(msg: str) -> NoReturn:
+ cprint(msg, 'red', file=sys.stderr)
+ sys.exit(1)
+
+
+def fatal(msg: str) -> NoReturn:
+ die('FATAL: ' + msg)
+
+
+def error(msg: str) -> NoReturn:
+ die('ERROR: ' + msg)
+
+
+def warn(msg: str) -> None:
+ cprint('WARNING: ' + msg, 'red', file=sys.stderr)
+
+
+def progress(msg: str) -> None:
+ cprint(msg, 'green', file=sys.stderr)
+
+
+def note(msg: str) -> None:
+ cprint(msg, 'yellow', file=sys.stderr)
+
+
+def debug(msg: str, level: int = 1) -> None:
+ if verbose >= level:
+ print(msg)
+
+
+def set_verbose(level: int) -> None:
+ global verbose
+ verbose = level
+
+
+def run_command(cmd: List[str], *args, **kwargs) -> None:
+ if verbose:
+ print('RUN: ' + " ".join(cmd))
+ res = subprocess.run(cmd, *args, **kwargs)
+ if res.returncode != 0:
+ sys.exit(res.returncode)
--
GitLab