#!/bin/sh
# Shell script for interacting with config files
#
# Copyright (C) 2006        Fokus Fraunhofer <carsten.tittel@fokus.fraunhofer.de>
# Copyright (C) 2006,2007	Felix Fietkau <nbd@openwrt.org>
#
# 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

. $UCI_ROOT/etc/functions.sh
include $UCI_ROOT/lib/config

SEP="[^0-9A-Za-z_]"

do_get() {
	local PACKAGE
	local CONFIG
	local OPTION
	local DUMMY

	strtok "$*" PACKAGE . CONFIG . OPTION $SEP DUMMY

	[ $? -ne 3 ] && {
		uci_usage get
		exit 1
	}

	uci_load "$PACKAGE"
	config_get "$CONFIG" "$OPTION"
}

do_set() {
	local PACKAGE
	local CONFIG
	local OPTION
	local VALUE

	strtok "$1" PACKAGE . CONFIG = VALUE
	[ $? -ne 3 -a $? -ne 2 ] && {
		uci_usage set
		exit 1
	}
	
	strtok "$CONFIG" CONFIG . OPTION
	
	if [ $? -eq 1 ]; then
		uci_add "$PACKAGE" "$VALUE" "$CONFIG"
	else
		uci_set "$PACKAGE" "$CONFIG" "$OPTION" "$VALUE"
	fi
}

do_rename() {
	[ $# -ne 3 ] && {
		uci_usage rename
		exit 1
	}
	uci_rename "$@"
}

do_remove() {
	local PACKAGE
	local CONFIG
	local OPTION
	local DUMMY

	strtok "$*" PACKAGE . CONFIG . OPTION $SEP DUMMY
	[ $? -ne 3 -a $? -ne 2 ] && {
		uci_usage rename
		exit 1
	}
	uci_remove "$PACKAGE" "$CONFIG" ${OPTION:+"$OPTION"}
}

do_commit() {
	local PACKAGE="$1"
	for package in ${PACKAGE:-$(cd /tmp/.uci; ls)}; do 
		[ lock = "${package##*.}" ] && continue # ignore .lock files
		uci_commit "$package"
	done
}

do_show() {
	local PACKAGE
	local CONFIG
	local DUMMY

	strtok "$*" PACKAGE . CONFIG $SEP DUMMY
	[ $? -gt 2 ] && {
		uci_usage show
		exit 1
	}
	
	for package in ${PACKAGE:-$(cd $UCI_ROOT/etc/config; ls)}; do
		SECTION=""
	
		config_cb() {
			if [ -z "$CONFIG" -o ."$CONFIG" = ."$2" ]; then
				append SECTION "$2"
				option_cb() {
					append "${CONFIG_SECTION}_VARS" "$1"
				}
			else
				option_cb() {
					return 0
				}
			fi
		}
			
		uci_load "$package"
	
		for section in $SECTION; do
			config_get type "$section" TYPE
			[ -z "$type" ] && continue
			echo "$package.$section=$type"
			eval "VARS=\"\${${section}_VARS}\""
			for var in $VARS; do
				config_get val "$section" "$var"
				[ -n "$val" ] && {
					echo "$package.$section.$var=$val"
					config_set "$section" "$var" ""
				}
			done
			config_set "$section" TYPE ""
		done
	done
}

do_validate() {
	[ "$#" -ne 1 ] && {
		uci_usage validate
		exit 1
	}
	uci_validate "$1" || exit "$?"
}

uci_usage() {
	case "$1" in
		show) echo "$0 show [<package>[.<config>]]";;
		get) echo "$0 get <package>.<config>.<option>";;
		set) echo "$0 set <package>.<config>[.<option>]=<value>";;
		del) echo "$0 del <package>.<config>[.<option>]";;
		rename) echo "$0 rename <package> <config> <name>";;
		commit) echo "$0 commit [<package> ... ]";;
		validate) echo "$0 validate <package>";;
		*) 
			echo "Syntax: $0 <command> <arguments...>"
			echo
			uci_usage show
			uci_usage get
			uci_usage set
			uci_usage del
			uci_usage rename
			uci_usage commit
			uci_usage validate 
			echo
			exit 1
		;;
	esac
}

if [ $# -eq 0 ] ; then
	uci_usage
	exit 0
fi

CMD="$1"
shift
case "$CMD" in
	set) do_set "$@";;
	del) do_remove "$@";;
	rename) do_rename "$@";;
	get) do_get "$@";;
	show) do_show "$@";;
	commit) do_commit "$@";;
	validate) do_validate "$@";;
	*) uci_usage;;
esac
exit 0