commit 7e5662ced43b6a7a563789b01cec7ff80136b294 Author: Ed Nielsen Date: Wed Mar 18 13:09:14 2026 +0100 Initial commit: update manager with examples and README diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5073d7d --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +hosts.conf +update-manager.conf +*.log diff --git a/README.md b/README.md new file mode 100644 index 0000000..22b3d8e --- /dev/null +++ b/README.md @@ -0,0 +1,31 @@ +# Update Manager + +Lightweight SSH-based update manager for Linux systems. + +## Features + +- Check for updates across multiple hosts +- Run upgrades remotely via SSH +- Run autoremove +- Simple inventory file +- No external dependencies + +## Usage + +./lanx-update.sh check +./lanx-update.sh update +./lanx-update.sh autoremove +./lanx-update.sh full + +## Hosts file format + +name|ip|ssh_user + +Example: + +server1|192.168.1.10|user + +## Config + +HOSTS_FILE="/opt/lanx/hosts.conf" +NTFY_URL="" diff --git a/hosts.conf.example b/hosts.conf.example new file mode 100644 index 0000000..f4269a7 --- /dev/null +++ b/hosts.conf.example @@ -0,0 +1,3 @@ +# name|ip|ssh_user +server1|192.168.1.10|user +server2|192.168.1.20|user diff --git a/lanx-update.sh b/lanx-update.sh new file mode 100755 index 0000000..80b3610 --- /dev/null +++ b/lanx-update.sh @@ -0,0 +1,103 @@ +#!/usr/bin/env bash + +HOSTS_FILE="/opt/lanx/hosts.conf" + +check_host() { + local name="$1" + local ip="$2" + local user="$3" + local result + + echo "===== $name ($ip) =====" + + result=$(ssh -n -o BatchMode=yes -o ConnectTimeout=5 "${user}@${ip}" \ + "apt-get -s upgrade 2>/dev/null | grep '^Inst'") + + if [[ -z "$result" ]]; then + echo "[OK] Up-to-date" + else + echo "[UPDATES]" + echo "$result" + fi + + echo +} + +update_host() { + local name="$1" + local ip="$2" + local user="$3" + + echo "===== $name ($ip) =====" + + ssh -n -o BatchMode=yes -o ConnectTimeout=5 "${user}@${ip}" \ + "sudo -n apt-get update && sudo -n apt-get upgrade -y" || { + echo "[FEJL] kunne ikke opdatere" + } + + echo +} + +autoremove_host() { + local name="$1" + local ip="$2" + local user="$3" + + echo "===== $name ($ip) =====" + + ssh -n -o BatchMode=yes -o ConnectTimeout=5 "${user}@${ip}" \ + "sudo -n apt-get autoremove -y" || { + echo "[FEJL] kunne ikke køre autoremove" + } + + echo +} + +full_host() { + local name="$1" + local ip="$2" + local user="$3" + + echo "===== $name ($ip) =====" + + ssh -n -o BatchMode=yes -o ConnectTimeout=5 "${user}@${ip}" \ + "sudo -n apt-get update && sudo -n apt-get upgrade -y && sudo -n apt-get autoremove -y" || { + echo "[FEJL] kunne ikke køre full maintenance" + } + + echo +} + +run_action() { + local action="$1" + + if [[ ! -f "$HOSTS_FILE" ]]; then + echo "FEJL: hosts-fil findes ikke: $HOSTS_FILE" + exit 1 + fi + + while IFS='|' read -r name ip user || [[ -n "$name" ]]; do + [[ -z "$name" || "$name" =~ ^# ]] && continue + + case "$action" in + check) + check_host "$name" "$ip" "$user" + ;; + update) + update_host "$name" "$ip" "$user" + ;; + autoremove) + autoremove_host "$name" "$ip" "$user" + ;; + full) + full_host "$name" "$ip" "$user" + ;; + *) + echo "Brug: $0 {check|update|autoremove|full}" + exit 1 + ;; + esac + done < "$HOSTS_FILE" +} + +run_action "$1" diff --git a/update-manager.conf.example b/update-manager.conf.example new file mode 100644 index 0000000..b7013a5 --- /dev/null +++ b/update-manager.conf.example @@ -0,0 +1,2 @@ +HOSTS_FILE="/opt/lanx/hosts.conf" +NTFY_URL=""