foam_sync.sh (beepboop) 2025-06-18T09:49:11Z
This commit is contained in:
110
foam_sync.sh
Executable file
110
foam_sync.sh
Executable file
@ -0,0 +1,110 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# debug script
|
||||||
|
set -x
|
||||||
|
|
||||||
|
# These are the only lines that should require updating
|
||||||
|
frequency_mins=2
|
||||||
|
|
||||||
|
# These values are automatically determined based on the scipt path
|
||||||
|
sync_script=$(readlink -f "${BASH_SOURCE[0]}")
|
||||||
|
script_dir=$(dirname "$sync_script")
|
||||||
|
cronjob="*/${frequency_mins} * * * * ${sync_script}"
|
||||||
|
script_name=$(basename "$sync_script")
|
||||||
|
|
||||||
|
# Get current crontab content, suppress error if crontab is empty
|
||||||
|
current_crontab=$(crontab -l 2>/dev/null)
|
||||||
|
|
||||||
|
# Check if the exact cron job already exists using fixed string (-F) and whole line (-x) match
|
||||||
|
if echo "$current_crontab" | grep -Fxq "$cronjob"; then
|
||||||
|
echo "${script_name} cron job is already correctly configured."
|
||||||
|
else
|
||||||
|
echo "${script_name} cron job needs update or addition."
|
||||||
|
|
||||||
|
# Use command grouping to construct the new crontab content:
|
||||||
|
# 1. List current crontab (or nothing if empty), suppressing errors.
|
||||||
|
# 2. Filter out any existing lines related to this specific script.
|
||||||
|
# 3. Echo the desired cron job line.
|
||||||
|
{ crontab -l 2>/dev/null | grep -v "$sync_script"; echo "$cronjob"; } | crontab -
|
||||||
|
update_result=$?
|
||||||
|
|
||||||
|
if [[ $update_result -eq 0 ]]; then
|
||||||
|
echo "cron job updated/added successfully."
|
||||||
|
else
|
||||||
|
echo "Warning: Failed to update crontab." >&2
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# navigate to the repo
|
||||||
|
cd "${script_dir}" || (echo 'unable to find repo' && exit 1)
|
||||||
|
|
||||||
|
# if this is macos, make sure '/usr/local/git/git-google/bin' is in $PATH
|
||||||
|
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||||
|
if ! echo "$PATH" | grep -q "/usr/local/git/git-google/bin"; then
|
||||||
|
export PATH="/usr/local/git/git-google/bin:$PATH"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Stage ALL changes, including new files and modifications
|
||||||
|
git add .
|
||||||
|
|
||||||
|
# Check if there are any *meaningful* staged changes (respecting diff filters)
|
||||||
|
# git diff --staged --quiet exits with 0 if NO differences, 1 if differences exist.
|
||||||
|
# The '!' negates the exit status, so the 'if' block runs if there ARE differences.
|
||||||
|
if ! git diff --staged --quiet; then
|
||||||
|
# Only commit if there are staged changes visible after filtering
|
||||||
|
echo "Staged changes detected, creating commit..."
|
||||||
|
# Use -m because we already staged everything with 'git add .'
|
||||||
|
git commit -m "${script_name} ($(hostname -s)) $(date +"%Y-%m-%dT%H:%M:%SZ")"
|
||||||
|
else
|
||||||
|
echo "No relevant changes detected to commit (changes might be filtered)."
|
||||||
|
# Optional but recommended: Reset the index if the only staged changes were filtered out.
|
||||||
|
# This prevents the file from showing as "changes staged for commit" on a later 'git status'
|
||||||
|
# if only the filtered line was changed and staged by 'git add .'.
|
||||||
|
git reset HEAD --quiet
|
||||||
|
fi
|
||||||
|
|
||||||
|
# make sure we are authenticated with git origin
|
||||||
|
if ! git remote update origin --prune; then
|
||||||
|
echo 'unable to authenticate to remote'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local_commit=$(git rev-parse HEAD)
|
||||||
|
remote_commit=$(git rev-parse origin/main)
|
||||||
|
|
||||||
|
if [[ "$local_commit" != "$remote_commit" ]]; then
|
||||||
|
# sleep for a random time between 1-45 seconds to avoid collisions
|
||||||
|
sleepy_time=$(( ( RANDOM % 45 ) + 1 ))
|
||||||
|
echo "sleeping for $sleepy_time seconds..."
|
||||||
|
sleep $sleepy_time
|
||||||
|
else
|
||||||
|
echo 'no pending changes to sync, exiting...'
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# which is newer, our code or the origin?
|
||||||
|
local_commit=$(git rev-parse HEAD)
|
||||||
|
remote_commit=$(git rev-parse origin/main)
|
||||||
|
|
||||||
|
if [[ "$local_commit" == "$remote_commit" ]]; then
|
||||||
|
echo "local and remote are in sync"
|
||||||
|
elif git merge-base --is-ancestor "$local_commit" "$remote_commit"; then
|
||||||
|
echo "remote is ahead of local"
|
||||||
|
git pull --rebase origin main
|
||||||
|
elif git merge-base --is-ancestor "$remote_commit" "$local_commit"; then
|
||||||
|
echo "local is ahead of remote"
|
||||||
|
git push origin main
|
||||||
|
else
|
||||||
|
echo "local and remote have diverged"
|
||||||
|
# if remote is newer, use a 'theirs' strategy
|
||||||
|
if [[ $(git log --pretty=format:"%at" -n 1 origin/main) -gt $(git log --pretty=format:"%at" -n 1 HEAD) ]]; then
|
||||||
|
echo "remote is newer"
|
||||||
|
git pull --rebase -X theirs origin main
|
||||||
|
else
|
||||||
|
echo "local is newer"
|
||||||
|
git pull --rebase -X ours origin main
|
||||||
|
fi
|
||||||
|
git push origin main
|
||||||
|
fi
|
||||||
|
|
||||||
@ -34,6 +34,7 @@
|
|||||||
## things to research
|
## things to research
|
||||||
|
|
||||||
* Pangolin
|
* Pangolin
|
||||||
|
* Suricata
|
||||||
|
|
||||||
### Home auth
|
### Home auth
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user