aboutsummaryrefslogtreecommitdiffstats
path: root/package/base-files/files/lib/functions
diff options
context:
space:
mode:
Diffstat (limited to 'package/base-files/files/lib/functions')
-rw-r--r--package/base-files/files/lib/functions/leds.sh72
-rw-r--r--package/base-files/files/lib/functions/network.sh268
-rw-r--r--package/base-files/files/lib/functions/preinit.sh88
-rw-r--r--package/base-files/files/lib/functions/service.sh103
-rw-r--r--package/base-files/files/lib/functions/system.sh112
-rwxr-xr-xpackage/base-files/files/lib/functions/uci-defaults-new.sh302
-rw-r--r--package/base-files/files/lib/functions/uci-defaults.sh345
7 files changed, 1290 insertions, 0 deletions
diff --git a/package/base-files/files/lib/functions/leds.sh b/package/base-files/files/lib/functions/leds.sh
new file mode 100644
index 0000000..d4d4512
--- /dev/null
+++ b/package/base-files/files/lib/functions/leds.sh
@@ -0,0 +1,72 @@
+#!/bin/sh
+# Copyright (C) 2013 OpenWrt.org
+
+led_set_attr() {
+ [ -f "/sys/class/leds/$1/$2" ] && echo "$3" > "/sys/class/leds/$1/$2"
+}
+
+led_timer() {
+ led_set_attr $1 "trigger" "timer"
+ led_set_attr $1 "delay_on" "$2"
+ led_set_attr $1 "delay_off" "$3"
+}
+
+led_on() {
+ led_set_attr $1 "trigger" "none"
+ led_set_attr $1 "brightness" 255
+}
+
+led_off() {
+ led_set_attr $1 "trigger" "none"
+ led_set_attr $1 "brightness" 0
+}
+
+led_morse() {
+ led_set_attr $1 "trigger" "morse"
+ led_set_attr $1 "delay" "$2"
+ led_set_attr $1 "message" "$3"
+}
+
+status_led_set_timer() {
+ led_timer $status_led "$1" "$2"
+ [ -n "$status_led2" ] && led_timer $status_led2 "$1" "$2"
+}
+
+status_led_set_heartbeat() {
+ led_set_attr $status_led "trigger" "heartbeat"
+}
+
+status_led_set_morse() {
+ led_morse $status_led "$1" "$2"
+ [ -n "$status_led2" ] && led_morse $status_led2 "$1" "$2"
+}
+
+status_led_on() {
+ led_on $status_led
+ [ -n "$status_led2" ] && led_on $status_led2
+}
+
+status_led_off() {
+ led_off $status_led
+ [ -n "$status_led2" ] && led_off $status_led2
+}
+
+status_led_blink_slow() {
+ led_timer $status_led 1000 1000
+}
+
+status_led_blink_fast() {
+ led_timer $status_led 100 100
+}
+
+status_led_blink_preinit() {
+ led_timer $status_led 100 100
+}
+
+status_led_blink_failsafe() {
+ led_timer $status_led 50 50
+}
+
+status_led_blink_preinit_regular() {
+ led_timer $status_led 200 200
+}
diff --git a/package/base-files/files/lib/functions/network.sh b/package/base-files/files/lib/functions/network.sh
new file mode 100644
index 0000000..1b0c717
--- /dev/null
+++ b/package/base-files/files/lib/functions/network.sh
@@ -0,0 +1,268 @@
+# 1: destination variable
+# 2: interface
+# 3: path
+# 4: separator
+# 5: limit
+__network_ifstatus() {
+ local __tmp
+
+ [ -z "$__NETWORK_CACHE" ] && \
+ export __NETWORK_CACHE="$(ubus call network.interface dump)"
+
+ __tmp="$(jsonfilter ${4:+-F "$4"} ${5:+-l "$5"} -s "$__NETWORK_CACHE" -e "$1=@.interface${2:+[@.interface='$2']}$3")"
+
+ [ -z "$__tmp" ] && \
+ unset "$1" && \
+ return 1
+
+ eval "$__tmp"
+}
+
+# determine first IPv4 address of given logical interface
+# 1: destination variable
+# 2: interface
+network_get_ipaddr() {
+ __network_ifstatus "$1" "$2" "['ipv4-address'][0].address";
+}
+
+# determine first IPv6 address of given logical interface
+# 1: destination variable
+# 2: interface
+network_get_ipaddr6() {
+ local __addr
+
+ if __network_ifstatus "__addr" "$2" "['ipv6-address','ipv6-prefix-assignment'][0].address"; then
+ case "$__addr" in
+ *:) export "$1=${__addr}1" ;;
+ *) export "$1=${__addr}" ;;
+ esac
+ return 0
+ fi
+
+ unset $1
+ return 1
+}
+
+# determine first IPv4 subnet of given logical interface
+# 1: destination variable
+# 2: interface
+network_get_subnet() {
+ __network_ifstatus "$1" "$2" "['ipv4-address'][0]['address','mask']" "/"
+}
+
+# determine first IPv6 subnet of given logical interface
+# 1: destination variable
+# 2: interface
+network_get_subnet6() {
+ __network_ifstatus "$1" "$2" "['ipv6-address'][0]['address','mask']" "/"
+}
+
+# determine first IPv6 prefix of given logical interface
+# 1: destination variable
+# 2: interface
+network_get_prefix6() {
+ __network_ifstatus "$1" "$2" "['ipv6-prefix'][0]['address','mask']" "/"
+}
+
+# determine all IPv4 addresses of given logical interface
+# 1: destination variable
+# 2: interface
+network_get_ipaddrs() {
+ __network_ifstatus "$1" "$2" "['ipv4-address'][*].address"
+}
+
+# determine all IPv6 addresses of given logical interface
+# 1: destination variable
+# 2: interface
+network_get_ipaddrs6() {
+ local __addr
+ local __list=""
+
+ if __network_ifstatus "__addr" "$2" "['ipv6-address','ipv6-prefix-assignment'][*].address"; then
+ for __addr in $__addr; do
+ case "$__addr" in
+ *:) __list="${__list:+$__list }${__addr}1" ;;
+ *) __list="${__list:+$__list }${__addr}" ;;
+ esac
+ done
+
+ export "$1=$__list"
+ return 0
+ fi
+
+ unset "$1"
+ return 1
+}
+
+# determine all IP addresses of given logical interface
+# 1: destination variable
+# 2: interface
+network_get_ipaddrs_all() {
+ local __addr
+ local __list=""
+
+ if __network_ifstatus "__addr" "$2" "['ipv4-address','ipv6-address','ipv6-prefix-assignment'][*].address"; then
+ for __addr in $__addr; do
+ case "$__addr" in
+ *:) __list="${__list:+$__list }${__addr}1" ;;
+ *) __list="${__list:+$__list }${__addr}" ;;
+ esac
+ done
+
+ export "$1=$__list"
+ return 0
+ fi
+
+ unset "$1"
+ return 1
+}
+
+# determine all IPv4 subnets of given logical interface
+# 1: destination variable
+# 2: interface
+network_get_subnets() {
+ __network_ifstatus "$1" "$2" "['ipv4-address'][*]['address','mask']" "/ "
+}
+
+# determine all IPv6 subnets of given logical interface
+# 1: destination variable
+# 2: interface
+network_get_subnets6() {
+ local __addr
+ local __list=""
+
+ if __network_ifstatus "__addr" "$2" "['ipv6-address','ipv6-prefix-assignment'][*]['address','mask']" "/ "; then
+ for __addr in $__addr; do
+ case "$__addr" in
+ *:/*) __list="${__list:+$__list }${__addr%/*}1/${__addr##*/}" ;;
+ *) __list="${__list:+$__list }${__addr}" ;;
+ esac
+ done
+
+ export "$1=$__list"
+ return 0
+ fi
+
+ unset "$1"
+ return 1
+}
+
+# determine all IPv6 prefixes of given logical interface
+# 1: destination variable
+# 2: interface
+network_get_prefixes6() {
+ __network_ifstatus "$1" "$2" "['ipv6-prefix'][*]['address','mask']" "/ "
+}
+
+# determine IPv4 gateway of given logical interface
+# 1: destination variable
+# 2: interface
+# 3: consider inactive gateway if "true" (optional)
+network_get_gateway() {
+ __network_ifstatus "$1" "$2" ".route[@.target='0.0.0.0' && !@.table].nexthop" "" 1 && \
+ return 0
+
+ [ "$3" = 1 -o "$3" = "true" ] && \
+ __network_ifstatus "$1" "$2" ".inactive.route[@.target='0.0.0.0' && !@.table].nexthop" "" 1
+}
+
+# determine IPv6 gateway of given logical interface
+# 1: destination variable
+# 2: interface
+# 3: consider inactive gateway if "true" (optional)
+network_get_gateway6() {
+ __network_ifstatus "$1" "$2" ".route[@.target='::' && !@.table].nexthop" "" 1 && \
+ return 0
+
+ [ "$3" = 1 -o "$3" = "true" ] && \
+ __network_ifstatus "$1" "$2" ".inactive.route[@.target='::' && !@.table].nexthop" "" 1
+}
+
+# determine the DNS servers of the given logical interface
+# 1: destination variable
+# 2: interface
+# 3: consider inactive servers if "true" (optional)
+network_get_dnsserver() {
+ __network_ifstatus "$1" "$2" "['dns-server'][*]" && return 0
+
+ [ "$3" = 1 -o "$3" = "true" ] && \
+ __network_ifstatus "$1" "$2" ".inactive['dns-server'][*]"
+}
+
+# determine the domains of the given logical interface
+# 1: destination variable
+# 2: interface
+# 3: consider inactive domains if "true" (optional)
+network_get_dnssearch() {
+ __network_ifstatus "$1" "$2" "['dns-search'][*]" && return 0
+
+ [ "$3" = 1 -o "$3" = "true" ] && \
+ __network_ifstatus "$1" "$2" ".inactive['dns-search'][*]"
+}
+
+
+# 1: destination variable
+# 2: addr
+# 3: inactive
+__network_wan()
+{
+ __network_ifstatus "$1" "" \
+ "[@.route[@.target='$2' && !@.table]].interface" "" 1 && \
+ return 0
+
+ [ "$3" = 1 -o "$3" = "true" ] && \
+ __network_ifstatus "$1" "" \
+ "[@.inactive.route[@.target='$2' && !@.table]].interface" "" 1
+}
+
+# find the logical interface which holds the current IPv4 default route
+# 1: destination variable
+# 2: consider inactive default routes if "true" (optional)
+network_find_wan() { __network_wan "$1" "0.0.0.0" "$2"; }
+
+# find the logical interface which holds the current IPv6 default route
+# 1: destination variable
+# 2: consider inactive dafault routes if "true" (optional)
+network_find_wan6() { __network_wan "$1" "::" "$2"; }
+
+# test whether the given logical interface is running
+# 1: interface
+network_is_up()
+{
+ local __up
+ __network_ifstatus "__up" "$1" ".up" && [ "$__up" = 1 ]
+}
+
+# determine the protocol of the given logical interface
+# 1: destination variable
+# 2: interface
+network_get_protocol() { __network_ifstatus "$1" "$2" ".proto"; }
+
+# determine the layer 3 linux network device of the given logical interface
+# 1: destination variable
+# 2: interface
+network_get_device() { __network_ifstatus "$1" "$2" ".l3_device"; }
+
+# determine the layer 2 linux network device of the given logical interface
+# 1: destination variable
+# 2: interface
+network_get_physdev() { __network_ifstatus "$1" "$2" ".device"; }
+
+# defer netifd actions on the given linux network device
+# 1: device name
+network_defer_device()
+{
+ ubus call network.device set_state \
+ "$(printf '{ "name": "%s", "defer": true }' "$1")" 2>/dev/null
+}
+
+# continue netifd actions on the given linux network device
+# 1: device name
+network_ready_device()
+{
+ ubus call network.device set_state \
+ "$(printf '{ "name": "%s", "defer": false }' "$1")" 2>/dev/null
+}
+
+# flush the internal value cache to force re-reading values from ubus
+network_flush_cache() { unset __NETWORK_CACHE; }
diff --git a/package/base-files/files/lib/functions/preinit.sh b/package/base-files/files/lib/functions/preinit.sh
new file mode 100644
index 0000000..57862a1
--- /dev/null
+++ b/package/base-files/files/lib/functions/preinit.sh
@@ -0,0 +1,88 @@
+#!/bin/sh
+# Copyright (C) 2006-2013 OpenWrt.org
+# Copyright (C) 2010 Vertical Communications
+
+boot_hook_splice_start() {
+ export -n PI_HOOK_SPLICE=1
+}
+
+boot_hook_splice_finish() {
+ local hook
+ for hook in $PI_STACK_LIST; do
+ local v; eval "v=\${${hook}_splice:+\$${hook}_splice }$hook"
+ export -n "${hook}=${v% }"
+ export -n "${hook}_splice="
+ done
+ export -n PI_HOOK_SPLICE=
+}
+
+boot_hook_init() {
+ local hook="${1}_hook"
+ export -n "PI_STACK_LIST=${PI_STACK_LIST:+$PI_STACK_LIST }$hook"
+ export -n "$hook="
+}
+
+boot_hook_add() {
+ local hook="${1}_hook${PI_HOOK_SPLICE:+_splice}"
+ local func="${2}"
+
+ [ -n "$func" ] && {
+ local v; eval "v=\$$hook"
+ export -n "$hook=${v:+$v }$func"
+ }
+}
+
+boot_hook_shift() {
+ local hook="${1}_hook"
+ local rvar="${2}"
+
+ local v; eval "v=\$$hook"
+ [ -n "$v" ] && {
+ local first="${v%% *}"
+
+ [ "$v" != "${v#* }" ] && \
+ export -n "$hook=${v#* }" || \
+ export -n "$hook="
+
+ export -n "$rvar=$first"
+ return 0
+ }
+
+ return 1
+}
+
+boot_run_hook() {
+ local hook="$1"
+ local func
+
+ while boot_hook_shift "$hook" func; do
+ local ran; eval "ran=\$PI_RAN_$func"
+ [ -n "$ran" ] || {
+ export -n "PI_RAN_$func=1"
+ $func "$1" "$2"
+ }
+ done
+}
+
+pivot() { # <new_root> <old_root>
+ /bin/mount -o noatime,move /proc $1/proc && \
+ pivot_root $1 $1$2 && {
+ /bin/mount -o noatime,move $2/dev /dev
+ /bin/mount -o noatime,move $2/tmp /tmp
+ /bin/mount -o noatime,move $2/sys /sys 2>&-
+ /bin/mount -o noatime,move $2/overlay /overlay 2>&-
+ return 0
+ }
+}
+
+fopivot() { # <rw_root> <work_dir> <ro_root> <dupe?>
+ /bin/mount -o noatime,lowerdir=/,upperdir=$1,workdir=$2 -t overlay "overlayfs:$1" /mnt
+ pivot /mnt $3
+}
+
+ramoverlay() {
+ mkdir -p /tmp/root
+ /bin/mount -t tmpfs -o noatime,mode=0755 root /tmp/root
+ mkdir -p /tmp/root/root /tmp/root/work
+ fopivot /tmp/root/root /tmp/root/work /rom 1
+}
diff --git a/package/base-files/files/lib/functions/service.sh b/package/base-files/files/lib/functions/service.sh
new file mode 100644
index 0000000..3d08e14
--- /dev/null
+++ b/package/base-files/files/lib/functions/service.sh
@@ -0,0 +1,103 @@
+#
+# service: simple wrapper around start-stop-daemon
+#
+# Usage: service ACTION EXEC ARGS...
+#
+# Action:
+# -C check if EXEC is alive
+# -S start EXEC, passing it ARGS as its arguments
+# -K kill EXEC, sending it a TERM signal if not specified otherwise
+#
+# Environment variables exposed:
+# SERVICE_DAEMONIZE run EXEC in background
+# SERVICE_WRITE_PID create a pid-file and use it for matching
+# SERVICE_MATCH_EXEC use EXEC command-line for matching (default)
+# SERVICE_MATCH_NAME use EXEC process name for matching
+# SERVICE_USE_PID assume EXEC create its own pid-file and use it for matching
+# SERVICE_NAME process name to use (default to EXEC file part)
+# SERVICE_PID_FILE pid file to use (default to /var/run/$SERVICE_NAME.pid)
+# SERVICE_SIG signal to send when using -K
+# SERVICE_SIG_RELOAD default signal used when reloading
+# SERVICE_SIG_STOP default signal used when stopping
+# SERVICE_STOP_TIME time to wait for a process to stop gracefully before killing it
+# SERVICE_UID user EXEC should be run as
+# SERVICE_GID group EXEC should be run as
+#
+# SERVICE_DEBUG don't do anything, but show what would be done
+# SERVICE_QUIET don't print anything
+#
+
+SERVICE_QUIET=1
+SERVICE_SIG_RELOAD="HUP"
+SERVICE_SIG_STOP="TERM"
+SERVICE_STOP_TIME=5
+SERVICE_MATCH_EXEC=1
+
+service() {
+ local ssd
+ local exec
+ local name
+ local start
+ ssd="${SERVICE_DEBUG:+echo }start-stop-daemon${SERVICE_QUIET:+ -q}"
+ case "$1" in
+ -C)
+ ssd="$ssd -K -t"
+ ;;
+ -S)
+ ssd="$ssd -S${SERVICE_DAEMONIZE:+ -b}${SERVICE_WRITE_PID:+ -m}"
+ start=1
+ ;;
+ -K)
+ ssd="$ssd -K${SERVICE_SIG:+ -s $SERVICE_SIG}"
+ ;;
+ *)
+ echo "service: unknown ACTION '$1'" 1>&2
+ return 1
+ esac
+ shift
+ exec="$1"
+ [ -n "$exec" ] || {
+ echo "service: missing argument" 1>&2
+ return 1
+ }
+ [ -x "$exec" ] || {
+ echo "service: file '$exec' is not executable" 1>&2
+ return 1
+ }
+ name="${SERVICE_NAME:-${exec##*/}}"
+ [ -z "$SERVICE_USE_PID$SERVICE_WRITE_PID$SERVICE_PID_FILE" ] \
+ || ssd="$ssd -p ${SERVICE_PID_FILE:-/var/run/$name.pid}"
+ [ -z "$SERVICE_MATCH_NAME" ] || ssd="$ssd -n $name"
+ ssd="$ssd${SERVICE_UID:+ -c $SERVICE_UID${SERVICE_GID:+:$SERVICE_GID}}"
+ [ -z "$SERVICE_MATCH_EXEC$start" ] || ssd="$ssd -x $exec"
+ shift
+ $ssd${1:+ -- "$@"}
+}
+
+service_check() {
+ service -C "$@"
+}
+
+service_signal() {
+ SERVICE_SIG="${SERVICE_SIG:-USR1}" service -K "$@"
+}
+
+service_start() {
+ service -S "$@"
+}
+
+service_stop() {
+ local try
+ SERVICE_SIG="${SERVICE_SIG:-$SERVICE_SIG_STOP}" service -K "$@" || return 1
+ while [ $((try++)) -lt $SERVICE_STOP_TIME ]; do
+ service -C "$@" || return 0
+ sleep 1
+ done
+ SERVICE_SIG="KILL" service -K "$@"
+ sleep 1
+ ! service -C "$@"
+}
+
+service_reload() {
+ SERVICE_SIG="${SERVICE_SIG:-$SERVICE_SIG_RELOAD}" service -K "$@"
+}
diff --git a/package/base-files/files/lib/functions/system.sh b/package/base-files/files/lib/functions/system.sh
new file mode 100644
index 0000000..8d75a5a
--- /dev/null
+++ b/package/base-files/files/lib/functions/system.sh
@@ -0,0 +1,112 @@
+# Copyright (C) 2006-2013 OpenWrt.org
+
+find_mtd_chardev() {
+ local INDEX=$(find_mtd_index "$1")
+ local PREFIX=/dev/mtd
+
+ [ -d /dev/mtd ] && PREFIX=/dev/mtd/
+ echo "${INDEX:+$PREFIX$INDEX}"
+}
+
+mtd_get_mac_ascii()
+{
+ local mtdname="$1"
+ local key="$2"
+ local part
+ local mac_dirty
+
+ part=$(find_mtd_part "$mtdname")
+ if [ -z "$part" ]; then
+ echo "mtd_get_mac_ascii: partition $mtdname not found!" >&2
+ return
+ fi
+
+ mac_dirty=$(strings "$part" | sed -n 's/^'"$key"'=//p')
+
+ # "canonicalize" mac
+ [ -n "$mac_dirty" ] && macaddr_canonicalize "$mac_dirty"
+}
+
+mtd_get_mac_binary() {
+ local mtdname="$1"
+ local offset="$2"
+ local part
+
+ part=$(find_mtd_part "$mtdname")
+ if [ -z "$part" ]; then
+ echo "mtd_get_mac_binary: partition $mtdname not found!" >&2
+ return
+ fi
+
+ dd bs=1 skip=$offset count=6 if=$part 2>/dev/null | hexdump -v -n 6 -e '5/1 "%02x:" 1/1 "%02x"'
+}
+
+mtd_get_part_size() {
+ local part_name=$1
+ local first dev size erasesize name
+ while read dev size erasesize name; do
+ name=${name#'"'}; name=${name%'"'}
+ if [ "$name" = "$part_name" ]; then
+ echo $((0x$size))
+ break
+ fi
+ done < /proc/mtd
+}
+
+macaddr_add() {
+ local mac=$1
+ local val=$2
+ local oui=${mac%:*:*:*}
+ local nic=${mac#*:*:*:}
+
+ nic=$(printf "%06x" $((0x${nic//:/} + $val & 0xffffff)) | sed 's/^\(.\{2\}\)\(.\{2\}\)\(.\{2\}\)/\1:\2:\3/')
+ echo $oui:$nic
+}
+
+macaddr_setbit_la()
+{
+ local mac=$1
+
+ printf "%02x:%s" $((0x${mac%%:*} | 0x02)) ${mac#*:}
+}
+
+macaddr_2bin()
+{
+ local mac=$1
+
+ echo -ne \\x${mac//:/\\x}
+}
+
+macaddr_canonicalize()
+{
+ local mac="$1"
+ local canon=""
+
+ mac=$(echo -n $mac | tr -d \")
+ [ ${#mac} -gt 17 ] && return
+ [ -n "${mac//[a-fA-F0-9\.: -]/}" ] && return
+
+ for octet in ${mac//[\.:-]/ }; do
+ case "${#octet}" in
+ 1)
+ octet="0${octet}"
+ ;;
+ 2)
+ ;;
+ 4)
+ octet="${octet:0:2} ${octet:2:2}"
+ ;;
+ 12)
+ octet="${octet:0:2} ${octet:2:2} ${octet:4:2} ${octet:6:2} ${octet:8:2} ${octet:10:2}"
+ ;;
+ *)
+ return
+ ;;
+ esac
+ canon=${canon}${canon:+ }${octet}
+ done
+
+ [ ${#canon} -ne 17 ] && return
+
+ printf "%02x:%02x:%02x:%02x:%02x:%02x" 0x${canon// / 0x} 2>/dev/null
+}
diff --git a/package/base-files/files/lib/functions/uci-defaults-new.sh b/package/base-files/files/lib/functions/uci-defaults-new.sh
new file mode 100755
index 0000000..7222ff8
--- /dev/null
+++ b/package/base-files/files/lib/functions/uci-defaults-new.sh
@@ -0,0 +1,302 @@
+#!/bin/ash
+
+CFG=/etc/board.json
+
+. /usr/share/libubox/jshn.sh
+
+json_select_array() {
+ local _json_no_warning=1
+
+ json_select "$1"
+ [ $? = 0 ] && return
+
+ json_add_array $1
+ json_close_array
+
+ json_select "$1"
+}
+
+json_select_object() {
+ local _json_no_warning=1
+
+ json_select "$1"
+ [ $? = 0 ] && return
+
+ json_add_object $1
+ json_close_object
+
+ json_select "$1"
+}
+
+_ucidef_set_interface() {
+ local name=$1
+ local iface=$2
+
+ json_select_object $name
+ json_add_string ifname "${iface%%.*}"
+ [ "$iface" = "${iface%%.*}" ] || json_add_boolean create_vlan 1
+ json_select ..
+}
+
+ucidef_set_interface_loopback()
+{
+ # stub
+ local a=$1
+}
+
+ucidef_set_interface_lan() {
+ local lan_if=$1
+
+ json_select_object network
+ _ucidef_set_interface lan $lan_if
+ json_select ..
+}
+
+ucidef_set_interfaces_lan_wan() {
+ local lan_if=$1
+ local wan_if=$2
+
+ json_select_object network
+ _ucidef_set_interface lan $lan_if
+ _ucidef_set_interface wan $wan_if
+ json_select ..
+}
+
+ucidef_add_switch() {
+ local name=$1
+ local reset=$2
+ local enable=$3
+
+ json_select_object switch
+
+ json_select_object $name
+ json_add_boolean enable $enable
+ json_add_boolean reset $reset
+ json_select ..
+
+ json_select ..
+}
+
+ucidef_add_switch_attr() {
+ local name=$1
+ local key=$2
+ local val=$3
+
+ json_select_object switch
+
+ json_select_object $name
+ json_add_string $key $val
+ json_select ..
+
+ json_select ..
+}
+
+ucidef_add_switch_vlan() {
+ local name=$1
+ local vlan=$2
+ local ports=$3
+ local cpu_port=''
+
+ case $vlan in
+ 1) vlan=lan;;
+ 2) vlan=wan;;
+ *) vlan=vlan$vlan;;
+ esac
+
+ json_select_object switch
+ json_select_object $name
+ json_select_object vlans
+
+ json_add_array $vlan
+ for p in $ports; do
+ if [ ${p%t} != $p ]; then
+ cpu_port=$p
+ else
+ json_add_int "" $p
+ fi
+ done
+ json_close_array
+
+ json_select ..
+ [ -n "$cpu_port" ] && json_add_int cpu_port $cpu_port
+ json_select ..
+ json_select ..
+}
+
+ucidef_set_interface_macaddr() {
+ local network=$1
+ local macaddr=$2
+
+ json_select_object network
+
+ json_select $network
+ [ $? -eq 0 ] || {
+ json_select ..
+ return
+ }
+
+ json_add_string macaddr $macaddr
+ json_select ..
+
+ json_select ..
+}
+
+ucidef_set_led_netdev() {
+ local cfg="led_$1"
+ local name=$2
+ local sysfs=$3
+ local dev=$4
+
+ json_select_object led
+
+ json_select_object $1
+ json_add_string name $name
+ json_add_string type netdev
+ json_add_string sysfs $sysfs
+ json_add_string device $dev
+ json_select ..
+
+ json_select ..
+}
+
+ucidef_set_led_interface() {
+ local name=$1
+ local sysfs=$2
+
+ json_select_object led
+
+ json_select_object $1
+ json_add_string name $name
+ json_add_string type interface
+ json_add_string sysfs $sysfs
+ json_add_string interface $name
+ json_select ..
+
+ json_select ..
+}
+
+ucidef_set_led_usbdev() {
+ local cfg="led_$1"
+ local name=$2
+ local sysfs=$3
+ local dev=$4
+
+ json_select_object led
+
+ json_select_object $1
+ json_add_string name $name
+ json_add_string type usb
+ json_add_string sysfs $sysfs
+ json_add_string device $dev
+ json_select ..
+
+ json_select ..
+}
+
+ucidef_set_led_wlan() {
+ local cfg="led_$1"
+ local name=$2
+ local sysfs=$3
+ local trigger=$4
+
+ json_select_object led
+
+ json_select_object $1
+ json_add_string name $name
+ json_add_string type trigger
+ json_add_string sysfs $sysfs
+ json_add_string trigger $trigger
+ json_select ..
+
+ json_select ..
+}
+
+ucidef_set_led_switch() {
+ local cfg="led_$1"
+ local name=$2
+ local sysfs=$3
+ local trigger=$4
+ local port_mask=$5
+
+ json_select_object led
+
+ json_select_object $1
+ json_add_string name $name
+ json_add_string type switch
+ json_add_string sysfs $sysfs
+ json_add_string trigger $trigger
+ json_add_string port_mask $port_mask
+ json_select ..
+
+ json_select ..
+}
+
+ucidef_set_led_default() {
+ local cfg="led_$1"
+ local name=$2
+ local sysfs=$3
+ local default=$4
+
+ json_select_object led
+
+ json_select_object $1
+ json_add_string name $name
+ json_add_string sysfs $sysfs
+ json_add_string default $default
+ json_select ..
+
+ json_select ..
+}
+
+ucidef_set_led_rssi() {
+ local cfg="led_$1"
+ local name=$2
+ local sysfs=$3
+ local iface=$4
+ local minq=$5
+ local maxq=$6
+ local offset=$7
+ local factor=$8
+
+ json_select_object led
+
+ json_select_object rssi
+ json_select_object $1
+ json_add_string name $name
+ json_add_string sysfs $sysfs
+ json_add_string minq $minq
+ json_add_string maxq $maxq
+ json_add_string offset $offset
+ json_add_string factor $factor
+ json_select ..
+ json_select ..
+
+ json_select ..
+}
+
+ucidef_set_rssimon() {
+ local dev="$1"
+ local refresh="$2"
+ local threshold="$3"
+
+ json_select_object led
+
+ json_select_object rssi
+ json_add_string type rssi
+ json_add_string dev $dev
+ json_add_string threshold $threshold
+ json_select ..
+
+ json_select ..
+
+}
+
+board_config_update() {
+ json_init
+ [ -f ${CFG} ] && json_load "$(cat ${CFG})"
+}
+
+board_config_flush() {
+ json_dump -i > /tmp/.board.json
+ mv /tmp/.board.json ${CFG}
+}
diff --git a/package/base-files/files/lib/functions/uci-defaults.sh b/package/base-files/files/lib/functions/uci-defaults.sh
new file mode 100644
index 0000000..2658d43
--- /dev/null
+++ b/package/base-files/files/lib/functions/uci-defaults.sh
@@ -0,0 +1,345 @@
+#!/bin/sh
+# Copyright (C) 2011 OpenWrt.org
+
+UCIDEF_LEDS_CHANGED=0
+UCIDEF_GPIO_SWITCHES_CHANGED=0
+
+ucidef_set_led_netdev() {
+ local cfg="led_$1"
+ local name=$2
+ local sysfs=$3
+ local dev=$4
+
+ uci -q get system.$cfg && return 0
+
+ uci batch <<EOF
+set system.$cfg='led'
+set system.$cfg.name='$name'
+set system.$cfg.sysfs='$sysfs'
+set system.$cfg.trigger='netdev'
+set system.$cfg.dev='$dev'
+set system.$cfg.mode='link tx rx'
+EOF
+ UCIDEF_LEDS_CHANGED=1
+}
+
+ucidef_set_led_usbdev() {
+ local cfg="led_$1"
+ local name=$2
+ local sysfs=$3
+ local dev=$4
+
+ uci -q get system.$cfg && return 0
+
+ uci batch <<EOF
+set system.$cfg='led'
+set system.$cfg.name='$name'
+set system.$cfg.sysfs='$sysfs'
+set system.$cfg.trigger='usbdev'
+set system.$cfg.dev='$dev'
+set system.$cfg.interval='50'
+EOF
+ UCIDEF_LEDS_CHANGED=1
+}
+
+ucidef_set_led_wlan() {
+ local cfg="led_$1"
+ local name=$2
+ local sysfs=$3
+ local trigger=$4
+
+ uci -q get system.$cfg && return 0
+
+ uci batch <<EOF
+set system.$cfg='led'
+set system.$cfg.name='$name'
+set system.$cfg.sysfs='$sysfs'
+set system.$cfg.trigger='$trigger'
+EOF
+ UCIDEF_LEDS_CHANGED=1
+}
+
+ucidef_set_led_switch() {
+ local cfg="led_$1"
+ local name=$2
+ local sysfs=$3
+ local trigger=$4
+ local port_mask=$5
+
+ uci -q get system.$cfg && return 0
+
+ uci batch <<EOF
+set system.$cfg='led'
+set system.$cfg.name='$name'
+set system.$cfg.sysfs='$sysfs'
+set system.$cfg.trigger='$trigger'
+set system.$cfg.port_mask='$port_mask'
+EOF
+ UCIDEF_LEDS_CHANGED=1
+}
+
+ucidef_set_led_default() {
+ local cfg="led_$1"
+ local name=$2
+ local sysfs=$3
+ local default=$4
+
+ uci -q get system.$cfg && return 0
+
+ uci batch <<EOF
+set system.$cfg='led'
+set system.$cfg.name='$name'
+set system.$cfg.sysfs='$sysfs'
+set system.$cfg.default='$default'
+EOF
+ UCIDEF_LEDS_CHANGED=1
+}
+
+ucidef_set_led_rssi() {
+ local cfg="led_$1"
+ local name=$2
+ local sysfs=$3
+ local iface=$4
+ local minq=$5
+ local maxq=$6
+ local offset=$7
+ local factor=$8
+
+ uci -q get system.$cfg && return 0
+
+ uci batch <<EOF
+set system.$cfg='led'
+set system.$cfg.name='$name'
+set system.$cfg.sysfs='$sysfs'
+set system.$cfg.trigger='rssi'
+set system.$cfg.iface='rssid_$iface'
+set system.$cfg.minq='$minq'
+set system.$cfg.maxq='$maxq'
+set system.$cfg.offset='$offset'
+set system.$cfg.factor='$factor'
+EOF
+ UCIDEF_LEDS_CHANGED=1
+}
+
+ucidef_set_led_timer() {
+ local cfg="led_$1"
+ local name=$2
+ local sysfs=$3
+ local delayon=$4
+ local delayoff=$5
+
+ uci -q get system.$cfg && return 0
+
+ uci batch <<EOF
+set system.$cfg='led'
+set system.$cfg.name='$name'
+set system.$cfg.sysfs='$sysfs'
+set system.$cfg.trigger='timer'
+set system.$cfg.delayon='$delayon'
+set system.$cfg.delayoff='$delayoff'
+EOF
+ UCIDEF_LEDS_CHANGED=1
+}
+
+ucidef_set_led_mmc() {
+ local cfg="led_$1"
+ local name=$2
+ local sysfs=$3
+ local trigger=$4
+
+ uci -q get system.$cfg && return 0
+
+ uci batch <<EOF
+set system.$cfg='led'
+set system.$cfg.name='$name'
+set system.$cfg.sysfs='$sysfs'
+set system.$cfg.trigger='$trigger'
+EOF
+ UCIDEF_LEDS_CHANGED=1
+}
+
+ucidef_set_led_trigger_gpio() {
+ local cfg="led_$1"
+ local name=$2
+ local sysfs=$3
+ local gpio=$4
+ local inverted=$5
+
+ uci -q get system.$cfg && return 0
+
+ uci batch <<EOF
+set system.$cfg='led'
+set system.$cfg.name='$name'
+set system.$cfg.sysfs='$sysfs'
+set system.$cfg.trigger='gpio'
+set system.$cfg.gpio='$gpio'
+set system.$cfg.inverted='$inverted'
+EOF
+ UCIDEF_LEDS_CHANGED=1
+}
+
+ucidef_set_led_ide_disk() {
+ local cfg="led_$1"
+ local name=$2
+ local sysfs=$3
+
+ uci -q get system.$cfg && return 0
+
+ uci batch <<EOF
+set system.$cfg='led'
+set system.$cfg.name='$name'
+set system.$cfg.sysfs='$sysfs'
+set system.$cfg.trigger='ide-disk'
+EOF
+ UCIDEF_LEDS_CHANGED=1
+}
+
+ucidef_set_rssimon() {
+ local dev="$1"
+ local refresh="$2"
+ local threshold="$3"
+
+ local cfg="rssid_$dev"
+
+ uci -q get system.$cfg && return 0
+
+ uci batch <<EOF
+set system.$cfg='rssid'
+set system.$cfg.dev='$dev'
+set system.$cfg.refresh='$refresh'
+set system.$cfg.threshold='$threshold'
+EOF
+ UCIDEF_LEDS_CHANGED=1
+}
+
+ucidef_commit_leds()
+{
+ [ "$UCIDEF_LEDS_CHANGED" = "1" ] && uci commit system
+}
+
+ucidef_set_gpio_switch() {
+ local cfg="gpio_switch_$1"
+ local name="$2"
+ local gpio_pin="$3"
+ # use "0" as default value
+ local default="${4:-0}"
+
+ uci -q get "system.$cfg" && return 0
+
+ uci batch <<EOF
+set system.$cfg='gpio_switch'
+set system.$cfg.name='$name'
+set system.$cfg.gpio_pin='$gpio_pin'
+set system.$cfg.value='$default'
+EOF
+ UCIDEF_GPIO_SWITCHES_CHANGED=1
+}
+
+ucidef_commit_gpio_switches()
+{
+ [ "$UCIDEF_GPIO_SWITCHES_CHANGED" = "1" ] && uci commit system
+}
+
+ucidef_set_interface_loopback() {
+ uci batch <<EOF
+set network.loopback='interface'
+set network.loopback.ifname='lo'
+set network.loopback.proto='static'
+set network.loopback.ipaddr='127.0.0.1'
+set network.loopback.netmask='255.0.0.0'
+set network.globals='globals'
+set network.globals.ula_prefix='auto'
+EOF
+}
+
+ucidef_set_interface_raw() {
+ local cfg=$1
+ local ifname=$2
+ local proto=${3:-"none"}
+
+ uci batch <<EOF
+set network.$cfg='interface'
+set network.$cfg.ifname='$ifname'
+set network.$cfg.proto='$proto'
+EOF
+}
+
+ucidef_set_interface_lan() {
+ local ifname=$1
+
+ uci batch <<EOF
+set network.lan='interface'
+set network.lan.ifname='$ifname'
+set network.lan.force_link=1
+set network.lan.type='bridge'
+set network.lan.proto='static'
+set network.lan.ipaddr='192.168.1.1'
+set network.lan.netmask='255.255.255.0'
+set network.lan.ip6assign='60'
+EOF
+}
+
+ucidef_set_interface_wan() {
+ local ifname=$1
+
+ uci batch <<EOF
+set network.wan='interface'
+set network.wan.ifname='$ifname'
+set network.wan.proto='dhcp'
+set network.wan6='interface'
+set network.wan6.ifname='$ifname'
+set network.wan6.proto='dhcpv6'
+EOF
+}
+
+ucidef_set_interfaces_lan_wan() {
+ local lan_ifname=$1
+ local wan_ifname=$2
+
+ ucidef_set_interface_lan "$lan_ifname"
+ ucidef_set_interface_wan "$wan_ifname"
+}
+
+ucidef_set_interface_macaddr() {
+ local ifname=$1
+ local mac=$2
+
+ uci batch <<EOF
+set network.$ifname.macaddr='$mac'
+EOF
+}
+
+ucidef_add_switch() {
+ local name=$1
+ local reset=$2
+ local enable=$3
+ uci batch <<EOF
+add network switch
+set network.@switch[-1].name='$name'
+set network.@switch[-1].reset='$reset'
+set network.@switch[-1].enable_vlan='$enable'
+EOF
+}
+
+ucidef_add_switch_vlan() {
+ local device=$1
+ local vlan=$2
+ local ports=$3
+ uci batch <<EOF
+add network switch_vlan
+set network.@switch_vlan[-1].device='$device'
+set network.@switch_vlan[-1].vlan='$vlan'
+set network.@switch_vlan[-1].ports='$ports'
+EOF
+}
+
+ucidef_add_switch_port() {
+ local device=$1
+ local port=$2
+ uci batch <<EOF
+add network switch_port
+set network.@switch_port[-1].device='$device'
+set network.@switch_port[-1].port='$port'
+EOF
+}
+