diff options
Diffstat (limited to 'net/openvswitch/files/openvswitch.init')
-rwxr-xr-x | net/openvswitch/files/openvswitch.init | 84 |
1 files changed, 83 insertions, 1 deletions
diff --git a/net/openvswitch/files/openvswitch.init b/net/openvswitch/files/openvswitch.init index 23b75c38f..229e6869b 100755 --- a/net/openvswitch/files/openvswitch.init +++ b/net/openvswitch/files/openvswitch.init @@ -7,6 +7,8 @@ . /lib/functions/procd.sh START=15 +basescript=$(readlink "$initscript") + ovs_ctl="/usr/share/openvswitch/scripts/ovs-ctl"; [ -x "$ovs_ctl" ] || ovs_ctl=: ovn_ctl="/usr/share/ovn/scripts/ovn-ctl"; [ -x "$ovn_ctl" ] || ovn_ctl=: @@ -59,7 +61,12 @@ ovs_action() { config_foreach "ovs_xx" "$cfgtype" "$action" "$cfgtype" done - config_foreach ovs_bridge_init "ovs_bridge" + case "$action" in + restart|start) + config_foreach ovs_bridge_init "ovs_bridge" + ;; + esac + } ovs_xx() { @@ -83,6 +90,7 @@ ovs_xx() { ovs) "$ovs_ctl" "$action" \ --system-id=random 1000>&- + ovs_set_ssl ;; ovn_*) "$ovn_ctl" "${action}_${cfgtype#ovn_}" @@ -116,6 +124,47 @@ ovs_bridge_port_add() { __port_list="$__port_list ${port} " } +ovs_bridge_port_add_complex() { + local cfg="$1" + local cur_bridge="$2" + + local bridge disabled ofport port tag type + local cur_tag cur_type del_port + + config_get_bool disabled "$cfg" disabled 0 + [ "$disabled" = "0" ] || return + + config_get bridge "$cfg" bridge + [ "$bridge" = "$cur_bridge" ] || return + ovs-vsctl br-exists "$bridge" || return + + config_get port "$cfg" port + [ -n "$port" ] || return + + config_get ofport "$cfg" ofport + + config_get tag "$cfg" tag + if [ -n "$tag" ]; then + if cur_tag="$(ovs-vsctl get port "$port" tag 2>/dev/null)"; then + [ "$tag" = "$cur_tag" ] || del_port=1 + fi + fi + + config_get type "$cfg" type + if [ -n "$type" ]; then + if cur_type="$(ovs-vsctl get interface "$port" type 2>/dev/null)"; then + [ "$type" = "$cur_type" ] || del_port=1 + fi + fi + + [ "${del_port:-0}" -eq 1 ] && ovs-vsctl --if-exists del-port "$bridge" "$port" + + ovs-vsctl --may-exist add-port "$bridge" "$port" ${tag:+tag="$tag"} \ + ${ofport:+ -- set interface "$port" ofport_request="$ofport"} \ + ${type:+ -- set interface "$port" type="$type"} + __port_list="$__port_list ${port} " +} + ovs_bridge_port_cleanup() { for port in `ovs-vsctl list-ports "$name"`; do case "$__port_list" in @@ -125,12 +174,26 @@ ovs_bridge_port_cleanup() { done } +ovs_bridge_validate_datapath_id() { + local dpid="$1" + + if expr "$dpid" : '[[:xdigit:]]\{16\}$' > /dev/null; then + return 0 + elif expr "$dpid" : '0x[[:xdigit:]]\{1,16\}$' > /dev/null; then + return 0 + else + logger -t openvswitch "invalid datapath_id: $dpid" + return 1 + fi +} + ovs_bridge_init() { local cfg="$1" local disabled local name local controller + local datapath_id config_get_bool disabled "$cfg" disabled 0 [ "$disabled" == "0" ] || return @@ -138,7 +201,15 @@ ovs_bridge_init() { config_get name "$cfg" name $cfg ovs-vsctl --may-exist add-br "$name" + config_get datapath_id "$cfg" datapath_id + [ -n "$datapath_id" ] && { + ovs_bridge_validate_datapath_id "$datapath_id" && { + ovs-vsctl --if-exists set bridge "$name" other-config:datapath-id="$datapath_id" + } + } + config_list_foreach "$cfg" "ports" ovs_bridge_port_add + config_foreach ovs_bridge_port_add_complex ovs_port "$name" config_get_bool drop "$cfg" "drop_unknown_ports" 0 [ "$drop" == 1 ] && ovs_bridge_port_cleanup @@ -146,3 +217,14 @@ ovs_bridge_init() { [ -n "$controller" ] && \ ovs-vsctl set-controller "$name" "$controller" } + +ovs_set_ssl() { + local ca="$(uci -q get openvswitch.ovs.ca)" + [ -f "$ca" ] || return + local cert="$(uci get openvswitch.ovs.cert)" + [ -f "$cert" ] || return + local key="$(uci get openvswitch.ovs.key)" + [ -f "$key" ] || return + + ovs-vsctl set-ssl "$key" "$cert" "$ca" +} |