forked from ungleich-public/cdist
		
	[type/__uci_section] Split up --option and --list
This commit is contained in:
		
					parent
					
						
							
								49e867fab4
							
						
					
				
			
			
				commit
				
					
						b99ca3cbdf
					
				
			
		
					 3 changed files with 50 additions and 18 deletions
				
			
		| 
						 | 
					@ -28,15 +28,21 @@ None.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
OPTIONAL PARAMETERS
 | 
					OPTIONAL PARAMETERS
 | 
				
			||||||
-------------------
 | 
					-------------------
 | 
				
			||||||
 | 
					list
 | 
				
			||||||
 | 
					    An option that is part of a list and should be present in the section (as
 | 
				
			||||||
 | 
					    part of a list).  Lists with multiple options can be expressed by using the
 | 
				
			||||||
 | 
					    same ``<option>`` repeatedly.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    The value to this parameter is a ``<option>=<value>`` string.
 | 
				
			||||||
match
 | 
					match
 | 
				
			||||||
    Allows to find a section to "replace" through one of its parameters.
 | 
					    Allows to find a section to "replace" through one of its parameters.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    The value to this parameter is a ``<option>=<value>`` string.
 | 
					    The value to this parameter is a ``<option>=<value>`` string.
 | 
				
			||||||
option
 | 
					option
 | 
				
			||||||
    An option that should be present in the section.
 | 
					    An option that should be present in the section.
 | 
				
			||||||
    This parameter can be used multiple times to specify multiple options.
 | 
					    This parameter can be used multiple times to specify multiple options.
 | 
				
			||||||
    The value to this parameter is a ``<option>=<value>`` string.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Lists can be expressed by repeatedly using the same key.
 | 
					    The value to this parameter is a ``<option>=<value>`` string.
 | 
				
			||||||
state
 | 
					state
 | 
				
			||||||
    ``present`` or ``absent``, defaults to ``present``.
 | 
					    ``present`` or ``absent``, defaults to ``present``.
 | 
				
			||||||
transaction
 | 
					transaction
 | 
				
			||||||
| 
						 | 
					@ -62,6 +68,15 @@ EXAMPLES
 | 
				
			||||||
        --option PasswordAuth=off \
 | 
					        --option PasswordAuth=off \
 | 
				
			||||||
        --option RootPasswordAuth=off
 | 
					        --option RootPasswordAuth=off
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Define a firewall zone comprised of lan and wlan networks
 | 
				
			||||||
 | 
					    __uci_section firewall.internal --type firewall.zone --transaction fw \
 | 
				
			||||||
 | 
					        --option name='internal' \
 | 
				
			||||||
 | 
					        --list network='lan' \
 | 
				
			||||||
 | 
					        --list network='wlan' \
 | 
				
			||||||
 | 
					        --option input='ACCEPT' \
 | 
				
			||||||
 | 
					        --option output='ACCEPT' \
 | 
				
			||||||
 | 
					        --option forward='ACCEPT'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Block SSH access from the guest network
 | 
					    # Block SSH access from the guest network
 | 
				
			||||||
    __uci_section firewall.block_ssh_from_guest --type firewall.rule \
 | 
					    __uci_section firewall.block_ssh_from_guest --type firewall.rule \
 | 
				
			||||||
        --transaction fwrules \
 | 
					        --transaction fwrules \
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,7 +18,14 @@
 | 
				
			||||||
# along with cdist. If not, see <http://www.gnu.org/licenses/>.
 | 
					# along with cdist. If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
grep_line() { echo "$2" | grep -qxF "$1"; }
 | 
					grep_line() { { shift; printf '%s\n' "$@"; } | grep -qxF "$1"; }
 | 
				
			||||||
 | 
					prefix_lines() {
 | 
				
			||||||
 | 
						while test $# -gt 0
 | 
				
			||||||
 | 
						do
 | 
				
			||||||
 | 
							echo "$2" | awk -v prefix="$1" '$0 { printf "%s %s\n", prefix, $0 }'
 | 
				
			||||||
 | 
							shift; shift
 | 
				
			||||||
 | 
						done
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
uci_validate_name() {
 | 
					uci_validate_name() {
 | 
				
			||||||
	# like util.c uci_validate_name()
 | 
						# like util.c uci_validate_name()
 | 
				
			||||||
	test -n "$*" && test -z "$(printf %s "$*" | tr -d '[:alnum:]_' | tr -c '' .)"
 | 
						test -n "$*" && test -z "$(printf %s "$*" | tr -d '[:alnum:]_' | tr -c '' .)"
 | 
				
			||||||
| 
						 | 
					@ -115,14 +122,25 @@ in
 | 
				
			||||||
		fi
 | 
							fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		# Check options for syntax errors
 | 
							# Check options for syntax errors
 | 
				
			||||||
		validate_options "${__object:?}/parameter/object" \
 | 
							validate_options "${__object:?}/parameter/list" "${__object:?}/parameter/object" \
 | 
				
			||||||
		| print_errors 'Found erroneous options in arguments:'
 | 
							| print_errors 'Found erroneous options in arguments:'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		# Collect option names
 | 
							# Collect option names
 | 
				
			||||||
 | 
							if test -f "${__object:?}/parameter/list"
 | 
				
			||||||
 | 
							then
 | 
				
			||||||
 | 
								listnames_should=$(
 | 
				
			||||||
 | 
									sed -e 's/=.*$//' "${__object:?}/parameter/list" | sort -u)
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if test -f "${__object:?}/parameter/option"
 | 
							if test -f "${__object:?}/parameter/option"
 | 
				
			||||||
		then
 | 
							then
 | 
				
			||||||
			optnames_should=$(
 | 
								optnames_should=$(sed -e 's/=.*$//' "${__object:?}/parameter/option" | sort)
 | 
				
			||||||
				sed -e 's/=.*$//' "${__object:?}/parameter/option" | sort -u)
 | 
					
 | 
				
			||||||
 | 
								echo "${optnames_should}" \
 | 
				
			||||||
 | 
								| uniq -d \
 | 
				
			||||||
 | 
								| print_errors \
 | 
				
			||||||
 | 
									  'Found duplicate --options:' \
 | 
				
			||||||
 | 
									  "$(printf '\nUse --list for lists, instead.')"
 | 
				
			||||||
		fi
 | 
							fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		# Make sure the section itself is present
 | 
							# Make sure the section itself is present
 | 
				
			||||||
| 
						 | 
					@ -130,29 +148,27 @@ in
 | 
				
			||||||
			--value "${sect_type}"
 | 
								--value "${sect_type}"
 | 
				
			||||||
		export require=__uci/"${section}"
 | 
							export require=__uci/"${section}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		# Delete options not in "should"
 | 
							# Delete options/lists not in "should"
 | 
				
			||||||
		sed -e 's/=.*$//;s/^.*\.//' "${__object:?}/explorer/options" \
 | 
							sed -e 's/=.*$//;s/^.*\.//' "${__object:?}/explorer/options" \
 | 
				
			||||||
		| while read -r optname
 | 
							| while read -r optname
 | 
				
			||||||
		  do
 | 
							  do
 | 
				
			||||||
			  if ! grep_line "${optname}" "${optnames_should}"
 | 
								  grep_line "${optname}" "${listnames_should}" "${optnames_should}" || {
 | 
				
			||||||
			  then
 | 
									  __uci "${section}.${optname}" --state absent --transaction "${transaction_name}"
 | 
				
			||||||
				  __uci "${section}.${optname}" --state absent \
 | 
								  } </dev/null
 | 
				
			||||||
					  --transaction "${transaction_name}" </dev/null
 | 
					 | 
				
			||||||
			  fi
 | 
					 | 
				
			||||||
		  done
 | 
							  done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		# Set "should" options
 | 
							# Set "should" options
 | 
				
			||||||
		echo "${optnames_should}" \
 | 
							prefix_lines option "${optnames_should}" list "${listnames_should}" \
 | 
				
			||||||
		| while read -r optname
 | 
							| while read -r _type _optname
 | 
				
			||||||
		  do
 | 
							  do
 | 
				
			||||||
			  test -n "${optname}" || continue  # ignore empty lines
 | 
								  test -n "${_type}${_optname}" || continue  # ignore empty lines
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			  grep "^${optname}=" <"${__object:?}/parameter/option" \
 | 
								  grep "^${_optname}=" <"${__object:?}/parameter/${_type}" \
 | 
				
			||||||
			  | sed -e 's/^.*=//' \
 | 
								  | sed -e 's/^.*=//' \
 | 
				
			||||||
			  | unquote_lines \
 | 
								  | unquote_lines \
 | 
				
			||||||
			  | append_values \
 | 
								  | append_values \
 | 
				
			||||||
				    __uci "${section}.${optname}" --state present \
 | 
									    __uci "${section}.${_optname}" --state present \
 | 
				
			||||||
					    --transaction "${transaction_name}"
 | 
										    --type "${_type}" --transaction "${transaction_name}"
 | 
				
			||||||
		  done
 | 
							  done
 | 
				
			||||||
		;;
 | 
							;;
 | 
				
			||||||
	(absent)
 | 
						(absent)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1 +1,2 @@
 | 
				
			||||||
 | 
					list
 | 
				
			||||||
option
 | 
					option
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue