blob: e1076d54eadb6249a9892f14fef829ed1df31f18 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
#!/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
}
|