rpcd: iwinfo plugin fixes
[openwrt/svn-archive/archive.git] / package / base-files / files / lib / functions / uci-defaults.sh
old mode 100644 (file)
new mode 100755 (executable)
index bf6fe1e..b097fba
-#!/bin/sh
-# Copyright (C) 2011 OpenWrt.org
+#!/bin/ash
 
-UCIDEF_LEDS_CHANGED=0
+CFG=/etc/board.json
 
-ucidef_set_led_netdev() {
-       local cfg="led_$1"
-       local name=$2
-       local sysfs=$3
-       local dev=$4
+. /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"
+}
 
-       uci -q get system.$cfg && return 0
+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"
+       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_board_id() {
+       json_select_object model
+       json_add_string id "$1"
+       json_select ..
+}
+
+ucidef_set_model_name() {
+       json_select_object model
+       json_add_string name "$1"
+       json_select ..
+}
+
+ucidef_set_interface_lan() {
+       json_select_object network
+       _ucidef_set_interface lan "$@"
+       json_select ..
+}
+
+ucidef_set_interface_wan() {
+       json_select_object network
+       _ucidef_set_interface wan "$@"
+       json_select ..
+}
+
+ucidef_set_interfaces_lan_wan() {
+       local lan_if="$1"
+       local wan_if="$2"
 
-       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
+       json_select_object network
+       _ucidef_set_interface lan "$lan_if"
+       _ucidef_set_interface wan "$wan_if"
+       json_select ..
+}
+
+ucidef_set_interface_raw() {
+       json_select_object network
+       _ucidef_set_interface "$@"
+       json_select ..
+}
+
+_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_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_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"
+
+       json_select_object switch
+               json_select_object "$name"
+
+               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 ..
+       json_select ..
+}
+
+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_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 tone="$2"
+       local xfer_mode="$3"
+
+       json_select_object dsl
+               json_select_object modem
+                       json_add_string type "vdsl"
+                       json_add_string annex "$annex"
+                       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 sysfs="$3"
+       local dev="$4"
+       local mode="${5:-link tx rx}"
+
+       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_add_string mode "$mode"
+       json_select ..
+
+       json_select ..
 }
 
 ucidef_set_led_usbdev() {
        local cfg="led_$1"
-       local name=$2
-       local sysfs=$3
-       local dev=$4
+       local name="$2"
+       local sysfs="$3"
+       local dev="$4"
 
-       uci -q get system.$cfg && return 0
+       json_select_object led
 
-       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 "$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
+       local name="$2"
+       local sysfs="$3"
+       local trigger="$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 trigger
+       json_add_string sysfs "$sysfs"
+       json_add_string trigger "$trigger"
+       json_select ..
 
-       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
+       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
+       local name="$2"
+       local sysfs="$3"
+       local trigger="$4"
+       local port_mask="$5"
+       local speed_mask="$6"
+
+       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_add_string speed_mask "$speed_mask"
+       json_select ..
+
+       json_select ..
 }
 
 ucidef_set_led_default() {
        local cfg="led_$1"
-       local name=$2
-       local sysfs=$3
-       local default=$4
+       local name="$2"
+       local sysfs="$3"
+       local default="$4"
+
+       json_select_object led
 
-       uci -q get system.$cfg && return 0
+       json_select_object "$1"
+       json_add_string name "$name"
+       json_add_string sysfs "$sysfs"
+       json_add_string default "$default"
+       json_select ..
 
-       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
+       json_select ..
 }
 
-ucidef_set_led_rssi() {
+ucidef_set_led_gpio() {
        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
+       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_rssimon() {
-       local dev="$1"
-       local refresh="$2"
-       local threshold="$3"
+ucidef_set_led_ide() {
+       local cfg="led_$1"
+       local name="$2"
+       local sysfs="$3"
 
-       local cfg="rssid_$dev"
+       json_select_object led
 
-       uci -q get system.$cfg && return 0
+       json_select_object "$1"
+       json_add_string name "$name"
+       json_add_string sysfs "$sysfs"
+       json_add_string trigger ide-disk
+       json_select ..
 
-       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 ..
 }
 
-ucidef_commit_leds()
-{
-       [ "$UCIDEF_LEDS_CHANGED" == "1" ] && uci commit system
+__ucidef_set_led_timer() {
+       local cfg="led_$1"
+       local name="$2"
+       local sysfs="$3"
+       local trigger="$4"
+       local delayon="$5"
+       local delayoff="$6"
+
+       json_select_object led
+
+       json_select_object "$1"
+       json_add_string type "$trigger"
+       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_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_oneshot() {
+       __ucidef_set_led_timer $1 $2 $3 "oneshot" $4 $5
 }
 
-ucidef_set_interface_raw() {
-       local cfg=$1
-       local ifname=$2
-
-       uci batch <<EOF
-set network.$cfg='interface'
-set network.$cfg.ifname='$ifname'
-set network.$cfg.proto='none'
-EOF
+ucidef_set_led_timer() {
+       __ucidef_set_led_timer $1 $2 $3 "timer" $4 $5
 }
 
-ucidef_set_interface_lan() {
-       local ifname=$1
-
-       uci batch <<EOF
-set network.lan='interface'
-set network.lan.ifname='$ifname'
-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_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_set_interface_wan() {
-       local ifname=$1
+ucidef_set_rssimon() {
+       local dev="$1"
+       local refresh="$2"
+       local threshold="$3"
 
-       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='@wan'
-set network.wan6.proto='dhcpv6'
-EOF
-}
+       json_select_object rssimon
 
-ucidef_set_interfaces_lan_wan() {
-       local lan_ifname=$1
-       local wan_ifname=$2
+       json_select_object "$dev"
+       [ -n "$refresh" ] && json_add_int refresh "$refresh"
+       [ -n "$threshold" ] && json_add_int threshold "$threshold"
+       json_select ..
 
-       ucidef_set_interface_lan "$lan_ifname"
-       ucidef_set_interface_wan "$wan_ifname"
-}
+       json_select ..
 
-ucidef_set_interface_macaddr() {
-       local ifname=$1
-       local mac=$2
+}
 
-       uci batch <<EOF
-set network.$ifname.macaddr='$mac'
-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 ..
 }
 
-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
+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}
+}