#!/bin/sh PSQL="/usr/bin/psql" free_megs() { fsdir=$1 while [ ! -d "$fsdir" ]; do fsdir="$(dirname "$fsdir")" done df -m $fsdir | while read fs bl us av cap mnt; do [ "$av" = "Available" ] || echo $av; done } pg_init_data() { # make sure we got at least 50MB of free space [ $(free_megs "$1") -lt 50 ] && return 1 pg_ctl initdb -U postgres -D "$1" } pg_server_ready() { t=0 while [ $t -le 90 ]; do psql -h /var/run/postgresql/ -U postgres -c "\q" 1>/dev/null 2>/dev/null && return 0 t=$((t+1)) sleep 1 done return 1 } pg_test_db() { echo "SELECT datname FROM pg_catalog.pg_database WHERE datname = '$1';" | $PSQL -h /var/run/postgresql -w -U "postgres" -d "template1" -q | grep -q "0 rows" && return 1 return 0 } pg_include_sql() { if [ "$3" ]; then env PGPASSWORD="$3" $PSQL -h /var/run/postgresql -U "$2" -d "$1" -e -f "$4" return $? else $PSQL -w -h /var/run/postgresql -U "$2" -d "$1" -e -f "$4" return $? fi } # $1: dbname, $2: username, $3: password, $4: sql populate script pg_require_db() { local ret local dbname="$1" local dbuser="$2" local dbpass="$3" local exuser pg_test_db $@ && return 0 shift ; shift ; shift echo "CREATE DATABASE $dbname;" | $PSQL -h /var/run/postgresql -U postgres -d template1 -e || return $? if [ "$dbuser" ]; then echo "SELECT usename FROM pg_catalog.pg_user WHERE usename = '$dbuser';" | $PSQL -h /var/run/postgresql -U postgres -d template1 -e | grep -q "0 rows" && ( echo -n "CREATE USER $dbuser" [ "$dbpass" ] && echo -n " WITH PASSWORD '$dbpass'" echo " NOCREATEDB NOSUPERUSER NOCREATEROLE NOINHERIT;" ) | $PSQL -h /var/run/postgresql -U postgres -d template1 -e echo "GRANT ALL PRIVILEGES ON DATABASE \"$dbname\" TO $dbuser;" | $PSQL -h /var/run/postgresql -U postgres -d template1 -e fi while [ "$1" ]; do pg_include_sql "$dbname" "$dbuser" "$dbpass" "$1" ret=$? [ $ret != 0 ] && break shift done return $ret } uci_require_db() { local dbname dbuser dbpass dbscript config_get dbname $1 name config_get dbuser $1 user config_get dbpass $1 pass config_get dbscript $1 script pg_require_db "$dbname" "$dbuser" "$dbpass" $dbscript } [ "$1" = "init" ] && { . /lib/functions.sh pg_server_ready $2 || exit 1 config_load postgresql config_foreach uci_require_db postgres-db }