From 120ab73095c575593121c0643917a7d1ea4b828a Mon Sep 17 00:00:00 2001 From: klein panic Date: Sun, 29 Sep 2024 01:17:19 -0400 Subject: [PATCH] initial commit --- another_clone_updated.bak | 195 ++++++++++++++++++++++++++++ auto_git_update.sh | 261 ++++++++++++++++++++++++++++++++++++++ auto_git_update.sh.1.bak | 244 +++++++++++++++++++++++++++++++++++ auto_git_update.sh.bak | 214 +++++++++++++++++++++++++++++++ testgit.sh | 184 +++++++++++++++++++++++++++ 5 files changed, 1098 insertions(+) create mode 100755 another_clone_updated.bak create mode 100755 auto_git_update.sh create mode 100755 auto_git_update.sh.1.bak create mode 100755 auto_git_update.sh.bak create mode 100755 testgit.sh diff --git a/another_clone_updated.bak b/another_clone_updated.bak new file mode 100755 index 0000000..5910e5a --- /dev/null +++ b/another_clone_updated.bak @@ -0,0 +1,195 @@ +#!/usr/bin/env bash + +# Check if required commands are available +for cmd in git nmcli msmtp ssh scp; 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="Git Update Report" +REPORT="/tmp/git_update_report.txt" # Full detailed report +SUMMARY_REPORT="/tmp/git_update_summary.txt" # Full summary report +SMS_REPORT="/tmp/git_update_sms.txt" # Minimal SMS summary +SSH_HOST="eulerpi" # Alias for the SSH connection +SSH_DIR="/home/klein/reports" # Remote directory to store the report + +# Function to ensure a file exists and has the correct permissions +ensure_file() { + local file="$1" + local permissions="$2" + + if [ ! -f "$file" ]; then + touch "$file" + chmod "$permissions" "$file" + echo "Created $file with permissions $permissions" + else + chmod "$permissions" "$file" + echo "Ensured $file has permissions $permissions" + fi +} + +# Ensure the report files exist and have the correct permissions +ensure_file "$REPORT" 600 +ensure_file "$SUMMARY_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 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" + + # Log and remove invalid entries from the file + if [ ${#invalid_dirs[@]} -gt 0 ]; then + for dir in "${invalid_dirs[@]}"; do + echo "$dir does not exist or is not a valid git repository. Removing from $TXT_FILE" >> "$REPORT" + echo "$dir does not exist or is not a valid git repository. Removing from $TXT_FILE" + sed -i "\|$dir|d" "$TXT_FILE" + done + fi + + # Return valid directories + echo "${valid_dirs[@]}" +} + +# Function to update, commit, and (if connected) push the changes +update_repo() { + local repo_dir="$1" + local repo_number="$2" + cd "$repo_dir" || return + + echo "Processing repository: $repo_dir" >> "$REPORT" + echo "Processing repository: $repo_dir" + + git fetch origin + if ! git merge origin/main --no-commit --no-ff; then + echo "Merge conflict detected in $repo_dir" >> "$REPORT" + echo "Merge conflict in $repo_dir" >> "$SUMMARY_REPORT" + echo "repo: $repo_number, C" >> "$SMS_REPORT" + git merge --abort + return 1 + fi + + if git diff-index --quiet HEAD --; then + echo "No changes detected in $repo_dir" >> "$REPORT" + echo "No changes in $repo_dir" >> "$SUMMARY_REPORT" + echo "repo: $repo_number, NC" >> "$SMS_REPORT" + return 0 + fi + + git add -A + git commit -m "Automated update" + + # Check if connected to the internet before pushing + if check_wifi; then + echo "Internet is available. Attempting to push changes..." >> "$REPORT" + if ! git push origin main; then + echo "Failed to push changes in $repo_dir" >> "$REPORT" + echo "Failed to push changes in $repo_dir" >> "$SUMMARY_REPORT" + echo "repo: $repo_number, ERR" >> "$SMS_REPORT" + return 1 + else + echo "Changes pushed successfully in $repo_dir" >> "$REPORT" + echo "Changes pushed in $repo_dir" >> "$SUMMARY_REPORT" + echo "repo: $repo_number, P" >> "$SMS_REPORT" + fi + else + echo "No internet connection. Changes committed locally in $repo_dir" >> "$REPORT" + echo "Changes committed locally in $repo_dir" >> "$SUMMARY_REPORT" + echo "repo: $repo_number, LC" >> "$SMS_REPORT" + fi +} + +# Start of the script +echo "Starting auto git update script on $(date)" > "$REPORT" +echo "Git Update Summary: $(date)" > "$SUMMARY_REPORT" +echo "(GIT Report), $(date)" > "$SMS_REPORT" + +# Fetch valid repositories +repo_dirs=($(get_repo_dirs)) # Convert to array properly +repo_number=1 + +# Loop through each valid directory +for repo_dir in "${repo_dirs[@]}"; do + update_repo "$repo_dir" "$repo_number" + repo_number=$((repo_number + 1)) +done + +# Function to send the report via text message +send_text() { + /usr/bin/msmtp -a default -t </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 and push changes +create_github_repo() { + local repo_name="$1" + local repo_dir="$2" + echo "Attempting to create GitHub repo for repo $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" + echo "Repo $repo_name: GHS (GitHub Repo Created Successfully)" >> "$SMS_REPORT" + + # Check if the repository has existing commits + if [ -d "$repo_dir/.git" ] && [ "$(git -C "$repo_dir" rev-parse HEAD)" ]; then + echo "Repository has existing commits. Attempting to add remote and push." >> "$REPORT" + + # Add the GitHub remote if not already added + git remote add origin "git@github.com:kleinpanic/$repo_name.git" 2>/dev/null || true + + # Set the main branch if necessary + git branch -M main + + # Push to GitHub + if git push -u origin main; then + echo "Existing repository pushed successfully to GitHub." >> "$REPORT" + echo "Repo $repo_name: Pushed Successfully" >> "$SMS_REPORT" + else + echo "Failed to push the existing repository to GitHub." >> "$REPORT" + echo "Repo $repo_name: Push Failed" >> "$SMS_REPORT" + fi + fi + return 0 + else + echo "Failed to create GitHub repository $repo_name" >> "$REPORT" + echo "Repo $repo_name: GCF (GitHub Repo Creation Failed)" >> "$SMS_REPORT" + return 1 + fi +} + +# Function to check if a remote GitHub origin exists +check_github_remote() { + if ! git remote get-url origin &>/dev/null; then + echo "No 'origin' remote found." >> "$REPORT" + return 1 + fi + + local remote_url + remote_url=$(git remote get-url origin) + if [[ "$remote_url" != *github.com* ]]; then + echo "'origin' remote does not point to GitHub." >> "$REPORT" + return 1 + fi + + local repo_name + repo_name=$(basename "$remote_url" .git) + local repo_owner + repo_owner=$(basename "$(dirname "$remote_url")") + local full_repo_name="$repo_owner/$repo_name" + + echo "Checking if GitHub repository '$full_repo_name' exists..." >> "$REPORT" + + if ! gh repo view "$full_repo_name" &>/dev/null; then + echo "GitHub repository '$full_repo_name' does not exist or is not accessible." >> "$REPORT" + return 1 + fi + + return 0 +} + +# Function to update, commit, and push the changes +update_repo() { + local repo_dir="$1" + local repo_number="$2" + cd "$repo_dir" || return 1 + + echo "Processing repository $repo_number located at $repo_dir" >> "$REPORT" + + local github_exists=true + if ! check_github_remote; then + echo "No valid GitHub repository found for repo $repo_number." >> "$REPORT" + github_exists=false + + if check_wifi; then + repo_name=$(basename "$repo_dir") + create_github_repo "$repo_name" "$repo_dir" + github_exists=true + fi + fi + + if [ "$github_exists" = true ]; then + git fetch origin &>/dev/null + 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 + fi + + if git diff-index --quiet HEAD --; then + echo "No changes detected in repo $repo_number" >> "$REPORT" + + if [ "$github_exists" = false ]; then + echo "Repo $repo_number: NC-GDE" >> "$SMS_REPORT" + else + echo "Repo $repo_number: NC-GE" >> "$SMS_REPORT" + fi + + return 0 + fi + + git add -A + git commit -m "Automated update" + + if [ "$github_exists" = false ]; then + echo "No GitHub repository available for repo $repo_number. Committing locally..." >> "$REPORT" + echo "Repo $repo_number: lc-ngr" >> "$SMS_REPORT" + return 0 + fi + + if check_wifi; then + echo "Internet is available. Attempting to push changes..." >> "$REPORT" + + if ! git push origin main; then + echo "Failed to push changes in repo $repo_number" >> "$REPORT" + echo "Repo $repo_number: PF" >> "$SMS_REPORT" + return 1 + else + echo "Changes pushed successfully in repo $repo_number" >> "$REPORT" + echo "Repo $repo_number: P" >> "$SMS_REPORT" + 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)) + +# Counters for SMS summary report +pushed_count=0 +no_change_count=0 +local_commit_count=0 +conflict_count=0 +error_count=0 +created_count=0 +no_github_repo_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)) ;; + *lc-ngr*) no_github_repo_count=$((no_github_repo_count + 1)) ;; + *GHS) created_count=$((created_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, No GitHub Repo: $no_github_repo_count/$total_repos, Created: $created_count/$total_repos" + echo "$sms_summary" > "$SMS_REPORT" +fi + +send_text() { + /usr/bin/msmtp -a default -t </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 $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" + echo "Repo $repo_name: GHS (GitHub Repo Created Successfully)" >> "$SMS_REPORT" + return 0 + else + echo "Failed to create GitHub repository $repo_name" >> "$REPORT" + echo "Repo $repo_name: GCF (GitHub Repo Creation Failed)" >> "$SMS_REPORT" + return 1 + fi +} + +# Enhanced function to check if a remote GitHub origin exists +check_github_remote() { + # Check if a remote named "origin" exists + if ! git remote get-url origin &>/dev/null; then + echo "No 'origin' remote found." >> "$REPORT" + return 1 # No remote named "origin" + fi + + # Check if the "origin" remote points to GitHub + local remote_url + remote_url=$(git remote get-url origin) + if [[ "$remote_url" != *github.com* ]]; then + echo "'origin' remote does not point to GitHub." >> "$REPORT" + return 1 # Not a GitHub remote + fi + + # Verify if the repository exists on GitHub using GitHub CLI + local repo_name + repo_name=$(basename "$remote_url" .git) + local repo_owner + repo_owner=$(basename "$(dirname "$remote_url")") + local full_repo_name="$repo_owner/$repo_name" + + echo "Checking if GitHub repository '$full_repo_name' exists..." >> "$REPORT" + + if ! gh repo view "$full_repo_name" &>/dev/null; then + echo "GitHub repository '$full_repo_name' does not exist or is not accessible." >> "$REPORT" + return 1 # GitHub repository does not exist + fi + + return 0 # GitHub repository exists +} + +# 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" + + # Check if the GitHub remote exists + local github_exists=true + if ! check_github_remote; then + echo "No valid GitHub repository found for repo $repo_number." >> "$REPORT" + github_exists=false + fi + + # Fetch from the origin if it exists + if [ "$github_exists" = true ]; then + git fetch origin &>/dev/null + 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 + fi + + if git diff-index --quiet HEAD --; then + echo "No changes detected in repo $repo_number" >> "$REPORT" + + if [ "$github_exists" = false ]; then + echo "Repo $repo_number: NC (No changes, but no GitHub repository)" >> "$SMS_REPORT" + else + echo "Repo $repo_number: NC (No changes, remote exists)" >> "$SMS_REPORT" + fi + + return 0 + fi + + git add -A + git commit -m "Automated update" + + if [ "$github_exists" = false ]; then + echo "No GitHub repository available for repo $repo_number. Committing locally..." >> "$REPORT" + echo "Repo $repo_number: lc-ngr (Locally committed - No GitHub Repo)" >> "$SMS_REPORT" + return 0 + fi + + if check_wifi; then + echo "Internet is available. Attempting to push changes..." >> "$REPORT" + + if ! git push origin main; then + echo "Failed to push changes in repo $repo_number" >> "$REPORT" + echo "Repo $repo_number: PF" >> "$SMS_REPORT" + return 1 + else + echo "Changes pushed successfully in repo $repo_number" >> "$REPORT" + echo "Repo $repo_number: P" >> "$SMS_REPORT" + 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 +created_count=0 +no_github_repo_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)) ;; + *lc-ngr*) no_github_repo_count=$((no_github_repo_count + 1)) ;; + *GHS) created_count=$((created_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, No GitHub Repo: $no_github_repo_count/$total_repos, Created: $created_count/$total_repos" + echo "$sms_summary" > "$SMS_REPORT" +fi + +# Function to send the SMS report +send_text() { + /usr/bin/msmtp -a default -t </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 </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="Git Update Report" +REPORT="/tmp/git_update_report.txt" # Full detailed report +SUMMARY_REPORT="/tmp/git_update_summary.txt" # Full summary report +SMS_REPORT="/tmp/git_update_sms.txt" # Minimal SMS summary +SSH_HOST="eulerpi" # Alias for the SSH connection +SSH_DIR="/home/klein/reports" # Remote directory to store the report + +# Function to ensure a file exists and has the correct permissions +ensure_file() { + local file="$1" + local permissions="$2" + + if [ ! -f "$file" ]; then + touch "$file" + chmod "$permissions" "$file" + echo "Created $file with permissions $permissions" + else + chmod "$permissions" "$file" + echo "Ensured $file has permissions $permissions" + fi +} + +# Ensure the report files exist and have the correct permissions +ensure_file "$REPORT" 600 +ensure_file "$SUMMARY_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 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" + + # Log and remove invalid entries from the file + if [ ${#invalid_dirs[@]} -gt 0 ]; then + for dir in "${invalid_dirs[@]}"; do + echo "$dir does not exist or is not a valid git repository. Removing from $TXT_FILE" >> "$REPORT" + echo "$dir does not exist or is not a valid git repository. Removing from $TXT_FILE" + sed -i "\|$dir|d" "$TXT_FILE" + done + fi + + # Return valid directories + echo "${valid_dirs[@]}" +} + +# Function to update, commit, and (if connected) push the changes +update_repo() { + local repo_dir="$1" + local repo_number="$2" + cd "$repo_dir" || return + + echo "Processing repository: $repo_dir" >> "$REPORT" + echo "Processing repository: $repo_dir" + + git fetch origin + if ! git merge origin/main --no-commit --no-ff; then + echo "Merge conflict detected in $repo_dir" >> "$REPORT" + echo "Merge conflict in $repo_dir" >> "$SUMMARY_REPORT" + echo "repo: $repo_number, C" >> "$SMS_REPORT" + git merge --abort + return 1 + fi + + if git diff-index --quiet HEAD --; then + echo "No changes detected in $repo_dir" >> "$REPORT" + echo "No changes in $repo_dir" >> "$SUMMARY_REPORT" + echo "repo: $repo_number, NC" >> "$SMS_REPORT" + return 0 + fi + + git add -A + git commit -m "Automated update" + + # Check if connected to the internet before pushing + if check_wifi; then + echo "Internet is available. Attempting to push changes..." >> "$REPORT" + if ! git push origin main; then + echo "Failed to push changes in $repo_dir" >> "$REPORT" + echo "Failed to push changes in $repo_dir" >> "$SUMMARY_REPORT" + echo "repo: $repo_number, ERR" >> "$SMS_REPORT" + return 1 + else + echo "Changes pushed successfully in $repo_dir" >> "$REPORT" + echo "Changes pushed in $repo_dir" >> "$SUMMARY_REPORT" + echo "repo: $repo_number, P" >> "$SMS_REPORT" + fi + else + echo "No internet connection. Changes committed locally in $repo_dir" >> "$REPORT" + echo "Changes committed locally in $repo_dir" >> "$SUMMARY_REPORT" + echo "repo: $repo_number, LC" >> "$SMS_REPORT" + fi +} + +# Start of the script +echo "Starting auto git update script on $(date)" > "$REPORT" +echo "Git Update Summary: $(date)" > "$SUMMARY_REPORT" +echo "(GIT Report), $(date)" > "$SMS_REPORT" + +# Fetch valid repositories +repo_dirs=($(get_repo_dirs)) # Convert to array properly +repo_number=1 + +# Loop through each valid directory +for repo_dir in "${repo_dirs[@]}"; do + update_repo "$repo_dir" "$repo_number" + repo_number=$((repo_number + 1)) +done + +# Function to send the report via text message +send_text() { + /usr/bin/msmtp -a default -t <