您的位置:首页 > 其它

(OK)(OK) seem-tools-CLI-semi-auto.sh

2016-06-19 10:31 232 查看
#!/bin/sh

#------------------------------------------------------------------------------------------

# This tool (seem-tools-CLI-semi-auto.sh) is released under GNU GPL v2,v3

# Author: Tongguang Zhang

# Date: 2016-06-18

#

# Note, Prerequisites for using this script:  You have already installed Docker and NS3.

# Path in my notebook:

# NS3: /opt/tools/network_simulators/ns3/ns-allinone-3.25/

#------------------------------------------------------------------------------------------

#------------------------------------------------------------------------------------------

# (OK)(OK)(All in CLI) Fedora23 + Docker(centos-manet) + NS3 + MANETs - testing

#------------------------------------------------------------------------------------------

#------------------------------------------------------------------------------------------

# function create_docker()

# Description:

# create $docker_node_num of dockers

# receive two parameters, that are docker_node_num, docker_image

#------------------------------------------------------------------------------------------

create_docker(){    

    # $1, that is, docker_node_num

    # $2, that is, docker_image

    # You will also have to make sure that your kernel has ethernet filtering (ebtables, bridge-nf,

    # arptables) disabled. If you do not do this, only STP and ARP traffic will be allowed to

    # flow across your bridge and your whole scenario will not work.

    cd /proc/sys/net/bridge

    for f in bridge-nf-*; do echo 0 > $f; done

    cd -

    # [root@localhost ~]# man ip-netns

    # By convention a named network namespace is an object at /var/run/netns/NAME that can be opened.

    # The file descriptor resulting from opening /var/run/netns/NAME refers to the specified network

    # namespace. Holding that file descriptor open keeps the network namespace alive.

    # The file descriptor can be used with the setns(2) system

    # call to change the network namespace associated with a task.

    rm /var/run/netns -rf &>/dev/null

    mkdir -p /var/run/netns &>/dev/null

    # $1, that is, docker_node_num

    # $2, that is, docker_image

    for((id=1; id<=$1; id++))

    do

        # to determine whether docker_image exists

        vm_image="$2"

        exists=`docker images | awk -F \" '{print $1}' | grep ${vm_image} | wc -l | cat`

        if [ $exists -eq 0 ]; then

            echo "${vm_image} does not exist"

            exit

        fi

        # docker run -it --rm --net='none' --name "docker_${id}" centos-manet /bin/sh

        # gnome-terminal -x bash -c "docker run -it --rm --net='none' --name \"docker_${id}\" centos-manet /bin/sh"

        # gnome-terminal -x bash -c "docker run -it --rm --net='none' --name \"docker_${id}\" $2 /bin/sh"

        #gnome-terminal -x bash -c "docker run -it --rm --net='none' --name \"docker_${id}\" $2"

        # kernel network capabilities are not enabled by default.

        # You are going to need to run your container with --privileged

        gnome-terminal -x bash -c "docker run --privileged -it -d --net='none' --name \"docker_${id}\" $2"

        sleep 2

        docker exec docker_${id} /bin/sh -c "sed -i '21a \ router-id 10.1.0.${id}' /usr/local/etc/ospf6d.conf"

        docker exec docker_${id} /bin/sh -c "zebra -d &>/dev/null"

        docker exec docker_${id} /bin/sh -c "ospf6d -d &>/dev/null"

        # SET VARIABLES

        # get PID of CONTAINER

        pid=$(docker inspect -f '{{.State.Pid}}' "docker_${id}")

        bridge="br_d_${id}"

        tap="tap_d_${id}"

        veth="veth_${id}"

        deth="deth_${id}"

        brctl addbr ${bridge}

        ip link add ${veth} type veth peer name ${deth}

        brctl addif ${bridge} ${veth}

        ip link set ${veth} up

        #ifconfig ${veth} 0.0.0.0 promisc up

        ip link set ${deth} netns ${pid}

        tunctl -t ${tap}

        ifconfig ${tap} 0.0.0.0 promisc up

        brctl addif ${bridge} ${tap}

        ifconfig ${bridge} up

        #ifconfig ${bridge} 0.0.0.0 promisc up

        ln -s /proc/${pid}/ns/net /var/run/netns/${pid}

        ip netns exec ${pid} ip link set dev ${deth} name eth0

        ip netns exec ${pid} ip link set eth0 up

        ip netns exec ${pid} ip addr add 112.26.1.${id}/16 dev eth0

    done

}

#------------------------------------------------------------------------------------------

# function destroy_docker()

# Description:

# destroy $docker_node_num of dockers

# receive one parameter, that is docker_node_num

#------------------------------------------------------------------------------------------

destroy_docker(){

    # $1, that is, $docker_node_num

    for((id=1; id<=$1; id++))

    do

        bridge="br_d_${id}"

        tap="tap_d_${id}"

        veth="veth_${id}"

        ifconfig ${bridge} down &>/dev/null

        brctl delif ${bridge} ${tap} &>/dev/null

        brctl delbr ${bridge} &>/dev/null

        ifconfig ${tap} down &>/dev/null

        tunctl -d ${tap} &>/dev/null

        ifconfig ${veth} down &>/dev/null

        docker stop "docker_${id}" &>/dev/null

        docker rm "docker_${id}" &>/dev/null

    done

}

#------------------------------------------------------------------------------------------

# So far, OK OK OK

#------------------------------------------------------------------------------------------

#--------------------------------------------------------------------------

# (OK)(OK)(All in CLI) running two Android-x86 which connect to NS3(MANETs) via "ethernet bridge"

#--------------------------------------------------------------------------

# ip route add 192.168.26.0/24 dev br_a_1

# adb devices

# adb root

# adb connect 192.168.56.101:5555

# adb devices

# adb -s 192.168.56.101:5555 root

# adb -s 192.168.56.101:5555 shell

# adb disconnect 192.168.56.102:5555

# VBoxManage controlvm android-x86_64-6.0-rc1-1 poweroff

#------------------------------------------------------------------------------------------

# function create_android()

# Description:

# create $android_node_num of dockers

# receive three parameters, that are docker_node_num, android_node_num, VM_image

#------------------------------------------------------------------------------------------

create_android(){    

    # $1, that is, docker_node_num

    # $2, that is, android_node_num

    # $3, that is, VM_image

    # $4, that is, PATH of *.vdi

    # You will also have to make sure that your kernel has ethernet filtering (ebtables, bridge-nf,

    # arptables) disabled. If you do not do this, only STP and ARP traffic will be allowed to

    # flow across your bridge and your whole scenario will not work.

    cd /proc/sys/net/bridge

    for f in bridge-nf-*; do echo 0 > $f; done

    cd -

    for((id=1; id<=$2; id++))

    do

        # to determine whether VM_image exists

        # vm_image=$3${id}

        # exists=`VBoxManage list vms | awk -F \" '{print $2}' | grep ${vm_image} | wc -l | cat`

        # if [ $exists -eq 0 ]; then

        #     echo "${vm_image} does not exist"

        #     exit

        # fi

        # SET VARIABLES

        bridge="br_a_${id}"

        tap="tap_a_${id}"

        # look at VirtualBox Gloable Setting, that is, vboxnet0: 192.168.56.1, 192.168.56.2(DHCPD), (3-254)

        #host0=$[2+id]

        #eth0_a_ip="192.168.56.${host0}"

        #eth0_a_ip="112.26.2.${id}"

        tunctl -t ${tap}

        #ip link set up dev ${tap}

        ifconfig ${tap} 0.0.0.0 promisc up

        brctl addbr ${bridge}

        brctl addif ${bridge} ${tap}

        #ip link set up dev ${bridge}

        ifconfig ${bridge} up

        #ifconfig ${bridge} 0.0.0.0 promisc up

        # VBoxManage modifyvm android-x86_64-6.0-rc1-${id} --memory 1024 --nic1 hostonly --nictype1 Am79C973 --hostonlyadapter1 vboxnet0  --nic2 bridged --bridgeadapter2 ${bridge}

        # VBoxManage startvm android-x86_64-6.0-rc1-${id}

        # gnome-terminal -x bash -c "VBoxManage startvm android-x86_64-6.0-rc1-${id}"

        # VBoxManage hostonlyif create

        # VBoxManage hostonlyif ipconfig vboxnet0 --ip 10.0.0.10 --netmask 255.255.255.0

        # VBoxManage list hostonlyifs

        # VBoxManage list dhcpservers

        # VBoxManage list bridgedifs

        # VBoxManage modifyvm $3${id} --nic1 hostonly --nictype1 Am79C973 --hostonlyadapter1 vboxnet0 --nic2 bridged --bridgeadapter2 ${bridge}

        # NOTE: (vboxnet0 - 192.168.56) (vboxnet1 - 192.168.57) (vboxnet2 - 192.168.58)

        # VBoxManage modifyvm $3${id} --nic1 hostonly --nictype1 Am79C973 --hostonlyadapter1 vboxnet0 --nic2 bridged --bridgeadapter2 ${bridge} --nic3 none --nic4 none

        # gnome-terminal -x bash -c "VBoxManage startvm $3${id}"

        # sleep 30

        #

        # adb connect ${eth0_a_ip}

        # sleep 1

        # adb -s ${eth0_a_ip}:5555 root

        # sleep 1

        # adb connect ${eth0_a_ip}

        # sleep 1

        # adb -s ${eth0_a_ip}:5555 root

        # sleep 1

        # adb connect ${eth0_a_ip}

        # adb -s ${eth0_a_ip}:5555 shell mkdir -p /opt/android-on-linux/quagga/out/etc

        # adb -s ${eth0_a_ip}:5555 shell cp /system/xbin/quagga/etc/zebra.conf /opt/android-on-linux/quagga/out/etc/

        # adb -s ${eth0_a_ip}:5555 shell cp /system/xbin/quagga/etc/ospf6d.conf /opt/android-on-linux/quagga/out/etc/

        # adb -s ${eth0_a_ip}:5555 shell /system/xbin/quagga/zebra -d

        # adb -s ${eth0_a_ip}:5555 shell /system/xbin/quagga/ospf6d -d

        # adb -s ${eth0_a_ip}:5555 shell ifconfig eth1 down

        # adb -s ${eth0_a_ip}:5555 shell ifconfig eth1 ${eth0_a_ip} netmask 255.255.255.0 up

        # adb -s ${eth0_a_ip}:5555 shell ifconfig eth0 down

        # VBoxManage createvm --name android-x86_64-6.0-rc1-1 --ostype Linux_64 --register

        # VBoxManage modifyvm android-x86_64-6.0-rc1-1 --memory 1024 --vram 128 --usb off --audio pulse --audiocontroller sb16 --acpi on --rtcuseutc off --boot1 disk --boot2 dvd --nic1 hostonly --nictype1 Am79C973 --hostonlyadapter1 vboxnet0

        # VBoxManage storagectl android-x86_64-6.0-rc1-1 --name "IDE Controller" --add ide --controller PIIX4

        # VBoxManage storageattach android-x86_64-6.0-rc1-1 --storagectl "IDE Controller" --port 0 --device 0 --type hdd --medium android-x86_64-6.0-rc1-1.vdi

        # VBoxManage startvm android-x86_64-6.0-rc1-1

        echo "VBoxManage startvm $3${id}"

        gnome-terminal -x bash -c "VBoxManage createvm --name $3${id} --ostype Linux_64 --register; \

VBoxManage modifyvm $3${id} --memory 1024 --vram 128 --usb off --audio pulse --audiocontroller sb16 --acpi on --rtcuseutc off --boot1 disk --boot2 dvd --nic1 bridged --bridgeadapter1 ${bridge} --nic2 none --nic3 none --nic4 none; \

VBoxManage storagectl $3${id} --name \"IDE Controller\" --add ide --controller PIIX4; \

VBoxManage internalcommands sethduuid $4/$3${id}.vdi; \

VBoxManage storageattach $3${id} --storagectl \"IDE Controller\" --port 0 --device 0 --type hdd --medium $4/$3${id}.vdi; \

VBoxManage startvm $3${id}; \

sleep 100"

    done

}

#------------------------------------------------------------------------------------------

# function destroy_android()

# Description:

# destroy $android_node_num of androids

# receive two parameters, that are android_node_num, VM_image

#------------------------------------------------------------------------------------------

destroy_android(){

    # $1, that is, $android_node_num

    # $2, that is, VM_image

    for((id=1; id<=$1; id++))

    do

        echo "VBoxManage controlvm $2${id} poweroff"

        VBoxManage controlvm $2${id} poweroff &>/dev/null

        VBoxManage unregistervm $2${id} &>/dev/null

        rm "/root/VirtualBox VMs/$2${id}" -rf &>/dev/null

        sleep 1

        bridge="br_a_${id}"

        tap="tap_a_${id}"

        ifconfig ${bridge} down &>/dev/null

        brctl delif ${bridge} ${tap} &>/dev/null

        brctl delbr ${bridge} &>/dev/null

        ifconfig ${tap} down &>/dev/null

        tunctl -d ${tap} &>/dev/null

    done

}

#------------------------------------------------------------------------------------------

# usage()

# script usage

#------------------------------------------------------------------------------------------

usage(){

    cat <<-EOU

    Usage: seem-tools-CLI-semi-auto.sh a b c

        a, the value is create or destroy

        b, the number of dockers to be created

        c, the number of androids to be created

        Note: b + c <= 254

    For example:

        [root@localhost fedora23server-share]# pwd

            /opt/share-vm/fedora23server-share

        [root@localhost fedora23server-share]# ls seem-tools-CLI-semi-auto.sh

            seem-tools-CLI-semi-auto.sh

        [root@localhost fedora23server-share]#

        ./seem-tools-CLI-semi-auto.sh create 25 0 centos-manet android-x86_64-6.0-rc1-  PATH_of_*.vdi

        ./seem-tools-CLI-semi-auto.sh destroy 25 0 centos-manet android-x86_64-6.0-rc1-  PATH_of_*.vdi

        ./seem-tools-CLI-semi-auto.sh create 0 5 centos-manet android-x86_64-6.0-rc1-  PATH_of_*.vdi

        ./seem-tools-CLI-semi-auto.sh destroy 0 5 centos-manet android-x86_64-6.0-rc1-  PATH_of_*.vdi

        ./seem-tools-CLI-semi-auto.sh create 20 5 centos-manet android-x86_64-6.0-rc1-  PATH_of_*.vdi

        ./seem-tools-CLI-semi-auto.sh destroy 20 5 centos-manet android-x86_64-6.0-rc1-  PATH_of_*.vdi

    EOU

}

#------------------------------------------------------------------------------------------

# function create_ns3_manet_seem_cc()

# receive two parameter, that is docker_node_num, android_node_num

#------------------------------------------------------------------------------------------

create_ns3_manet_seem_cc(){

    echo "create seem-manet.cc from seem-manet-template.cc"

    cd /opt/tools/network_simulators/ns3/ns-allinone-3.25/ns-3.25/scratch

    rm seem-manet.cc -f &>/dev/null

    cp seem-manet-template.cc seem-manet.cc

    # after the 302 line of /opt/tools/network_simulators/ns3/ns-allinone-3.25/ns-3.25/scratch/seem-manet-template.cc

    str='302a \\n  '

    for((id=1; id<=$1; id++))

    do

        tap="tap_d_${id}"

        ns=$[id-1]

        # inter="tapBridge.SetAttribute (\"Gateway\", Ipv4AddressValue (\"192.168.26.${id}\")); tapBridge.SetAttribute (\"DeviceName\", StringValue (\"${tap}\"));\n  tapBridge.Install (adhocNodes.Get (${id}), adhocDevices.Get (${id}));\n  "

        inter="tapBridge.SetAttribute (\"DeviceName\", StringValue (\"${tap}\"));\n  tapBridge.Install (adhocNodes.Get (${ns}), adhocDevices.Get (${ns}));\n  "

        #inter="tapBridge.SetAttribute (\"DeviceName\", StringValue (\"${tap}\"));\n  "

        str=${str}${inter}

    done

    # a: docker_node_num, b:android_node_num

    #host1=$[$1+1]

    a=$1

    b=$2

    for((id=$[a+1]; id<=$[a+b]; id++))

    do

        tap="tap_a_${id}"

        ns=$[id-1]

        #inter="tapBridge.SetAttribute (\"Gateway\", Ipv4AddressValue (\"192.168.26.${host1}\")); tapBridge.SetAttribute (\"DeviceName\", StringValue (\"${tap}\"));\n  tapBridge.Install (adhocNodes.Get (${id}), adhocDevices.Get (${id}));\n  "

        inter="tapBridge.SetAttribute (\"DeviceName\", StringValue (\"${tap}\"));\n  tapBridge.Install (adhocNodes.Get (${ns}), adhocDevices.Get (${ns}));\n  "

        #inter="tapBridge.SetAttribute (\"DeviceName\", StringValue (\"${tap}\"));\n  "

        str=${str}${inter}

        #host1=$[host1+1]

    done

    # sed -i '302a \\n  tapBridge.SetAttribute ("DeviceName", StringValue ("tap_a_1"));\n  tapBridge.Install (adhocNodes.Get (0), adhocDevices.Get (0));\n  tapBridge.SetAttribute ("DeviceName", StringValue ("tap_a_2"));\n  tapBridge.Install (adhocNodes.Get
(0), adhocDevices.Get (0));' seem-manet.cc

    sed -i "${str}" seem-manet.cc

    cd -

}

#------------------------------------------------------------------------------------------

# function start_ns3()

#------------------------------------------------------------------------------------------

start_ns3(){

    echo "RUNNING SIMULATION, press CTRL-C to stop it"

    cd /opt/tools/network_simulators/ns3/ns-allinone-3.25/ns-3.25

    ./waf --run scratch/seem-manet --vis

#    ./waf --run scratch/seem-manet-5-android --vis

    cd -

}

#------------------------------------------------------------------------------------------

# ./seem-tools-CLI-semi-auto.sh para1 para2 para3 para4 para5 para6

# para1 ($1), that is, the value is create or destroy

# para2 ($2), that is, the number of dockers to be created

# para3 ($3), that is, the number of androids to be created

# para4 ($4), that is, docker image, such as, busybox or ubuntu, etc.

# para5 ($5), that is, VM image, such as, android-x86_64-6.0-rc1-

# para6 ($6), that is, the path of VM image, such as, android-x86_64-6.0-rc1-

# [root@localhost virtualbox-os]# pwd

# /run/media/root/158a840e-63fa-4544-b0b8-dc0d40c79241/virtualbox-os

# [root@localhost virtualbox-os]# ls

# android-x86_64-6.0-rc1-1.vdi  android-x86_64-6.0-rc1-2.vdi  android-x86_64-6.0-rc1-3.vdi  android-x86_64-6.0-rc1-4.vdi

#

# ./seem-tools-CLI-semi-auto.sh create 25 0 centos-manet android-x86_64-6.0-rc1-  PATH_of_*.vdi

# ./seem-tools-CLI-semi-auto.sh destroy 25 0 centos-manet android-x86_64-6.0-rc1-  PATH_of_*.vdi

#

# ./seem-tools-CLI-semi-auto.sh create 0 5 centos-manet android-x86_64-6.0-rc1-  PATH_of_*.vdi

# ./seem-tools-CLI-semi-auto.sh destroy 0 5 centos-manet android-x86_64-6.0-rc1-  PATH_of_*.vdi

#

# ./seem-tools-CLI-semi-auto.sh create 20 5 centos-manet android-x86_64-6.0-rc1-  PATH_of_*.vdi

# ./seem-tools-CLI-semi-auto.sh destroy 20 5 centos-manet android-x86_64-6.0-rc1-  PATH_of_*.vdi

#------------------------------------------------------------------------------------------

# docker search image_name

# docker pull image_name

# docker images

# docker rmi image_name

# docker run --privileged -i -t -d --net=none --name docker_$id $docker_image -t $type -i $id

# docker ps

# systemctl start docker.service

# the number of dockers and androids should be less than 254,

# if you have more nodes in your emulation environment, you can modify corresponding code.

a=$2

b=$3

if [ $# -eq 6 ]; then

    if [ $[a+b] -gt 254 ] || [ $2 -lt 0 ] || [ $3 -lt 0 ] || !([ $1 == "create" ]||[ $1 == "destroy" ]); then

        usage

        exit

    fi

    case $1 in

        create)

            if [ $2 -gt 0 ]; then create_docker $2 $4; fi

            if [ $3 -gt 0 ]; then create_android $2 $3 $5 $6; fi

            if [ $[a+b] -gt 0 ]; then

                create_ns3_manet_seem_cc $2 $3

    # waiting a while, push init_in_android-x86_64.sh in create_vm(),

    # due to that init_in_android-x86_64.sh may be exist in android-x86_64-6.0-rc1-[1-252].vdi

    # if create android-x86_64-6.0-rc1-[1-252].vdi from scratch create, then can delete the following line.

    # look at seem-tools-auto_create_vm_android.sh

                #sleep 60

                #start_ns3

                #echo $2

            fi

        ;;

        destroy)

            if [ $2 -gt 0 ]; then

                destroy_docker $2

                rm /var/run/netns -rf &>/dev/null

            fi

            if [ $3 -gt 0 ]; then

                destroy_android $3 $5

                ifconfig vboxnet0 down &>/dev/null

            fi

        ;;

    esac

else

    usage

fi

# [root@localhost virtualbox-os]# pwd

# /run/media/root/158a840e-63fa-4544-b0b8-dc0d40c79241/virtualbox-os

# [root@localhost virtualbox-os]# ls

# android-x86_64-6.0-rc1-0.vdi  android-x86_64-6.0-rc1-2.vdi  android-x86_64-6.0-rc1-4.vdi

# android-x86_64-6.0-rc1-1.vdi  android-x86_64-6.0-rc1-3.vdi  android-x86_64-6.0-rc1-5.vdi

# [root@localhost virtualbox-os]#

#-----------------------------------------------------------------------------

# 25 docker (centos)

#-----------------------------------------------------------------------------

# systemctl start docker.service

# ./seem-tools-CLI-semi-auto.sh create 25 0 centos-manet android-x86_64-6.0-rc1- /run/media/root/158a840e-63fa-4544-b0b8-dc0d40c79241/virtualbox-os

# ./seem-tools-CLI-semi-auto.sh destroy 25 0 centos-manet android-x86_64-6.0-rc1- /run/media/root/158a840e-63fa-4544-b0b8-dc0d40c79241/virtualbox-os

# cd /opt/tools/network_simulators/ns3/ns-allinone-3.25/ns-3.25

# ./waf --run scratch/seem-manet --vis

# ./waf --run scratch/seem-manet-25-docker --vis

# ./waf --run scratch/seem-manet-5-docker --vis

#

# docker run --privileged -it -d --name "docker_1" centos-manet

# docker ps -a

# docker attach docker_1

# docker stop docker_1

# docker rm docker_1

# docker ps

# docker rmi 2c067614b89f

#-----------------------------------------------------------------------------

# 5 android-x86_64

#-----------------------------------------------------------------------------

#

# ./seem-tools-CLI-semi-auto.sh create 0 5 centos-manet android-x86_64-6.0-rc1- /run/media/root/158a840e-63fa-4544-b0b8-dc0d40c79241/virtualbox-os

#

# ./seem-tools-CLI-semi-auto.sh destroy 0 5 centos-manet android-x86_64-6.0-rc1- /run/media/root/158a840e-63fa-4544-b0b8-dc0d40c79241/virtualbox-os

#

# cd /opt/tools/network_simulators/ns3/ns-allinone-3.25/ns-3.25

# ./waf --run scratch/seem-manet --vis

# ./waf --run scratch/seem-manet-5-android --vis

#

#------------------------------------------------------------------------------------------

# So far, All is OK

#------------------------------------------------------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: