#!/bin/bash # ppf-db -- manage PPF databases # # Usage: # ppf-db [options] # # Commands: stats, purge-proxies, vacuum set -eu # Resolve to real path (handles symlinks from ~/.local/bin/) SCRIPT_PATH="$(cd "$(dirname "$0")" && pwd)/$(basename "$0")" SCRIPT_DIR="$(dirname "$(readlink -f "$SCRIPT_PATH")")" # shellcheck disable=SC1091 . "$SCRIPT_DIR/lib/ppf-common.sh" PROXY_DB="/home/podman/ppf/data/proxies.sqlite" URL_DB="/home/podman/ppf/data/websites.sqlite" # --------------------------------------------------------------------------- # Usage # --------------------------------------------------------------------------- usage() { cat < [options] Manage PPF databases on odin (master). Commands: stats show proxy and URL counts purge-proxies delete all proxies (keeps URLs) vacuum reclaim disk space after purge Options: --help show this help --version show version Examples: ppf-db stats ppf-db purge-proxies ppf-db vacuum EOF exit 0 } # --------------------------------------------------------------------------- # Helpers # --------------------------------------------------------------------------- run_sql() { local db="$1" sql="$2" ansible_cmd "$MASTER" -m raw -a \ "sudo -u podman sqlite3 '$db' \"$sql\"" 2>/dev/null \ | sed 's/Shared connection.*//; /^\s*$/d; /^odin/d; /CHANGED/d; /SUCCESS/d' } # --------------------------------------------------------------------------- # Commands # --------------------------------------------------------------------------- cmd_stats() { section "Database stats (odin)" local proxies total_urls active_urls working proxies=$(run_sql "$PROXY_DB" "SELECT COUNT(*) FROM proxylist;") working=$(run_sql "$PROXY_DB" "SELECT COUNT(*) FROM proxylist WHERE failed=0 AND proto IS NOT NULL;") total_urls=$(run_sql "$URL_DB" "SELECT COUNT(*) FROM uris;") active_urls=$(run_sql "$URL_DB" "SELECT COUNT(*) FROM uris WHERE error=0;") log_info "Proxies: ${proxies} total, ${working} working" log_info "URLs: ${total_urls} total, ${active_urls} active" } cmd_purge_proxies() { section "Purging proxies from odin" # Get counts before local before before=$(run_sql "$PROXY_DB" "SELECT COUNT(*) FROM proxylist;") log_info "Proxies before: $before" # Stop container log_info "Stopping container..." compose_cmd "$MASTER" "down" > /dev/null 2>&1 \ && log_ok "Container stopped" \ || die "Failed to stop container" # Delete proxies log_info "Deleting proxylist rows..." run_sql "$PROXY_DB" "DELETE FROM proxylist;" > /dev/null 2>&1 log_ok "Proxylist purged" # Vacuum to reclaim space log_info "Vacuuming database..." run_sql "$PROXY_DB" "VACUUM;" > /dev/null 2>&1 log_ok "Database vacuumed" # Verify URLs intact local urls_after urls_after=$(run_sql "$URL_DB" "SELECT COUNT(*) FROM uris;") log_ok "URLs preserved: $urls_after" # Start container log_info "Starting container..." compose_cmd "$MASTER" "up -d" > /dev/null 2>&1 \ && log_ok "Container started" \ || die "Failed to start container" } cmd_vacuum() { section "Vacuuming database (odin)" local before after before=$(ansible_cmd "$MASTER" -m raw -a \ "sudo -u podman ls -lh '$PROXY_DB'" 2>/dev/null \ | grep -oE '[0-9]+[KMG]?' | head -1) run_sql "$PROXY_DB" "VACUUM;" > /dev/null 2>&1 after=$(ansible_cmd "$MASTER" -m raw -a \ "sudo -u podman ls -lh '$PROXY_DB'" 2>/dev/null \ | grep -oE '[0-9]+[KMG]?' | head -1) log_ok "Vacuumed: ${before:-?} -> ${after:-?}" } # --------------------------------------------------------------------------- # Parse args # --------------------------------------------------------------------------- [ $# -eq 0 ] && usage COMMAND="" while [ $# -gt 0 ]; do case "$1" in --help|-h) usage ;; --version|-V) echo "ppf-db $PPF_TOOLS_VERSION"; exit 0 ;; stats|purge-proxies|vacuum) [ -n "$COMMAND" ] && die "Multiple commands given" COMMAND="$1" ;; -*) die "Unknown option: $1" ;; *) die "Unknown command: $1" ;; esac shift done [ -z "$COMMAND" ] && die "No command given. Use: stats, purge-proxies, vacuum" case "$COMMAND" in stats) cmd_stats ;; purge-proxies) cmd_purge_proxies ;; vacuum) cmd_vacuum ;; esac printf "\n"