#!/bin/sh |
#!/bin/sh |
# Shell script defining macros for manipulating config files |
# Shell script defining macros for manipulating config files |
# |
# |
# Copyright (C) 2006 Fokus Fraunhofer <carsten.tittel@fokus.fraunhofer.de> |
# Copyright (C) 2006 Fokus Fraunhofer <carsten.tittel@fokus.fraunhofer.de> |
# Copyright (C) 2006,2007 Felix Fietkau <nbd@openwrt.org> |
# Copyright (C) 2006,2007 Felix Fietkau <nbd@openwrt.org> |
# |
# |
# This program is free software; you can redistribute it and/or modify |
# 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 |
# it under the terms of the GNU General Public License as published by |
# the Free Software Foundation; either version 2 of the License, or |
# the Free Software Foundation; either version 2 of the License, or |
# (at your option) any later version. |
# (at your option) any later version. |
# |
# |
# This program is distributed in the hope that it will be useful, |
# This program is distributed in the hope that it will be useful, |
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
# General Public License for more details. |
# General Public License for more details. |
# |
# |
# You should have received a copy of the GNU General Public License |
# You should have received a copy of the GNU General Public License |
# along with this program; if not, write to the Free Software |
# along with this program; if not, write to the Free Software |
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|
|
uci_load() { |
uci_load() { |
local PACKAGE="$1" |
local PACKAGE="$1" |
config_load "$PACKAGE" |
config_load "$PACKAGE" |
local PACKAGE_BASE="$(basename "$PACKAGE")" |
local PACKAGE_BASE="$(basename "$PACKAGE")" |
[ -f "/tmp/.uci/${PACKAGE_BASE}" ] && { |
[ -f "/tmp/.uci/${PACKAGE_BASE}" ] && { |
. "/tmp/.uci/${PACKAGE_BASE}" 2>/dev/null >/dev/null |
. "/tmp/.uci/${PACKAGE_BASE}" 2>/dev/null >/dev/null |
config_cb |
config_cb |
} |
} |
} |
} |
|
|
|
uci_apply_defaults() {( |
|
cd /etc/uci-defaults || return 0 |
|
files="$(ls)" |
|
[ -z "$files" ] && return 0 |
|
mkdir -p /tmp/.uci |
|
for file in $files; do |
|
( . "./$(basename $file)" ) && rm -f "$file" |
|
done |
|
uci commit |
|
)} |
|
|
uci_do_update() { |
uci_do_update() { |
local FILENAME="$1" |
local FILENAME="$1" |
local UPDATE="$2" |
local UPDATE="$2" |
awk -f $UCI_ROOT/lib/config/uci-update.awk -f - <<EOF |
awk -f $UCI_ROOT/lib/config/uci-update.awk -f - <<EOF |
BEGIN { |
BEGIN { |
config = read_file("$FILENAME") |
config = read_file("$FILENAME") |
$UPDATE |
$UPDATE |
print config |
print config |
} |
} |
EOF |
EOF |
} |
} |
|
|
uci_add_update() { |
uci_add_update() { |
local PACKAGE="$1" |
local PACKAGE="$1" |
local UPDATE="$2" |
local UPDATE="$2" |
local PACKAGE_BASE="$(basename "$PACKAGE")" |
local PACKAGE_BASE="$(basename "$PACKAGE")" |
|
|
# FIXME: add locking? |
# FIXME: add locking? |
mkdir -p "/tmp/.uci" |
mkdir -p "/tmp/.uci" |
echo "$UPDATE" >> "/tmp/.uci/${PACKAGE_BASE}" |
echo "$UPDATE" >> "/tmp/.uci/${PACKAGE_BASE}" |
} |
} |
|
|
uci_set() { |
uci_set() { |
local PACKAGE="$1" |
local PACKAGE="$1" |
local CONFIG="$2" |
local CONFIG="$2" |
local OPTION="$3" |
local OPTION="$3" |
local VALUE="$4" |
local VALUE="$4" |
|
|
( # spawn a subshell so you don't mess up the current environment |
( # spawn a subshell so you don't mess up the current environment |
uci_load "$PACKAGE" |
uci_load "$PACKAGE" |
config_get type "$CONFIG" TYPE |
config_get type "$CONFIG" TYPE |
[ -z "$type" ] |
[ -z "$type" ] |
) || uci_add_update "$PACKAGE" "CONFIG_SECTION='$CONFIG'${N}option '$OPTION' '$VALUE'" |
) || uci_add_update "$PACKAGE" "CONFIG_SECTION='$CONFIG'${N}option '$OPTION' '$VALUE'" |
} |
} |
|
|
uci_add() { |
uci_add() { |
local PACKAGE="$1" |
local PACKAGE="$1" |
local TYPE="$2" |
local TYPE="$2" |
local CONFIG="$3" |
local CONFIG="$3" |
|
|
uci_add_update "$PACKAGE" "config '$TYPE' '$CONFIG'" |
uci_add_update "$PACKAGE" "config '$TYPE' '$CONFIG'" |
} |
} |
|
|
uci_rename() { |
uci_rename() { |
local PACKAGE="$1" |
local PACKAGE="$1" |
local CONFIG="$2" |
local CONFIG="$2" |
local VALUE="$3" |
local VALUE="$3" |
|
|
uci_add_update "$PACKAGE" "config_rename '$CONFIG' '$VALUE'" |
uci_add_update "$PACKAGE" "config_rename '$CONFIG' '$VALUE'" |
} |
} |
|
|
uci_remove() { |
uci_remove() { |
local PACKAGE="$1" |
local PACKAGE="$1" |
local CONFIG="$2" |
local CONFIG="$2" |
local OPTION="$3" |
local OPTION="$3" |
|
|
if [ -z "$OPTION" ]; then |
if [ -z "$OPTION" ]; then |
uci_add_update "$PACKAGE" "config_clear '$CONFIG'" |
uci_add_update "$PACKAGE" "config_clear '$CONFIG'" |
else |
else |
uci_add_update "$PACKAGE" "config_unset '$CONFIG' '$OPTION'" |
uci_add_update "$PACKAGE" "config_unset '$CONFIG' '$OPTION'" |
fi |
fi |
} |
} |
|
|
uci_commit() { |
uci_commit() { |
local PACKAGE="$1" |
local PACKAGE="$1" |
local PACKAGE_BASE="$(basename "$PACKAGE")" |
local PACKAGE_BASE="$(basename "$PACKAGE")" |
|
|
mkdir -p /tmp/.uci |
mkdir -p /tmp/.uci |
LOCK=`which lock` || LOCK=: |
LOCK=`which lock` || LOCK=: |
$LOCK "/tmp/.uci/$PACKAGE_BASE.lock" |
$LOCK "/tmp/.uci/$PACKAGE_BASE.lock" |
[ -f "/tmp/.uci/$PACKAGE_BASE" ] && ( |
[ -f "/tmp/.uci/$PACKAGE_BASE" ] && ( |
updatestr="" |
updatestr="" |
|
|
# replace handlers |
# replace handlers |
config() { |
config() { |
append updatestr "config = update_config(config, \"@$2=$1\")" "$N" |
append updatestr "config = update_config(config, \"@$2=$1\")" "$N" |
} |
} |
option() { |
option() { |
append updatestr "config = update_config(config, \"$CONFIG_SECTION.$1=$2\")" "$N" |
append updatestr "config = update_config(config, \"$CONFIG_SECTION.$1=$2\")" "$N" |
} |
} |
config_rename() { |
config_rename() { |
append updatestr "config = update_config(config, \"&$1=$2\")" "$N" |
append updatestr "config = update_config(config, \"&$1=$2\")" "$N" |
} |
} |
config_unset() { |
config_unset() { |
append updatestr "config = update_config(config, \"-$1.$2\")" "$N" |
append updatestr "config = update_config(config, \"-$1.$2\")" "$N" |
} |
} |
config_clear() { |
config_clear() { |
append updatestr "config = update_config(config, \"-$1\")" "$N" |
append updatestr "config = update_config(config, \"-$1\")" "$N" |
} |
} |
|
|
. "/tmp/.uci/$PACKAGE_BASE" |
. "/tmp/.uci/$PACKAGE_BASE" |
|
|
# completely disable handlers so that they don't get in the way |
# completely disable handlers so that they don't get in the way |
config() { |
config() { |
return 0 |
return 0 |
} |
} |
option() { |
option() { |
return 0 |
return 0 |
} |
} |
|
|
config_load "$PACKAGE" |
config_load "$PACKAGE" |
CONFIG_FILENAME="${CONFIG_FILENAME:-$UCI_ROOT/etc/config/$PACKAGE_BASE}" |
CONFIG_FILENAME="${CONFIG_FILENAME:-$UCI_ROOT/etc/config/$PACKAGE_BASE}" |
uci_do_update "$CONFIG_FILENAME" "$updatestr" > "/tmp/.uci/$PACKAGE_BASE.new" && { |
uci_do_update "$CONFIG_FILENAME" "$updatestr" > "/tmp/.uci/$PACKAGE_BASE.new" && { |
mv -f "/tmp/.uci/$PACKAGE_BASE.new" "$CONFIG_FILENAME" && \ |
mv -f "/tmp/.uci/$PACKAGE_BASE.new" "$CONFIG_FILENAME" && \ |
rm -f "/tmp/.uci/$PACKAGE_BASE" |
rm -f "/tmp/.uci/$PACKAGE_BASE" |
} |
} |
) |
) |
$LOCK -u "/tmp/.uci/$PACKAGE_BASE.lock" |
$LOCK -u "/tmp/.uci/$PACKAGE_BASE.lock" |
} |
} |
|
|
|
|
|
|