diff options
Diffstat (limited to 'package/base-files/files/lib/functions/uci-defaults.sh')
-rwxr-xr-x[-rw-r--r--] | package/base-files/files/lib/functions/uci-defaults.sh | 807 |
1 files changed, 519 insertions, 288 deletions
diff --git a/package/base-files/files/lib/functions/uci-defaults.sh b/package/base-files/files/lib/functions/uci-defaults.sh index 2658d439ac..de3f180cbb 100644..100755 --- a/package/base-files/files/lib/functions/uci-defaults.sh +++ b/package/base-files/files/lib/functions/uci-defaults.sh @@ -1,345 +1,576 @@ -#!/bin/sh -# Copyright (C) 2011 OpenWrt.org +#!/bin/ash -UCIDEF_LEDS_CHANGED=0 -UCIDEF_GPIO_SWITCHES_CHANGED=0 +CFG=/etc/board.json -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 +. /lib/functions.sh +. /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" } -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 +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_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_interface() { + local name="$1" + local iface="$2" + local proto="$3" + + json_select_object "$name" + json_add_string ifname "$iface" + + if ! json_is_a protocol string; then + case "$proto" in + static|dhcp|none|pppoe) : ;; + *) + case "$name" in + lan) proto="static" ;; + wan) proto="dhcp" ;; + *) proto="none" ;; + esac + ;; + esac + + json_add_string protocol "$proto" + fi + + json_select .. } -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_board_id() { + json_select_object model + json_add_string id "$1" + json_select .. } -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_model_name() { + json_select_object model + json_add_string name "$1" + 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 - - 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_interface_lan() { + json_select_object network + _ucidef_set_interface lan "$@" + json_select .. } -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_interface_wan() { + json_select_object network + _ucidef_set_interface wan "$@" + json_select .. } -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_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_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_add_switch_port() { + # inherited: $num $device $need_tag $role $index $prev_role + # inherited: $n_cpu $n_ports $n_vlan $cpu0 $cpu1 $cpu2 $cpu3 $cpu4 $cpu5 + + n_ports=$((n_ports + 1)) + + json_select_array ports + json_add_object + json_add_int num "$num" + [ -n "$device" ] && json_add_string device "$device" + [ -n "$need_tag" ] && json_add_boolean need_tag "$need_tag" + [ -n "$role" ] && json_add_string role "$role" + [ -n "$index" ] && json_add_int index "$index" + json_close_object + json_select .. + + # record pointer to cpu entry for lookup in _ucidef_finish_switch_roles() + [ -n "$device" ] && { + export "cpu$n_cpu=$n_ports" + n_cpu=$((n_cpu + 1)) + } + + # create/append object to role list + [ -n "$role" ] && { + json_select_array roles + + if [ "$role" != "$prev_role" ]; then + json_add_object + json_add_string role "$role" + json_add_string ports "$num" + json_close_object + + prev_role="$role" + n_vlan=$((n_vlan + 1)) + else + json_select_object "$n_vlan" + json_get_var port ports + json_add_string ports "$port $num" + json_select .. + fi + + json_select .. + } } -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_finish_switch_roles() { + # inherited: $name $n_cpu $n_vlan $cpu0 $cpu1 $cpu2 $cpu3 $cpu4 $cpu5 + local index role roles num device need_tag port ports + + json_select switch + json_select "$name" + json_get_keys roles roles + json_select .. + json_select .. + + for index in $roles; do + eval "port=\$cpu$(((index - 1) % n_cpu))" + + json_select switch + json_select "$name" + json_select ports + json_select "$port" + json_get_vars num device need_tag + json_select .. + json_select .. + + if [ $n_vlan -gt $n_cpu -o ${need_tag:-0} -eq 1 ]; then + num="${num}t" + device="${device}.${index}" + fi + + json_select roles + json_select "$index" + json_get_vars role ports + json_add_string ports "$ports $num" + json_add_string device "$device" + json_select .. + json_select .. + json_select .. + json_select .. + + json_select_object network + local devices + + json_select_object "$role" + # attach previous interfaces (for multi-switch devices) + json_get_var devices ifname + if ! list_contains devices "$device"; then + devices="${devices:+$devices }$device" + fi + json_select .. + + _ucidef_set_interface "$role" "$devices" + json_select .. + done } -ucidef_set_rssimon() { - local dev="$1" - local refresh="$2" - local threshold="$3" +ucidef_add_switch() { + local name="$1"; shift + local port num role device index need_tag prev_role + local cpu0 cpu1 cpu2 cpu3 cpu4 cpu5 + local n_cpu=0 n_vlan=0 n_ports=0 + + json_select_object switch + json_select_object "$name" + json_add_boolean enable 1 + json_add_boolean reset 1 + + for port in "$@"; do + case "$port" in + [0-9]*@*) + num="${port%%@*}" + device="${port##*@}" + need_tag=0 + [ "${num%t}" != "$num" ] && { + num="${num%t}" + need_tag=1 + } + ;; + [0-9]*:*:[0-9]*) + num="${port%%:*}" + index="${port##*:}" + role="${port#[0-9]*:}"; role="${role%:*}" + ;; + [0-9]*:*) + num="${port%%:*}" + role="${port##*:}" + ;; + esac + + if [ -n "$num" ] && [ -n "$device$role" ]; then + _ucidef_add_switch_port + fi + + unset num device role index need_tag + done + json_select .. + json_select .. + + _ucidef_finish_switch_roles +} + +ucidef_add_switch_attr() { + local name="$1" + local key="$2" + local val="$3" - local cfg="rssid_$dev" + json_select_object switch + json_select_object "$name" - uci -q get system.$cfg && return 0 + case "$val" in + true|false) [ "$val" != "true" ]; json_add_boolean "$key" $? ;; + [0-9]) json_add_int "$key" "$val" ;; + *) json_add_string "$key" "$val" ;; + esac - 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 + json_select .. + json_select .. } -ucidef_commit_leds() -{ - [ "$UCIDEF_LEDS_CHANGED" = "1" ] && uci commit system +ucidef_add_switch_port_attr() { + local name="$1" + local port="$2" + local key="$3" + local val="$4" + local ports i num + + json_select_object switch + json_select_object "$name" + + json_get_keys ports ports + json_select_array ports + + for i in $ports; do + json_select "$i" + json_get_var num num + + if [ -n "$num" ] && [ $num -eq $port ]; then + json_select_object attr + + case "$val" in + true|false) [ "$val" != "true" ]; json_add_boolean "$key" $? ;; + [0-9]) json_add_int "$key" "$val" ;; + *) json_add_string "$key" "$val" ;; + esac + + json_select .. + fi + + json_select .. + done + + json_select .. + json_select .. + json_select .. } -ucidef_set_gpio_switch() { - local cfg="gpio_switch_$1" +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_add_atm_bridge() { + local vpi="$1" + local vci="$2" + local encaps="$3" + local payload="$4" + + json_select_object dsl + json_select_object atmbridge + json_add_int vpi "$vpi" + json_add_int vci "$vci" + json_add_string encaps "$encaps" + json_add_string payload "$payload" + json_select .. + json_select .. +} + +ucidef_add_adsl_modem() { + local annex="$1" + local firmware="$2" + + json_select_object dsl + json_select_object modem + json_add_string type "adsl" + json_add_string annex "$annex" + json_add_string firmware "$firmware" + json_select .. + json_select .. +} + +ucidef_add_vdsl_modem() { + local annex="$1" + local firmware="$2" + local tone="$3" + local xfer_mode="$4" + + json_select_object dsl + json_select_object modem + json_add_string type "vdsl" + json_add_string annex "$annex" + json_add_string firmware "$firmware" + json_add_string tone "$tone" + json_add_string xfer_mode "$xfer_mode" + json_select .. + json_select .. +} + +ucidef_set_led_netdev() { + local cfg="led_$1" local name="$2" - local gpio_pin="$3" - # use "0" as default value - local default="${4:-0}" + local sysfs="$3" + local dev="$4" + + json_select_object led - uci -q get "system.$cfg" && return 0 + 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 .. - 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 + json_select .. } -ucidef_commit_gpio_switches() -{ - [ "$UCIDEF_GPIO_SWITCHES_CHANGED" = "1" ] && uci commit system +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_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_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_interface_raw() { - local cfg=$1 - local ifname=$2 - local proto=${3:-"none"} +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 .. - uci batch <<EOF -set network.$cfg='interface' -set network.$cfg.ifname='$ifname' -set network.$cfg.proto='$proto' -EOF + json_select .. } -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_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_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_led_gpio() { + local cfg="led_$1" + local name="$2" + local sysfs="$3" + local gpio="$4" + local inverted="$5" + + json_select_object led + + json_select_object "$1" + json_add_string type gpio + json_add_string name "$name" + json_add_string sysfs "$sysfs" + json_add_string trigger "$trigger" + json_add_int gpio "$gpio" + json_add_boolean inverted "$inverted" + json_select .. + + json_select .. } -ucidef_set_interfaces_lan_wan() { - local lan_ifname=$1 - local wan_ifname=$2 +ucidef_set_led_ide() { + local cfg="led_$1" + local name="$2" + local sysfs="$3" + + json_select_object led - ucidef_set_interface_lan "$lan_ifname" - ucidef_set_interface_wan "$wan_ifname" + json_select_object "$1" + json_add_string name "$name" + json_add_string sysfs "$sysfs" + json_add_string trigger ide-disk + json_select .. + + json_select .. } -ucidef_set_interface_macaddr() { - local ifname=$1 - local mac=$2 +ucidef_set_led_timer() { + local cfg="led_$1" + local name="$2" + local sysfs="$3" + local delayon="$4" + local delayoff="$5" + + json_select_object led - uci batch <<EOF -set network.$ifname.macaddr='$mac' -EOF + json_select_object "$1" + json_add_string type timer + json_add_string name "$name" + json_add_string sysfs "$sysfs" + json_add_int delayon "$delayon" + json_add_int delayoff "$delayoff" + json_select .. + + json_select .. } -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_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 "$1" + json_add_string type rssi + json_add_string name "$name" + json_add_string iface "$iface" + 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 .. } -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_set_rssimon() { + local dev="$1" + local refresh="$2" + local threshold="$3" + + json_select_object rssimon + + json_select_object "$dev" + [ -n "$refresh" ] && json_add_int refresh "$refresh" + [ -n "$threshold" ] && json_add_int threshold "$threshold" + json_select .. + + json_select .. + } -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 +ucidef_add_gpio_switch() { + local cfg="$1" + local name="$2" + local pin="$3" + local default="${4:-0}" + + json_select_object gpioswitch + json_select_object "$cfg" + json_add_string name "$name" + json_add_int pin "$pin" + json_add_int default "$default" + json_select .. + json_select .. } +board_config_update() { + json_init + [ -f ${CFG} ] && json_load "$(cat ${CFG})" + + # auto-initialize model id and name if applicable + if ! json_is_a model object; then + json_select_object model + [ -f "/tmp/sysinfo/board_name" ] && \ + json_add_string id "$(cat /tmp/sysinfo/board_name)" + [ -f "/tmp/sysinfo/model" ] && \ + json_add_string name "$(cat /tmp/sysinfo/model)" + json_select .. + fi +} + +board_config_flush() { + json_dump -i > /tmp/.board.json + mv /tmp/.board.json ${CFG} +} |