aboutsummaryrefslogtreecommitdiff
path: root/net/openvswitch/files/openvswitch.init
blob: 23b75c38f72c7ec2e92ca7c60bf8eeecb2e5dbc8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#!/bin/sh /etc/rc.common
# Copyright (C) 2013 Julius Schulz-Zander <julius@net.t-labs.tu-berlin.de>
# Copyright (C) 2014-2017 OpenWrt.org
# Copyright (C) 2018 Yousong Zhou <yszhou4tech@gmail.com>
# Copyright (C) 2021 Felix Fietkau <nbd@nbd.name>

. /lib/functions/procd.sh
START=15

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=:

extra_command "status" "Get status information"

service_triggers() {
	procd_add_reload_trigger openvswitch
}

init_triggers() {
	procd_open_service "$(basename ${basescript:-$initscript})" "$initscript"
	procd_close_service set
}

start() {
	init_triggers
	ovs_action start "$@"
}

reload() {
	start
}

running() {
	return 0
}

stop() {
	procd_kill "$(basename ${basescript:-$initscript})"
	ovs_action stop "$@"
}

restart() {
	init_triggers
	ovs_action restart "$@"
}

status() {
	ovs_action status "$@"
}

ovs_action_cfgs=
ovs_action() {
	local action="$1"; shift
	local cfgtype

	ovs_action_cfgs="$*"
	config_load openvswitch
	for cfgtype in ovs ovn_northd ovn_controller; do
		config_foreach "ovs_xx" "$cfgtype" "$action" "$cfgtype"
	done

	config_foreach ovs_bridge_init "ovs_bridge"
}

ovs_xx() {
	local cfg="$1"
	local action="$2"
	local cfgtype="$3"
	local disabled

	if [ -n "$ovs_action_cfgs" ] && ! list_contains "ovs_action_cfgs" "$cfg"; then
		return
	fi
	case "$action" in
		status|stop) ;;
		*)
			config_get_bool disabled "$cfg" disabled 0
			[ "$disabled" == "0" ] || return
			;;
	esac

	case "$cfgtype" in
		ovs)
			"$ovs_ctl" "$action" \
				--system-id=random 1000>&-
			;;
		ovn_*)
			"$ovn_ctl" "${action}_${cfgtype#ovn_}"
			;;
	esac
}

ovs_bridge_parse_port() {
	case "$1" in
		*:*)
			port="${1%%:*}"
			type="${1#*:}"
		;;
		*)
			port="$1"
			type=""
		;;
	esac
}

ovs_bridge_port_add() {
	[ -n "$1" ] || return

	ovs_bridge_parse_port "$1"
	cur_type="$(ovs-vsctl get interface "$port" type 2>/dev/null)"
	[ "$?" = 0 ] && {
		[ "$type" = "$cur_type" ] || ovs-vsctl del-port "$port"
	}

	ovs-vsctl --may-exist add-port "$name" "$port" ${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
			*" $port "*);;
			*) ovs-vsctl del-port "$port";;
		esac
	done
}

ovs_bridge_init() {
	local cfg="$1"

	local disabled
	local name
	local controller

	config_get_bool disabled "$cfg" disabled 0
	[ "$disabled" == "0" ] || return

	config_get name "$cfg" name $cfg
	ovs-vsctl --may-exist add-br "$name"

	config_list_foreach "$cfg" "ports" ovs_bridge_port_add
	config_get_bool drop "$cfg" "drop_unknown_ports" 0
	[ "$drop" == 1 ] && ovs_bridge_port_cleanup

	config_get controller "$cfg" controller
	[ -n "$controller" ] && \
		ovs-vsctl set-controller "$name" "$controller"
}