From 450ba9229b3b1bf1dbce079d0d2441de28d32550 Mon Sep 17 00:00:00 2001 From: yukkop Date: Sat, 25 Oct 2025 06:48:48 +0000 Subject: [PATCH] feat(package): `sentinel`: some changes --- flake.nix | 8 +++--- package/deploy/deploy.sh | 1 - package/sentinèlla/router.sh | 20 +++++++++++++++ package/sentinèlla/scheme.sql | 13 ++++++++++ package/sentinèlla/sentinel.sh | 46 ++++++++++++++++++++++++---------- 5 files changed, 70 insertions(+), 18 deletions(-) create mode 100644 package/sentinèlla/scheme.sql diff --git a/flake.nix b/flake.nix index 4fd3297..932a84c 100644 --- a/flake.nix +++ b/flake.nix @@ -104,14 +104,14 @@ inherit system; modules = [ self.nixosModules.hectic - { services.hardware.lenovo-ideapad-15arh7 = opts; } + { hectic.hardware.lenovo-ideapad-15arh7 = opts; } ]; }); cases = { - enable = { enable = true; }; - disabled = { enable = false; }; - customFoo = { enable = true; foo = "bar"; }; + #enable = { enable = true; }; + #disabled = { enable = false; }; + #customFoo = { enable = true; foo = "bar"; }; }; in nixpkgs.lib.mapAttrs (name: opts: (mkSys system opts).config.system.build.toplevel) cases; diff --git a/package/deploy/deploy.sh b/package/deploy/deploy.sh index d8d063b..856ad76 100644 --- a/package/deploy/deploy.sh +++ b/package/deploy/deploy.sh @@ -1,7 +1,6 @@ #!/bin/dash # requirements: ssh-to-age nixos-anywhere -# jjjn # ssh proxydoe 'cat /etc/os-release 2>/dev/null || echo "no /etc/os-release"' | grep '^NAME=NixOS$' # NAME=NixOS diff --git a/package/sentinèlla/router.sh b/package/sentinèlla/router.sh index 804099d..1025daf 100644 --- a/package/sentinèlla/router.sh +++ b/package/sentinèlla/router.sh @@ -12,6 +12,26 @@ # TIMEOUT=5 # AUTH_FILE="/path/htpasswd-like" # lines: user:pass +# output example +# { +# "checks": [], +# "summary": { +# "total": 0, +# "ok": 0 +# } +# "disk": { +# "volumes": [ +# { +# "mount": "/dev", +# "size_blocks": 195760, +# "used": 0, +# "avail": 195760, +# "use_percent": "0%" +# } +# ] +# } +# } + : "${TIMEOUT:=5}" : "${VOLUMES:=$(df -P | awk 'NR>1{print $6}')}" diff --git a/package/sentinèlla/scheme.sql b/package/sentinèlla/scheme.sql new file mode 100644 index 0000000..bd68ead --- /dev/null +++ b/package/sentinèlla/scheme.sql @@ -0,0 +1,13 @@ +CREATE TABLE status ( + id INTEGER PRIMARY KEY, -- integer in sqlite almoust infinity + time DATETIME DEFAULT CURRENT_TIMESTAMP, + status TEXT NOT NULL +); + +CREATE TABLE disk ( + id INTEGER PRIMARY KEY, -- integer in sqlite almoust infinity + time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + server TEXT NOT NULL, + disk TEXT NOT NULL, + space INTEGER NOT NULL +); diff --git a/package/sentinèlla/sentinel.sh b/package/sentinèlla/sentinel.sh index 0901761..fd54b46 100644 --- a/package/sentinèlla/sentinel.sh +++ b/package/sentinèlla/sentinel.sh @@ -1,5 +1,7 @@ #!/bin/dash # sentinel.sh — polls probe backends (/status) and notifies on status change via Telegram +# requirements: +# curl, awk, sqlite, jq # Env: # SERVERS="http://host1:8080,http://host2:8080" # TOKENS="-,b64token2" # CSV aligned with SERVERS; "-" means no auth @@ -12,6 +14,24 @@ set -eu +#SQLITE_SCHEME=" +#CREATE TABLE IF NOT EXISTS status ( +# id INTEGER PRIMARY KEY, -- integer in sqlite almoust infinity +# time DATETIME DEFAULT CURRENT_TIMESTAMP, +# status TEXT NOT NULL +#); +# +#CREATE TABLE IF NOT EXISTS disk ( +# id INTEGER PRIMARY KEY, -- integer in sqlite almoust infinity +# time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, +# server TEXT NOT NULL, +# disk TEXT NOT NULL, +# space INTEGER NOT NULL +#);" + +PREFIX_OK="OK " +PREFIX_FAIL="FAIL" + TIMEOUT=${TIMEOUT:-5} POLLING_INTERVAL_SEC=${POLLING_INTERVAL_SEC:-3} SERVERS=${SERVERS:-} @@ -48,14 +68,14 @@ get_csv() { } notify() { - msg=$1 + msg=${1:?} if [ -n "$TOKEN" ] && [ -n "$CHAT_ID" ]; then curl -sS -m "$TIMEOUT" -X POST "https://api.telegram.org/bot${TOKEN}/sendMessage" \ -d "chat_id=${CHAT_ID}" \ - --data-urlencode "text=${msg}" >/dev/null || printf >&2 'notify failed: %s\n' "$msg" - else - printf >&2 '%s\n' "$msg" + --data-urlencode "text=${msg}" >/dev/null || log error "notify failed: $msg" fi + + log notice "notify message: ${WHITE}${msg}${NC}" } # sid(text) @@ -78,7 +98,7 @@ list_failures() { # server_status_message(msg_prefix, server, ok_amount, total_amount, fail_list) server_status_message() { - msg=$(printf '%s: %s [%s/%s]%s' "${1:?}" "${2:?}" "${3:?}" "${4:?}" "$5") + printf '%s: %s [%s/%s]%s' "${1:?}" "${2:?}" "${3:?}" "${4:?}" "$5" } # --- main loop --- @@ -102,26 +122,26 @@ while :; do code=$(sh -c "curl -sS -m \"$TIMEOUT\" -w '%{http_code}' -o \"$tmpb\" $auth_h \"$url\"") || code="000" body=$(cat "$tmpb"); rm -f "$tmpb" - log info "server ${WHITE}${srv}${NC}\ncode ${WHITE}${code}${NC}\nbody ${WHITE}${body}${NC}" + #log info "server ${WHITE}${srv}${NC}\ncode ${WHITE}${code}${NC}\nbody ${WHITE}${body}${NC}" - ok="down"; tot=0; good=0 + ok="down"; total=0; good=0 if [ "$code" = "200" ]; then - s=$(printf '%s' "$body" | parse_summary || true) - [ -n "$s" ] && { tot=${s%% *}; good=${s#* }; } - [ "$tot" -eq "$good" ] && ok="up" + summary=$(printf '%s' "$body" | parse_summary || true) + [ -n "$summary" ] && { total=${summary%% *}; good=${summary#* }; } + [ "$total" -eq "$good" ] && ok="up" fi - msg_prefix=$( [ "$ok" = "up" ] && printf 'OK' || printf 'FAIL' ) + msg_prefix=$( [ "$ok" = "up" ] && printf '%s' "$PREFIX_OK" || printf '%s' "$PREFIX_FAIL" ) fail_list="" if [ "$ok" = "down" ] && [ -n "$body" ]; then fails=$(printf '%s' "$body" | list_failures | sed 's/[ ]$//') [ -n "$fails" ] && fail_list=" — ${fails}" fi - msg=$(server_status_message "$msg_prefix" "$srv" "$good" "$tot" "$fail_list") + msg=$(server_status_message "$msg_prefix" "$srv" "$good" "$total" "$fail_list") sfile="${STATE_DIR}/$(sid "$srv").state" last=""; [ -f "$sfile" ] && last=$(cat "$sfile") - cur="${ok}:${good}/${tot}:${code}" + cur="${ok}:${good}/${total}:${code}" if [ "$cur" != "$last" ]; then notify "$msg" printf '%s' "$cur" >"$sfile"