#!/bin/sh

## live-config(7) - System Configuration Components
## Copyright (C) 2006-2015 Daniel Baumann <mail@daniel-baumann.ch>
##
## 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/>.
##
## The complete text of the GNU General Public License
## can be found in /usr/share/common-licenses/GPL-3 file.

#set -e

. /lib/live/init-config.sh

DEBIAN_FRONTEND="noninteractive"
DEBIAN_PRIORITY="critical"
DEBCONF_NOWARNINGS="yes"
export DEBIAN_FRONTEND DEBIAN_PRIORITY DEBCONF_NOWARNINGS

_IP_SEPARATOR="-"
_PROC_OPTIONS="onodev,noexec,nosuid"
export _IP_SEPARATOR _PROC_OPTIONS

_COMPONENTS="$(ls /lib/live/config/*)"

Cmdline ()
{
	for _PARAMETER in ${LIVE_CONFIG_CMDLINE}
	do
		case "${_PARAMETER}" in
			# Components
			live-config.components=*|components=*)
				# Only run requested components
				LIVE_CONFIG_COMPONENTS="${_PARAMETER#*components=}"
				LIVE_CONFIG_NOCOMPONENTS=""
				_COMPONENTS=""
				;;

			live-config.components|components)
				# Run all components
				LIVE_CONFIG_COMPONENTS=""
				LIVE_CONFIG_NOCOMPONENTS=""
				_COMPONENTS="$(ls /lib/live/config/*)"
				;;

			live-config.nocomponents=*|nocomponents=*)
				# Don't run requested components
				LIVE_CONFIG_COMPONENTS=""
				LIVE_CONFIG_NOCOMPONENTS="${_PARAMETER#*nocomponents=}"
				_COMPONENTS="$(ls /lib/live/config/*)"
				;;

			live-config.nocomponents|nocomponents)
				# Don't run any component
				LIVE_CONFIG_COMPONENTS=""
				LIVE_CONFIG_NOCOMPONENTS=""
				_COMPONENTS=""
				;;

			# Special options
			live-config.debug|debug)
				LIVE_CONFIG_DEBUG="true"
				;;
		esac
	done

	# Include requested components
	if [ -n "${LIVE_CONFIG_COMPONENTS}" ]
	then
		for _COMPONENT in $(echo ${LIVE_CONFIG_COMPONENTS} | sed -e 's|,| |g')
		do
			_COMPONENTS="${_COMPONENTS} $(ls /lib/live/config/????-${_COMPONENT} 2> /dev/null || true)"
		done
	fi

	# Exclude requested components
	if [ -n "${LIVE_CONFIG_NOCOMPONENTS}" ]
	then
		for _NOCOMPONENT in $(echo ${LIVE_CONFIG_NOCOMPONENTS} | sed -e 's|,| |g')
		do
			_COMPONENTS="$(echo ${_COMPONENTS} | sed -e "s|$(ls /lib/live/config/????-${_NOCOMPONENT} 2> /dev/null || echo none)||")"
		done
	fi
}

Trap ()
{
	_RETURN="${?}"

	case "${_RETURN}" in
		0)

			;;

		*)
			echo ":ERROR"
			;;
	esac

	return ${_RETURN}
}

Main ()
{
	if [ ! -e /proc/version ]
	then
		mount -n -t proc -o${_PROC_OPTIONS} -odefaults proc /proc
	fi

	LIVE_CONFIG_CMDLINE="${LIVE_CONFIG_CMDLINE:-$(cat /proc/cmdline)}"
	export LIVE_CONFIG_CMDLINE

	if ! echo ${LIVE_CONFIG_CMDLINE} | grep -qs "boot=live"
	then
		exit 0
	fi

	# Setting up log redirection
	rm -f /var/log/live/config.log
	rm -f /tmp/live-config.pipe

	mkdir -p /var/log/live
	mkfifo /tmp/live-config.pipe
	tee < /tmp/live-config.pipe /var/log/live/config.log &
	exec > /tmp/live-config.pipe 2>&1

	echo -n "live-config:" > /tmp/live-config.pipe 2>&1
	trap 'Trap' EXIT HUP INT QUIT TERM

	# Processing command line
	Cmdline

	case "${LIVE_CONFIG_DEBUG}" in
		true)
			set -x
			;;
	esac

	# Configuring system
	_COMPONENTS="$(echo ${_COMPONENTS} | sed -e 's| |\n|g' | sort -u)"

	for _COMPONENT in ${_COMPONENTS}
	do
		[ "${LIVE_CONFIG_DEBUG}" = "true" ] && echo "[$(date +'%F %T')] live-config: ${_COMPONENT}" > /tmp/live-config.pipe

		${_COMPONENT} > /tmp/live-config.pipe 2>&1
	done

	echo "." > /tmp/live-config.pipe

	# Cleaning up log redirection
	rm -f /tmp/live-config.pipe
}

Main ${@}
