/usr/bin/ikiwiki-hosting-web-backup is in ikiwiki-hosting-web 0.20160123.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
| 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 | #!/bin/bash
# Backs up all sites.
failed=""
. /etc/ikiwiki-hosting/ikiwiki-hosting.conf
LOCKFILE=/var/run/ikiwiki-hosting-web-backup-lockfile
# Use lockfile to avoid multiple jobs running.
# (bash needed because exec 200>file is a bashism)
exec 200>$LOCKFILE
if ! flock --nonblock 200; then
	echo "another ikiwiki-hosting-web-backup is already running" >&2
	exit 1
fi
trap cleanup EXIT INT
cleanup () {
	rm -f $LOCKFILE || true
	if [ -n "$backup_ssh_cache" ]; then
		kill %1 # stop any backgrounded ssh master process
	fi
}
# start master process for ssh connection caching
if [ -n "$backup_ssh_cache" ]; then
	ssh -nMN "$backup_ssh_cache" &
fi
for site in $(ikisite list); do
	if ( [ -n "$num_backups" ] && [ "$num_backups" -gt 0 ] ) || [ -n "$backup_rsync_urls" ]; then
		bdir="/var/backups/ikiwiki-hosting-web/$site"
		mkdir -p "$bdir"
		# savelog has a minimim -c of 2
		if [ -e "$bdir/backup" ] && [ -n "$num_backups" ] && [ "$num_backups" -gt 2 ]; then
			savelog -c "$num_backups" "$bdir/backup"
		fi
		if ! ikisite backup "$site" --filename="$bdir"/backup; then
			echo "ikisite backup $site failed!" >&2
			failed=1
		fi
		# rsync backups to somewhere
		if [ -n "$backup_rsync_urls" ]; then
			for url in $backup_rsync_urls; do
				if ! rsync -az $backup_rsync_options "$bdir/backup" "$url$site"; then
					failed=1
				fi
			done
		fi
		# maybe we don't want to keep backups locally..
		if [ -z "$num_backups" ] || [ "$num_backups" = 0 ]; then
			rm -f "$bdir/backup"
		fi
		# delete any obsolete version of the site in the morgue
		# (might exist if it got deleted and then recreated)
		if [ -n "$morguedir" ]; then
			rm -f "$morguedir/$site.backup"
		fi
	fi
done
if [ -n "$morguedir" ] && [ -d "$morguedir" ] && [ -n "$backup_rsync_urls" ]; then
	# backup the morgue to any configured rsync urls.
	for url in $backup_rsync_urls; do
		if ! rsync -az $backup_rsync_options "$morguedir/" "${url}morgue/"; then
			failed=1
		fi
	done
	# For each site in the morgue, zero out any old backup
	# of it that might exist on the remote. This is done to avoid
	# deleted sites being restored if the backups should be used.
	# (We can't properly delete them the way that we're using rsync.)
	for file in $(find "$morguedir" -type f); do
		site="$(basename "$file" | sed 's/\.backup$//')"
		touch "$morguedir/empty"
		if ! rsync -a $backup_rsync_options "$morguedir/empty" "$url$site"; then
			failed=1
		fi
		rm -f "$morguedir/empty"
	done
fi
if [ "$failed" ]; then
	exit 1
else
	exit 0
fi
 |