Compare commits
5 Commits
55676661db
...
07a5dd96b2
Author | SHA1 | Date | |
---|---|---|---|
07a5dd96b2 | |||
3349430416 | |||
52d9dc0f57 | |||
d86b692e4f | |||
55ba448f13 |
@ -1,2 +1,4 @@
|
|||||||
---
|
---
|
||||||
rclone_package_url: https://downloads.rclone.org/v1.50.1/rclone-v1.50.1-linux-amd64.deb
|
rclone_arch: amd64
|
||||||
|
rclone_version: 1.50.2
|
||||||
|
rclone_package_url: "https://downloads.rclone.org/v{{ rclone_version }}/rclone-v{{ rclone_version }}-linux-{{ rclone_arch }}.deb"
|
||||||
|
96
roles/restic/files/hooks/minecraft.sh
Normal file
96
roles/restic/files/hooks/minecraft.sh
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
SERVICE=minecraft.service
|
||||||
|
VAR_DIR=/opt/minecraft/var
|
||||||
|
WAIT=30
|
||||||
|
VERBOSE=${VERBOSE:-4}
|
||||||
|
|
||||||
|
error_exit() {
|
||||||
|
printf "%s\n" "$1" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
stop_server() {
|
||||||
|
local unit="${1:-$SERVICE}"
|
||||||
|
local attempts="${2:-$WAIT}"
|
||||||
|
|
||||||
|
if ! systemctl -q is-active "$unit"; then
|
||||||
|
printf "%s is already stopped\n" "$unit"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
systemctl -q stop "$unit"
|
||||||
|
|
||||||
|
while systemctl -q is-active "$unit"; do
|
||||||
|
printf "waiting for %s to stop ... (%s)\n" "$unit" "$attempts"
|
||||||
|
((attempts--))
|
||||||
|
if ((attempts == 0)); then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
start_server() {
|
||||||
|
local unit="${1:-$SERVICE}"
|
||||||
|
local attempts="${2:-$WAIT}"
|
||||||
|
|
||||||
|
if systemctl -q is-active "$unit"; then
|
||||||
|
printf "%s is already started\n" "$unit"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
systemctl -q start "$unit"
|
||||||
|
|
||||||
|
while ! systemctl -q is-active "$unit"; do
|
||||||
|
printf "waiting for %s to start ... (%d)\n" "$unit" "$attempts"
|
||||||
|
((attempts--))
|
||||||
|
if ((attempts == 0)); then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
open_files() {
|
||||||
|
local dir=${1-$VAR_DIR}
|
||||||
|
local attempts="${2:-$WAIT}"
|
||||||
|
|
||||||
|
while (($(lsof +D "$dir" | wc -l) > 0)); do
|
||||||
|
printf "waiting for open files ... (%d)\n" "$attempts"
|
||||||
|
((attempts--))
|
||||||
|
if ((attempts == 0)); then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
main() {
|
||||||
|
if [ "$1" == "pre" ]; then
|
||||||
|
printf "stopping %s\n" $SERVICE
|
||||||
|
if ! stop_server $SERVICE; then
|
||||||
|
error_exit "Failed to stop $SERVICE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf "checking for open files\n"
|
||||||
|
if ! open_files $VAR_DIR; then
|
||||||
|
error_exit "Open files exist in $VAR_DIR"
|
||||||
|
fi
|
||||||
|
elif [ "$1" == "post" ]; then
|
||||||
|
printf "starting %s\n" $SERVICE
|
||||||
|
if ! start_server $SERVICE; then
|
||||||
|
error_exit "Failed to start $SERVICE"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
main "$@"
|
15
roles/restic/files/restic-job.sh
Normal file → Executable file
15
roles/restic/files/restic-job.sh
Normal file → Executable file
@ -20,6 +20,7 @@ fi
|
|||||||
|
|
||||||
JOB_PATH="${RESTIC_ETC_PATH}/jobs/${JOB}"
|
JOB_PATH="${RESTIC_ETC_PATH}/jobs/${JOB}"
|
||||||
JOB_ENV="${JOB_PATH}/env.sh"
|
JOB_ENV="${JOB_PATH}/env.sh"
|
||||||
|
HOOKS_PATH="${JOB_PATH}/hooks.d"
|
||||||
|
|
||||||
if [ ! -r "$JOB_ENV" ]; then
|
if [ ! -r "$JOB_ENV" ]; then
|
||||||
error_exit "${JOB_ENV} does not exist"
|
error_exit "${JOB_ENV} does not exist"
|
||||||
@ -48,6 +49,13 @@ if [ -z "${PATHS+x}" ]; then
|
|||||||
error_exit "\$PATHS is not set"
|
error_exit "\$PATHS is not set"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
printf "job '%s' started\n" "$JOB"
|
||||||
|
|
||||||
|
if [ -d "${HOOKS_PATH}" ]; then
|
||||||
|
printf "running '%s' job pre-hooks\n" "$JOB"
|
||||||
|
run-parts -v -a pre "${HOOKS_PATH}"
|
||||||
|
fi
|
||||||
|
|
||||||
counter=0
|
counter=0
|
||||||
sleep=1
|
sleep=1
|
||||||
rc=1
|
rc=1
|
||||||
@ -72,4 +80,11 @@ done
|
|||||||
|
|
||||||
if [ $rc -ne 0 ] && [ $counter -eq "$MAX_ATTEMPTS" ]; then
|
if [ $rc -ne 0 ] && [ $counter -eq "$MAX_ATTEMPTS" ]; then
|
||||||
printf "restic job timed out, exiting\n"
|
printf "restic job timed out, exiting\n"
|
||||||
|
else
|
||||||
|
printf "job '%s' complete\n" "$JOB"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -d "${HOOKS_PATH}" ]; then
|
||||||
|
printf "running '%s' job post-hooks\n" "$JOB"
|
||||||
|
run-parts -v -a post "${HOOKS_PATH}"
|
||||||
fi
|
fi
|
||||||
|
16
roles/restic/files/restic-tidy.sh
Normal file → Executable file
16
roles/restic/files/restic-tidy.sh
Normal file → Executable file
@ -10,8 +10,10 @@ error_exit() {
|
|||||||
RESTIC_ETC_PATH=${RESTIC_ETC_PATH:-/etc/restic}
|
RESTIC_ETC_PATH=${RESTIC_ETC_PATH:-/etc/restic}
|
||||||
RESTIC_PATH=${RESTIC_PATH:-/usr/local/bin/restic}
|
RESTIC_PATH=${RESTIC_PATH:-/usr/local/bin/restic}
|
||||||
|
|
||||||
|
# initial sleep
|
||||||
MAX_ATTEMPTS=60
|
MAX_ATTEMPTS=60
|
||||||
MAX_SLEEP=43200 # 12 hours
|
MAX_SLEEP=43200 # 12 hours
|
||||||
|
SLEEP="$(((RANDOM % MAX_SLEEP) + 1))s"
|
||||||
REPO=$1
|
REPO=$1
|
||||||
|
|
||||||
if [ -z "$REPO" ]; then
|
if [ -z "$REPO" ]; then
|
||||||
@ -34,8 +36,16 @@ KEEP_WEEKLY=${KEEP_WEEKLY:-5}
|
|||||||
KEEP_MONTHLY=${KEEP_MONTHLY:-12}
|
KEEP_MONTHLY=${KEEP_MONTHLY:-12}
|
||||||
KEEP_YEARLY=${KEEP_YEARLY:-10}
|
KEEP_YEARLY=${KEEP_YEARLY:-10}
|
||||||
|
|
||||||
# initial sleep
|
printf "started, keep hourly:%d daily:%d weekly:%d monthly:%d year:%d\n" \
|
||||||
sleep "$(((RANDOM % MAX_SLEEP) + 1))s"
|
"$KEEP_HOURLY" \
|
||||||
|
"$KEEP_DAILY" \
|
||||||
|
"$KEEP_WEEKLY" \
|
||||||
|
"$KEEP_MONTHLY" \
|
||||||
|
"$KEEP_YEARLY"
|
||||||
|
|
||||||
|
printf "sleeping for %s (initial)\n" $SLEEP
|
||||||
|
|
||||||
|
sleep $SLEEP
|
||||||
|
|
||||||
counter=0
|
counter=0
|
||||||
sleep=1
|
sleep=1
|
||||||
@ -65,4 +75,6 @@ done
|
|||||||
|
|
||||||
if [ $rc -ne 0 ] && [ $counter -eq "$MAX_ATTEMPTS" ]; then
|
if [ $rc -ne 0 ] && [ $counter -eq "$MAX_ATTEMPTS" ]; then
|
||||||
printf "tidy timed out, exiting\n"
|
printf "tidy timed out, exiting\n"
|
||||||
|
else
|
||||||
|
printf "complete\n"
|
||||||
fi
|
fi
|
||||||
|
@ -7,7 +7,19 @@
|
|||||||
mode: 0755
|
mode: 0755
|
||||||
state: directory
|
state: directory
|
||||||
|
|
||||||
- name: create repo environment helper
|
- name: create job hooks
|
||||||
|
copy:
|
||||||
|
src: "hooks/{{ hook_item }}"
|
||||||
|
dest: "{{ restic_etc_path }}/jobs/{{ item.name }}/hooks.d/{{ hook_item | basename | splitext | first }}"
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: 0755
|
||||||
|
loop: "{{ item.hooks | default([]) }}"
|
||||||
|
loop_control:
|
||||||
|
loop_var: hook_item
|
||||||
|
when: item.hooks is defined
|
||||||
|
|
||||||
|
- name: create job environment helper
|
||||||
template:
|
template:
|
||||||
src: job-env.sh.j2
|
src: job-env.sh.j2
|
||||||
dest: "{{ restic_etc_path }}/jobs/{{ item.name }}/env.sh"
|
dest: "{{ restic_etc_path }}/jobs/{{ item.name }}/env.sh"
|
||||||
@ -15,6 +27,15 @@
|
|||||||
group: root
|
group: root
|
||||||
mode: 0400
|
mode: 0400
|
||||||
|
|
||||||
|
- name: install hooks
|
||||||
|
file:
|
||||||
|
path: "{{ restic_etc_path }}/jobs/{{ item.name }}/hooks.d"
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: 0755
|
||||||
|
state: directory
|
||||||
|
when: item.hooks is defined and item.hooks | length
|
||||||
|
|
||||||
- name: create job exclude file
|
- name: create job exclude file
|
||||||
template:
|
template:
|
||||||
src: exclude.txt.j2
|
src: exclude.txt.j2
|
||||||
@ -33,4 +54,4 @@
|
|||||||
weekday: "{{ item.cron.weekday | default(omit) }}"
|
weekday: "{{ item.cron.weekday | default(omit) }}"
|
||||||
user: "{{ item.cron.user | default('root') }}"
|
user: "{{ item.cron.user | default('root') }}"
|
||||||
state: "{{ item.cron.state | default('present') }}"
|
state: "{{ item.cron.state | default('present') }}"
|
||||||
job: "{{ restic_bin_path }}/restic-job {{ item.name }}"
|
job: "( {{ restic_bin_path }}/restic-job {{ item.name }} | logger --id=$$ -t restic-job -p user.info ) 2>&1 | logger --id=$$ -t restic-job -p user.err"
|
||||||
|
@ -60,4 +60,4 @@
|
|||||||
minute: "{{ 60 | random(seed=inventory_hostname) }}"
|
minute: "{{ 60 | random(seed=inventory_hostname) }}"
|
||||||
user: root
|
user: root
|
||||||
state: present
|
state: present
|
||||||
job: "{{ restic_bin_path }}/restic-tidy {{ item.name }}"
|
job: "( {{ restic_bin_path }}/restic-tidy {{ item.name }} | logger --id=$$ -t restic-tidy -p user.info ) 2>&1 | logger --id=$$ -t restic-tidy -p user.err"
|
||||||
|
Loading…
Reference in New Issue
Block a user