#!/usr/bin/env bash set -euo pipefail client_home=/var/lib/n2usenet/nym client_bin=/opt/n2usenet/bin/nym-socks5-client check_bin=/opt/n2usenet/bin/n2u-check gateway_db="$client_home/.nym/socks5-clients/n2usenet/data/gateways_registrations.sqlite" backup_root=/var/lib/n2usenet-gateway-watch/backups renew_before_seconds=86400 lock_file=/run/n2usenet-gateway-watch/lock exec 9>"$lock_file" if ! flock -n 9; then exit 0 fi for required in "$client_bin" "$check_bin" "$gateway_db" /etc/n2usenet/smtp-password; do if [[ ! -e "$required" ]]; then logger -t n2usenet-gateway-watch "required path is missing: $required" exit 1 fi done expiry=$(sqlite3 "$gateway_db" "select d.expiration_timestamp from active_gateway a join remote_gateway_details d on d.gateway_id_bs58=a.active_gateway_id_bs58;") if [[ -n "$expiry" ]]; then expiry_epoch=$(date -u -d "$expiry" +%s) now_epoch=$(date -u +%s) if (( expiry_epoch - now_epoch > renew_before_seconds )); then exit 0 fi fi stamp=$(date -u +%Y%m%dT%H%M%SZ) backup_dir="$backup_root/$stamp" install -d -m 0700 "$backup_dir" restart_services() { systemctl start n2usenet-socks.service || true systemctl start n2usenet.service || true } trap restart_services EXIT systemctl stop n2usenet.service n2usenet-socks.service cp -a "$gateway_db" "$backup_dir/gateways_registrations.sqlite.before" if ! runuser -u n2usenet -- "$client_bin" add-gateway --id n2usenet --set-active -o json; then cp -a "$backup_dir/gateways_registrations.sqlite.before" "$gateway_db" chown n2usenet:n2usenet "$gateway_db" logger -t n2usenet-gateway-watch "gateway registration failed; previous state restored" exit 1 fi chown -R n2usenet:n2usenet "$client_home/.nym" systemctl start n2usenet-socks.service sleep 5 if ! "$check_bin" \ -socks 127.0.0.1:11080 \ -smtp 51.178.55.22:587 \ -tls-name mail.virebent.art \ -helo n2usenet.virebent.art \ -auth-user n2usenet@virebent.art \ -auth-password-file /etc/n2usenet/smtp-password \ -timeout 180s; then systemctl stop n2usenet-socks.service cp -a "$backup_dir/gateways_registrations.sqlite.before" "$gateway_db" chown n2usenet:n2usenet "$gateway_db" logger -t n2usenet-gateway-watch "new gateway failed transport verification; previous state restored" exit 1 fi systemctl start n2usenet.service trap - EXIT logger -t n2usenet-gateway-watch "gateway renewed and transport verification passed"