1*fa212bfbSJulian Elischer#!/bin/sh 2*fa212bfbSJulian Elischer# 3*fa212bfbSJulian Elischer# Copyright (c) 2010, Yavuz Gokirmak 4*fa212bfbSJulian Elischer# 5*fa212bfbSJulian Elischer# All rights reserved. 6*fa212bfbSJulian Elischer# 7*fa212bfbSJulian Elischer# This source code may be used, modified, copied, distributed, and 8*fa212bfbSJulian Elischer# sold, in both source and binary form provided that the above 9*fa212bfbSJulian Elischer# copyright and these terms are retained, verbatim, as the first 10*fa212bfbSJulian Elischer# lines of this file. Under no circumstances is the author 11*fa212bfbSJulian Elischer# responsible for the proper functioning of the software nor does 12*fa212bfbSJulian Elischer# the author assume any responsibility for damages incurred with 13*fa212bfbSJulian Elischer# its use. 14*fa212bfbSJulian Elischer# 15*fa212bfbSJulian Elischer# $FreeBSD$ 16*fa212bfbSJulian Elischer 17*fa212bfbSJulian Elischer# 18*fa212bfbSJulian Elischer# This script adds virtual nodes to one of the physical interfaces 19*fa212bfbSJulian Elischer# visible on your local area network (LAN). Virtual nodes seems real 20*fa212bfbSJulian Elischer# to external observers. 21*fa212bfbSJulian Elischer# If traceroute is executed to one of virtual nodes, the IP 22*fa212bfbSJulian Elischer# address of the physical interface will not be seen in the output. 23*fa212bfbSJulian Elischer# Virtual nodes are generated via jails and network connections are 24*fa212bfbSJulian Elischer# established using ng_bridge(4) and ng_eiface(4) node types. 25*fa212bfbSJulian Elischer# 26*fa212bfbSJulian Elischer# To use this script: 27*fa212bfbSJulian Elischer# 28*fa212bfbSJulian Elischer# 0. Make your own copy of this example script. 29*fa212bfbSJulian Elischer# 30*fa212bfbSJulian Elischer# 1. Edit the definition of ${ETHER_INTF} as described below 31*fa212bfbSJulian Elischer# to define your real interface connected to the LAN. Virtual nodes 32*fa212bfbSJulian Elischer# will placed on the same physical network as this interface. 33*fa212bfbSJulian Elischer# 34*fa212bfbSJulian Elischer# 2. Edit the definition of ${TARGET_TOPOLOGY} to define your virtual 35*fa212bfbSJulian Elischer# nodes. Virtual topology definition includes node names and their 36*fa212bfbSJulian Elischer# IP address. Target top. sytax: ( node1|ip1/24 node2|ip2/24 ... ) 37*fa212bfbSJulian Elischer# Example 1: ( n1|122.122.122.12/24, n2|122.122.122.13/24 ...) 38*fa212bfbSJulian Elischer# Example 2: ( n1|2001:b90::14a/125, n1|2001:b90::14b/125 ...) 39*fa212bfbSJulian Elischer# 40*fa212bfbSJulian Elischer# 3. Run this script with "start" as the command line argument. 41*fa212bfbSJulian Elischer# 42*fa212bfbSJulian Elischer# 4. Stop bridging by running this script with "stop" as the 43*fa212bfbSJulian Elischer# command line argument. 44*fa212bfbSJulian Elischer# 45*fa212bfbSJulian Elischer# 5. This cript uses a template file in order to carry information 46*fa212bfbSJulian Elischer# between start and stop calls. 47*fa212bfbSJulian Elischer# In the start call, the netgraph interfaces and jails are created. 48*fa212bfbSJulian Elischer# At the stop phase, all created objects should be removed. 49*fa212bfbSJulian Elischer# DO NOT delete the temporary file between the start and stop phases. 50*fa212bfbSJulian Elischer# 51*fa212bfbSJulian Elischer# To add virtual nodes for multiple independent LANs, create multiple 52*fa212bfbSJulian Elischer# copies of this script with different variable definitions. 53*fa212bfbSJulian Elischer# 54*fa212bfbSJulian Elischer# Target Topology: 55*fa212bfbSJulian Elischer# 56*fa212bfbSJulian Elischer# 57*fa212bfbSJulian Elischer# +---------------+ +---------------+ +---------------+ 58*fa212bfbSJulian Elischer# | n0 (vimage) | | n1 (vimage) | | nk (vimage) | 59*fa212bfbSJulian Elischer# | | | | | | 60*fa212bfbSJulian Elischer# | +-----------+ | | +-----------+ | | +-----------+ | 61*fa212bfbSJulian Elischer# | | ngeth0 | | | | ngeth1 | | | | ngethk | | 62*fa212bfbSJulian Elischer# | |(ng_eiface)| | | |(ng_eiface)| | | |(ng_eiface)| | 63*fa212bfbSJulian Elischer# | +--+-----+--+ | | +--+-----+--+ | | +--+-----+--+ | 64*fa212bfbSJulian Elischer# | |ether| | | |ether| | | |ether| | 65*fa212bfbSJulian Elischer# | +--X--+ | | +--X--+ | | +---X-+ | 66*fa212bfbSJulian Elischer# +-----+ +--------\------+ +--------\------+ +-------/-------+ 67*fa212bfbSJulian Elischer# |upper|----\ \ip_addr \ip_addr /ip_addr 68*fa212bfbSJulian Elischer# +-+-----+--+ \ \ \ \ 69*fa212bfbSJulian Elischer# | em0 | \ +--------+ +-+ \ 70*fa212bfbSJulian Elischer# |(ng_ether)| +-----------+ \ \ \ 71*fa212bfbSJulian Elischer# +-+-----+--+ \ \ / \ 72*fa212bfbSJulian Elischer# |lower| +---------\ \ \ / / 73*fa212bfbSJulian Elischer# +--X--+ / O--X--O O-X---O O---X-O O--X--O O---X---O 74*fa212bfbSJulian Elischer# \ | |link0| |link1| |link2| |link3| |linkk+2| 75*fa212bfbSJulian Elischer# \ / +-O-----O-O-----O-O-----O-O-----O-----O-------O-+ 76*fa212bfbSJulian Elischer# +---+ | | 77*fa212bfbSJulian Elischer# | bridge (ng_bridge) | 78*fa212bfbSJulian Elischer# +-----------------------------------------------+ 79*fa212bfbSJulian Elischer# 80*fa212bfbSJulian Elischer# 81*fa212bfbSJulian Elischer 82*fa212bfbSJulian Elischer# Give the name of ethernet interface. Virtual nodes will be seen as 83*fa212bfbSJulian Elischer# local neighbours of this interface. 84*fa212bfbSJulian Elischer 85*fa212bfbSJulian ElischerETHER_INTF="em0" 86*fa212bfbSJulian Elischer 87*fa212bfbSJulian Elischer# List the names of virtual nodes and their IP addresses. Use ':' 88*fa212bfbSJulian Elischer# character to seperate node name from node IP address and netmask. 89*fa212bfbSJulian Elischer 90*fa212bfbSJulian ElischerTARGET_TOPOLOGY="c1|10.0.2.20/24 c2|10.0.2.21/24 c3|10.0.2.22/24" 91*fa212bfbSJulian Elischer 92*fa212bfbSJulian Elischer# MAC manifacturer prefix. This can be modified according to needs. 93*fa212bfbSJulian ElischerMAC_PREFIX="00:1d:92" 94*fa212bfbSJulian Elischer 95*fa212bfbSJulian Elischer# Temporary file is important for proper execution of script. 96*fa212bfbSJulian ElischerTEMP_FILE="/var/tmp/.virtual.lan.tmp" 97*fa212bfbSJulian Elischer 98*fa212bfbSJulian Elischer# Set root directory for jails to be created. 99*fa212bfbSJulian ElischerJAIL_PATH="/usr/jails/node" 100*fa212bfbSJulian Elischer 101*fa212bfbSJulian Elischer 102*fa212bfbSJulian Elischer#################################################################### 103*fa212bfbSJulian Elischer#### Nothing below this point should need to be modified. #### 104*fa212bfbSJulian Elischer#################################################################### 105*fa212bfbSJulian Elischer 106*fa212bfbSJulian Elischer 107*fa212bfbSJulian Elischer# Start/restart routine. 108*fa212bfbSJulian Elischervirtual_lan_start() { 109*fa212bfbSJulian Elischer 110*fa212bfbSJulian Elischer # Load netgraph KLD's as necessary. 111*fa212bfbSJulian Elischer 112*fa212bfbSJulian Elischer for KLD in ng_ether ng_bridge ng_eiface; do 113*fa212bfbSJulian Elischer if ! kldstat -v | grep -qw ${KLD}; then 114*fa212bfbSJulian Elischer echo -n "Loading ${KLD}.ko... " 115*fa212bfbSJulian Elischer kldload ${KLD} || exit 1 116*fa212bfbSJulian Elischer echo "done" 117*fa212bfbSJulian Elischer fi 118*fa212bfbSJulian Elischer done 119*fa212bfbSJulian Elischer 120*fa212bfbSJulian Elischer # Reset all interfaces and jails. If temporary file can not be found 121*fa212bfbSJulian Elischer # script assumes that there is no previous configuration. 122*fa212bfbSJulian Elischer 123*fa212bfbSJulian Elischer if [ ! -e ${TEMP_FILE} ]; then 124*fa212bfbSJulian Elischer echo "No previous configuration(${TEMP_FILE}) found to clean-up." 125*fa212bfbSJulian Elischer else 126*fa212bfbSJulian Elischer echo -n "Cleaning previous configuration..." 127*fa212bfbSJulian Elischer virtual_lan_stop 128*fa212bfbSJulian Elischer echo "done" 129*fa212bfbSJulian Elischer fi 130*fa212bfbSJulian Elischer 131*fa212bfbSJulian Elischer # Create temporary file for usage. This file includes generated 132*fa212bfbSJulian Elischer # interface names and jail names. All bridges, interfaces and jails 133*fa212bfbSJulian Elischer # are written to file while created. In clean-up process written 134*fa212bfbSJulian Elischer # objects are cleaned (i.e removed) from system. 135*fa212bfbSJulian Elischer 136*fa212bfbSJulian Elischer if [ -e ${TEMP_FILE} ]; then 137*fa212bfbSJulian Elischer touch ${TEMP_FILE} 138*fa212bfbSJulian Elischer fi 139*fa212bfbSJulian Elischer 140*fa212bfbSJulian Elischer echo -n "Verifying ethernet interface existence..." 141*fa212bfbSJulian Elischer # Verify ethernet interface exist. 142*fa212bfbSJulian Elischer if ! ngctl info ${ETHER_INTF}: >/dev/null 2>&1; then 143*fa212bfbSJulian Elischer echo "Error: interface ${ETHER_INTF} does not exist" 144*fa212bfbSJulian Elischer exit 1 145*fa212bfbSJulian Elischer fi 146*fa212bfbSJulian Elischer ifconfig ${ETHER_INTF} up || exit 1 147*fa212bfbSJulian Elischer echo "done" 148*fa212bfbSJulian Elischer 149*fa212bfbSJulian Elischer # Get current number of bridge interfaces in the system. This number 150*fa212bfbSJulian Elischer # is used to create a name for new bridge. 151*fa212bfbSJulian Elischer BRIDGE_COUNT=`ngctl l | grep bridge | wc -l | sed -e "s/ //g"` 152*fa212bfbSJulian Elischer BRIDGE_NAME="bridge${BRIDGE_COUNT}" 153*fa212bfbSJulian Elischer 154*fa212bfbSJulian Elischer # Create new ng_bridge(4) node and attach it to the ethernet interface. 155*fa212bfbSJulian Elischer # Connect ng_ether:lower hook to bridge:link0 when creating bridge and 156*fa212bfbSJulian Elischer # connect ng_ether:upper hook to bridge:link1 after bridge name is set. 157*fa212bfbSJulian Elischer 158*fa212bfbSJulian Elischer echo "Creating bridge interface: ${BRIDGE_NAME}..." 159*fa212bfbSJulian Elischer ngctl mkpeer ${ETHER_INTF}: bridge lower link0 || exit 1 160*fa212bfbSJulian Elischer ngctl name ${ETHER_INTF}:lower ${BRIDGE_NAME} || exit 1 161*fa212bfbSJulian Elischer ngctl connect ${ETHER_INTF}: ${BRIDGE_NAME}: upper link1 || exit 1 162*fa212bfbSJulian Elischer echo "Bridge ${BRIDGE_NAME} is created and ${ETHER_INTF} is connected." 163*fa212bfbSJulian Elischer 164*fa212bfbSJulian Elischer # In the above code block two hooks are connected to bridge interface, 165*fa212bfbSJulian Elischer # therefore LINKNUM is set to 2 indicating total number of connected 166*fa212bfbSJulian Elischer # hooks on the bridge interface. 167*fa212bfbSJulian Elischer LINKNUM=2 168*fa212bfbSJulian Elischer 169*fa212bfbSJulian Elischer # Write name of the bridge to temp file. Clean-up procedure will use 170*fa212bfbSJulian Elischer # this name to shutdown bridge interface. 171*fa212bfbSJulian Elischer echo "bridge ${BRIDGE_NAME}" > ${TEMP_FILE} 172*fa212bfbSJulian Elischer 173*fa212bfbSJulian Elischer 174*fa212bfbSJulian Elischer # Attach other interfaces as well. 175*fa212bfbSJulian Elischer for NODE in ${TARGET_TOPOLOGY}; do 176*fa212bfbSJulian Elischer 177*fa212bfbSJulian Elischer # Virtual nodes are defined in TARGET_TOPOLOGY variable. They 178*fa212bfbSJulian Elischer # have the form of 'nodeName|IPaddr'. Below two lines split 179*fa212bfbSJulian Elischer # node definition to get node name and node IP. 180*fa212bfbSJulian Elischer 181*fa212bfbSJulian Elischer NODE_NAME=`echo ${NODE} | awk -F"|" '{print $1}'` 182*fa212bfbSJulian Elischer NODE_IP=`echo ${NODE} | awk -F"|" '{print $2}'` 183*fa212bfbSJulian Elischer 184*fa212bfbSJulian Elischer # Create virtual node (jail) with given name and using 185*fa212bfbSJulian Elischer # JAIL_PATH as root directory for jail. 186*fa212bfbSJulian Elischer 187*fa212bfbSJulian Elischer echo -n "Creating virtual node (jail) ${NODE_NAME}..." 188*fa212bfbSJulian Elischer jail -c vnet name=${NODE_NAME} host.hostname=${NODE_NAME} \ 189*fa212bfbSJulian Elischer path=${JAIL_PATH} persist 190*fa212bfbSJulian Elischer echo "done" 191*fa212bfbSJulian Elischer 192*fa212bfbSJulian Elischer # Write name of the jail to temp file. Clean-up procedure will 193*fa212bfbSJulian Elischer # use this name to remove jail. 194*fa212bfbSJulian Elischer 195*fa212bfbSJulian Elischer echo "node ${NODE_NAME}" >> ${TEMP_FILE} 196*fa212bfbSJulian Elischer 197*fa212bfbSJulian Elischer # Create a ng_eiface object for virtual node. ng_eiface 198*fa212bfbSJulian Elischer # object has a hook that can be connected to one of bridge 199*fa212bfbSJulian Elischer # links. After creating interface get its automatically 200*fa212bfbSJulian Elischer # generated name for further usage. 201*fa212bfbSJulian Elischer 202*fa212bfbSJulian Elischer echo "Creating eiface interface for virtual node ${NODE_NAME}." 203*fa212bfbSJulian Elischer ngctl mkpeer eiface ether ether 204*fa212bfbSJulian Elischer EIFACE=`ngctl l | grep ngeth | tail -n 1| awk '{print $2}'` 205*fa212bfbSJulian Elischer echo "Interface ${EIFACE} is created." 206*fa212bfbSJulian Elischer 207*fa212bfbSJulian Elischer # Write name of the interface to temp file. Clean-up procedure 208*fa212bfbSJulian Elischer # will use this name to shutdown interface. 209*fa212bfbSJulian Elischer 210*fa212bfbSJulian Elischer echo "interface ${EIFACE}" >> ${TEMP_FILE} 211*fa212bfbSJulian Elischer 212*fa212bfbSJulian Elischer # Move virtual interface to virtual node. Note that Interface 213*fa212bfbSJulian Elischer # name will not be changed at the end of this movement. Moved 214*fa212bfbSJulian Elischer # interface can be seen at the output of ifconfig command in 215*fa212bfbSJulian Elischer # jail: 'jexec jailname ifconfig' 216*fa212bfbSJulian Elischer 217*fa212bfbSJulian Elischer echo "Moving ${EIFACE} to ${NODE_NAME}" 218*fa212bfbSJulian Elischer ifconfig ${EIFACE} vnet ${NODE_NAME} 219*fa212bfbSJulian Elischer 220*fa212bfbSJulian Elischer # Make lo0 interface localhost. 221*fa212bfbSJulian Elischer jexec ${NODE_NAME} ifconfig lo0 localhost 222*fa212bfbSJulian Elischer 223*fa212bfbSJulian Elischer # Generate a random mac address for virtual interface. First 224*fa212bfbSJulian Elischer # three octets can be changed by user. Last three octets are 225*fa212bfbSJulian Elischer # generated randomly. 226*fa212bfbSJulian Elischer M4=`od -An -N2 -i /dev/random | sed -e 's/ //g' | \ 227*fa212bfbSJulian Elischer awk '{ print $1 % 256 }'` 228*fa212bfbSJulian Elischer M5=`od -An -N2 -i /dev/random | sed -e 's/ //g' | \ 229*fa212bfbSJulian Elischer awk '{ print $1 % 256 }'` 230*fa212bfbSJulian Elischer M6=`od -An -N2 -i /dev/random | sed -e 's/ //g' | \ 231*fa212bfbSJulian Elischer awk '{ print $1 % 256 }'` 232*fa212bfbSJulian Elischer 233*fa212bfbSJulian Elischer MAC=`printf ${MAC_PREFIX}:%02x:%02x:%02x ${M4} ${M5} ${M6}` 234*fa212bfbSJulian Elischer 235*fa212bfbSJulian Elischer # Set the link address (mac address) of virtual interface in 236*fa212bfbSJulian Elischer # virtual node to randomly generated MAC. 237*fa212bfbSJulian Elischer echo "Setting MAC address of ${EIFACE} to '${MAC}'" 238*fa212bfbSJulian Elischer jexec ${NODE_NAME} ifconfig ${EIFACE} link $MAC 239*fa212bfbSJulian Elischer 240*fa212bfbSJulian Elischer # Either IPv4 or IPv6 can be used in this script. Ifconfig 241*fa212bfbSJulian Elischer # IP setting syntax differs slightly for two IP versions. 242*fa212bfbSJulian Elischer # For version 4 'inet' keyword is used whereas for version 6 243*fa212bfbSJulian Elischer # 'inet6' is used. Below line tries to decide which IP version 244*fa212bfbSJulian Elischer # is given and sets IPVER to 'inet' or 'inet6'. 245*fa212bfbSJulian Elischer 246*fa212bfbSJulian Elischer IPVER=`echo ${NODE_IP} | awk -F"." '{ split($4,last,"/"); \ 247*fa212bfbSJulian Elischer if( NF==4 && $1>0 && $1<256 && $2<256 && $3<256 && \ 248*fa212bfbSJulian Elischer last[1]<256) print "inet"; else print "inet6"}'` 249*fa212bfbSJulian Elischer 250*fa212bfbSJulian Elischer # Set IP address of virtual interface in virtual node. 251*fa212bfbSJulian Elischer echo "Setting IP address of ${EIFACE} to '${NODE_IP}'" 252*fa212bfbSJulian Elischer jexec ${NODE_NAME} ifconfig ${EIFACE} ${IPVER} ${NODE_IP} 253*fa212bfbSJulian Elischer 254*fa212bfbSJulian Elischer # Connect virtual interface to bridge interface. Syntax is : 255*fa212bfbSJulian Elischer # ngctl connect INTERFACE: BRIDGE: INTERFACE_HOOK EMPTY_LINK. 256*fa212bfbSJulian Elischer # Interface has one hook named 'ether' and below line connects 257*fa212bfbSJulian Elischer # ether hook to bridge's first unconnected link. 258*fa212bfbSJulian Elischer 259*fa212bfbSJulian Elischer echo -n "Connecting ${EIFACE}:ether to ${BRIDGE_NAME}:link${LINKNUM}..." 260*fa212bfbSJulian Elischer ngctl connect ${EIFACE}: ${BRIDGE_NAME}: ether link${LINKNUM} \ 261*fa212bfbSJulian Elischer || exit 1 262*fa212bfbSJulian Elischer echo "done" 263*fa212bfbSJulian Elischer 264*fa212bfbSJulian Elischer # Now, bridge has one more connected link thus link count is 265*fa212bfbSJulian Elischer # incremented. 266*fa212bfbSJulian Elischer LINKNUM=`expr ${LINKNUM} + 1` 267*fa212bfbSJulian Elischer done 268*fa212bfbSJulian Elischer echo "Virtual LAN established succesfully!" 269*fa212bfbSJulian Elischer 270*fa212bfbSJulian Elischer} 271*fa212bfbSJulian Elischer 272*fa212bfbSJulian Elischer# Stop routine. 273*fa212bfbSJulian Elischervirtual_lan_stop() { 274*fa212bfbSJulian Elischer 275*fa212bfbSJulian Elischer if [ ! -e ${TEMP_FILE} ]; then 276*fa212bfbSJulian Elischer echo "Nothing to stop! ${TEMP_FILE}: temp file not found" 277*fa212bfbSJulian Elischer else 278*fa212bfbSJulian Elischer 279*fa212bfbSJulian Elischer echo -n "Shutdown bridge interface.." 280*fa212bfbSJulian Elischer OBJECTS=`cat ${TEMP_FILE} | grep bridge | awk '{print $2}'` 281*fa212bfbSJulian Elischer for BRIDGE in ${OBJECTS}; do 282*fa212bfbSJulian Elischer ngctl shutdown ${BRIDGE}: >/dev/null 2>&1 283*fa212bfbSJulian Elischer done 284*fa212bfbSJulian Elischer echo "done" 285*fa212bfbSJulian Elischer 286*fa212bfbSJulian Elischer echo -n "Shutdown all eiface interfaces..." 287*fa212bfbSJulian Elischer OBJECTS=`cat ${TEMP_FILE} | grep interface | awk '{print $2}'` 288*fa212bfbSJulian Elischer for INTERFACE in ${OBJECTS}; do 289*fa212bfbSJulian Elischer ngctl shutdown ${INTERFACE}: >/dev/null 2>&1 290*fa212bfbSJulian Elischer done 291*fa212bfbSJulian Elischer echo "done" 292*fa212bfbSJulian Elischer 293*fa212bfbSJulian Elischer echo -n "Removing all jails..." 294*fa212bfbSJulian Elischer OBJECTS=`cat ${TEMP_FILE} | grep node | awk '{print $2}'` 295*fa212bfbSJulian Elischer for NODE in ${OBJECTS}; do 296*fa212bfbSJulian Elischer jail -r ${NODE} 297*fa212bfbSJulian Elischer done 298*fa212bfbSJulian Elischer echo "done" 299*fa212bfbSJulian Elischer 300*fa212bfbSJulian Elischer echo "Removing tempfile ${TEMP_FILE}" 301*fa212bfbSJulian Elischer rm ${TEMP_FILE} 302*fa212bfbSJulian Elischer fi 303*fa212bfbSJulian Elischer echo "Virtual LAN objects removed succesfully!" 304*fa212bfbSJulian Elischer 305*fa212bfbSJulian Elischer} 306*fa212bfbSJulian Elischer 307*fa212bfbSJulian Elischervirtual_lan_usage() { 308*fa212bfbSJulian Elischer echo "usage: $0 start [target_topology]" 309*fa212bfbSJulian Elischer echo " : $0 [ stop | help ]" 310*fa212bfbSJulian Elischer} 311*fa212bfbSJulian Elischer 312*fa212bfbSJulian Elischer 313*fa212bfbSJulian Elischer# Main entry point. 314*fa212bfbSJulian Elischer 315*fa212bfbSJulian Elischercase $# in 316*fa212bfbSJulian Elischer 1) 317*fa212bfbSJulian Elischer case $1 in 318*fa212bfbSJulian Elischer start) 319*fa212bfbSJulian Elischer echo -n "Creating default target topology:" 320*fa212bfbSJulian Elischer echo " ${TARGET_TOPOLOGY}" 321*fa212bfbSJulian Elischer virtual_lan_start 322*fa212bfbSJulian Elischer ;; 323*fa212bfbSJulian Elischer stop) 324*fa212bfbSJulian Elischer 325*fa212bfbSJulian Elischer if [ ! -e ${TEMP_FILE} ]; then 326*fa212bfbSJulian Elischer echo -n "Noting to stop! ${TEMP_FILE}:" 327*fa212bfbSJulian Elischer echo " temp file not found" 328*fa212bfbSJulian Elischer else 329*fa212bfbSJulian Elischer virtual_lan_stop 330*fa212bfbSJulian Elischer fi 331*fa212bfbSJulian Elischer ;; 332*fa212bfbSJulian Elischer help) 333*fa212bfbSJulian Elischer virtual_lan_usage 334*fa212bfbSJulian Elischer exit 1 335*fa212bfbSJulian Elischer ;; 336*fa212bfbSJulian Elischer *) 337*fa212bfbSJulian Elischer virtual_lan_usage 338*fa212bfbSJulian Elischer exit 1 339*fa212bfbSJulian Elischer 340*fa212bfbSJulian Elischer esac 341*fa212bfbSJulian Elischer ;; 342*fa212bfbSJulian Elischer 2) 343*fa212bfbSJulian Elischer case $1 in 344*fa212bfbSJulian Elischer start) 345*fa212bfbSJulian Elischer TARGET_TOPOLOGY=$2 346*fa212bfbSJulian Elischer echo -n "Creating target topology:" 347*fa212bfbSJulian Elischer echo "${TARGET_TOPOLOGY}" 348*fa212bfbSJulian Elischer virtual_lan_start 349*fa212bfbSJulian Elischer ;; 350*fa212bfbSJulian Elischer *) 351*fa212bfbSJulian Elischer virtual_lan_usage 352*fa212bfbSJulian Elischer exit 1 353*fa212bfbSJulian Elischer esac 354*fa212bfbSJulian Elischer ;; 355*fa212bfbSJulian Elischer 356*fa212bfbSJulian Elischer *) 357*fa212bfbSJulian Elischer virtual_lan_usage 358*fa212bfbSJulian Elischer exit 1 359*fa212bfbSJulian Elischeresac 360*fa212bfbSJulian Elischer 361