confz

git mirror of https://ccx.te2000.cz/bzr/confz
git clone https://ccx.te2000.cz/git/confz
Log | Files | Refs

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 }