4 ### expected to be run as root
8 #################### global vars
10 DB_CONF_FILE=@DBDIR@/conf.db
11 DB_SCHEMA=@pkgdatadir@/vswitch.ovsschema
12 DB_LOG=@LOGDIR@/ovs-db.log
14 DB_SOCKET=$RUN_DIR/db.sock
16 SWITCH_LOG=@LOGDIR@/ovs-switch.log
18 #################### helper functions
20 function kill_pltap_ovs () {
21 killall pltap-ovs 2>/dev/null || :
31 err_msg="$COMMAND $SUBCOMMAND $(echo $params | perl -pe 's/\S+/<$&>/g')"
32 for p in $(echo $params); do
33 [[ -z "$@" ]] && error "$err_msg"
34 pname=$(echo -n $p|perl -pe 's/\W/_/g')
35 eval $pname="$1"; shift
37 [[ -n "$@" ]] && error "$err_msg"
40 function is_switch_running {
41 ovs-appctl --target=ovs-vswitchd version >& /dev/null
44 function is_db_running {
45 ovs-appctl --target=ovsdb-server version >& /dev/null
50 echo $(ip addr show to "$IP/32" | perl -ne '/^\s*\d+:\s*([\w-]+):/ && print $1')
53 function wait_server () {
58 expire=$(($(date +%s) + $timeout))
60 ## wait for it to be up - xxx todo - could use a timeout of some kind
61 while [ ! -f "$pid_file" ]; do
62 echo "Waiting for $server_name to start... $(($expire - $(date +%s)))s left" >&2
64 [ $(date +%s) -ge $expire ] && return 1
69 function wait_device () {
73 expire=$(($(date +%s) + $timeout))
75 while ! ip link show up | egrep -q "^[0-9]+: +$tapname:"; do
76 echo "Waiting for $tapname to come UP...$(($expire - $(date +%s)))s left" >&2
78 [ $(date +%s) -ge $expire ] && return 1
83 ######################################## startup
84 function start_db () {
88 conf_dir=$(dirname $DB_CONF_FILE)
89 [ -d $conf_dir ] || mkdir -p $conf_dir
90 [ -f $DB_CONF_FILE ] || ovsdb-tool create $DB_CONF_FILE $DB_SCHEMA
93 [ -d $RUN_DIR ] || mkdir -p $RUN_DIR
96 [ -f $DB_CONF_FILE ] || { echo "Could not initialize $DB_CONF_FILE - exiting" ; exit 1 ; }
97 [ -d $RUN_DIR ] || { echo "Could not initialize $RUN_DIR - exiting" ; exit 1 ; }
100 if [ ! -f "$RUN_DIR/ovsdb-server.pid" ]; then
101 ovsdb-server $DB_CONF_FILE \
102 --remote=punix:$DB_SOCKET \
103 --remote=db:Open_vSwitch,manager_options \
104 --private-key=db:SSL,private_key \
105 --certificate=db:SSL,certificate \
106 --bootstrap-ca-cert=db:SSL,ca_cert \
109 --detach >& /dev/null
111 echo 'ovsdb-server appears to be running already, *not* starting'
113 wait_server $RUN_DIR/ovsdb-server.pid ovsdb-server 30
116 function start_switch () {
119 # ensure ovsdb-server is running
120 is_db_running || { echo "ovsdb-server not running" >&2 ; exit 1 ; }
122 if [ ! -f "$RUN_DIR/ovs-vswitchd.pid" ] ; then
125 --log-file=$SWITCH_LOG \
127 unix:$DB_SOCKET >& /dev/null
129 echo 'ovs-vswitchd appears to be running already, *not* starting'
131 wait_server $RUN_DIR/ovs-vswitchd.pid ovs-vswitchd 30
134 function stop_db () {
135 ovs-appctl --target=ovsdb-server exit || :
138 function stop_switch () {
139 ovs-appctl --target=ovs-vswitchd exit || :
144 [ -n "$pids" ] && ps $pids
157 #################### create functions
158 function create_bridge () {
160 get_params "bridge IP/PREFIX" "$@"
163 PREFIX=${IP_PREFIX#*/}
165 # ensure ovs-vswitchd is running
166 is_switch_running || { echo "ovs-vswitchd not running" >&2 ; exit 1 ; }
169 ovs-vsctl --db=unix:$DB_SOCKET -- --may-exist add-br "$bridge" \
170 -- set bridge "$bridge" datapath_type=planetlab \
171 -- set interface "$bridge" options:local_ip="$IP" option:local_netmask="$PREFIX"
172 ovs-appctl netdev-pltap/get-tapname "$bridge"
175 function create_port () {
177 get_params "bridge port" "$@"
179 # ensure ovs-vswitchd is running
180 is_switch_running || { echo "ovs-vswitchd not running" >&2 ; exit 1 ; }
183 ovs-vsctl --db=unix:$DB_SOCKET -- --may-exist add-port "$bridge" "$port" -- set interface "$port" type=tunnel
184 ovs-appctl --target=ovs-vswitchd netdev-tunnel/get-port "$port"
187 function set_remote_endpoint () {
189 get_params "local_port remote_ip remote_UDP_port" "$@"
191 # ensure ovs-vswitchd is running
192 is_switch_running || { echo "ovs-vswitchd not running" >&2 ; exit 1 ; }
195 ovs-vsctl --db=unix:$DB_SOCKET set interface $local_port \
196 options:remote_ip=$remote_ip \
197 options:remote_port=$remote_UDP_port
200 function set_controller () {
202 get_params "bridge_name controller" "$@"
204 # ensure ovs-vswitchd is running
205 is_switch_running || { echo "ovs-vswitchd not running" >&2 ; exit 1 ; }
208 ovs-vsctl --db=unix:$DB_SOCKET set-controller "$bridge_name" "$controller"
211 #################### del functions
212 function del_bridge () {
214 get_params "bridge_name" "$@"
217 if ! is_switch_running; then
218 # we can delete the bridge even if ovs-vswitchd is not running,
219 # but we need a running ovsdb-server
220 is_db_running || { echo "ovsdb-server not running" >&2; exit 1; }
224 ovs-vsctl --db=unix:$DB_SOCKET $W -- --if-exists del-br $bridge_name
227 function del_port () {
229 get_params "port" "$@"
232 if ! is_switch_running; then
233 # we can delete the port even if ovs-vswitchd is not running,
234 # but we need a running ovsdb-server
235 is_db_running || { echo "ovsdb-server not running" >&2; exit 1; }
239 ovs-vsctl --db=unix:$DB_SOCKET $W -- --if-exists del-port "$port"
246 is_db_running || { echo "ovsdb-server not running" >&2; exit 1; }
248 ovs-vsctl --db=unix:$DB_SOCKET show
252 SUPPORTED_SUBCOMMANDS="start stop status
253 start_db stop_db start_switch stop_switch
254 create_bridge create_port del_bridge del_port
255 show set_remote_endpoint"
258 message="Usage: $COMMAND <subcommand> ...
259 Supported subcommands are (dash or underscore is the same):
260 $SUPPORTED_SUBCOMMANDS"
261 [[ -z "$@" ]] && error "$message"
264 # support dashes instead of underscores
265 SUBCOMMAND=$(echo $SUBCOMMAND | sed -e s,-,_,g)
267 for supported in $SUPPORTED_SUBCOMMANDS; do [ "$SUBCOMMAND" = "$supported" ] && found=yes; done
269 [ -z "$found" ] && error $message