#!/bin/bash

# Desc    Backup PG using basebackup + wals to provide Point In Time Recovery
# Author  Pierre Fumet <pfumet@easter-eggs.com>
# Date    Fri Nov  8 16:40:27 CET 2019

PITR_DIR="/srv/pitr"
B_DIR=$PITR_DIR/base
W_DIR=$PITR_DIR/wal
B_DOW=0
B_DAYS=6
W_DAYS=8
MSG=

# 65196 : PITR

# checks
[ $EUID -eq 0 ] || { echo "[$0] Must be launched by root"; exit 1; }
mkdir -p -m 750 $B_DIR || { echo "[$0] Unable to mkdir" $B_DIR; exit 1; }
mkdir -p -m 750 $W_DIR || { echo "[$0] Unable to mkdir" $W_DIR; exit 1; }
ln -sf $PITR_DIR /var/backups || { echo "[$0] Unable to symlink $PITR_DIR in /var/backups"; exit 1; }
chown postgres: $PITR_DIR/* || { echo "[$0] Unable to chown postgres: $PITR_DIR"; exit 1; }
cd $B_DIR || { echo "[$0] Unable to cd in $B_DIR"; exit 1; }
cd $W_DIR || { echo "[$0] Unable to cd in $W_DIR"; exit 1; }
cd

# cleanup archives
find $B_DIR -mtime +$B_DAYS -delete || MSG="$MSG\n[$0] Unable to purge old basebackup"
find $W_DIR -mtime +$W_DAYS -delete || MSG="$MSG\n[$0] Unable to purge old WALs"

# get new basebackup each sunday
if test $(date +%w) -eq $B_DOW
then
	echo "[$0] Start pg_basebackup..."
	# if not already in last 24h (eg. 0:10 and next 23:40), run basebackup
	test $(find $B_DIR -type f -mtime -1 | wc -l) -gt 0 && \
		echo -e "[$0] pg_basebackup already done :\n$(ls -l $B_DIR)" || \
		{ su - postgres -c "/usr/bin/pg_basebackup -F t -z -P -D $B_DIR/$(date +'%Y%m%d_%H%M')/" && echo "[$0] Done !" || MSG="$MSG\nUnable to perform new basebackup"; }
else
	echo "[$0] Today is not $B_DOW but $(date +%w), no pg_basebackup."
fi

# output
[ -z "$MSG" ] || { echo -e "$MSG"; exit 1; }
