diff options
Diffstat (limited to 'qemu-init-scripts/qtap-manipulate')
-rwxr-xr-x | qemu-init-scripts/qtap-manipulate | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/qemu-init-scripts/qtap-manipulate b/qemu-init-scripts/qtap-manipulate new file mode 100755 index 0000000..516e1ca --- /dev/null +++ b/qemu-init-scripts/qtap-manipulate @@ -0,0 +1,128 @@ +#!/bin/sh +# Copyright 1999-2012 Gentoo Foundation +# Distributed under the terms of the GNU General Public Licens + +VERSION="0.3.0" + +has() { + local desired=$1 x + shift + for x in "$@"; do + [ "$desired" = "$x" ] && return 0; + done + return 1 +} + +find_available_node() { + local val=$(ip addr | grep -i '.*: qtap' | cut -d: -f2 | cut -d@ -f1) + local pos=0 + while has qtap${pos} ${val##*()}; do + pos=$(( $pos + 1 )) + done + echo qtap${pos} +} + +create_node() { + local qtap="$1" + shift + tunctl -b -t "${qtap}" "$@" > /dev/null || die "tunctl failed" + brctl addif br0 "${qtap}" || die "brctl failed" + ip link set "${qtap}" up || die "ip link set ${qtap} failed" + ip link set "${qtap}" promisc on || die "ip link set ${qtap} promiscuos mode failed" +} + +destroy_node() { + issue= + ip link set ${1} down || { echo "ip link set ${1} down failed";issue=1; } + brctl delif br0 ${1} || { echo "brctl failed";issue=2; } + tunctl -d ${1} > /dev/null || { echo "tunctl failed";issue=3;} + [ -n "${issue}" ] && exit $(( $issue )) +} + +die() { + echo "$@" >&2 + exit 1 +} + +usage() { + echo "commands available:" + echo "create-specific qtap-name [ -u user ] [ -g group ]" + echo "create [ -u user ] [ -g group ]" + echo "destroy qtap-name" + echo "version" + echo +} + +usage_die() { + usage + die "$@" +} + +show_version() { + echo "qtap-manipulate version: ${VERSION}" +} + +create_user= +create_group= + +parse_create_options() { + while [ $# -ne 0 ]; do + local x="$1" + case "$x" in + -u=*) + shift + set -- "-u" "${x#-u=}" "$@" + ;& + -u) + shift + [ -z "$1" ] && die "-u requires an argument" + create_user="$1" + shift + ;; + -g=*) + shift + set -- "-g" "${x#-u=}" "$@" + ;& + -g) + shift + [ -z "$1" ] && die "-g requires an argument" + create_group="$2" + shift + ;; + *) + die "unknown option $1" + esac + done +} + +output_qtap=false +case "$1" in + destroy) + shift + [ $# -eq 0 ] && usage_die "destroy requires a second argument" + [ $# -gt 1 ] && usage_die "no idea what to do with args: $@" + destroy_node "$1" + ;; + create) + output_qtap=true + qtap=$(find_available_node) + [ -z "$qtap" ] && die "failed to find a qtap node to use" + shift + set -- create_specific "${qtap}" "$@" + ;& + create_specific) + shift + qtap="$1"; shift + parse_create_options "$@" + create_node "$qtap" + $output_qtap && echo "$qtap" + ;; + version) + show_version + ;; + *) + usage_die "Unknown command $1" + ;; +esac +exit 0 + |