#!/bin/bash

restoreDir=/etc/restore
giteaDir="/var/backups/gitea"
scriptDir="$(dirname "$0")"

readConfig() {
	if [[ -r "${scriptDir}/../config/gitea_backup.cfg" ]]; then
        source "${scriptDir}/../config/gitea_backup.cfg"
	fi

}

check() {
    GITEA_CONFIG=${GITEA_CONFIG:-/etc/gitea/app.ini}
    if [[ ! -r "$GITEA_CONFIG" ]]; then
        echo "ERROR: Cannot read gitea app.ini in $GITEA_CONFIG"
        return 4
    fi

    GITEA_USER=${GITEA_USER:-git}
    GITEA_GROUP=${GITEA_GROUP:-git}
    GITEA_HOME=${GITEA_HOME:-$(getent passwd ${GITEA_USER} | cut -f6 -d:)}
    if [[ ! -d "$GITEA_HOME" ]]; then
        echo "ERROR: Cannot find Gitea home directory"
        return 5
    fi

    if [[ -n "$GITEA_BIN" ]]; then
        if [[ -x "${GITEA_BIN}" ]]; then
            echo "Found Gitea in $GITEA_BIN"
        else
            echo "FATAL: Cannot execute Gitea"
            return 3
        fi
    else
        if ! which gitea &>/dev/null; then
            echo "Cannot find Gitea in PATH"
            return 2
        fi
        if [[ -x "$(which gitea)" ]]; then
            GITEA_BIN="$(which gitea)"
            echo "Found Gitea in $GITEA_BIN"
        else
            echo "FATAL: Cannot execute Gitea"
            return 3
        fi
    fi

    if [[ -d "$giteaDir" ]]; then
        echo "Cleaning out old Gitea backups..."
        rm -f "$giteaDir"/* || return 1
    else
        mkdir -p "$giteaDir" | return 1
        chgrp "$GITEA_GROUP" "$giteaDir" 
        chmod g+wx "$giteaDir"
    fi
}

runBackups() {
    local backupDate
    
    backupDate=$(date +"%Y-%m-%d")
    giteaHome=$(getent passwd git | cut -f6 -d:)
    pushd "${giteaDir}" &>/dev/null
    sudo -u "$GITEA_USER" "${GITEA_BIN}" dump --config "${GITEA_CONFIG}" --type tar.xz --file - > "${giteaDir}/gitea-dump-${backupDate}.tar.xz"
    popd &>/dev/null
}

hook_before() {
    check || exit $?
    runBackups || exit $?
}

hook_after() {
    :
}

hook_fail() {
    :
}

hook_final() {
    :
}


case "$1" in
    before)     hook_before     || exit $?;;
    after)      hook_after      || exit $?;;
    fail)       hook_fail       || exit $?;;
    finally)    hook_final      || exit $?;;
esac