Automated update

This commit is contained in:
klein panic
2025-02-01 17:01:33 -05:00
parent 5e229fd859
commit 9935555da2

View File

@@ -1,5 +1,6 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -euo pipefail # Remove the -e flag so errors do not immediately terminate the script.
set -uo pipefail
IFS=$'\n\t' IFS=$'\n\t'
####################################### #######################################
@@ -14,8 +15,8 @@ ensure_file() {
chmod "$permissions" "$file" chmod "$permissions" "$file"
} }
ensure_file "$LOGFILE" 600 ensure_file "$LOGFILE" 600
# (Optional) Uncomment the following line to redirect all output to LOGFILE as well: # Uncomment the next line if you want to redirect all output to LOGFILE as well:
# exec > >(tee -a "$LOGFILE") 2>&1 exec > >(tee -a "$LOGFILE") 2>&1
echo "Advanced logging initialized at ${LOGFILE}" echo "Advanced logging initialized at ${LOGFILE}"
####################################### #######################################
@@ -33,9 +34,8 @@ ensure_file "$REPORT" 600
ensure_file "$SMS_REPORT" 600 ensure_file "$SMS_REPORT" 600
####################################### #######################################
# Error Trap Setup # Error Trap Setup (Logs error info before exiting)
####################################### #######################################
# This trap logs the line number and command that failed.
trap 'echo "Error on line $LINENO: command \"$BASH_COMMAND\" exited with status $?" >> "$REPORT"' ERR trap 'echo "Error on line $LINENO: command \"$BASH_COMMAND\" exited with status $?" >> "$REPORT"' ERR
####################################### #######################################
@@ -50,13 +50,11 @@ log_msg() {
# Security Check # Security Check
####################################### #######################################
security_variable=2 # Change this value as needed (0, 1, or 2) security_variable=2 # Change this value as needed (0, 1, or 2)
echo "Security variable is set to: $security_variable" echo "Security variable is set to: $security_variable"
if [ "$security_variable" -eq 0 ]; then if [ "$security_variable" -eq 0 ]; then
echo "Error: security_variable is set to 0. Exiting the script." echo "Error: security_variable is set to 0. Exiting the script."
exit 1 exit 1
fi fi
if [ "$security_variable" -eq 2 ]; then if [ "$security_variable" -eq 2 ]; then
echo "security_variable is set to 2. Running the script without further checks." echo "security_variable is set to 2. Running the script without further checks."
log_msg "Security check passed (security_variable=2)." log_msg "Security check passed (security_variable=2)."
@@ -95,17 +93,13 @@ if [ ! -f "$TXT_FILE" ]; then
log_msg "Configuration file '$TXT_FILE' not found." log_msg "Configuration file '$TXT_FILE' not found."
exit 1 exit 1
fi fi
if [ ! -f "$CREDENTIALS_FILE" ]; then if [ ! -f "$CREDENTIALS_FILE" ]; then
echo "Error: Credentials file '$CREDENTIALS_FILE' not found. Exiting the script." echo "Error: Credentials file '$CREDENTIALS_FILE' not found. Exiting the script."
log_msg "Credentials file '$CREDENTIALS_FILE' not found." log_msg "Credentials file '$CREDENTIALS_FILE' not found."
exit 1 exit 1
fi fi
# Source the credentials.
source "$CREDENTIALS_FILE" source "$CREDENTIALS_FILE"
log_msg "Credentials loaded from $CREDENTIALS_FILE." log_msg "Credentials loaded from $CREDENTIALS_FILE."
if [ -z "$EMAIL" ] || [ -z "$SSH_HOST" ] || [ -z "$PHONE_NUMBER" ]; then if [ -z "$EMAIL" ] || [ -z "$SSH_HOST" ] || [ -z "$PHONE_NUMBER" ]; then
echo "Error: Missing required credentials (EMAIL, SSH_HOST, or PHONE_NUMBER) in '$CREDENTIALS_FILE'. Exiting the script." echo "Error: Missing required credentials (EMAIL, SSH_HOST, or PHONE_NUMBER) in '$CREDENTIALS_FILE'. Exiting the script."
log_msg "Required credentials missing in $CREDENTIALS_FILE." log_msg "Required credentials missing in $CREDENTIALS_FILE."
@@ -113,9 +107,8 @@ if [ -z "$EMAIL" ] || [ -z "$SSH_HOST" ] || [ -z "$PHONE_NUMBER" ]; then
fi fi
####################################### #######################################
# Helper Functions (continued) # Other Helper Functions
####################################### #######################################
check_wifi() { check_wifi() {
nmcli -t -f ACTIVE,SSID dev wifi | grep -q "^yes" && ping -c 1 8.8.8.8 &>/dev/null nmcli -t -f ACTIVE,SSID dev wifi | grep -q "^yes" && ping -c 1 8.8.8.8 &>/dev/null
return $? return $?
@@ -124,17 +117,14 @@ check_wifi() {
get_repo_dirs() { get_repo_dirs() {
local valid_dirs=() local valid_dirs=()
while IFS= read -r repo_dir; do while IFS= read -r repo_dir; do
# Trim whitespace and skip empty or commented lines.
repo_dir=$(echo "$repo_dir" | xargs) repo_dir=$(echo "$repo_dir" | xargs)
if [[ -z "$repo_dir" || "$repo_dir" == \#* ]]; then if [[ -z "$repo_dir" || "$repo_dir" == \#* ]]; then
continue continue
fi fi
# Add repository if it exists and contains a .git folder.
if [ -d "$repo_dir" ] && [ -d "$repo_dir/.git" ]; then if [ -d "$repo_dir" ] && [ -d "$repo_dir/.git" ]; then
valid_dirs+=("$repo_dir") valid_dirs+=("$repo_dir")
fi fi
done < "$TXT_FILE" done < "$TXT_FILE"
# Output one repository per line.
printf "%s\n" "${valid_dirs[@]}" printf "%s\n" "${valid_dirs[@]}"
} }
@@ -241,25 +231,27 @@ is_valid_git_repo() {
return 0 return 0
} }
#######################################
# Main Repository Update Function
#######################################
update_repo() { update_repo() {
local repo_dir="$1" local repo_dir="$1"
local repo_number="$2" local repo_number="$2"
# Change directory and log failure if unable.
if ! cd "$repo_dir"; then if ! cd "$repo_dir"; then
log_msg "Repo #$repo_number: Unable to cd to $repo_dir" log_msg "Repo #$repo_number: Unable to cd to $repo_dir"
return 1 return 1
fi fi
log_msg "Processing repository #$repo_number at $repo_dir" log_msg "Processing repository #$repo_number at $repo_dir"
# Validate the .git folder. # Validate the repository.
if ! is_valid_git_repo "$repo_dir"; then if ! is_valid_git_repo "$repo_dir"; then
log_msg "Repo #$repo_number: Invalid repository. Skipping." log_msg "Repo #$repo_number: Invalid repository. Skipping."
echo "Invalid .git" >> "$SMS_REPORT" echo "Invalid .git" >> "$SMS_REPORT"
return 1 return 1
fi fi
# If the repository has no commits, create an initial empty commit. # If no commits exist, create an initial empty commit.
if ! git rev-parse HEAD &>/dev/null; then if ! git rev-parse HEAD &>/dev/null; then
log_msg "Repo #$repo_number: No commits found. Creating an initial empty commit." log_msg "Repo #$repo_number: No commits found. Creating an initial empty commit."
if ! git commit --allow-empty -m "Initial commit"; then if ! git commit --allow-empty -m "Initial commit"; then
@@ -269,7 +261,7 @@ update_repo() {
fi fi
fi fi
# Check for GitHub remote; if missing, try to create one. # Check for GitHub remote; if missing, attempt to create one.
local remote_available=true local remote_available=true
if ! check_github_remote; then if ! check_github_remote; then
log_msg "Repo #$repo_number: No valid GitHub remote found." log_msg "Repo #$repo_number: No valid GitHub remote found."
@@ -302,11 +294,9 @@ update_repo() {
return 0 return 0
fi fi
# Stage all changes. # Stage and commit changes.
log_msg "Repo #$repo_number: Staging all changes." log_msg "Repo #$repo_number: Staging all changes."
git add -A git add -A
# Commit changes.
if git -c commit.gpgSign=false commit -m "Automated update"; then if git -c commit.gpgSign=false commit -m "Automated update"; then
log_msg "Repo #$repo_number: Local commit succeeded." log_msg "Repo #$repo_number: Local commit succeeded."
else else
@@ -315,7 +305,7 @@ update_repo() {
return 0 return 0
fi fi
# Pull with rebase if remote exists and WiFi is available. # Pull with rebase if a remote exists and WiFi is available.
if [ "$remote_available" = true ] && check_wifi; then if [ "$remote_available" = true ] && check_wifi; then
log_msg "Repo #$repo_number: Attempting pull --rebase on branch 'main'." log_msg "Repo #$repo_number: Attempting pull --rebase on branch 'main'."
if timeout 60s git pull --rebase --no-edit origin main; then if timeout 60s git pull --rebase --no-edit origin main; then
@@ -323,7 +313,7 @@ update_repo() {
else else
local pull_exit=$? local pull_exit=$?
log_msg "Repo #$repo_number: Rebase failed with exit code $pull_exit; aborting rebase." log_msg "Repo #$repo_number: Rebase failed with exit code $pull_exit; aborting rebase."
git rebase --abort || log_msg "Repo #$repo_number: Failed to abort rebase." git rebase --abort || log_msg "Repo #$repo_number: Failed to abort rebase cleanly."
echo "Repo #$repo_number: Rebase Conflict" >> "$SMS_REPORT" echo "Repo #$repo_number: Rebase Conflict" >> "$SMS_REPORT"
echo "MC" echo "MC"
return 1 return 1
@@ -373,6 +363,9 @@ update_repo() {
return 0 return 0
} }
#######################################
# Main Script Execution
#######################################
echo "Starting auto git update script on $(date)" > "$REPORT" echo "Starting auto git update script on $(date)" > "$REPORT"
echo "(G-R), $(date)" > "$SMS_REPORT" echo "(G-R), $(date)" > "$SMS_REPORT"
@@ -392,7 +385,9 @@ repo_number=1
for repo_dir in "${repo_dirs[@]}"; do for repo_dir in "${repo_dirs[@]}"; do
echo "Updating repository #$repo_number: $repo_dir" echo "Updating repository #$repo_number: $repo_dir"
log_msg "Starting update for repository #$repo_number: $repo_dir" log_msg "Starting update for repository #$repo_number: $repo_dir"
update_repo "$repo_dir" "$repo_number" if ! update_repo "$repo_dir" "$repo_number"; then
log_msg "Error processing repository #$repo_number. Continuing with next repository."
fi
case "$(tail -n 1 "$SMS_REPORT")" in case "$(tail -n 1 "$SMS_REPORT")" in
*P) pushed_count=$((pushed_count + 1)) ;; *P) pushed_count=$((pushed_count + 1)) ;;
*NC*) no_change_count=$((no_change_count + 1)) ;; *NC*) no_change_count=$((no_change_count + 1)) ;;