Project: IPFire
Code Location: git://git.ipfire.org/network.gitmaster
Browse
/
Download File
functions.config
#!/bin/bash
###############################################################################
#                                                                             #
# IPFire.org - A linux based firewall                                         #
# Copyright (C) 2012  IPFire Network Development Team                         #
#                                                                             #
# This program is free software: you can redistribute it and/or modify        #
# it under the terms of the GNU General Public License as published by        #
# the Free Software Foundation, either version 3 of the License, or           #
# (at your option) any later version.                                         #
#                                                                             #
# This program is distributed in the hope that it will be useful,             #
# but WITHOUT ANY WARRANTY; without even the implied warranty of              #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               #
# GNU General Public License for more details.                                #
#                                                                             #
# You should have received a copy of the GNU General Public License           #
# along with this program.  If not, see <http://www.gnu.org/licenses/>.       #
#                                                                             #
###############################################################################

function config_read() {
	local file=${1}
	assert isset file
	shift

	local valid_keys=$@

	# Exit if the file cannot be read.
	[ -r "${file}" ] || return ${EXIT_ERROR}

	local line key val
	while read -r line; do
		case "${line}" in
			*=*)
				key=$(cli_get_key ${line})

				# If valid keys is set, key must be in the list.
				if [ -n "${valid_keys}" ]; then
					if ! listmatch ${key} ${valid_keys}; then
						log DEBUG "Ignoring configuration setting: ${key}"
						continue
					fi
				fi

				val=$(cli_get_val ${line})
				val=$(config_strip ${val})

				# Assign variable.
				printf -v ${key} "%s" "${val}"
				;;
			*)
				log DEBUG "Invalid line in configuration file: ${line}"
				;;
		esac
	done < ${file}
}

function config_read_array() {
	local file=${1}
	assert isset file
	shift

	local array=${1}
	assert isset array
	shift

	local valid_keys=$@

	# Exit if the file cannot be read.
	[ -r "${file}" ] || return ${EXIT_ERROR}

	local line key val
	while read -r line; do
		case "${line}" in
			*=*)
				key=$(cli_get_key ${line})

				# If valid_keys is set, key must be in the list.
				if [ -n "${valid_keys}" ]; then
					if ! listmatch ${key} ${valid_keys}; then
						log DEBUG "Ignoring configuration setting: ${key}"
						continue
					fi
				fi

				val=$(cli_get_val ${line})
				val=$(config_strip ${val})

				# Assign variable.
				printf -v  "${array}["${key}"]" "%s" "${val}"
				;;
			*)
				log DEBUG "Invalid line in configuration file: ${line}"
				;;
		esac
	done < ${file}
}

# Strip leading and trailing "s.
function config_strip() {
	local var="$@"

	# Do nothing for strings that contain spaces.
	if contains_spaces ${var}; then
		print "${var}"
		return ${EXIT_OK}
	fi

	unquote "${var}"
}

function config_write() {
	local config_file=${1}
	assert isset config_file
	shift

	# Check if all values to be written are sane
	if ! config_check; then
		log CRITICAL "Configuration check failed. No config has been written."
		return ${EXIT_ERROR}
	fi

	log DEBUG "Writing configuration file ${config_file}."

	mkdir -p $(dirname ${config_file}) 2>/dev/null
	> ${config_file}

	local param
	for param in $(listsort $@); do
		echo "${param}=\"${!param}\"" >> ${config_file}
	done
}

function config_print() {
	local param

	for param in $(listsort $@); do
		printf "%-32s = %s\n" "${param}" "${!param}"
	done
}

function config_check() {
	# If there is a function defined that is called __check
	# we call that function
	if [ -n "$(type -t _check)" ]; then
		_check || return $?
	fi

	return ${EXIT_OK}
}

function config_header() {
	local what=${1}
	assert isset what

	# Print the header.
	echo "#"
	echo "# This is a ${what}."
	echo "# THIS FILE IS AUTOMATICALLY GENERATED AND"
	echo "# ANY CUSTOM CHANGES WILL BE OVERWRITTEN!"
	echo "#"
	echo "# $(date -u)"
	echo "#"
	echo
}

function config_hostname() {
	local hostname=${1}

	if [ -n "${hostname}" ]; then
		echo "${hostname}" > ${CONFIG_HOSTNAME}
	else
		echo "$(<${CONFIG_HOSTNAME})"
	fi
}

function config_domainname() {
	local hostname=$(config_hostname)

	# Strip off the hostname part and just return
	# the domain part.
	print "${hostname#*.}"
}

function config_set() {
	while [ $# -gt 0 ]; do
		case "${1}" in
			*=*)
				local key=$(cli_get_key ${1})
				local val=$(cli_get_val ${1})

				log INFO "Setting configuration option '${key}=${val}'".

				printf -v ${key} "%s" "${val}"
				;;
			*)
				warning "Invalid parameter given: ${1}"
				;;
		esac
		shift
	done
}

function network_config_read() {
	local options=${NETWORK_CONFIG_FILE_PARAMS}

	# If the DEBUG variable has already been set,
	# don't overwrite it.
	if [ -n "${DEBUG}" ]; then
		list_remove options DEBUG
	fi

	config_read ${NETWORK_CONFIG_FILE} ${options}
}

function network_config_write() {
	config_write ${NETWORK_CONFIG_FILE} ${NETWORK_CONFIG_FILE_PARAMS}

	# Update DNS configuration.
	dns_generate_resolvconf
}

function network_config_print() {
	config_print ${NETWORK_CONFIG_FILE_PARAMS}
}

function firewall_config_read() {
	config_read "${FIREWALL_CONFIG_FILE}" "${FIREWALL_CONFIG_PARAMS}"
}

function firewall_config_write() {
	config_write "${FIREWALL_CONFIG_FILE}" "${FIREWALL_CONFIG_PARAMS}"
}

function firewall_config_print() {
	config_print "${FIREWALL_CONFIG_PARAMS}"
}