| #!/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 |
| } |