confz_postgresql_init (5919B)
1 # vim: ft=zsh noet ts=4 sts=4 sw=4 2 3 # 4 # confz functions for PostgreSQL 5 # 6 7 config-protect-mv() { 8 local n dst base 9 if [[ -d $2 ]]; then 10 dst=${2%/}/$1:t 11 else 12 dst=$2 13 fi 14 15 if ! [[ -e $dst ]]; then 16 confz_do mv "$1" "$dst" 17 return $? 18 fi 19 20 n=0 21 base=$dst:t 22 dst="$dst:h/$(printf "._cfg%04d_%s" $n $base)" 23 24 while [[ -e $dst ]]; do 25 n=$[ $n + 1 ] 26 dst="$dst:h/$(printf "._cfg%04d_%s" $n $base)" 27 (( $n > 9999 )) && die "can not config-protect $dst:t/$base" 28 done 29 30 confz_do mv "$1" "$dst" 31 } 32 33 confz_postgresql_cluster_check() { 34 checkvars data_dir 35 defvar owner postgres 36 defvar pgdata $vars[data_dir] 37 defvar locale en_US.UTF-8 38 defvar initdb initdb 39 defvar initdb_opts '' 40 41 [[ -d $vars[data_dir]/base && -e $vars[pgdata]/postgresql.conf ]] 42 } 43 44 confz_postgresql_cluster_do() { 45 confz_do mkdir -p $vars[data_dir] $vars[pgdata] || return $? 46 confz_do chown -Rf $vars[owner]: $vars[data_dir] || return $? 47 confz_do chmod 0700 $vars[data_dir] || return $? 48 confz_do su $vars[owner] -c "$vars[initdb] --locale=${(qqq)vars[locale]} --pgdata=${(qqq)vars[data_dir]} $vars[initdb_opts]" || return $? 49 50 local cfg 51 52 if ! [[ $vars[data_dir] == $vars[pgdata] ]]; then 53 for cfg in $vars[data_dir]/*.conf(N); do 54 confz_do config-protect-mv $cfg $vars[pgdata]/ 55 done 56 fi 57 58 return 0 59 } 60 61 confz_postgresql_cluster_slot_check() { 62 checkvars slot 63 require postgresql_cluster \?owner \?locale \?initdb_opts \ 64 pgdata="/etc/postgresql-$vars[slot]/" \ 65 data_dir="/var/lib/postgresql/$vars[slot]/data" \ 66 initdb="/usr/lib/postgresql-$vars[slot]/bin/initdb" 67 } 68 69 70 confz_postgresql_user_check() { 71 checkvars name 72 defvar user postgres 73 defvar psql psql 74 defvar createuser createuser 75 defvar allow_createdb 0 76 defvar allow_createrole 0 77 defvar allow_replication 0 78 defvar allow_login 1 79 defvar superuser 0 80 81 local -a opts 82 83 opts+=( -U $vars[user] ) 84 (($+vars[host])) && opts+=( --host=$vars[host] ) 85 (($+vars[port])) && opts+=( --port=$vars[port] ) 86 87 do_command=( $vars[createuser] $opts $vars[name] ) 88 89 local flag 90 for flag in allow_createdb allow_createrole allow_replication allow_login superuser; do 91 if (($vars[$flag])); then 92 do_command+=( --${flag#allow_} ) 93 else 94 do_command+=( --no-${flag#allow_} ) 95 fi 96 done 97 98 out=$( confz_do $vars[psql] $opts -AP tuples_only=on -c '\dg' template1 ) || \ 99 die "psql failed" 100 grep -q "^$vars[name]|" <<<$out 101 } 102 103 confz_postgresql_db_check() { 104 checkvars db owner 105 defvar user postgres 106 defvar psql psql 107 defvar createdb createdb 108 109 local -a opts 110 111 opts+=( -U $vars[user] ) 112 (($+vars[host])) && opts+=( --host=$vars[host] ) 113 (($+vars[port])) && opts+=( --port=$vars[port] ) 114 115 do_command=( $vars[createdb] $opts $vars[db] -O $vars[owner] ) 116 if (($+vars[encoding])); then 117 do_command+=( -E $vars[encoding] ) 118 fi 119 120 local out name owner encoding rest 121 out=$( confz_do $vars[psql] $opts -lAP tuples_only=on template1 ) || \ 122 die "psql failed" 123 while IFS='|' read name owner encoding rest; do 124 if [[ $name == $vars[db] ]]; then 125 [[ $owner == $vars[owner] ]] || \ 126 die "database $name has owner $owner, want $vars[owner]" 127 if (($+vars[encoding])); then 128 [[ $encoding == $vars[encoding] ]] || \ 129 die "database $name has encoding $encoding, want $vars[encoding]" 130 fi 131 return 0 132 fi 133 done <<<$out 134 135 fail_reason="database ${(qqq)vars[db]} was not found" 136 return 1 137 } 138 139 confz_postgresql_schema_check() { 140 checkvars db owner schema_name 141 defvar user postgres 142 defvar psql psql 143 144 local -a opts 145 146 opts+=( -U $vars[user] ) 147 (($+vars[host])) && opts+=( --host=$vars[host] ) 148 (($+vars[port])) && opts+=( --port=$vars[port] ) 149 150 do_command=( 151 $vars[psql] $opts $vars[db] -1 152 -c "CREATE SCHEMA $vars[schema_name]; ALTER SCHEMA $vars[schema_name] OWNER TO $vars[owner]" 153 ) 154 155 local out schema owner 156 out=$( confz_do $vars[psql] $opts -AP tuples_only=on -c '\dn' $vars[db] ) || die "psql failed" 157 while IFS='|' read schema owner; do 158 if [[ $schema == $vars[schema_name] ]]; then 159 [[ $owner == $vars[owner] ]] || \ 160 die "schema $schema has owner $owner, want $vars[owner]" 161 return 0 162 fi 163 done <<<$out 164 165 fail_reason="schema ${(qqq)vars[schema_name]} was not found in database ${(qqq)vars[db]}" 166 return 1 167 } 168 169 confz_postgresql_extension_check() { 170 checkvars db extension schema_name 171 defvar user postgres 172 defvar psql psql 173 174 local -a opts 175 176 opts+=( -U $vars[user] ) 177 (($+vars[host])) && opts+=( --host=$vars[host] ) 178 (($+vars[port])) && opts+=( --port=$vars[port] ) 179 180 do_command=( 181 $vars[psql] $opts $vars[db] -1 182 -c "CREATE EXTENSION $vars[extension] SCHEMA $vars[schema_name]" 183 ) 184 185 local out extension version schema comment 186 out=$( confz_do $vars[psql] $opts -AP tuples_only=on -c '\dx' $vars[db] ) || die "psql failed" 187 while IFS='|' read extension version schema comment; do 188 if [[ $extension == $vars[extension] ]]; then 189 [[ $schema == $vars[schema_name] ]] || \ 190 die "extension $extension has schema $schema, want $vars[schema_name]" 191 return 0 192 fi 193 done <<<$out 194 195 fail_reason="extension ${(qqq)vars[extension]} was not found in database ${(qqq)vars[db]}" 196 return 1 197 } 198 199 confz_postgresql_content_check() { 200 checkvars db schema psql_input 201 defvar user postgres 202 defvar psql psql 203 204 local out 205 local -a opts 206 207 opts+=( -U $vars[user] ) 208 (($+vars[host])) && opts+=( --host=$vars[host] ) 209 (($+vars[port])) && opts+=( --port=$vars[port] ) 210 211 out=$( confz_do $vars[psql] $opts -AP tuples_only=on -c '\d' $vars[db] ) || die "psql failed" 212 if [[ -z $out || $out == 'No relations found.' ]]; then 213 fail_reason="the schema for ${(qqq)vars[db]} is empty" 214 return 1 215 elif [[ $out != $vars[schema] ]]; then 216 die "the schema for ${(qqq)vars[db]} differs:"$'\n'"$( \ 217 diff -u <(print -r - $vars[schema]) <(print -r - $out) )" 218 fi 219 return 0 220 } 221 222 confz_postgresql_content_do() { 223 local -a opts 224 225 opts+=( -U $vars[user] ) 226 (($+vars[host])) && opts+=( --host=$vars[host] ) 227 (($+vars[port])) && opts+=( --port=$vars[port] ) 228 229 confz_do $vars[psql] $opts -1 $vars[db] -f - <<<$vars[psql_input] 230 }