From ab945b1caf3612954ebf8906064125759d53ec0b Mon Sep 17 00:00:00 2001 From: Ed Nielsen Date: Wed, 18 Mar 2026 19:25:01 +0100 Subject: [PATCH] Add logging, dialog UI, README updates and initial release --- README.md | 2 +- log/update-manager.sh | 117 ++++++++++++++++++++++++++ update-manager-ui.sh | 152 ++++++++++++++++++++++++++++++++++ update-manager.sh | 186 ++++++++++++++++-------------------------- 4 files changed, 339 insertions(+), 118 deletions(-) create mode 100644 log/update-manager.sh create mode 100755 update-manager-ui.sh diff --git a/README.md b/README.md index 36fcbfb..f0286cf 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 🖥️ Update Manager +# 🖥️ Update Manager - Version: 1.0.0 Simple CLI tool to check and manage updates across multiple Ubuntu systems over SSH. diff --git a/log/update-manager.sh b/log/update-manager.sh new file mode 100644 index 0000000..d3e9635 --- /dev/null +++ b/log/update-manager.sh @@ -0,0 +1,117 @@ +#!/usr/bin/env bash + +UPDATE_MANAGER_SCRIPT="/opt/update-manager/update-manager.sh" + +get_log_file() { + local primary="/opt/update-manager/log/update-manager.log" + local fallback="$HOME/update-manager/log/update-manager.log" + + if [[ -f "$primary" ]]; then + echo "$primary" + else + echo "$fallback" + fi +} + +run_check() { + echo + bash "$UPDATE_MANAGER_SCRIPT" check + echo + read -rp "Press Enter to continue..." +} + +view_log() { + local log_file + log_file="$(get_log_file)" + + echo + if [[ -f "$log_file" ]]; then + less "$log_file" + else + echo "Log file not found: $log_file" + echo + read -rp "Press Enter to continue..." + fi +} + +follow_log() { + local log_file + log_file="$(get_log_file)" + + echo + if [[ -f "$log_file" ]]; then + echo "Following log: $log_file" + echo "Press Ctrl+C to stop." + echo + tail -f "$log_file" + else + echo "Log file not found: $log_file" + fi + + echo + read -rp "Press Enter to continue..." +} + +show_log_location() { + local log_file + log_file="$(get_log_file)" + + echo + echo "Log file location:" + echo "$log_file" + echo + read -rp "Press Enter to continue..." +} + +show_menu() { + clear + echo "==================================" + echo " Update Manager UI" + echo "==================================" + echo + echo "1) Run update check" + echo "2) View full log" + echo "3) Follow log live" + echo "4) Show log location" + echo "0) Exit" + echo +} + +main() { + if [[ ! -f "$UPDATE_MANAGER_SCRIPT" ]]; then + echo "Update manager script not found: $UPDATE_MANAGER_SCRIPT" + exit 1 + fi + + while true; do + show_menu + read -rp "Choose an option: " choice + + case "$choice" in + 1) + run_check + ;; + 2) + view_log + ;; + 3) + follow_log + ;; + 4) + show_log_location + ;; + 0) + echo + echo "Bye." + exit 0 + ;; + *) + echo + echo "Invalid choice." + read -rp "Press Enter to continue..." + ;; + esac + done +} + +main diff --git a/update-manager-ui.sh b/update-manager-ui.sh new file mode 100755 index 0000000..97bb29c --- /dev/null +++ b/update-manager-ui.sh @@ -0,0 +1,152 @@ +#!/usr/bin/env bash + +UPDATE_MANAGER_SCRIPT="$HOME/update-manager/update-manager.sh" +HOSTS_FILE="/opt/update-manager/hosts.conf" + +get_log_file() { + local primary="/opt/update-manager/log/update-manager.log" + local fallback="$HOME/update-manager/log/update-manager.log" + + if [[ -f "$primary" ]]; then + echo "$primary" + else + echo "$fallback" + fi +} + +run_check() { + echo + bash "$UPDATE_MANAGER_SCRIPT" check + echo + read -rp "Press Enter to continue..." +} + +view_hosts() { + echo + if [[ -f "$HOSTS_FILE" ]]; then + cat "$HOSTS_FILE" + else + echo "Hosts file not found: $HOSTS_FILE" + fi + echo + read -rp "Press Enter to continue..." +} + +edit_hosts() { + nano "$HOSTS_FILE" +} + +add_host() { + echo + read -rp "Name: " name + read -rp "IP: " ip + read -rp "User: " user + + echo "$name $ip $user" >> "$HOSTS_FILE" + + echo "Host added." + echo + read -rp "Press Enter to continue..." +} + +remove_host() { + echo + nl -w2 -s'. ' "$HOSTS_FILE" + echo + read -rp "Enter line number to remove: " line + + sed -i "${line}d" "$HOSTS_FILE" + + echo "Host removed." + echo + read -rp "Press Enter to continue..." +} + +view_log() { + local log_file + log_file="$(get_log_file)" + + echo + if [[ -f "$log_file" ]]; then + less "$log_file" + else + echo "Log file not found: $log_file" + read -rp "Press Enter to continue..." + fi +} + +follow_log() { + local log_file + log_file="$(get_log_file)" + + echo + if [[ -f "$log_file" ]]; then + echo "Following log: $log_file" + echo "Press Ctrl+C to stop." + echo + tail -f "$log_file" + else + echo "Log file not found: $log_file" + fi + + echo + read -rp "Press Enter to continue..." +} + +show_log_location() { + local log_file + log_file="$(get_log_file)" + + echo + echo "Log file location:" + echo "$log_file" + echo + read -rp "Press Enter to continue..." +} + +show_menu() { + clear + echo "==================================" + echo " Update Manager UI" + echo "==================================" + echo + echo "1) Check all hosts" + echo "2) View hosts file" + echo "3) Edit hosts file" + echo "4) Add host" + echo "5) Remove host" + echo "6) View full log" + echo "7) Follow log live" + echo "8) Show log location" + echo "0) Exit" + echo +} + +main() { + while true; do + show_menu + read -rp "Choose an option: " choice + + case "$choice" in + 1) run_check ;; + 2) view_hosts ;; + 3) edit_hosts ;; + 4) add_host ;; + 5) remove_host ;; + 6) view_log ;; + 7) follow_log ;; + 8) show_log_location ;; + 0) + echo + echo "Bye." + exit 0 + ;; + *) + echo "Invalid choice" + read -rp "Press Enter to continue..." + ;; + esac + done +} + +main diff --git a/update-manager.sh b/update-manager.sh index 89b5ef9..679fea0 100755 --- a/update-manager.sh +++ b/update-manager.sh @@ -1,127 +1,79 @@ #!/usr/bin/env bash -CONFIG_FILE="/etc/update-manager.conf" -[[ -f "$CONFIG_FILE" ]] || CONFIG_FILE="./update-manager.conf" +UPDATE_MANAGER_SCRIPT="$HOME/update-manager/update-manager.sh" +HOSTS_FILE="/opt/update-manager/hosts.conf" -if [[ -f "$CONFIG_FILE" ]]; then - # shellcheck disable=SC1090 - source "$CONFIG_FILE" -fi +get_log_file() { + local primary="/opt/update-manager/log/update-manager.log" + local fallback="$HOME/update-manager/log/update-manager.log" -DEFAULT_HOSTS_FILE="${HOSTS_FILE:-/opt/update-manager/hosts.conf}" -SSH_OPTIONS="${SSH_OPTIONS:--o BatchMode=yes -o ConnectTimeout=5}" - -######################################## -# Ensure hosts file exists -######################################## - -ensure_hosts_file() { - if [[ ! -f "$DEFAULT_HOSTS_FILE" ]]; then - echo "Creating example hosts file: $DEFAULT_HOSTS_FILE" - - mkdir -p "$(dirname "$DEFAULT_HOSTS_FILE")" - - cat > "$DEFAULT_HOSTS_FILE" <<'EOF' -# Example hosts file -# Format: -# name ip user -# -# server1 192.168.1.10 user -# server2 192.168.1.20 user -# server3 10.0.0.5 root -EOF - fi -} - -######################################## -# Helpers -######################################## - -get_hosts_file() { - if [[ -n "$2" ]]; then - echo "$2" + if [[ -f "$primary" ]]; then + echo "$primary" else - echo "$DEFAULT_HOSTS_FILE" + echo "$fallback" fi } -usage() { - cat <&1 1>&2 2>&3) -Examples: - $0 check - $0 check /path/to/hosts.conf - HOSTS_FILE=/path/to/hosts.conf $0 check -USAGE -} + clear -######################################## -# Check single host -######################################## - -check_host() { - local name="$1" - local ip="$2" - local user="$3" - local result - local rc - - result=$(ssh -n $SSH_OPTIONS "${user}@${ip}" \ - "apt list --upgradable 2>/dev/null | sed '/^Listing/d'" 2>&1) - rc=$? - - printf "===== %s (%s) =====\n" "$name" "$ip" - - if [[ $rc -ne 0 ]]; then - echo "❌ connection failed" - echo "$result" - echo - return - fi - - if [[ -z "$result" ]]; then - echo "Up-to-date" - else - echo "$result" - fi - - echo -} - -######################################## -# Check all hosts -######################################## - -check_all() { - local hosts_file="$1" - - ensure_hosts_file - - while IFS= read -r line; do - [[ -z "$line" || "$line" =~ ^[[:space:]]*# ]] && continue - - local name ip user - read -r name ip user <<< "$line" - - [[ -z "$name" || -z "$ip" || -z "$user" ]] && continue - - check_host "$name" "$ip" "$user" - done < "$hosts_file" -} - -######################################## -# Main -######################################## - -case "${1:-}" in - check) - HOSTS_FILE_TO_USE="$(get_hosts_file "$@")" - check_all "$HOSTS_FILE_TO_USE" - ;; - *) - usage - exit 1 - ;; -esac + case $choice in + 1) + bash "$UPDATE_MANAGER_SCRIPT" check + read -rp "Press Enter to continue..." + ;; + 2) + less "$HOSTS_FILE" + ;; + 3) + nano "$HOSTS_FILE" + ;; + 4) + read -rp "Name: " name + read -rp "IP: " ip + read -rp "User: " user + echo "$name $ip $user" >> "$HOSTS_FILE" + echo "Host added." + read -rp "Press Enter to continue..." + ;; + 5) + nl -w2 -s'. ' "$HOSTS_FILE" + read -rp "Line to remove: " line + sed -i "${line}d" "$HOSTS_FILE" + echo "Host removed." + read -rp "Press Enter to continue..." + ;; + 6) + less "$(get_log_file)" + ;; + 7) + echo "Press Ctrl+C to stop" + tail -f "$(get_log_file)" + read -rp "Press Enter to continue..." + ;; + 8) + echo "Log file:" + echo "$(get_log_file)" + read -rp "Press Enter to continue..." + ;; + 0) + clear + exit 0 + ;; + esac +done