From ff56fbf1909d79fa44a0adfd095a7a9692dc469e Mon Sep 17 00:00:00 2001 From: Cameron Thompson <50184035+iamromulan@users.noreply.github.com> Date: Wed, 10 Apr 2024 00:45:02 -0400 Subject: [PATCH] Combine daemon and CLI into one script --- simpleupdates/simpleupdate | 180 +++++++++++++++++++++++++++++++++---- 1 file changed, 165 insertions(+), 15 deletions(-) diff --git a/simpleupdates/simpleupdate b/simpleupdates/simpleupdate index 4bae180..f98125c 100644 --- a/simpleupdates/simpleupdate +++ b/simpleupdates/simpleupdate @@ -1,7 +1,144 @@ #!/bin/bash -# Configuration file path +# Configuration and directories CONFIG_FILE="/usrdata/simpleupdate/simpleupdate.conf" +GITUSER="iamromulan" +GITTREE="main" +DIRECTORIES=("simpleadmin" "socat-at-bridge" "simplefirewall" "tailscale" "ttyd") +BASE_URL="https://raw.githubusercontent.com/$GITUSER/quectel-rgmii-toolkit/$GITTREE" +LOG_FILE="/tmp/simpleupdate.log" + +# Load configuration +load_config() { + if [[ -f "$CONFIG_FILE" ]]; then + source "$CONFIG_FILE" + else + echo "Configuration file ($CONFIG_FILE) not found." + exit 1 + fi +} + +# Function to trim the log file to the last 100 lines +trim_log_file() { + tail -n 100 "$LOG_FILE" > "$LOG_FILE.tmp" && mv "$LOG_FILE.tmp" "$LOG_FILE" +} + +# Function to check for updates +check_for_updates() { + echo "$(date): Checking for updates..." + for dir in "${DIRECTORIES[@]}"; do + local remote_rev=$(wget -qO- "$BASE_URL/$dir/.rev") + local local_rev_file="/usrdata/$dir/.rev" + + if [[ ! -f "$local_rev_file" ]]; then + echo "No local revision file found for $dir, skipping." + continue + fi + + local local_rev=$(cat "$local_rev_file") + + if [[ "$remote_rev" -gt "$local_rev" ]]; then + echo "Update available for $dir, updating..." + wget -qO "/tmp/update_${dir}.sh" "$BASE_URL/simpleupdates/scripts/update_${dir}.sh" + chmod +x "/tmp/update_${dir}.sh" + "/tmp/update_${dir}.sh" + else + echo "$dir is up to date." + fi + done + trim_log_file + wait_to_update +} + +# Function to wait and trigger updates based on scheduling +wait_to_update() { + echo "Waiting for the next update check according to schedule..." + while true; do + local current_time=$(date "+%H:%M") + local current_day=$(date "+%a") + local current_date=$(date "+%d") + + case $UPDATE_FREQUENCY in + daily) + if [[ "$current_time" == "$SCHEDULED_TIME" ]]; then + check_for_updates + fi + ;; + weekly) + if [[ "$current_day" == "$WEEKLY_DAY" && "$current_time" == "$SCHEDULED_TIME" ]]; then + check_for_updates + fi + ;; + monthly) + if [[ "$current_date" == "$MONTHLY_DATE" && "$current_time" == "$SCHEDULED_TIME" ]]; then + check_for_updates + fi + ;; + none) + echo "Update checking is disabled by frequency setting." + exit 0 + ;; + esac + sleep 30 # Sleep for 30 seconds for more granular checks + trim_log_file + done +} + +# Daemon mode to wait and trigger updates based on scheduling +daemon_mode() { + load_config + exec > >(tee -a "$LOG_FILE") 2>&1 + echo "Daemon mode started." + # Validate only one update frequency is defined + frequency_count=0 + [[ "$UPDATE_FREQUENCY" == "daily" ]] && ((frequency_count++)) + [[ "$UPDATE_FREQUENCY" == "weekly" ]] && ((frequency_count++)) + [[ "$UPDATE_FREQUENCY" == "monthly" ]] && ((frequency_count++)) + + if [[ $frequency_count -gt 1 ]]; then + echo "Error: More than one update frequency is defined. Exiting." + exit 1 + elif [[ $frequency_count -eq 0 && "$UPDATE_FREQUENCY" != "none" ]]; then + echo "Error: No valid update frequency defined. Exiting." + exit 1 + fi + if [[ "$CONF_ENABLED" == "no" ]]; then + echo "Updates are disabled in the configuration." + exit 0 +fi + +if [[ "$CHECK_AT_BOOT" == "yes" ]]; then + check_for_updates +else + wait_to_update +fi +} + +# Function to check for updates +force_check_for_updates() { + echo "$(date): Checking for updates..." + for dir in "${DIRECTORIES[@]}"; do + local remote_rev=$(wget -qO- "$BASE_URL/$dir/.rev") + local local_rev_file="/usrdata/$dir/.rev" + + if [[ ! -f "$local_rev_file" ]]; then + echo "No local revision file found for $dir, skipping." + continue + fi + + local local_rev=$(cat "$local_rev_file") + + if [[ "$remote_rev" -gt "$local_rev" ]]; then + echo "Update available for $dir, updating..." + wget -qO "/tmp/update_${dir}.sh" "$BASE_URL/simpleupdates/scripts/update_${dir}.sh" + chmod +x "/tmp/update_${dir}.sh" + "/tmp/update_${dir}.sh" + else + echo "$dir is up to date." + fi + done + exit 0 +} # Helper function to load and update the configuration update_config() { @@ -38,12 +175,6 @@ disable_updates() { echo "Automatic updates have been disabled." } -# Manually start the update process -start_update() { - /usrdata/simpleupdate/simpleupdated & - echo "The update process has been started manually." -} - # Interactive setup for the update configuration setup() { read -p "Enable automatic updates? [yes/no]: " enable_updates @@ -91,15 +222,34 @@ setup() { echo "Update configuration has been set." } -# Parse command-line arguments +# Command operations: status, enable, disable, update, setup case "$1" in - status) status ;; - enable) enable_updates ;; - disable) disable_updates ;; - start) start_update ;; - setup) setup ;; + d) + daemon_mode + ;; + update) + load_config + force_check_for_updates + ;; + status) + status + ;; + enable) + enable_updates + ;; + disable) + disable_updates + ;; + setup) + setup + ;; *) - echo "Usage: $0 {status|enable|disable|start|setup}" - exit 1 + echo "Usage:" + echo "d: Run as a background check daemon" + echo "update: Force check for and install updates" + echo "status: Display current set update schedule" + echo "enable: Enable automatic updates" + echo "disable: Disable automatic updates" + echo "setup: Set up an automatic update schedule" ;; esac