diff options
author | John Crispin <john@openwrt.org> | 2014-08-18 13:09:17 +0000 |
---|---|---|
committer | John Crispin <john@openwrt.org> | 2014-08-18 13:09:17 +0000 |
commit | 562d9f958290acd4323b24fbecfec43514b392e9 (patch) | |
tree | c1f25b964ce0560d7aa4842fa4de4f560ad374f5 /package/base-files/files/bin | |
parent | 2c6768219221954c731b14f43f57840a96002a03 (diff) | |
download | upstream-562d9f958290acd4323b24fbecfec43514b392e9.tar.gz upstream-562d9f958290acd4323b24fbecfec43514b392e9.tar.bz2 upstream-562d9f958290acd4323b24fbecfec43514b392e9.zip |
base-files: add a hardware detection layer
this allows targets to use the new uci-default helper which will generate
a file called /etc/board.json. a tool called /bin/config_generate can then
be used to generate the default uci settings.
Signed-off-by: John Crispin <blogic@openwrt.org>
SVN-Revision: 42185
Diffstat (limited to 'package/base-files/files/bin')
-rwxr-xr-x | package/base-files/files/bin/board_detect | 14 | ||||
-rwxr-xr-x | package/base-files/files/bin/config_generate | 173 |
2 files changed, 187 insertions, 0 deletions
diff --git a/package/base-files/files/bin/board_detect b/package/base-files/files/bin/board_detect new file mode 100755 index 0000000000..ddd17a1633 --- /dev/null +++ b/package/base-files/files/bin/board_detect @@ -0,0 +1,14 @@ +#!/bin/sh + +[ -d "/etc/board.d/" -a ! -f "/etc/board.json" ] || { + for a in `ls /etc/board.d/*`; do + [ -x $a ] || continue; + $(. $a) + done +} + +[ -f "/etc/board.json" ] || return 1 +[ -f "/etc/config/network" ] || { + touch /etc/config/network + /bin/config_generate +} diff --git a/package/base-files/files/bin/config_generate b/package/base-files/files/bin/config_generate new file mode 100755 index 0000000000..c435e7bb43 --- /dev/null +++ b/package/base-files/files/bin/config_generate @@ -0,0 +1,173 @@ +#!/bin/sh + +CFG=/etc/board.json + +. /usr/share/libubox/jshn.sh + +[ -f $CFG ] || exit 1 + +generate_static_network() { + uci -q batch <<EOF +delete network.loopback +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' +delete network.globals +set network.globals='globals' +set network.globals.ula_prefix='fdb1:a57f:2544::/48' +EOF +} + +next_vlan=3 +generate_network() { + local vlan + + json_select network + json_select $1 + json_get_vars ifname create_vlan macaddr + json_select .. + json_select .. + + [ -n "$ifname" ] || return + [ "$create_vlan" -eq 1 ] && case $1 in + lan) vlan=1;; + wan) vlan=2;; + *) + vlan=$next_vlan + next_vlan=$((next_vlan + 1)) + ;; + esac + [ -n "$vlan" ] && ifname=${ifname}.${vlan} + uci -q batch <<EOF +delete network.$1 +set network.$1='interface' +set network.$1.ifname='$ifname' +set network.$1.force_link=1 +set network.$1.proto='none' +set network.$1.macaddr='$macaddr' +EOF + + case $1 in + lan) uci -q batch <<EOF +set network.$1.type='bridge' +set network.$1.proto='static' +set network.$1.ipaddr='192.168.1.1' +set network.$1.netmask='255.255.255.0' +set network.$1.ip6assign='60' +EOF + ;; + wan) uci -q batch <<EOF +set network.$1.proto='dhcp' +delete network.wan6 +set network.wan6='interface' +set network.wan6.ifname='@wan6' +set network.wan6.proto='dhcpv6' +EOF + ;; + esac +} + +generate_switch_vlan() { + local device=$1 + local vlan=$2 + local cpu_port=$3 + + case $vlan in + lan) vlan=1;; + wan) vlan=2;; + *) vlan=${vlan##vlan};; + esac + + json_select vlans + json_select $2 + json_get_values ports + json_select .. + json_select .. + + uci -q 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 ${cpu_port}t' +EOF +} + +generate_switch() { + local key=$1 + local vlans + + json_select switch + json_select $key + json_get_vars enable reset blinkrate cpu_port + + [ -n "$cpu_port" ] || return + + uci -q batch <<EOF +add network switch +set network.@switch[-1].name='$key' +set network.@switch[-1].reset='$reset' +set network.@switch[-1].enable_vlan='$enable' +set network.@switch[-1].blinkrate='$blinkrate' +EOF + + json_get_keys vlans vlans + for vlan in $vlans; do generate_switch_vlan $1 $vlan $cpu_port; done + json_select .. + json_select .. +} + +generate_led() { + local key=$1 + local cfg="led_$key" + + json_select led + json_select $key + json_get_vars name sysfs type trigger device interface default + json_select .. + json_select .. + + uci -q batch <<EOF +delete system.$cfg +set system.$cfg='led' +set system.$cfg.name='$name' +set system.$cfg.sysfs='$sysfs' +set system.$cfg.dev='$device' +set system.$cfg.trigger='$trigger' +set system.$cfg.port_mask='$port_mask' +set system.$cfg.default='$default' +EOF + case $type in + netdev) + uci -q batch <<EOF +set system.$cfg.trigger='netdev' +set system.$cfg.mode='link tx rx' +EOF + ;; + + usb) + uci -q batch <<EOF +set system.$cfg.trigger='usbdev' +set system.$cfg.interval='50' +EOF + ;; + + esac +} + +json_init +json_load "$(cat ${CFG})" + +generate_static_network + +json_get_keys keys network +for key in $keys; do generate_network $key; done + +json_get_keys keys switch +for key in $keys; do generate_switch $key; done + +json_get_keys keys led +for key in $keys; do generate_led $key; done + +uci commit |