#!/bin/sh CFG=/etc/board.json . /usr/share/libubox/jshn.sh [ -s $CFG ] || /bin/board_detect || exit 1 [ -s /etc/config/network ] && \ [ -s /etc/config/system ] && \ [ -s /etc/config/hwinfo ] && \ [ -s /etc/config/blesem ] && \ [ -s /etc/config/poe ] && \ 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 } 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 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 } ip6assign= disable_vlan= apply_network_options() { json_select network_options && { json_get_vars ip6assign ula disable_vlan json_select .. } [ -z "$ip6assign" ] && ip6assign=1 [ -z "$ula" ] && ula=1 [ -e /proc/sys/net/ipv6 ] && [ "$ula" = 1 ] && { uci -q batch <<-EOF delete network.globals set network.globals='globals' set network.globals.ula_prefix='auto' EOF } } metric=1 addr_offset=2 generate_network() { local ports device macaddr proto type ipaddr netmask vlan no_metric local bridge=$2 uci -q batch <<-EOF delete "network.$1" set network.$1='interface' EOF json_select network json_select "$1" json_get_vars device macaddr proto ipaddr netmask vlan ipv6 guest type json_get_values ports ports json_select .. json_select .. json_select network_options && { json_get_vars no_metric json_select .. } # Force bridge for "lan" as it may have other devices (e.g. wireless) # bridged [ "$1" = "lan" ] && [ -z "$ports" ] && { ports="$device" } [ -n "$ports" ] && [ -z "$bridge" ] && { [ -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 } uci -q batch <<-EOF add network device rename network.@device[-1]='br_$1' set network.@device[-1].name='br-$1' set network.@device[-1].type='bridge' EOF [ -n "$device" ] && uci add_list network.@device[-1].ports="$device" || { for port in $ports; do uci add_list network.@device[-1].ports="$port" done } device=br-$1 type= macaddr="" json_select hwinfo json_get_vars dsa json_select .. } 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.proto='none' EOF [ "$1" != "lan" ] && metric=$((metric+1)) [ "$guest" = "1" ] && uci set network.$1.guest='1' case "$proto" in static) local ipad metr case "$1" in lan) ipad="192.168.100.1" metr=1 ;; *) ipad=${ipaddr:-"192.168.$((addr_offset++)).1"} metr="$metric" ;; 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' set network.$1.metric='$metr' EOF [ "$ipv6" = "1" ] && uci set network.$1.ipv6="$ipv6" [ -e /proc/sys/net/ipv6 ] && [ "$ip6assign" = 1 ] && \ uci set network.$1.ip6assign='60' ;; dhcp) # fixup IPv6 slave interface if parent is a bridge [ "$type" = "bridge" ] && device="br-$1" uci -q batch <<-EOF set network.$1.proto='dhcp' set network.$1.metric='$metric' EOF [ -e /proc/sys/net/ipv6 ] && { metric=$((metric+1)) 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' set network.${1}6.metric='$metric' EOF [ "$ip6assign" != 1 ] && uci set network.${1}6.delegate='0' } ;; 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 } ;; esac [ -n "$no_metric" ] && { uci -q delete network.${1}.metric [ -e /proc/sys/net/ipv6 ] && uci -q delete network.${1}6.metric } } add_modem_section() { local id="$1" local num="$2" local simcount="$3" local builtin="$4" local custom_proto custom_ifname json_select .. json_get_vars custom_proto custom_ifname json_select modems for count in $(seq "$simcount"); do interface="mob${num}s${count}a1" local proto="wwan" # if needed, use custom proto for rmnet/other devices [ -n "${custom_proto}" ] && proto="${custom_proto}" metric=$((metric+1)) uci_remove network "${interface}" uci_add network interface "${interface}" uci_set network "${interface}" proto "$proto" uci_set network "${interface}" modem "$id" uci_set network "${interface}" metric "$metric" uci_set network "${interface}" sim "${count}" uci_set network "${interface}" dhcpv6 "0" uci_set network "${interface}" pdptype "ip" uci_set network "${interface}" method "nat" uci_set network "${interface}" auth "none" uci_set network "${interface}" auto_apn "1" # if needed, use custom ifname for rmnet/other devices [ -n "${custom_ifname}" ] && \ uci_set network "${interface}" device "${custom_ifname}" uci_commit network update_firewall_zone "wan" "$interface" create_multiwan_iface "$interface" "$metric" add_simcard_config "$id" "${count}" "${count}" "$builtin" add_sim_switch_config "$id" "${count}" add_quota_limit_config "$interface" done add_sms_storage_config "$id" } generate_dynamic_lte() { [ -f /lib/functions/modem.sh ] || return . /lib/functions/modem.sh local interface num id simcount builtin #creating simcard sections from board.json file if json_is_a modems array; then json_get_keys modems modems json_select modems num=1 for modem in $modems; do json_select "$modem" json_get_vars id simcount builtin json_select .. add_modem_section "$id" "$num" "$simcount" "$builtin" num=$(( num + 1 )) done json_select .. else ## because of RUTX8 have no default modem # after this script runs out simcard config # must not be empty due to external modems could appear to config echo " " >> /etc/config/simcard fi #creating simcard sections from conneted via USB for a in `ls /sys/bus/usb/devices`; do local vendor product [ -f "/sys/bus/usb/devices/$a/idVendor" ] && [ -f "/sys/bus/usb/devices/$a/idProduct" ] || continue vendor=$(cat "/sys/bus/usb/devices/$a/idVendor") product=$(cat "/sys/bus/usb/devices/$a/idProduct") [ -f "/lib/network/wwan/${vendor}:${product}" ] && { add_simcard_config "$a" "1" "0" "" add_sms_storage_config "$a" } done } 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].vid='$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 [ "$disable_vlan" = 1 ] && enable=0 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() { param=$(/sbin/mnf_info "--name") hostname=${param:0:6} uci -q batch <<-EOF delete system.@system[0] set system.system='system' set system.@system[-1].hostname='$hostname' set system.@system[-1].timezone='UTC' set system.@system[-1].ttylogin='0' set system.@system[-1].log_buffer_size='128' set system.@system[-1].log_size='200' set system.@system[-1].urandom_seed='0' delete system.ntp set system.ntp='timeserver' set system.ntp.zoneName='UTC' set system.ntp.enabled='0' set system.ntp.enable_server='0' add_list system.ntp.server='0.pool.ntp.org' add_list system.ntp.server='1.pool.ntp.org' add_list system.ntp.server='2.pool.ntp.org' add_list system.ntp.server='3.pool.ntp.org' delete system.debug set system.debug='debug' set system.debug.sms_utils_debug_level='4' 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 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 .. } generate_hwinfo() { local parameter="$1" local temp json_select hwinfo json_get_var temp "$parameter" json_select .. uci -q batch <<-EOF set hwinfo.hwinfo='hwinfo' set hwinfo.hwinfo.$parameter='$temp' EOF } set_poe_ports() { json_select "$1" json_get_vars name class budget uci -q batch <<-EOF set poe.port$1='port$1' set poe.port$1.name='$name' set poe.port$1.poe_enable='1' set poe.port$1.class='$class' set poe.port$1.budget='$budget' EOF json_select .. } set_poe_chips(){ local keys key uci -q set poe.chip$1=chip$1 json_get_keys keys "$1" json_select "$1" for key in $keys; do json_get_var var "$key" uci -q set poe.chip$1.$key="$var" done json_select .. } generate_poe_config(){ if json_is_a poe object; then json_select poe json_get_vars chip_count budget poe_ports uci -q batch <<-EOF set poe.poe='poe' set poe.poe.chip_count='$chip_count' set poe.poe.budget='$budget' set poe.poe.poe_ports='$poe_ports' EOF if json_is_a ports array; then #json_for_each_item "set_poe_ports" ports json_select ports idx=1 while json_is_a ${idx} object do "set_poe_ports" $idx idx=$(( idx + 1 )) done json_select .. fi if json_is_a poe_chips array; then json_select poe_chips idx=1 while json_is_a ${idx} object do "set_poe_chips" $idx idx=$(( idx + 1 )) done json_select .. fi json_select .. fi } generate_bluetooth() { uci -q batch <<-EOF set blesem.general='section' set blesem.general.enabled='0' set blesem.settings='app' set blesem.settings.refresh_time='30000' EOF } add_firewall_zone() { local device json_select network json_select "$1" json_get_vars device json_select .. json_select .. fw3 -q network "$1" || fw3 -q device "$device" && return uci -q batch <<-EOF add firewall zone set firewall.@zone[-1].name='$1' set firewall.@zone[-1].network='$1' set firewall.@zone[-1].input='REJECT' set firewall.@zone[-1].output='ACCEPT' set firewall.@zone[-1].forward='REJECT' add firewall forwarding set firewall.@forwarding[-1].src='$1' set firewall.@forwarding[-1].dest='wan' add firewall rule set firewall.@rule[-1].name='Allow-DNS-$1' set firewall.@rule[-1].src='$1' set firewall.@rule[-1].dest_port='53' set firewall.@rule[-1].proto='tcp udp' set firewall.@rule[-1].target='ACCEPT' add firewall rule set firewall.@rule[-1].name='Allow-DHCP-$1' set firewall.@rule[-1].src='$1' set firewall.@rule[-1].dest_port='67' set firewall.@rule[-1].proto='udp' set firewall.@rule[-1].family='ipv4' set firewall.@rule[-1].target='ACCEPT' EOF } add_dhcp() { json_select network json_select "$1" json_get_vars _dhcp json_select .. json_select .. [ "$_dhcp" = "true" ] || return uci -q batch <<-EOF set dhcp.$1='dhcp' set dhcp.$1.interface='$1' set dhcp.$1.start='100' set dhcp.$1.limit='150' set dhcp.$1.leasetime='1h' EOF } json_init json_load "$(cat ${CFG})" umask 077 if [ ! -s /etc/config/network ]; then touch /etc/config/network generate_static_network apply_network_options json_get_keys keys network for key in $keys; do generate_network $key add_dhcp "$key" done json_get_keys keys switch for key in $keys; do generate_switch $key; done generate_dynamic_lte 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 if [ ! -s /etc/config/hwinfo ]; then touch /etc/config/hwinfo json_get_keys keys hwinfo for key in $keys; do generate_hwinfo $key; done fi if [ ! -s /etc/config/poe ]; then touch /etc/config/poe generate_poe_config fi if [ ! -s /etc/config/blesem ]; then bluetooth="" json_select hwinfo json_get_vars bluetooth [ "$bluetooth" -eq 1 ] && { touch /etc/config/blesem touch /etc/config/ble_devices generate_bluetooth } fi uci commit