diff options
Diffstat (limited to 'package/base-files/files/lib/functions')
| -rw-r--r-- | package/base-files/files/lib/functions/leds.sh | 72 | ||||
| -rw-r--r-- | package/base-files/files/lib/functions/network.sh | 268 | ||||
| -rw-r--r-- | package/base-files/files/lib/functions/preinit.sh | 88 | ||||
| -rw-r--r-- | package/base-files/files/lib/functions/service.sh | 103 | ||||
| -rw-r--r-- | package/base-files/files/lib/functions/system.sh | 112 | ||||
| -rwxr-xr-x | package/base-files/files/lib/functions/uci-defaults-new.sh | 302 | ||||
| -rw-r--r-- | package/base-files/files/lib/functions/uci-defaults.sh | 345 | 
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 +} + | 
