[type/__postgres_role] ALTER ROLE when parameters change
This commit is contained in:
		
					parent
					
						
							
								932e2496ed
							
						
					
				
			
			
				commit
				
					
						c36df82882
					
				
			
		
					 2 changed files with 91 additions and 16 deletions
				
			
		| 
						 | 
				
			
			@ -1,6 +1,7 @@
 | 
			
		|||
#!/bin/sh -e
 | 
			
		||||
#
 | 
			
		||||
# 2011 Steven Armstrong (steven-cdist at armstrong.cc)
 | 
			
		||||
# 2020 Dennis Camera (dennis.camera at ssrq-sds-fds.ch)
 | 
			
		||||
#
 | 
			
		||||
# This file is part of cdist.
 | 
			
		||||
#
 | 
			
		||||
| 
						 | 
				
			
			@ -31,11 +32,48 @@ in
 | 
			
		|||
		;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
rolename=${__object_id:?}
 | 
			
		||||
 | 
			
		||||
if test -n "$(su - "${postgres_user}" -c "psql postgres -twAc \"SELECT 1 FROM pg_roles WHERE rolname='${rolename}'\"")"
 | 
			
		||||
role_properties=$(
 | 
			
		||||
	cmd=$(printf "psql -F '\034' -R '\036' -wAc \"SELECT * FROM pg_roles WHERE rolname='%s'\"" "${rolename}")
 | 
			
		||||
	su -l "${postgres_user}" -c "${cmd}" \
 | 
			
		||||
	| awk '
 | 
			
		||||
	  BEGIN { RS = "\036"; FS = "\034" }
 | 
			
		||||
	  /^\([0-9]+ rows?\)/ { exit }
 | 
			
		||||
	  NR == 1 { for (i = 1; i <= NF; i++) cols[i] = $i; next }
 | 
			
		||||
	  NR == 2 { for (i = 1; i <= NF; i++) printf "%s=%s\n", cols[i], $i }
 | 
			
		||||
	  '
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
if test -n "${role_properties}"
 | 
			
		||||
then
 | 
			
		||||
	# Check if the user's properties match the parameters
 | 
			
		||||
	for prop in login createdb createrole superuser
 | 
			
		||||
	do
 | 
			
		||||
		bool_should=$(test -f "${__object:?}/parameter/${prop}" && echo 't' || echo 'f')
 | 
			
		||||
		bool_is=$(
 | 
			
		||||
			printf '%s\n' "${role_properties}" |
 | 
			
		||||
			awk -F '=' -v key="${prop}" '
 | 
			
		||||
			BEGIN {
 | 
			
		||||
				if (key == "login")
 | 
			
		||||
					key = "canlogin"
 | 
			
		||||
				else if (key == "superuser")
 | 
			
		||||
					key = "super"
 | 
			
		||||
				key = "rol" key
 | 
			
		||||
			}
 | 
			
		||||
			$1 == key {
 | 
			
		||||
				sub(/^[^=]*=/, "")
 | 
			
		||||
				print
 | 
			
		||||
			}
 | 
			
		||||
			'
 | 
			
		||||
		)
 | 
			
		||||
 | 
			
		||||
		test "${bool_is}" = "${bool_should}" || {
 | 
			
		||||
			echo 'different'
 | 
			
		||||
			exit 0
 | 
			
		||||
		}
 | 
			
		||||
	done
 | 
			
		||||
 | 
			
		||||
	echo 'present'
 | 
			
		||||
else
 | 
			
		||||
	echo 'absent'
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,7 @@
 | 
			
		|||
#!/bin/sh -e
 | 
			
		||||
#
 | 
			
		||||
# 2011 Steven Armstrong (steven-cdist at armstrong.cc)
 | 
			
		||||
# 2020 Dennis Camera (dennis.camera at ssrq-sds-fds.ch)
 | 
			
		||||
#
 | 
			
		||||
# This file is part of cdist.
 | 
			
		||||
#
 | 
			
		||||
| 
						 | 
				
			
			@ -18,6 +19,15 @@
 | 
			
		|||
# along with cdist. If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
quote() {
 | 
			
		||||
	if test $# -gt 0
 | 
			
		||||
	then
 | 
			
		||||
		printf '%s' "$*"
 | 
			
		||||
	else
 | 
			
		||||
		cat -
 | 
			
		||||
	fi | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/'/"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
case $(cat "${__global:?}/explorer/os")
 | 
			
		||||
in
 | 
			
		||||
	(netbsd)
 | 
			
		||||
| 
						 | 
				
			
			@ -44,28 +54,55 @@ fi
 | 
			
		|||
case ${state_should}
 | 
			
		||||
in
 | 
			
		||||
	(present)
 | 
			
		||||
		if test -f "${__object:?}/parameter/password"
 | 
			
		||||
		if test -s "${__object:?}/parameter/password"
 | 
			
		||||
		then
 | 
			
		||||
			password=$(cat "${__object:?}/parameter/password")
 | 
			
		||||
			quoted_password=$(
 | 
			
		||||
				delim='$$'
 | 
			
		||||
				while grep -q -F "${delim}" "${__object:?}/parameter/password"
 | 
			
		||||
				do
 | 
			
		||||
					delim="\$$(LC_ALL=C tr -cd '[:alpha:]' </dev/urandom | dd bs=1 count=4 2>/dev/null)$"
 | 
			
		||||
				done
 | 
			
		||||
 | 
			
		||||
				raw_passwd=$(cat "${__object:?}/parameter/password"; printf .)
 | 
			
		||||
				# shellcheck disable=SC2016
 | 
			
		||||
				printf '%s%s%s' "${delim}" "${raw_passwd%?.}" "${delim}"
 | 
			
		||||
			)
 | 
			
		||||
		fi
 | 
			
		||||
 | 
			
		||||
		booleans=
 | 
			
		||||
		for boolean in login createdb createrole superuser
 | 
			
		||||
		do
 | 
			
		||||
			if test ! -f "${__object:?}/parameter/${boolean}"
 | 
			
		||||
			then
 | 
			
		||||
				boolean="no${boolean}"
 | 
			
		||||
			fi
 | 
			
		||||
			booleans="${booleans} $(echo ${boolean} | tr '[:lower:]' '[:upper:]')"
 | 
			
		||||
			booleans="${booleans}${booleans:+ }$(
 | 
			
		||||
				if test -f "${__object:?}/parameter/${boolean}"
 | 
			
		||||
				then
 | 
			
		||||
					echo "${boolean}"
 | 
			
		||||
				else
 | 
			
		||||
					echo "no${boolean}"
 | 
			
		||||
				fi \
 | 
			
		||||
				| tr '[:lower:]' '[:upper:]')"
 | 
			
		||||
		done
 | 
			
		||||
 | 
			
		||||
		[ -n "${password}" ] && password="PASSWORD '${password}'"
 | 
			
		||||
		cat << EOF
 | 
			
		||||
su - '${postgres_user}' -c "psql postgres -wc 'CREATE ROLE \\"${rolename}\\" WITH ${password} ${booleans};'"
 | 
			
		||||
EOF
 | 
			
		||||
		case ${state_is}
 | 
			
		||||
		in
 | 
			
		||||
			(absent)
 | 
			
		||||
				query=$(printf 'CREATE ROLE "%s" WITH %s PASSWORD %s;' \
 | 
			
		||||
					"${rolename}" "${booleans}" "${quoted_password:-NULL}")
 | 
			
		||||
				;;
 | 
			
		||||
			(different)
 | 
			
		||||
				query=$(printf 'ALTER ROLE "%s" WITH %s PASSWORD %s;' \
 | 
			
		||||
					"${rolename}" "${booleans}" "${quoted_password:-NULL}")
 | 
			
		||||
				;;
 | 
			
		||||
			(*)
 | 
			
		||||
				exit 1	# TODO: error msg
 | 
			
		||||
				;;
 | 
			
		||||
		esac
 | 
			
		||||
 | 
			
		||||
		psql_cmd=$(printf 'psql postgres -wc %s' "$(quote "${query}")" | quote)
 | 
			
		||||
		printf "su -l '%s' -c %s\\n" "${postgres_user}" "${psql_cmd}"
 | 
			
		||||
		;;
 | 
			
		||||
	(absent)
 | 
			
		||||
		cat << EOF
 | 
			
		||||
su - '${postgres_user}' -c "dropuser '${rolename}'"
 | 
			
		||||
EOF
 | 
			
		||||
		printf "su -l '%s' -c 'dropuser '\\\\'%s\\\\'\\n" \
 | 
			
		||||
			"${postgres_user}" \
 | 
			
		||||
			"$(quote "${rolename}")"
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue