| #!/bin/sh |
| |
| CFG=/etc/board.json |
| |
| . /usr/share/libubox/jshn.sh |
| |
| [ -s $CFG ] || /bin/board_detect || exit 1 |
| [ -s /etc/config/network -a -s /etc/config/system ] && exit 0 |
| |
| generate_bridge() { |
| local name=$1 |
| local macaddr=$2 |
| uci -q batch <<-EOF |
| set network.$name=device |
| set network.$name.name=$name |
| set network.$name.type=bridge |
| EOF |
| if [ -n "$macaddr" ]; then |
| uci -q batch <<-EOF |
| set network.$name.macaddr=$macaddr |
| EOF |
| fi |
| } |
| |
| bridge_vlan_id=0 |
| generate_bridge_vlan() { |
| local name=$1_vlan |
| local device=$2 |
| local ports="$3" |
| local vlan="$4" |
| uci -q batch <<-EOF |
| set network.$name=bridge-vlan |
| set network.$name.device='$device' |
| set network.$name.vlan='$vlan' |
| set network.$name.ports='$ports' |
| EOF |
| } |
| |
| generate_static_network() { |
| uci -q batch <<-EOF |
| delete network.loopback |
| set network.loopback='interface' |
| set network.loopback.device='lo' |
| set network.loopback.proto='static' |
| set network.loopback.ipaddr='127.0.0.1' |
| set network.loopback.netmask='255.0.0.0' |
| EOF |
| [ -e /proc/sys/net/ipv6 ] && { |
| uci -q batch <<-EOF |
| delete network.globals |
| set network.globals='globals' |
| set network.globals.ula_prefix='auto' |
| EOF |
| } |
| |
| if json_is_a dsl object; then |
| json_select dsl |
| if json_is_a atmbridge object; then |
| json_select atmbridge |
| local vpi vci encaps payload nameprefix |
| json_get_vars vpi vci encaps payload nameprefix |
| uci -q batch <<-EOF |
| delete network.atm |
| set network.atm='atm-bridge' |
| set network.atm.vpi='$vpi' |
| set network.atm.vci='$vci' |
| set network.atm.encaps='$encaps' |
| set network.atm.payload='$payload' |
| set network.atm.nameprefix='$nameprefix' |
| EOF |
| json_select .. |
| fi |
| |
| if json_is_a modem object; then |
| json_select modem |
| local type annex firmware tone xfer_mode |
| json_get_vars type annex firmware tone xfer_mode |
| uci -q batch <<-EOF |
| delete network.dsl |
| set network.dsl='dsl' |
| set network.dsl.annex='$annex' |
| set network.dsl.firmware='$firmware' |
| set network.dsl.tone='$tone' |
| set network.dsl.xfer_mode='$xfer_mode' |
| EOF |
| json_select .. |
| fi |
| json_select .. |
| fi |
| } |
| |
| addr_offset=2 |
| generate_network() { |
| local ports device macaddr protocol type ipaddr netmask vlan |
| local bridge=$2 |
| |
| json_select network |
| json_select "$1" |
| json_get_vars device macaddr metric protocol ipaddr netmask vlan |
| json_get_values ports ports |
| json_select .. |
| json_select .. |
| |
| [ -n "$device" -o -n "$ports" ] || return |
| |
| # Force bridge for "lan" as it may have other devices (e.g. wireless) |
| # bridged |
| [ "$1" = "lan" -a -z "$ports" ] && { |
| ports="$device" |
| } |
| |
| [ -n "$ports" -a -z "$bridge" ] && { |
| uci -q batch <<-EOF |
| add network device |
| set network.@device[-1].name='br-$1' |
| set network.@device[-1].type='bridge' |
| EOF |
| for port in $ports; do uci add_list network.@device[-1].ports="$port"; done |
| [ -n "$macaddr" ] && { |
| for port in $ports; do |
| uci -q batch <<-EOF |
| add network device |
| set network.@device[-1].name='$port' |
| set network.@device[-1].macaddr='$macaddr' |
| EOF |
| done |
| } |
| device=br-$1 |
| type= |
| macaddr="" |
| } |
| |
| [ -n "$bridge" ] && { |
| [ -z "$ports" ] && ports="$device" |
| if [ -z "$vlan" ]; then |
| bridge_vlan_id=$((bridge_vlan_id + 1)) |
| vlan=$bridge_vlan_id |
| fi |
| generate_bridge_vlan $1 $bridge "$ports" $vlan |
| device=$bridge.$vlan |
| type="" |
| } |
| |
| if [ -n "$macaddr" ]; then |
| uci -q batch <<-EOF |
| add network device |
| set network.@device[-1].name='$device' |
| set network.@device[-1].macaddr='$macaddr' |
| EOF |
| fi |
| |
| uci -q batch <<-EOF |
| delete network.$1 |
| set network.$1='interface' |
| set network.$1.type='$type' |
| set network.$1.device='$device' |
| set network.$1.metric='$metric' |
| set network.$1.proto='none' |
| EOF |
| |
| case "$protocol" in |
| static) |
| local ipad |
| case "$1" in |
| lan) ipad=${ipaddr:-"192.168.1.1"} ;; |
| *) ipad=${ipaddr:-"192.168.$((addr_offset++)).1"} ;; |
| esac |
| |
| netm=${netmask:-"255.255.255.0"} |
| |
| uci -q batch <<-EOF |
| set network.$1.proto='static' |
| set network.$1.ipaddr='$ipad' |
| set network.$1.netmask='$netm' |
| EOF |
| [ -e /proc/sys/net/ipv6 ] && uci set network.$1.ip6assign='60' |
| ;; |
| |
| dhcp) |
| # fixup IPv6 slave interface if parent is a bridge |
| [ "$type" = "bridge" ] && device="br-$1" |
| |
| uci set network.$1.proto='dhcp' |
| [ -e /proc/sys/net/ipv6 ] && { |
| uci -q batch <<-EOF |
| delete network.${1}6 |
| set network.${1}6='interface' |
| set network.${1}6.device='$device' |
| set network.${1}6.proto='dhcpv6' |
| EOF |
| } |
| ;; |
| |
| pppoe) |
| uci -q batch <<-EOF |
| set network.$1.proto='pppoe' |
| set network.$1.username='username' |
| set network.$1.password='password' |
| EOF |
| [ -e /proc/sys/net/ipv6 ] && { |
| uci -q batch <<-EOF |
| set network.$1.ipv6='1' |
| delete network.${1}6 |
| set network.${1}6='interface' |
| set network.${1}6.device='@${1}' |
| set network.${1}6.proto='dhcpv6' |
| EOF |
| } |
| ;; |
| |
| ncm|\ |
| qmi|\ |
| mbim) |
| uci -q batch <<-EOF |
| set network.$1.proto='${protocol}' |
| set network.$1.pdptype='ipv4' |
| EOF |
| ;; |
| esac |
| } |
| |
| generate_switch_vlans_ports() { |
| local switch="$1" |
| local port ports role roles num attr val |
| |
| # |
| # autogenerate vlans |
| # |
| |
| if json_is_a roles array; then |
| json_get_keys roles roles |
| json_select roles |
| |
| for role in $roles; do |
| json_select "$role" |
| json_get_vars ports |
| json_select .. |
| |
| uci -q batch <<-EOF |
| add network switch_vlan |
| set network.@switch_vlan[-1].device='$switch' |
| set network.@switch_vlan[-1].vlan='$role' |
| set network.@switch_vlan[-1].ports='$ports' |
| EOF |
| done |
| |
| json_select .. |
| fi |
| |
| |
| # |
| # write port specific settings |
| # |
| |
| if json_is_a ports array; then |
| json_get_keys ports ports |
| json_select ports |
| |
| for port in $ports; do |
| json_select "$port" |
| json_get_vars num |
| |
| if json_is_a attr object; then |
| json_get_keys attr attr |
| json_select attr |
| uci -q batch <<-EOF |
| add network switch_port |
| set network.@switch_port[-1].device='$switch' |
| set network.@switch_port[-1].port=$num |
| EOF |
| |
| for attr in $attr; do |
| json_get_var val "$attr" |
| uci -q set network.@switch_port[-1].$attr="$val" |
| done |
| json_select .. |
| fi |
| json_select .. |
| done |
| |
| json_select .. |
| fi |
| } |
| |
| generate_switch() { |
| local key="$1" |
| local vlans |
| |
| json_select switch |
| json_select "$key" |
| json_get_vars enable reset blinkrate cpu_port \ |
| ar8xxx_mib_type ar8xxx_mib_poll_interval |
| |
| 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' |
| set network.@switch[-1].ar8xxx_mib_type='$ar8xxx_mib_type' |
| set network.@switch[-1].ar8xxx_mib_poll_interval='$ar8xxx_mib_poll_interval' |
| EOF |
| |
| generate_switch_vlans_ports "$1" |
| |
| json_select .. |
| json_select .. |
| } |
| |
| generate_static_system() { |
| uci -q batch <<-EOF |
| delete system.@system[0] |
| add system system |
| set system.@system[-1].hostname='OpenWrt' |
| set system.@system[-1].timezone='CST-8' |
| set system.@system[-1].zonename='Asia/Shanghai' |
| set system.@system[-1].ttylogin='0' |
| set system.@system[-1].log_size='64' |
| set system.@system[-1].urandom_seed='0' |
| |
| delete system.ntp |
| set system.ntp='timeserver' |
| set system.ntp.enabled='1' |
| set system.ntp.enable_server='0' |
| add_list system.ntp.server='0.openwrt.pool.ntp.org' |
| add_list system.ntp.server='1.openwrt.pool.ntp.org' |
| add_list system.ntp.server='2.openwrt.pool.ntp.org' |
| add_list system.ntp.server='3.openwrt.pool.ntp.org' |
| EOF |
| |
| if json_is_a system object; then |
| json_select system |
| local hostname |
| if json_get_var hostname hostname; then |
| uci -q set "system.@system[-1].hostname=$hostname" |
| fi |
| |
| local compat_version |
| if json_get_var compat_version compat_version; then |
| uci -q set "system.@system[-1].compat_version=$compat_version" |
| else |
| uci -q set "system.@system[-1].compat_version=1.0" |
| fi |
| |
| local timezone |
| if json_get_var timezone timezone; then |
| uci -q set "system.@system[-1].timezone=$timezone" |
| fi |
| |
| if json_is_a ntpserver array; then |
| local keys key |
| json_get_keys keys ntpserver |
| json_select ntpserver |
| uci -q delete "system.ntp.server" |
| |
| for key in $keys; do |
| local server |
| if json_get_var server "$key"; then |
| uci -q add_list "system.ntp.server=$server" |
| fi |
| done |
| json_select .. |
| fi |
| json_select .. |
| fi |
| } |
| |
| generate_rssimon() { |
| local key="$1" |
| local cfg="rssid_$key" |
| local refresh threshold |
| |
| json_select rssimon |
| json_select "$key" |
| json_get_vars refresh threshold |
| json_select .. |
| json_select .. |
| |
| uci -q batch <<-EOF |
| delete system.$cfg |
| set system.$cfg='rssid' |
| set system.$cfg.dev='$key' |
| set system.$cfg.refresh='$refresh' |
| set system.$cfg.threshold='$threshold' |
| EOF |
| } |
| |
| generate_led() { |
| local key="$1" |
| local cfg="led_$key" |
| |
| json_select led |
| json_select "$key" |
| json_get_vars name sysfs type trigger default |
| |
| uci -q batch <<-EOF |
| delete system.$cfg |
| set system.$cfg='led' |
| set system.$cfg.name='$name' |
| set system.$cfg.sysfs='$sysfs' |
| set system.$cfg.trigger='$trigger' |
| set system.$cfg.default='$default' |
| EOF |
| |
| case "$type" in |
| gpio) |
| local gpio inverted |
| json_get_vars gpio inverted |
| uci -q batch <<-EOF |
| set system.$cfg.trigger='gpio' |
| set system.$cfg.gpio='$gpio' |
| set system.$cfg.inverted='$inverted' |
| EOF |
| ;; |
| |
| netdev) |
| local device mode |
| json_get_vars device mode |
| uci -q batch <<-EOF |
| set system.$cfg.trigger='netdev' |
| set system.$cfg.mode='$mode' |
| set system.$cfg.dev='$device' |
| EOF |
| ;; |
| |
| usb) |
| local device |
| json_get_vars device |
| uci -q batch <<-EOF |
| set system.$cfg.trigger='usbdev' |
| set system.$cfg.interval='50' |
| set system.$cfg.dev='$device' |
| EOF |
| ;; |
| |
| usbport) |
| local ports port |
| json_get_values ports ports |
| uci set system.$cfg.trigger='usbport' |
| for port in $ports; do |
| uci add_list system.$cfg.port=$port |
| done |
| ;; |
| |
| rssi) |
| local iface minq maxq offset factor |
| json_get_vars iface minq maxq offset factor |
| uci -q batch <<-EOF |
| 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 |
| ;; |
| |
| switch) |
| local port_mask speed_mask mode |
| json_get_vars port_mask speed_mask mode |
| uci -q batch <<-EOF |
| set system.$cfg.port_mask='$port_mask' |
| set system.$cfg.speed_mask='$speed_mask' |
| set system.$cfg.mode='$mode' |
| EOF |
| ;; |
| |
| portstate) |
| local port_state |
| json_get_vars port_state |
| uci -q batch <<-EOF |
| set system.$cfg.port_state='$port_state' |
| EOF |
| ;; |
| |
| timer|oneshot) |
| local delayon delayoff |
| json_get_vars delayon delayoff |
| uci -q batch <<-EOF |
| set system.$cfg.trigger='$type' |
| set system.$cfg.delayon='$delayon' |
| set system.$cfg.delayoff='$delayoff' |
| EOF |
| ;; |
| esac |
| |
| json_select .. |
| json_select .. |
| } |
| |
| generate_gpioswitch() { |
| local cfg="$1" |
| |
| json_select gpioswitch |
| json_select "$cfg" |
| local name pin default |
| json_get_vars name pin default |
| uci -q batch <<-EOF |
| delete system.$cfg |
| set system.$cfg='gpio_switch' |
| set system.$cfg.name='$name' |
| set system.$cfg.gpio_pin='$pin' |
| set system.$cfg.value='$default' |
| EOF |
| json_select .. |
| json_select .. |
| } |
| |
| json_init |
| json_load "$(cat ${CFG})" |
| |
| umask 077 |
| |
| if [ ! -s /etc/config/network ]; then |
| bridge_name="" |
| touch /etc/config/network |
| generate_static_network |
| |
| json_get_vars bridge |
| [ -n "$bridge" ] && { |
| json_select bridge |
| json_get_vars name macaddr |
| generate_bridge "$name" "$macaddr" |
| json_select .. |
| bridge_name=$name |
| } |
| |
| json_get_keys keys network |
| for key in $keys; do generate_network $key $bridge_name; done |
| |
| json_get_keys keys switch |
| for key in $keys; do generate_switch $key; done |
| fi |
| |
| if [ ! -s /etc/config/system ]; then |
| touch /etc/config/system |
| generate_static_system |
| |
| json_get_keys keys rssimon |
| for key in $keys; do generate_rssimon $key; done |
| |
| json_get_keys keys gpioswitch |
| for key in $keys; do generate_gpioswitch $key; done |
| |
| json_get_keys keys led |
| for key in $keys; do generate_led $key; done |
| fi |
| uci commit |