-
Notifications
You must be signed in to change notification settings - Fork 226
Expand file tree
/
Copy pathinstall_cron.sh
More file actions
executable file
·102 lines (75 loc) · 2.21 KB
/
Copy pathinstall_cron.sh
File metadata and controls
executable file
·102 lines (75 loc) · 2.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#!/usr/bin/env bash
set -euo pipefail
REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CRON_DIR="$REPO_DIR/.cron"
UPDATER_SCRIPT="$CRON_DIR/update_and_restart.sh"
LOG_FILE="$REPO_DIR/cron_update.log"
LOCK_FILE="/tmp/supoclip_auto_update.lock"
CRON_TAG_START="# supoclip-auto-update-start"
CRON_TAG_END="# supoclip-auto-update-end"
CRON_SCHEDULE="0 */3 * * *"
mkdir -p "$CRON_DIR"
cat > "$UPDATER_SCRIPT" <<EOF
#!/usr/bin/env bash
set -euo pipefail
REPO_DIR="$REPO_DIR"
LOG_FILE="$LOG_FILE"
LOCK_FILE="$LOCK_FILE"
exec >> "\$LOG_FILE" 2>&1
echo "[\$(date '+%Y-%m-%d %H:%M:%S')] Starting auto-update check"
if ! command -v flock >/dev/null 2>&1; then
echo "flock command not found; aborting"
exit 1
fi
exec 9>"\$LOCK_FILE"
if ! flock -n 9; then
echo "Another update process is running; exiting"
exit 0
fi
cd "\$REPO_DIR"
if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
echo "Not a git repository: \$REPO_DIR"
exit 1
fi
if [ -n "\$(git status --porcelain)" ]; then
echo "Repository has local changes; skipping update"
exit 0
fi
git fetch --quiet
LOCAL_COMMIT="\$(git rev-parse HEAD)"
REMOTE_COMMIT="\$(git rev-parse @{u})"
if [ "\$LOCAL_COMMIT" = "\$REMOTE_COMMIT" ]; then
echo "No updates found (\$LOCAL_COMMIT)"
exit 0
fi
echo "Update detected: \$LOCAL_COMMIT -> \$REMOTE_COMMIT"
git pull --ff-only --quiet
if docker compose version >/dev/null 2>&1; then
COMPOSE_CMD="docker compose"
elif command -v docker-compose >/dev/null 2>&1; then
COMPOSE_CMD="docker-compose"
else
echo "Neither 'docker compose' nor 'docker-compose' is available"
exit 1
fi
echo "Restarting Docker services"
\$COMPOSE_CMD down
\$COMPOSE_CMD up -d --build
echo "Update complete"
EOF
chmod +x "$UPDATER_SCRIPT"
EXISTING_CRON="$(crontab -l 2>/dev/null || true)"
UPDATED_CRON="$(printf '%s\n' "$EXISTING_CRON" | awk -v start="$CRON_TAG_START" -v end="$CRON_TAG_END" '
$0 == start { skip = 1; next }
$0 == end { skip = 0; next }
!skip { print }
')"
CRON_LINE="$CRON_SCHEDULE $UPDATER_SCRIPT"
{
printf '%s\n' "$UPDATED_CRON"
printf '%s\n' "$CRON_TAG_START"
printf '%s\n' "$CRON_LINE"
printf '%s\n' "$CRON_TAG_END"
} | crontab -
echo "Installed cron job: $CRON_LINE"
echo "Logs will be written to: $LOG_FILE"