From f2c4058bb88d6885f54e4b5025e6b7ca5541be9d Mon Sep 17 00:00:00 2001 From: Robert Günzler Date: Sun, 7 Sep 2025 17:32:13 +0200 Subject: replace s6 with svtree bundle MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Robert Günzler --- bundles/containers/items.py | 19 ++++++----- bundles/svtree/items.py | 77 +++++++++++++++++++++++++++++++++++++++++++++ bundles/svtree/metadata.py | 9 ++++++ bundles/www/items.py | 21 +++++++------ groups.py | 2 +- items/svc_s6rc.py | 8 ++--- 6 files changed, 111 insertions(+), 25 deletions(-) create mode 100644 bundles/svtree/items.py create mode 100644 bundles/svtree/metadata.py diff --git a/bundles/containers/items.py b/bundles/containers/items.py index eb28c44..ea5b341 100644 --- a/bundles/containers/items.py +++ b/bundles/containers/items.py @@ -12,6 +12,10 @@ svc_openrc = { }, } +directories = { + "/etc/s6-rc/src/containers/contents.d": { 'purge': True }, +} + files = { "/etc/containers/containers.conf.d/10-firewall-driver.conf": { "needs": { @@ -21,18 +25,18 @@ files = { "/etc/s6-rc/templates/container/+service-srv/run": { "mode": "0755" }, "/etc/s6-rc/templates/container/+service-log/run": { "mode": "0755" }, - "/etc/s6-rc/services/default/contents.d/containers": { + "/etc/s6-rc/src/default/contents.d/containers": { "content_type": "text", "content": "", "triggers": { - "svc_openrc:s6-rc-up:restart", + "svc_openrc:svtree:reload", }, }, - "/etc/s6-rc/services/containers/type": { + "/etc/s6-rc/src/containers/type": { "content_type": "text", "content": "bundle", "triggers": { - "svc_openrc:s6-rc-up:restart", + "svc_openrc:svtree:reload", }, }, @@ -48,16 +52,11 @@ repo.libs.gen.add_files_recursive( join(repo.path, "bundles", "containers", "files"), ) -directories = { - "/etc/s6-rc/services/containers/contents.d": {} -} - for container, _ in node.metadata.get("containers", {}).items(): svc_s6rc[container] = { "bundle": "containers", "generate": "container", "triggers": { - "svc_openrc:s6-rc-init:reload", - "svc_openrc:s6-rc-up:reload", + "svc_openrc:svtree:reload", }, } diff --git a/bundles/svtree/items.py b/bundles/svtree/items.py new file mode 100644 index 0000000..809f869 --- /dev/null +++ b/bundles/svtree/items.py @@ -0,0 +1,77 @@ +if node.os != "alpine": + raise BundleError(f"{node.name}: OS {node.os} is not supported.") + +git_deploy = { + "/opt/svtree": { + 'repo': "https://git.sr.ht/~robertgzr/svtree", + 'rev': "master", + }, +} + +symlinks = { + "/etc/init.d/svtree": { + 'target': "/opt/svtree/openrc.service", + 'needs': {"git_deploy:/opt/svtree"}, + }, + "/etc/s6-rc/templates/service": { + 'target': "/opt/svtree/templates/service", + 'needs': {"git_deploy:/opt/svtree"}, + }, + "/usr/bin/sv": { + 'target': "/opt/svtree/bin/sv", + 'needs': {"git_deploy:/opt/svtree"}, + }, +} + +directories = { + "/opt/svtree": {}, + + "/etc/s6-rc/src": { 'purge': True }, + "/etc/s6-rc/templates": { 'purge': True }, + '/etc/s6-rc/generate': { 'purge': True }, + + "/etc/s6-rc/src/default/contents.d": { 'purge': True }, + + "/etc/s6-rc/src/services/contents.d": { 'purge': True }, + "/etc/s6-rc/services": { 'purge': True }, +} + +files = { + "/etc/s6-rc/src/default/type": { + "content_type": "text", + "content": "bundle", + "triggers": { + "svc_openrc:svtree:reload", + }, + }, + + "/etc/s6-rc/src/services/type": { + "content_type": "text", + "content": "bundle", + "triggers": { + "svc_openrc:svtree:reload", + }, + }, + "/etc/s6-rc/src/default/contents.d/services": { + "content_type": "text", + "content": "", + "triggers": { + "svc_openrc:svtree:reload", + }, + }, +} + +svc_openrc = { + "svtree": { + 'enabled': True, + 'running': True, + 'needs': {"symlink:/etc/init.d/svtree"}, + }, +} + +for service, _ in node.metadata.get("services", {}).items(): + svc_s6rc[service] = { + 'runlevel': "default", + 'bundle': "services", + 'generate': "service", + } diff --git a/bundles/svtree/metadata.py b/bundles/svtree/metadata.py new file mode 100644 index 0000000..0ddc51b --- /dev/null +++ b/bundles/svtree/metadata.py @@ -0,0 +1,9 @@ +defaults = { + "apk": { + "packages": { + "coreutils": {}, # TODO: make scripts busybox compatible + "s6-rc": {}, + "s6-portable-utils": {}, + }, + }, +} diff --git a/bundles/www/items.py b/bundles/www/items.py index 7805991..b6f0cfd 100644 --- a/bundles/www/items.py +++ b/bundles/www/items.py @@ -3,23 +3,25 @@ if node.os != "alpine": from os.path import join +directories = { + "/etc/s6-rc/src/www/contents.d": { 'purge': True } +} + files = { "/etc/s6-rc/templates/www/+service-srv/run": { "mode": "0755" }, "/etc/s6-rc/templates/www/+service-log/run": { "mode": "0755" }, - "/etc/s6-rc/services/default/contents.d/www": { + "/etc/s6-rc/src/default/contents.d/www": { "content_type": "text", "content": "", "triggers": { - "svc_openrc:s6-rc-init:reload", - "svc_openrc:s6-rc-up:restart", + "svc_openrc:svtree:reload", }, }, - "/etc/s6-rc/services/www/type": { + "/etc/s6-rc/src/www/type": { "content_type": "text", "content": "bundle", "triggers": { - "svc_openrc:s6-rc-init:reload", - "svc_openrc:s6-rc-up:restart", + "svc_openrc:svtree:reload", }, }, } @@ -29,12 +31,11 @@ repo.libs.gen.add_files_recursive( join(repo.path, "bundles", "www", "files"), ) -directories = { - "/etc/s6-rc/services/www/contents.d": {} -} - for www, _ in node.metadata.get("www", {}).items(): svc_s6rc[www] = { "bundle": "www", "generate": "www", + "triggers": { + "svc_openrc:svtree:reload", + }, } diff --git a/groups.py b/groups.py index d7d55f0..67c683c 100644 --- a/groups.py +++ b/groups.py @@ -15,7 +15,7 @@ groups = { "motd", "node-exporter", "restic-backup", - "s6", + "svtree", "syncthing", "tailscale", "tgnotify", diff --git a/items/svc_s6rc.py b/items/svc_s6rc.py index 429c04a..c827f05 100644 --- a/items/svc_s6rc.py +++ b/items/svc_s6rc.py @@ -8,8 +8,8 @@ S6RC_ROOT = "/etc/s6-rc" def generate_request_path(template, service) -> str: return Path(S6RC_ROOT, "generate", f"{template}.{service}").as_posix() -def service_dependency_path(bundle, service) -> str: - return Path(S6RC_ROOT, "services", bundle, "contents.d", service).as_posix() +def bundle_dependency_path(bundle, service) -> str: + return Path(S6RC_ROOT, "src", bundle, "contents.d", service).as_posix() def have_generate_template(node, template) -> bool: template_path = Path(S6RC_ROOT, "templates", template) @@ -43,7 +43,7 @@ def generate_service(node, template, service) -> bool: def is_service_registered(node, bundle, service) -> bool: try: result = node.run( - f"test -f {quote(service_dependency_path(bundle, service))}", + f"test -f {quote(bundle_dependency_path(bundle, service))}", ) return result.return_code == 0 except: @@ -51,7 +51,7 @@ def is_service_registered(node, bundle, service) -> bool: def register_service(node, bundle, service) -> bool: result = node.run( - f"touch {quote(service_dependency_path(bundle, service))}", + f"touch {quote(bundle_dependency_path(bundle, service))}", ) return result.return_code == 0 -- cgit 1.4.1