base-files: generate "device" UCI type section for bridge
[openwrt/openwrt.git] / package / base-files / files / bin / config_generate
index 3ca035ca8b20d460644698636a025b6b5e3e2e5d..0f6f280cf095e7ca367d0ac88c1857aaf57f08b8 100755 (executable)
@@ -7,6 +7,35 @@ CFG=/etc/board.json
 [ -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
@@ -62,20 +91,44 @@ generate_static_network() {
 
 addr_offset=2
 generate_network() {
-       local ifname macaddr protocol type ipaddr netmask
+       local ports ifname macaddr protocol type ipaddr netmask vlan
+       local bridge=$2
 
        json_select network
                json_select "$1"
-                       json_get_vars ifname macaddr protocol ipaddr netmask
+                       json_get_values ports ports
+                       json_get_vars ifname macaddr protocol ipaddr netmask vlan
                json_select ..
        json_select ..
 
-       [ -n "$ifname" ] || return
-
-       # force bridge for multi-interface devices (and lan)
-       case "$1:$ifname" in
-               *\ * | lan:*) type="bridge" ;;
-       esac
+       [ -n "$ifname" -o -n "$ports" ] || return
+
+       # Force bridge for "lan" as it may have other devices (e.g. wireless)
+       # bridged
+       [ "$1" = "lan" -a -z "$ports" ] && {
+               ports="$ifname"
+       }
+
+       [ -n "$ports" ] && {
+               uci -q batch <<-EOF
+                       add network device
+                       set network.@device[-1].name='$1'
+                       set network.@device[-1].type='bridge'
+               EOF
+               for port in $ports; do uci add_list network.@device[-1].ports="$port"; done
+               ifname=$1
+               type=
+       }
+
+       [ -n "$bridge" ] && {
+               if [ -z "$vlan" ]; then
+                       bridge_vlan_id=$((bridge_vlan_id + 1))
+                       vlan=$bridge_vlan_id
+               fi
+               generate_bridge_vlan $1 $bridge "$ifname" $vlan
+               ifname=$bridge.$vlan
+               type=""
+       }
 
        uci -q batch <<-EOF
                delete network.$1
@@ -85,12 +138,16 @@ generate_network() {
                set network.$1.proto='none'
        EOF
 
-       [ -n "$macaddr" ] && uci -q batch <<-EOF
-               delete network.$1_dev
-               set network.$1_dev='device'
-               set network.$1_dev.name='$ifname'
-               set network.$1_dev.macaddr='$macaddr'
-       EOF
+       if [ -n "$macaddr" ]; then
+               for name in $ifname; do
+                       uci -q batch <<-EOF
+                               delete network.$1_${name/./_}_dev
+                               set network.$1_${name/./_}_dev='device'
+                               set network.$1_${name/./_}_dev.name='$name'
+                               set network.$1_${name/./_}_dev.macaddr='$macaddr'
+                       EOF
+               done
+       fi
 
        case "$protocol" in
                static)
@@ -232,7 +289,6 @@ generate_switch() {
        json_select ..
 }
 
-
 generate_static_system() {
        uci -q batch <<-EOF
                delete system.@system[0]
@@ -260,6 +316,13 @@ generate_static_system() {
                                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
+
                        if json_is_a ntpserver array; then
                                local keys key
                                json_get_keys keys ntpserver
@@ -422,12 +485,24 @@ generate_gpioswitch() {
 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; done
+       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