From 57e1787cd25a425eb1c425dff58387f5da76037d Mon Sep 17 00:00:00 2001 From: David Timber Date: Mon, 14 Apr 2025 19:23:34 +0200 Subject: Some tree changes ... - Move src/conf into src/palhm - Delete .vscode/settings.json --- src/conf/crontab | 6 -- src/conf/palhm-boot-report.service | 11 -- src/conf/py-debug/aws.jsonc | 163 ---------------------------- src/conf/py-debug/conf.d | 1 - src/conf/py-debug/localfs.jsonc | 161 ---------------------------- src/conf/py-debug/null.jsonc | 141 ------------------------- src/conf/py-debug/palhm.jsonc | 1 - src/conf/py-sample/conf.d/core.json | 85 --------------- src/conf/py-sample/sample.jsonc | 170 ------------------------------ src/palhm/conf/crontab | 6 ++ src/palhm/conf/palhm-boot-report.service | 11 ++ src/palhm/conf/py-debug/aws.jsonc | 163 ++++++++++++++++++++++++++++ src/palhm/conf/py-debug/conf.d | 1 + src/palhm/conf/py-debug/localfs.jsonc | 161 ++++++++++++++++++++++++++++ src/palhm/conf/py-debug/null.jsonc | 141 +++++++++++++++++++++++++ src/palhm/conf/py-debug/palhm.jsonc | 1 + src/palhm/conf/py-sample/conf.d/core.json | 85 +++++++++++++++ src/palhm/conf/py-sample/sample.jsonc | 170 ++++++++++++++++++++++++++++++ 18 files changed, 739 insertions(+), 739 deletions(-) delete mode 100644 src/conf/crontab delete mode 100644 src/conf/palhm-boot-report.service delete mode 100644 src/conf/py-debug/aws.jsonc delete mode 120000 src/conf/py-debug/conf.d delete mode 100644 src/conf/py-debug/localfs.jsonc delete mode 100644 src/conf/py-debug/null.jsonc delete mode 120000 src/conf/py-debug/palhm.jsonc delete mode 100644 src/conf/py-sample/conf.d/core.json delete mode 100644 src/conf/py-sample/sample.jsonc create mode 100644 src/palhm/conf/crontab create mode 100644 src/palhm/conf/palhm-boot-report.service create mode 100644 src/palhm/conf/py-debug/aws.jsonc create mode 120000 src/palhm/conf/py-debug/conf.d create mode 100644 src/palhm/conf/py-debug/localfs.jsonc create mode 100644 src/palhm/conf/py-debug/null.jsonc create mode 120000 src/palhm/conf/py-debug/palhm.jsonc create mode 100644 src/palhm/conf/py-sample/conf.d/core.json create mode 100644 src/palhm/conf/py-sample/sample.jsonc (limited to 'src') diff --git a/src/conf/crontab b/src/conf/crontab deleted file mode 100644 index d0eeda6..0000000 --- a/src/conf/crontab +++ /dev/null @@ -1,6 +0,0 @@ -# PALHM will produce stderr on exception. Mail the output to root -MAILTO="root" -# Run default task every Sunday at midnight -0 0 * * sun root /var/lib/PALHM/src/palhm.py -q run -# Check dnssec validity every hour -# 0 * * * * root systemd-run -qP -p User=palhm -p Nice=15 -p ProtectSystem=strict -p ReadOnlyPaths=/ -p PrivateDevices=true --wait /var/lib/PALHM/src/palhm.py -q run check-dnssec diff --git a/src/conf/palhm-boot-report.service b/src/conf/palhm-boot-report.service deleted file mode 100644 index 0b4ba67..0000000 --- a/src/conf/palhm-boot-report.service +++ /dev/null @@ -1,11 +0,0 @@ -[Unit] -Description=PALHM send boot report mail -After=postfix.service sendmail.service exim.service dovecot.service network-online.target - -[Service] -Type=oneshot -ExecStart=/var/lib/PALHM/src/palhm.py -q boot-report -Nice=10 - -[Install] -WantedBy=multi-user.target diff --git a/src/conf/py-debug/aws.jsonc b/src/conf/py-debug/aws.jsonc deleted file mode 100644 index 23e8faf..0000000 --- a/src/conf/py-debug/aws.jsonc +++ /dev/null @@ -1,163 +0,0 @@ -// PALHM Instance Config -{ - "include": [ "conf.d/core.json" ], - "modules": [ "aws" ], - "nb-workers": 0, // assumed $(nproc) - default - // "nb-workers": 1, // to disable concurrent task despatch - // To unlimit the number of workers. - // Does not fail on resource alloc failure. - // "nb-workers": -1, - "vl": 4, - "tasks": [ - { - "id": "backup", - "type": "backup", - "backend": "aws-s3", - "backend-param": { - // "profile": "default", - "bucket": "palhm.test", - "root": "/palhm/backup", - "prefix": { - "type": "default" - // "type": "iso8601", - // "timespec": "seconds", - // "tz": "utc" - }, - // "sink-storage-class": "STANDARD_IA", - // "rot-storage-class": "ONEZONE_IA", - "nb-copy-limit": 2, // or Infinity assumed(not in JSON spec) - "root-size-limit": "Infinity" // or Infinity assumed - }, - "object-groups": [ - { "id": "pre-start" }, - { - "id": "data-dump", - "depends": [ "pre-start" ] - }, - { - "id": "tar-media-0", - "depends": [ "data-dump" ] - }, - { - "id": "tar-media-1", - "depends": [ "data-dump" ] - } - ], - "objects": [ - { - "path": "pm-list.gz", - "group": "pre-start", - "pipeline": [ - { "type": "exec", "exec-id": "rpm-list-installed" }, - { "type": "exec", "exec-id": "filter-gzip-plain" } - ] - }, - { - "path": "lsblk.json.gz", - "group": "pre-start", - "pipeline": [ - { - "type": "exec-append", - "exec-id": "lsblk-all-json", - "argv": [ "-a" ] - }, - { "type": "exec", "exec-id": "filter-gzip-plain" } - ] - }, - { - "path": "random-dump.sql.xz", - "alloc-size": 2097152, - "group": "data-dump", - "pipeline": [ - { - "type": "exec-inline", - "argv": [ - "/bin/dd", - "if=/dev/urandom", - "bs=4096", - "count=512", - "status=none" - ] - }, - { "type": "exec", "exec-id": "filter-xz-parallel" } - ] - }, - { - "path": "random-dump.0.xz", - "alloc-size": 2097152, - "group": "tar-media-0", - "pipeline": [ - { - "type": "exec-inline", - "argv": [ - "/bin/dd", - "if=/dev/zero", - "bs=4096", - "count=512", - "status=none" - ] - }, - { "type": "exec", "exec-id": "filter-xz-parallel" } - ] - }, - { - "path": "random-dump.1.xz", - "alloc-size": 2097152, - "group": "tar-media-1", - "pipeline": [ - { - "type": "exec-inline", - "argv": [ - "/bin/dd", - "if=/dev/zero", - "bs=4096", - "count=512", - "status=none" - ] - }, - { "type": "exec", "exec-id": "filter-xz-parallel" } - ] - } - ] - }, - { - "id": "update", - "type": "routine", - "routine": [ - { - "type": "exec-inline", - "argv": [ "/bin/echo", "0" ] - }, - { - "type": "exec-inline", - "argv": [ "/bin/sleep", "1" ] - }, - { - "type": "exec-inline", - "argv": [ "/bin/echo", "1" ] - } - ] - }, - { - "id": "default", - "type": "routine", - "routine": [ - { "type": "task", "task-id": "backup" }, - { "type": "task", "task-id": "update" }, - { - // Block SIGTERM from systemd/init.d so the program is not - // affected by the reboot command. - "type": "builtin", - "builtin-id": "sigmask", - "param": [ - { "action": "block", "sig": [ "TERM" ] } - ] - }, - { - "type": "exec-inline", - "argv": [ "/bin/true" ] - } - ] - } - ] -} diff --git a/src/conf/py-debug/conf.d b/src/conf/py-debug/conf.d deleted file mode 120000 index a32163d..0000000 --- a/src/conf/py-debug/conf.d +++ /dev/null @@ -1 +0,0 @@ -../py-sample/conf.d \ No newline at end of file diff --git a/src/conf/py-debug/localfs.jsonc b/src/conf/py-debug/localfs.jsonc deleted file mode 100644 index 80efd5d..0000000 --- a/src/conf/py-debug/localfs.jsonc +++ /dev/null @@ -1,161 +0,0 @@ -// PALHM Instance Config -{ - "include": [ "conf.d/core.json" ], - "nb-workers": 0, // assumed $(nproc) - default - // "nb-workers": 1, // to disable concurrent task despatch - // To unlimit the number of workers. - // Does not fail on resource alloc failure. - // "nb-workers": -1, - "vl": 3, - "tasks": [ - { - "id": "backup", - "type": "backup", - "backend": "localfs", - "backend-param": { - "root": "/var/tmp/palhm-backup-root", - "prefix": { - "type": "default" - // "type": "iso8601", - // "timespec": "seconds", - // "tz": "utc" - }, - // "dmode": "755", - // "fmode": "644", - "nb-copy-limit": 2, - "root-size-limit": "Infinity", - "block-size": 4096 - }, - "object-groups": [ - { "id": "pre-start" }, - { - "id": "data-dump", - "depends": [ "pre-start" ] - }, - { - "id": "tar-media-0", - "depends": [ "data-dump" ] - }, - { - "id": "tar-media-1", - "depends": [ "data-dump" ] - } - ], - "objects": [ - { - "path": "pm-list.gz", - "group": "pre-start", - "pipeline": [ - { "type": "exec", "exec-id": "rpm-list-installed" }, - { "type": "exec", "exec-id": "filter-gzip-plain" } - ] - }, - { - "path": "lsblk.json.gz", - "group": "pre-start", - "pipeline": [ - { - "type": "exec-append", - "exec-id": "lsblk-all-json", - "argv": [ "-a" ] - }, - { "type": "exec", "exec-id": "filter-gzip-plain" } - ] - }, - { - "path": "random-dump.sql.xz", - "alloc-size": 2097152, - "group": "data-dump", - "pipeline": [ - { - "type": "exec-inline", - "argv": [ - "/bin/dd", - "if=/dev/urandom", - "bs=4096", - "count=512", - "status=none" - ] - }, - { "type": "exec", "exec-id": "filter-xz-parallel" } - ] - }, - { - "path": "random-dump.0.xz", - "alloc-size": 2097152, - "group": "tar-media-0", - "pipeline": [ - { - "type": "exec-inline", - "argv": [ - "/bin/dd", - "if=/dev/zero", - "bs=4096", - "count=512", - "status=none" - ] - }, - { "type": "exec", "exec-id": "filter-xz-parallel" } - ] - }, - { - "path": "random-dump.1.xz", - "alloc-size": 2097152, - "group": "tar-media-1", - "pipeline": [ - { - "type": "exec-inline", - "argv": [ - "/bin/dd", - "if=/dev/zero", - "bs=4096", - "count=512", - "status=none" - ] - }, - { "type": "exec", "exec-id": "filter-xz-parallel" } - ] - } - ] - }, - { - "id": "update", - "type": "routine", - "routine": [ - { - "type": "exec-inline", - "argv": [ "/bin/echo", "0" ] - }, - { - "type": "exec-inline", - "argv": [ "/bin/sleep", "1" ] - }, - { - "type": "exec-inline", - "argv": [ "/bin/echo", "1" ] - } - ] - }, - { - "id": "default", - "type": "routine", - "routine": [ - { "type": "task", "task-id": "backup" }, - { "type": "task", "task-id": "update" }, - { - // Block SIGTERM from systemd/init.d so the program is not - // affected by the reboot command. - "type": "builtin", - "builtin-id": "sigmask", - "param": [ - { "action": "block", "sig": [ "TERM" ] } - ] - }, - { - "type": "exec-inline", - "argv": [ "/bin/true" ] - } - ] - } - ] -} diff --git a/src/conf/py-debug/null.jsonc b/src/conf/py-debug/null.jsonc deleted file mode 100644 index b5ce9f8..0000000 --- a/src/conf/py-debug/null.jsonc +++ /dev/null @@ -1,141 +0,0 @@ -{ - "include": [ "conf.d/core.json" ], - "nb-workers": 0, // assumed $(nproc) - // "nb-workers": 1, // to disable concurrent task despatch - // "nb-workers": -1, // to unlimit the number of workers. - "vl": 3, - "tasks": [ - { - "id": "backup", - "type": "backup", - "backend": "null", - "object-groups": [ - { "id": "pre-start" }, - { - "id": "data-dump", - "depends": [ "pre-start" ] - }, - { - "id": "tar-0", - "depends": [ "data-dump" ] - }, - { - "id": "tar-1", - "depends": [ "data-dump" ] - } - ], - "objects": [ - { - "path": "pm-list.zstd", - "group": "pre-start", - "pipeline": [ - { "type": "exec", "exec-id": "rpm-list-installed" }, - { "type": "exec", "exec-id": "filter-zstd-plain" } - ] - }, - { - "path": "lsblk.json.zstd", - "group": "pre-start", - "pipeline": [ - { "type": "exec", "exec-id": "lsblk-all-json" }, - { "type": "exec", "exec-id": "filter-zstd-plain" } - ] - }, - { - "path": "db.sql.zstd", - "group": "data-dump", - "pipeline": [ - { - "type": "exec-inline", - "argv": [ - "/bin/mysqldump", - "-uroot", - "--all-databases" - ] - }, - { "type": "exec", "exec-id": "filter-zstd-parallel" } - ] - }, - { - "path": "root.tar.zstd", - "group": "tar-0", - "pipeline": [ - { - "type": "exec-append", - "exec-id": "tar", - "argv": [ - "-C", - "/", - "/etc", - "/home", - "/root", - "/var" - ] - }, - { "type": "exec", "exec-id": "filter-zstd-parallel" } - ] - }, - { - "path": "srv.tar.zstd", - "group": "tar-1", - "pipeline": [ - { - "type": "exec-append", - "exec-id": "tar", - "argv": [ - "-C", - "/", - "/srv" - ] - }, - { "type": "exec", "exec-id": "filter-zstd-parallel" } - ] - } - ] - }, - { - "id": "update", - "type": "routine", - "routine": [ - { - "type": "exec-inline", - "argv": [ "/bin/dnf", "--refresh", "-yq", "update" ] - }, - { - "type": "exec-inline", - "argv": [ "/bin/sa-update" ] - } - ] - }, - { - "id": "reboot", - "type": "routine", - "routine": [ - { -/* - * Block SIGTERM from systemd/init.d so PALHM can exit gracefully after issuing - * reboot. - */ - "type": "builtin", - "builtin-id": "sigmask", - "param": [ - { "action": "block", "sig": [ "TERM" ] } - ] - }, - { - "type": "exec-inline", - "argv": [ "/sbin/reboot" ] - } - ] - }, - { - "id": "default", - "type": "routine", - "routine": [ - { "type": "task", "task-id": "backup" }, - { "type": "task", "task-id": "update" }, - { "type": "task", "task-id": "reboot" } - ] - } - ] -} diff --git a/src/conf/py-debug/palhm.jsonc b/src/conf/py-debug/palhm.jsonc deleted file mode 120000 index c40e201..0000000 --- a/src/conf/py-debug/palhm.jsonc +++ /dev/null @@ -1 +0,0 @@ -../py-sample/sample.jsonc \ No newline at end of file diff --git a/src/conf/py-sample/conf.d/core.json b/src/conf/py-sample/conf.d/core.json deleted file mode 100644 index fac28a0..0000000 --- a/src/conf/py-sample/conf.d/core.json +++ /dev/null @@ -1,85 +0,0 @@ -{ - "execs": [ - { - "id": "tar", - "argv": [ - "/bin/tar", - "--xattrs", - "--selinux", - "--warning=none", - "-cf", - "-" - ], - "ec": "<2" - }, - { - "id": "filter-xz-parallel", - "argv": [ "/bin/xz", "-T0" ] - }, - { - "id": "filter-gzip-plain", - "argv": [ "/bin/gzip" ] - }, - { - "id": "filter-zstd-plain", - "argv": [ "/bin/zstd" ] - }, - { - "id": "filter-zstd-parallel", - "argv": [ "/bin/zstd", "-T0" ] - }, - { - "id": "rpm-list-installed", - "argv": [ - "/bin/rpm", - "-qa", - "--qf", - "%{name}\\t%{version}-%{release}.%{arch}\\t%{vendor}\\n" - ] - }, - { - "id": "dnf-list-userinstalled", - "argv": [ - "/bin/dnf", - "history", - "userinstalled" - ] - }, - { - "id": "dnf-group-list-installed", - "argv": [ - "/bin/dnf", - "--cacheonly", - "-q", - "group", - "list", - "--installed" - ], - "ec": " >= 0" - }, - { - "id": "dpkg-list-installed", - "argv": [ "/bin/dpkg-query", "-l" ] - }, - { - "id": "lsblk-all-json", - "argv": [ "/bin/lsblk", "-JbOa" ] - }, - { - "id": "os-release", - "argv": [ "/bin/cat", "/etc/os-release" ] - }, - { - "id": "dig-dnssec", - "argv": [ "/bin/dig", "+short", "+dnssec", "+notcp" ] - }, - { - "id": "grep-any", - "argv": [ "/bin/grep", "." ] - }, - { - "id": "null-stdout-sink", - "argv": [ "/bin/cp", "/dev/stdin", "/dev/null" ] - } - ] -} diff --git a/src/conf/py-sample/sample.jsonc b/src/conf/py-sample/sample.jsonc deleted file mode 100644 index 2a349c1..0000000 --- a/src/conf/py-sample/sample.jsonc +++ /dev/null @@ -1,170 +0,0 @@ -{ - "include": [ "/etc/palhm/conf.d/core.json" ], - "modules": [ "aws" ], - "nb-workers": 0, - // "vl": 4, - "boot-report": { - // "mua": "stdout", - "mua": "mailx", - // "mua": "aws-sns", - "mua-param": { - "int-opts": [ "smtp=localhost" ] - }, - "mail-to": [ "root" ], - // "subject": "Custom Boot Report Subject from {hostname}", - // "header": "Custom header content with {hostname} substitution." - // "uptime-since": true, - // "uptime": true, - // "bootid": true, - // "boot-wait": "systemd", - "delay": 5 - }, - "tasks": [ - { - "id": "backup", - "type": "backup", - "backend": "null", - "backend-param": {}, - "object-groups": [ - { "id": "meta-run" }, - { - "id": "data-dump", - "depends": [ "meta-run" ] - }, - { - "id": "tar-root", - "depends": [ "data-dump" ] - } - ], - "objects": [ - { - "path": "os-release", - "group": "meta-run", - "pipeline": [ { "type": "exec" , "exec-id": "os-release" } ] - }, - { - "path": "pm-list.zstd", - "group": "meta-run", - "pipeline": [ - { "type": "exec", "exec-id": "rpm-list-installed" }, - { "type": "exec", "exec-id": "filter-zstd-plain" } - ] - }, - { - "path": "lsblk.json.zstd", - "group": "meta-run", - "pipeline": [ - { "type": "exec", "exec-id": "lsblk-all-json" }, - { "type": "exec", "exec-id": "filter-zstd-plain" } - ] - }, - // { - // "path": "db.sql.zstd", - // "group": "data-dump", - // "pipeline": [ - // { - // "type": "exec-inline", - // "argv": [ - // "/bin/mysqldump", - // "-uroot", - // "--all-databases" - // ] - // // "ec": "<=2" // don't fail when the DB is offline - // }, - // { "type": "exec", "exec-id": "filter-zstd-parallel" } - // ] - // }, - { - "path": "root.tar.zstd", - "group": "tar-root", - "pipeline": [ - { - "type": "exec-append", - "exec-id": "tar", - "argv": [ - "-C", - "/", - "etc", - "home", - "root", - "var" - ] - }, - { "type": "exec", "exec-id": "filter-zstd-parallel" } - ] - } - ] - }, - { - "id": "update", - "type": "routine", - "routine": [ - { - "type": "exec-inline", - "argv": [ "/bin/dnf", "--refresh", "-yq", "update" ] - } - // { - // "type": "exec-inline", - // "argv": [ "/bin/sa-update" ] - // } - ] - }, - { - "id": "reboot", - "type": "routine", - "routine": [ - { -/* - * Block SIGTERM from systemd/init.d so PALHM can exit gracefully after issuing - * reboot. - */ - "type": "builtin", - "builtin-id": "sigmask", - "param": [ - { "action": "block", "sig": [ "TERM" ] } - ] - }, - { - "type": "exec-inline", - "argv": [ "/sbin/reboot" ] - } - ] - }, - { - "id": "check-dnssec", - "type": "backup", - "backend": "null", - "objects": [ - { - "path": "example.com", // Placeholder - "pipeline": [ - /* - * Check if dig can query the record with the DNSSEC - * validation flag. Empty stdout with zero return code - * means SERVFAIL. - */ - { - "type": "exec-append", - "exec-id": "dig-dnssec", - "argv": [ "ANY", "example.com" ] - }, - /* - * Trap for empty dig output grep will return non-zero if - * dig have not produced any output - */ - { "type": "exec", "exec-id": "grep-any" } - ] - } - ] - }, - { - "id": "default", - "type": "routine", - "routine": [ - { "type": "task", "task-id": "backup" }, - { "type": "task", "task-id": "update" }, - { "type": "task", "task-id": "reboot" } - ] - } - ] -} diff --git a/src/palhm/conf/crontab b/src/palhm/conf/crontab new file mode 100644 index 0000000..d0eeda6 --- /dev/null +++ b/src/palhm/conf/crontab @@ -0,0 +1,6 @@ +# PALHM will produce stderr on exception. Mail the output to root +MAILTO="root" +# Run default task every Sunday at midnight +0 0 * * sun root /var/lib/PALHM/src/palhm.py -q run +# Check dnssec validity every hour +# 0 * * * * root systemd-run -qP -p User=palhm -p Nice=15 -p ProtectSystem=strict -p ReadOnlyPaths=/ -p PrivateDevices=true --wait /var/lib/PALHM/src/palhm.py -q run check-dnssec diff --git a/src/palhm/conf/palhm-boot-report.service b/src/palhm/conf/palhm-boot-report.service new file mode 100644 index 0000000..0b4ba67 --- /dev/null +++ b/src/palhm/conf/palhm-boot-report.service @@ -0,0 +1,11 @@ +[Unit] +Description=PALHM send boot report mail +After=postfix.service sendmail.service exim.service dovecot.service network-online.target + +[Service] +Type=oneshot +ExecStart=/var/lib/PALHM/src/palhm.py -q boot-report +Nice=10 + +[Install] +WantedBy=multi-user.target diff --git a/src/palhm/conf/py-debug/aws.jsonc b/src/palhm/conf/py-debug/aws.jsonc new file mode 100644 index 0000000..23e8faf --- /dev/null +++ b/src/palhm/conf/py-debug/aws.jsonc @@ -0,0 +1,163 @@ +// PALHM Instance Config +{ + "include": [ "conf.d/core.json" ], + "modules": [ "aws" ], + "nb-workers": 0, // assumed $(nproc) - default + // "nb-workers": 1, // to disable concurrent task despatch + // To unlimit the number of workers. + // Does not fail on resource alloc failure. + // "nb-workers": -1, + "vl": 4, + "tasks": [ + { + "id": "backup", + "type": "backup", + "backend": "aws-s3", + "backend-param": { + // "profile": "default", + "bucket": "palhm.test", + "root": "/palhm/backup", + "prefix": { + "type": "default" + // "type": "iso8601", + // "timespec": "seconds", + // "tz": "utc" + }, + // "sink-storage-class": "STANDARD_IA", + // "rot-storage-class": "ONEZONE_IA", + "nb-copy-limit": 2, // or Infinity assumed(not in JSON spec) + "root-size-limit": "Infinity" // or Infinity assumed + }, + "object-groups": [ + { "id": "pre-start" }, + { + "id": "data-dump", + "depends": [ "pre-start" ] + }, + { + "id": "tar-media-0", + "depends": [ "data-dump" ] + }, + { + "id": "tar-media-1", + "depends": [ "data-dump" ] + } + ], + "objects": [ + { + "path": "pm-list.gz", + "group": "pre-start", + "pipeline": [ + { "type": "exec", "exec-id": "rpm-list-installed" }, + { "type": "exec", "exec-id": "filter-gzip-plain" } + ] + }, + { + "path": "lsblk.json.gz", + "group": "pre-start", + "pipeline": [ + { + "type": "exec-append", + "exec-id": "lsblk-all-json", + "argv": [ "-a" ] + }, + { "type": "exec", "exec-id": "filter-gzip-plain" } + ] + }, + { + "path": "random-dump.sql.xz", + "alloc-size": 2097152, + "group": "data-dump", + "pipeline": [ + { + "type": "exec-inline", + "argv": [ + "/bin/dd", + "if=/dev/urandom", + "bs=4096", + "count=512", + "status=none" + ] + }, + { "type": "exec", "exec-id": "filter-xz-parallel" } + ] + }, + { + "path": "random-dump.0.xz", + "alloc-size": 2097152, + "group": "tar-media-0", + "pipeline": [ + { + "type": "exec-inline", + "argv": [ + "/bin/dd", + "if=/dev/zero", + "bs=4096", + "count=512", + "status=none" + ] + }, + { "type": "exec", "exec-id": "filter-xz-parallel" } + ] + }, + { + "path": "random-dump.1.xz", + "alloc-size": 2097152, + "group": "tar-media-1", + "pipeline": [ + { + "type": "exec-inline", + "argv": [ + "/bin/dd", + "if=/dev/zero", + "bs=4096", + "count=512", + "status=none" + ] + }, + { "type": "exec", "exec-id": "filter-xz-parallel" } + ] + } + ] + }, + { + "id": "update", + "type": "routine", + "routine": [ + { + "type": "exec-inline", + "argv": [ "/bin/echo", "0" ] + }, + { + "type": "exec-inline", + "argv": [ "/bin/sleep", "1" ] + }, + { + "type": "exec-inline", + "argv": [ "/bin/echo", "1" ] + } + ] + }, + { + "id": "default", + "type": "routine", + "routine": [ + { "type": "task", "task-id": "backup" }, + { "type": "task", "task-id": "update" }, + { + // Block SIGTERM from systemd/init.d so the program is not + // affected by the reboot command. + "type": "builtin", + "builtin-id": "sigmask", + "param": [ + { "action": "block", "sig": [ "TERM" ] } + ] + }, + { + "type": "exec-inline", + "argv": [ "/bin/true" ] + } + ] + } + ] +} diff --git a/src/palhm/conf/py-debug/conf.d b/src/palhm/conf/py-debug/conf.d new file mode 120000 index 0000000..a32163d --- /dev/null +++ b/src/palhm/conf/py-debug/conf.d @@ -0,0 +1 @@ +../py-sample/conf.d \ No newline at end of file diff --git a/src/palhm/conf/py-debug/localfs.jsonc b/src/palhm/conf/py-debug/localfs.jsonc new file mode 100644 index 0000000..80efd5d --- /dev/null +++ b/src/palhm/conf/py-debug/localfs.jsonc @@ -0,0 +1,161 @@ +// PALHM Instance Config +{ + "include": [ "conf.d/core.json" ], + "nb-workers": 0, // assumed $(nproc) - default + // "nb-workers": 1, // to disable concurrent task despatch + // To unlimit the number of workers. + // Does not fail on resource alloc failure. + // "nb-workers": -1, + "vl": 3, + "tasks": [ + { + "id": "backup", + "type": "backup", + "backend": "localfs", + "backend-param": { + "root": "/var/tmp/palhm-backup-root", + "prefix": { + "type": "default" + // "type": "iso8601", + // "timespec": "seconds", + // "tz": "utc" + }, + // "dmode": "755", + // "fmode": "644", + "nb-copy-limit": 2, + "root-size-limit": "Infinity", + "block-size": 4096 + }, + "object-groups": [ + { "id": "pre-start" }, + { + "id": "data-dump", + "depends": [ "pre-start" ] + }, + { + "id": "tar-media-0", + "depends": [ "data-dump" ] + }, + { + "id": "tar-media-1", + "depends": [ "data-dump" ] + } + ], + "objects": [ + { + "path": "pm-list.gz", + "group": "pre-start", + "pipeline": [ + { "type": "exec", "exec-id": "rpm-list-installed" }, + { "type": "exec", "exec-id": "filter-gzip-plain" } + ] + }, + { + "path": "lsblk.json.gz", + "group": "pre-start", + "pipeline": [ + { + "type": "exec-append", + "exec-id": "lsblk-all-json", + "argv": [ "-a" ] + }, + { "type": "exec", "exec-id": "filter-gzip-plain" } + ] + }, + { + "path": "random-dump.sql.xz", + "alloc-size": 2097152, + "group": "data-dump", + "pipeline": [ + { + "type": "exec-inline", + "argv": [ + "/bin/dd", + "if=/dev/urandom", + "bs=4096", + "count=512", + "status=none" + ] + }, + { "type": "exec", "exec-id": "filter-xz-parallel" } + ] + }, + { + "path": "random-dump.0.xz", + "alloc-size": 2097152, + "group": "tar-media-0", + "pipeline": [ + { + "type": "exec-inline", + "argv": [ + "/bin/dd", + "if=/dev/zero", + "bs=4096", + "count=512", + "status=none" + ] + }, + { "type": "exec", "exec-id": "filter-xz-parallel" } + ] + }, + { + "path": "random-dump.1.xz", + "alloc-size": 2097152, + "group": "tar-media-1", + "pipeline": [ + { + "type": "exec-inline", + "argv": [ + "/bin/dd", + "if=/dev/zero", + "bs=4096", + "count=512", + "status=none" + ] + }, + { "type": "exec", "exec-id": "filter-xz-parallel" } + ] + } + ] + }, + { + "id": "update", + "type": "routine", + "routine": [ + { + "type": "exec-inline", + "argv": [ "/bin/echo", "0" ] + }, + { + "type": "exec-inline", + "argv": [ "/bin/sleep", "1" ] + }, + { + "type": "exec-inline", + "argv": [ "/bin/echo", "1" ] + } + ] + }, + { + "id": "default", + "type": "routine", + "routine": [ + { "type": "task", "task-id": "backup" }, + { "type": "task", "task-id": "update" }, + { + // Block SIGTERM from systemd/init.d so the program is not + // affected by the reboot command. + "type": "builtin", + "builtin-id": "sigmask", + "param": [ + { "action": "block", "sig": [ "TERM" ] } + ] + }, + { + "type": "exec-inline", + "argv": [ "/bin/true" ] + } + ] + } + ] +} diff --git a/src/palhm/conf/py-debug/null.jsonc b/src/palhm/conf/py-debug/null.jsonc new file mode 100644 index 0000000..b5ce9f8 --- /dev/null +++ b/src/palhm/conf/py-debug/null.jsonc @@ -0,0 +1,141 @@ +{ + "include": [ "conf.d/core.json" ], + "nb-workers": 0, // assumed $(nproc) + // "nb-workers": 1, // to disable concurrent task despatch + // "nb-workers": -1, // to unlimit the number of workers. + "vl": 3, + "tasks": [ + { + "id": "backup", + "type": "backup", + "backend": "null", + "object-groups": [ + { "id": "pre-start" }, + { + "id": "data-dump", + "depends": [ "pre-start" ] + }, + { + "id": "tar-0", + "depends": [ "data-dump" ] + }, + { + "id": "tar-1", + "depends": [ "data-dump" ] + } + ], + "objects": [ + { + "path": "pm-list.zstd", + "group": "pre-start", + "pipeline": [ + { "type": "exec", "exec-id": "rpm-list-installed" }, + { "type": "exec", "exec-id": "filter-zstd-plain" } + ] + }, + { + "path": "lsblk.json.zstd", + "group": "pre-start", + "pipeline": [ + { "type": "exec", "exec-id": "lsblk-all-json" }, + { "type": "exec", "exec-id": "filter-zstd-plain" } + ] + }, + { + "path": "db.sql.zstd", + "group": "data-dump", + "pipeline": [ + { + "type": "exec-inline", + "argv": [ + "/bin/mysqldump", + "-uroot", + "--all-databases" + ] + }, + { "type": "exec", "exec-id": "filter-zstd-parallel" } + ] + }, + { + "path": "root.tar.zstd", + "group": "tar-0", + "pipeline": [ + { + "type": "exec-append", + "exec-id": "tar", + "argv": [ + "-C", + "/", + "/etc", + "/home", + "/root", + "/var" + ] + }, + { "type": "exec", "exec-id": "filter-zstd-parallel" } + ] + }, + { + "path": "srv.tar.zstd", + "group": "tar-1", + "pipeline": [ + { + "type": "exec-append", + "exec-id": "tar", + "argv": [ + "-C", + "/", + "/srv" + ] + }, + { "type": "exec", "exec-id": "filter-zstd-parallel" } + ] + } + ] + }, + { + "id": "update", + "type": "routine", + "routine": [ + { + "type": "exec-inline", + "argv": [ "/bin/dnf", "--refresh", "-yq", "update" ] + }, + { + "type": "exec-inline", + "argv": [ "/bin/sa-update" ] + } + ] + }, + { + "id": "reboot", + "type": "routine", + "routine": [ + { +/* + * Block SIGTERM from systemd/init.d so PALHM can exit gracefully after issuing + * reboot. + */ + "type": "builtin", + "builtin-id": "sigmask", + "param": [ + { "action": "block", "sig": [ "TERM" ] } + ] + }, + { + "type": "exec-inline", + "argv": [ "/sbin/reboot" ] + } + ] + }, + { + "id": "default", + "type": "routine", + "routine": [ + { "type": "task", "task-id": "backup" }, + { "type": "task", "task-id": "update" }, + { "type": "task", "task-id": "reboot" } + ] + } + ] +} diff --git a/src/palhm/conf/py-debug/palhm.jsonc b/src/palhm/conf/py-debug/palhm.jsonc new file mode 120000 index 0000000..c40e201 --- /dev/null +++ b/src/palhm/conf/py-debug/palhm.jsonc @@ -0,0 +1 @@ +../py-sample/sample.jsonc \ No newline at end of file diff --git a/src/palhm/conf/py-sample/conf.d/core.json b/src/palhm/conf/py-sample/conf.d/core.json new file mode 100644 index 0000000..fac28a0 --- /dev/null +++ b/src/palhm/conf/py-sample/conf.d/core.json @@ -0,0 +1,85 @@ +{ + "execs": [ + { + "id": "tar", + "argv": [ + "/bin/tar", + "--xattrs", + "--selinux", + "--warning=none", + "-cf", + "-" + ], + "ec": "<2" + }, + { + "id": "filter-xz-parallel", + "argv": [ "/bin/xz", "-T0" ] + }, + { + "id": "filter-gzip-plain", + "argv": [ "/bin/gzip" ] + }, + { + "id": "filter-zstd-plain", + "argv": [ "/bin/zstd" ] + }, + { + "id": "filter-zstd-parallel", + "argv": [ "/bin/zstd", "-T0" ] + }, + { + "id": "rpm-list-installed", + "argv": [ + "/bin/rpm", + "-qa", + "--qf", + "%{name}\\t%{version}-%{release}.%{arch}\\t%{vendor}\\n" + ] + }, + { + "id": "dnf-list-userinstalled", + "argv": [ + "/bin/dnf", + "history", + "userinstalled" + ] + }, + { + "id": "dnf-group-list-installed", + "argv": [ + "/bin/dnf", + "--cacheonly", + "-q", + "group", + "list", + "--installed" + ], + "ec": " >= 0" + }, + { + "id": "dpkg-list-installed", + "argv": [ "/bin/dpkg-query", "-l" ] + }, + { + "id": "lsblk-all-json", + "argv": [ "/bin/lsblk", "-JbOa" ] + }, + { + "id": "os-release", + "argv": [ "/bin/cat", "/etc/os-release" ] + }, + { + "id": "dig-dnssec", + "argv": [ "/bin/dig", "+short", "+dnssec", "+notcp" ] + }, + { + "id": "grep-any", + "argv": [ "/bin/grep", "." ] + }, + { + "id": "null-stdout-sink", + "argv": [ "/bin/cp", "/dev/stdin", "/dev/null" ] + } + ] +} diff --git a/src/palhm/conf/py-sample/sample.jsonc b/src/palhm/conf/py-sample/sample.jsonc new file mode 100644 index 0000000..2a349c1 --- /dev/null +++ b/src/palhm/conf/py-sample/sample.jsonc @@ -0,0 +1,170 @@ +{ + "include": [ "/etc/palhm/conf.d/core.json" ], + "modules": [ "aws" ], + "nb-workers": 0, + // "vl": 4, + "boot-report": { + // "mua": "stdout", + "mua": "mailx", + // "mua": "aws-sns", + "mua-param": { + "int-opts": [ "smtp=localhost" ] + }, + "mail-to": [ "root" ], + // "subject": "Custom Boot Report Subject from {hostname}", + // "header": "Custom header content with {hostname} substitution." + // "uptime-since": true, + // "uptime": true, + // "bootid": true, + // "boot-wait": "systemd", + "delay": 5 + }, + "tasks": [ + { + "id": "backup", + "type": "backup", + "backend": "null", + "backend-param": {}, + "object-groups": [ + { "id": "meta-run" }, + { + "id": "data-dump", + "depends": [ "meta-run" ] + }, + { + "id": "tar-root", + "depends": [ "data-dump" ] + } + ], + "objects": [ + { + "path": "os-release", + "group": "meta-run", + "pipeline": [ { "type": "exec" , "exec-id": "os-release" } ] + }, + { + "path": "pm-list.zstd", + "group": "meta-run", + "pipeline": [ + { "type": "exec", "exec-id": "rpm-list-installed" }, + { "type": "exec", "exec-id": "filter-zstd-plain" } + ] + }, + { + "path": "lsblk.json.zstd", + "group": "meta-run", + "pipeline": [ + { "type": "exec", "exec-id": "lsblk-all-json" }, + { "type": "exec", "exec-id": "filter-zstd-plain" } + ] + }, + // { + // "path": "db.sql.zstd", + // "group": "data-dump", + // "pipeline": [ + // { + // "type": "exec-inline", + // "argv": [ + // "/bin/mysqldump", + // "-uroot", + // "--all-databases" + // ] + // // "ec": "<=2" // don't fail when the DB is offline + // }, + // { "type": "exec", "exec-id": "filter-zstd-parallel" } + // ] + // }, + { + "path": "root.tar.zstd", + "group": "tar-root", + "pipeline": [ + { + "type": "exec-append", + "exec-id": "tar", + "argv": [ + "-C", + "/", + "etc", + "home", + "root", + "var" + ] + }, + { "type": "exec", "exec-id": "filter-zstd-parallel" } + ] + } + ] + }, + { + "id": "update", + "type": "routine", + "routine": [ + { + "type": "exec-inline", + "argv": [ "/bin/dnf", "--refresh", "-yq", "update" ] + } + // { + // "type": "exec-inline", + // "argv": [ "/bin/sa-update" ] + // } + ] + }, + { + "id": "reboot", + "type": "routine", + "routine": [ + { +/* + * Block SIGTERM from systemd/init.d so PALHM can exit gracefully after issuing + * reboot. + */ + "type": "builtin", + "builtin-id": "sigmask", + "param": [ + { "action": "block", "sig": [ "TERM" ] } + ] + }, + { + "type": "exec-inline", + "argv": [ "/sbin/reboot" ] + } + ] + }, + { + "id": "check-dnssec", + "type": "backup", + "backend": "null", + "objects": [ + { + "path": "example.com", // Placeholder + "pipeline": [ + /* + * Check if dig can query the record with the DNSSEC + * validation flag. Empty stdout with zero return code + * means SERVFAIL. + */ + { + "type": "exec-append", + "exec-id": "dig-dnssec", + "argv": [ "ANY", "example.com" ] + }, + /* + * Trap for empty dig output grep will return non-zero if + * dig have not produced any output + */ + { "type": "exec", "exec-id": "grep-any" } + ] + } + ] + }, + { + "id": "default", + "type": "routine", + "routine": [ + { "type": "task", "task-id": "backup" }, + { "type": "task", "task-id": "update" }, + { "type": "task", "task-id": "reboot" } + ] + } + ] +} -- cgit v1.2.3-70-g09d2