#!/usr/bin/env bash # Check if required commands are available for cmd in git nmcli msmtp ssh scp gh; do if ! command -v "$cmd" &>/dev/null; then echo "$cmd is required but not installed. Exiting." exit 1 fi done # Configuration TXT_FILE="/home/klein/.config/setup/autogitupdate.txt" PHONE_NUMBER="2673479614@vtext.com" # Verizon SMS gateway EMAIL="kleinpanic@gmail.com" SUBJECT="G-U-R" REPORT="/tmp/git_update_report.txt" # Full detailed report SMS_REPORT="/tmp/git_update_sms.txt" # Minimal SMS summary SSH_HOST="eulerpi5" # Alias for the SSH connection SSH_DIR="/home/klein/reports" # Remote directory to store the report SMS_CHAR_LIMIT=160 # Character limit for SMS messages # Ensure the report files exist and have the correct permissions ensure_file() { local file="$1" local permissions="$2" [ ! -f "$file" ] && touch "$file" && chmod "$permissions" "$file" chmod "$permissions" "$file" } ensure_file "$REPORT" 600 ensure_file "$SMS_REPORT" 600 # Function to check WiFi connection and internet availability check_wifi() { nmcli -t -f ACTIVE,SSID dev wifi | grep -q "^yes" && ping -c 1 8.8.8.8 &>/dev/null return $? } # Function to fetch and clean repo directories from the text file get_repo_dirs() { local valid_dirs=() local invalid_dirs=() while IFS= read -r repo_dir; do if [ -d "$repo_dir" ] && [ -d "$repo_dir/.git" ]; then valid_dirs+=("$repo_dir") else invalid_dirs+=("$repo_dir") fi done < "$TXT_FILE" for dir in "${invalid_dirs[@]}"; do sed -i "\|$dir|d" "$TXT_FILE" done echo "${valid_dirs[@]}" } # Function to create GitHub repo if it doesn't exist create_github_repo() { local repo_name="$1" local repo_dir="$2" echo "Attempting to create GitHub repo for $repo_name" >> "$REPORT" # Use GitHub CLI to create the repo if gh repo create "$repo_name" --public --source="$repo_dir" --remote=origin --push; then echo "Successfully created GitHub repository $repo_name" >> "$REPORT" return 0 else echo "Failed to create GitHub repository $repo_name" >> "$REPORT" return 1 fi } # Function to check if a remote GitHub origin exists check_github_remote() { git remote -v | grep -q "github.com" } # Function to update, commit, and push the changes update_repo() { local repo_dir="$1" local repo_number="$2" cd "$repo_dir" || return echo "Processing repository number $repo_number" >> "$REPORT" git fetch origin if ! git merge origin/main --no-commit --no-ff; then echo "Merge conflict detected in repo $repo_number" >> "$REPORT" echo "Repo $repo_number: MC" >> "$SMS_REPORT" git merge --abort return 1 fi if git diff-index --quiet HEAD --; then echo "No changes detected in repo $repo_number" >> "$REPORT" echo "Repo $repo_number: NC" >> "$SMS_REPORT" return 0 fi git add -A git commit -m "Automated update" if check_wifi; then echo "Internet is available. Attempting to push changes..." >> "$REPORT" if check_github_remote; then if ! git push origin main; then echo "Failed to push changes in repo $repo_number" >> "$REPORT" echo "Repo $repo_number: PF" >> "$SMS_REPORT" # Check if the failure is due to a non-existent repository if git remote show origin | grep -q "ERROR: Repository not found"; then echo "Remote GitHub repository missing for repo $repo_number. Attempting to recreate..." >> "$REPORT" if create_github_repo "$repo_number" "$repo_dir"; then git push -u origin main echo "Changes pushed successfully after recreating GitHub repo for repo $repo_number" >> "$REPORT" echo "Repo $repo_number: P" >> "$SMS_REPORT" else echo "Failed to create GitHub repository for repo $repo_number" >> "$REPORT" echo "Repo $repo_number: GCF" >> "$SMS_REPORT" return 1 fi else return 1 fi else echo "Changes pushed successfully in repo $repo_number" >> "$REPORT" echo "Repo $repo_number: P" >> "$SMS_REPORT" fi else if create_github_repo "$repo_number" "$repo_dir"; then git push -u origin main echo "Changes pushed successfully after creating GitHub repo in repo $repo_number" >> "$REPORT" echo "Repo $repo_number: P" >> "$SMS_REPORT" else echo "Failed to create GitHub repository for repo $repo_number" >> "$REPORT" echo "Repo $repo_number: GCF" >> "$SMS_REPORT" return 1 fi fi else echo "No internet connection. Changes committed locally in repo $repo_number" >> "$REPORT" echo "Repo $repo_number: LC" >> "$SMS_REPORT" fi } # Start of the script echo "Starting auto git update script on $(date)" > "$REPORT" echo "(G-R), $(date)" > "$SMS_REPORT" # Fetch valid repositories repo_dirs=($(get_repo_dirs)) # Convert to array properly # Counters for SMS summary report pushed_count=0 no_change_count=0 local_commit_count=0 conflict_count=0 error_count=0 total_repos=${#repo_dirs[@]} # Loop through each valid directory repo_number=1 for repo_dir in "${repo_dirs[@]}"; do update_repo "$repo_dir" "$repo_number" case "$(tail -n 1 "$SMS_REPORT")" in *P) pushed_count=$((pushed_count + 1)) ;; *NC) no_change_count=$((no_change_count + 1)) ;; *LC) local_commit_count=$((local_commit_count + 1)) ;; *MC) conflict_count=$((conflict_count + 1)) ;; *PF) error_count=$((error_count + 1)) ;; esac repo_number=$((repo_number + 1)) done # Check if the detailed SMS report exceeds the SMS character limit sms_detailed_content=$(cat "$SMS_REPORT") if [ "${#sms_detailed_content}" -gt "$SMS_CHAR_LIMIT" ]; then sms_summary="Pushed: $pushed_count/$total_repos, No Change: $no_change_count/$total_repos, Locally Committed: $local_commit_count/$total_repos, Conflicts: $conflict_count/$total_repos, Errors: $error_count/$total_repos" echo "$sms_summary" > "$SMS_REPORT" fi # Function to send the SMS report send_text() { /usr/bin/msmtp -a default -t <