#!/bin/sh -e
#
# Generate a new random password for the database
#

if [ "$(id -u)" != "0" ]
then
    echo "This command must be run as root."
    exit 1
fi


TMPBASE=${TMP:=/tmp}/$(basename $0).$$

cleanup()
{
    rm -rf $TMPBASE*
}
trap cleanup EXIT


[ -t 0 -a -t 1 -a -t 2 ] && INTERACTIVE=true || INTERACTIVE=false


# Generate the new password and write it to the config files

# Password
random-string --safe --length 60 --randlength > '/etc/pscheduler/database/database-password'

# DSN
cat > '/etc/pscheduler/database/database-dsn' <<EOF
dbname=pscheduler user=pscheduler password=$(cat '/etc/pscheduler/database/database-password')
EOF

# Pg Password
cat > '//etc/pscheduler/database/pgpassfile' <<EOF
*:*:pscheduler:pscheduler:$(cat '/etc/pscheduler/database/database-password')
EOF


# Change it in the database

ROLESQL="${TMPBASE}.rolesql"
touch "${ROLESQL}"
chmod 400 "${ROLESQL}"

cat > "${ROLESQL}" <<EOF
DO \$\$
BEGIN
    PERFORM pg_terminate_backend(pg_stat_activity.pid)
    FROM pg_stat_activity
    WHERE
        pg_stat_activity.datname = 'pscheduler'
        AND usename = 'pscheduler'
        AND pid <> pg_backend_pid()     -- Not this connection
        AND application_name <> 'psql'  -- Not interactive sessions
        ;
END;
\$\$ LANGUAGE plpgsql;
EOF

printf "ALTER ROLE pscheduler WITH PASSWORD '" > "${ROLESQL}"
tr -d "\n" < "/etc/pscheduler/database/database-password" >> "${ROLESQL}"
printf "';\n"  >> "${ROLESQL}"

postgresql-load "${ROLESQL}"

if $INTERACTIVE
then
    cat <<'EOF'
Password changed.

Note that this program is intended for use during installation and
upgrades.  Using it manually requires that the pScheduler services and
Apache be restarted manually.
EOF
fi
