Combine daemon and CLI into one script

This commit is contained in:
Cameron Thompson
2024-04-10 00:45:02 -04:00
committed by GitHub
parent ce5e328bae
commit ff56fbf190

View File

@@ -1,7 +1,144 @@
#!/bin/bash #!/bin/bash
# Configuration file path # Configuration and directories
CONFIG_FILE="/usrdata/simpleupdate/simpleupdate.conf" 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 # Helper function to load and update the configuration
update_config() { update_config() {
@@ -38,12 +175,6 @@ disable_updates() {
echo "Automatic updates have been disabled." 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 # Interactive setup for the update configuration
setup() { setup() {
read -p "Enable automatic updates? [yes/no]: " enable_updates read -p "Enable automatic updates? [yes/no]: " enable_updates
@@ -91,15 +222,34 @@ setup() {
echo "Update configuration has been set." echo "Update configuration has been set."
} }
# Parse command-line arguments # Command operations: status, enable, disable, update, setup
case "$1" in case "$1" in
status) status ;; d)
enable) enable_updates ;; daemon_mode
disable) disable_updates ;; ;;
start) start_update ;; update)
setup) setup ;; load_config
force_check_for_updates
;;
status)
status
;;
enable)
enable_updates
;;
disable)
disable_updates
;;
setup)
setup
;;
*) *)
echo "Usage: $0 {status|enable|disable|start|setup}" echo "Usage:"
exit 1 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 esac