forked from ungleich-public/cdist
		
	[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
 | 
					#!/bin/sh -e
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# 2011 Steven Armstrong (steven-cdist at armstrong.cc)
 | 
					# 2011 Steven Armstrong (steven-cdist at armstrong.cc)
 | 
				
			||||||
 | 
					# 2020 Dennis Camera (dennis.camera at ssrq-sds-fds.ch)
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# This file is part of cdist.
 | 
					# This file is part of cdist.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
| 
						 | 
					@ -31,11 +32,48 @@ in
 | 
				
			||||||
		;;
 | 
							;;
 | 
				
			||||||
esac
 | 
					esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
rolename=${__object_id:?}
 | 
					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
 | 
					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'
 | 
						echo 'present'
 | 
				
			||||||
else
 | 
					else
 | 
				
			||||||
	echo 'absent'
 | 
						echo 'absent'
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,7 @@
 | 
				
			||||||
#!/bin/sh -e
 | 
					#!/bin/sh -e
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# 2011 Steven Armstrong (steven-cdist at armstrong.cc)
 | 
					# 2011 Steven Armstrong (steven-cdist at armstrong.cc)
 | 
				
			||||||
 | 
					# 2020 Dennis Camera (dennis.camera at ssrq-sds-fds.ch)
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# This file is part of cdist.
 | 
					# This file is part of cdist.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
| 
						 | 
					@ -18,6 +19,15 @@
 | 
				
			||||||
# along with cdist. If not, see <http://www.gnu.org/licenses/>.
 | 
					# 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")
 | 
					case $(cat "${__global:?}/explorer/os")
 | 
				
			||||||
in
 | 
					in
 | 
				
			||||||
	(netbsd)
 | 
						(netbsd)
 | 
				
			||||||
| 
						 | 
					@ -44,28 +54,55 @@ fi
 | 
				
			||||||
case ${state_should}
 | 
					case ${state_should}
 | 
				
			||||||
in
 | 
					in
 | 
				
			||||||
	(present)
 | 
						(present)
 | 
				
			||||||
		if test -f "${__object:?}/parameter/password"
 | 
							if test -s "${__object:?}/parameter/password"
 | 
				
			||||||
		then
 | 
							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
 | 
							fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		booleans=
 | 
							booleans=
 | 
				
			||||||
		for boolean in login createdb createrole superuser
 | 
							for boolean in login createdb createrole superuser
 | 
				
			||||||
		do
 | 
							do
 | 
				
			||||||
			if test ! -f "${__object:?}/parameter/${boolean}"
 | 
								booleans="${booleans}${booleans:+ }$(
 | 
				
			||||||
			then
 | 
									if test -f "${__object:?}/parameter/${boolean}"
 | 
				
			||||||
				boolean="no${boolean}"
 | 
									then
 | 
				
			||||||
			fi
 | 
										echo "${boolean}"
 | 
				
			||||||
			booleans="${booleans} $(echo ${boolean} | tr '[:lower:]' '[:upper:]')"
 | 
									else
 | 
				
			||||||
 | 
										echo "no${boolean}"
 | 
				
			||||||
 | 
									fi \
 | 
				
			||||||
 | 
									| tr '[:lower:]' '[:upper:]')"
 | 
				
			||||||
		done
 | 
							done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		[ -n "${password}" ] && password="PASSWORD '${password}'"
 | 
							case ${state_is}
 | 
				
			||||||
		cat << EOF
 | 
							in
 | 
				
			||||||
su - '${postgres_user}' -c "psql postgres -wc 'CREATE ROLE \\"${rolename}\\" WITH ${password} ${booleans};'"
 | 
								(absent)
 | 
				
			||||||
EOF
 | 
									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)
 | 
						(absent)
 | 
				
			||||||
		cat << EOF
 | 
							printf "su -l '%s' -c 'dropuser '\\\\'%s\\\\'\\n" \
 | 
				
			||||||
su - '${postgres_user}' -c "dropuser '${rolename}'"
 | 
								"${postgres_user}" \
 | 
				
			||||||
EOF
 | 
								"$(quote "${rolename}")"
 | 
				
			||||||
		;;
 | 
							;;
 | 
				
			||||||
esac
 | 
					esac
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue