Example #1
0
def simpleTest():
    print("infection hosts rate:")
    inf_rate = eval(input())
    print("amplituda (packets per second):")
    max = eval(input())
    print("period T:")
    grow_time = eval(input()) / 2
    atck_time = 40
    test_time = 50

    controller = RemoteController('Runos', ip='127.0.0.1', port=6653)
    switch = partial(OVSKernelSwitch, protocols='OpenFlow13')
    net = TreeNet(depth=2,
                  fanout=3,
                  controller=controller,
                  switch=switch,
                  cleanup=True)
    net.start()
    sleep(3)

    hosts = net.topo.hosts()
    inf_amount = round(inf_rate * len(hosts))
    inf_hosts = []
    while inf_amount:
        num = randint(0, 8)
        if inf_amount and not (hosts[num] in inf_hosts):
            inf_hosts.append(hosts[num])
            inf_amount -= 1
    hosts = net.topo.hosts()
    general_capacity_per_sec = max / len(inf_hosts)
    num_intervals = round(grow_time / 2)
    offset_delay = round((1000 / general_capacity_per_sec) / num_intervals)

    print(hosts)

    start = monotonic()

    childs = []

    for i in range(len(hosts)):
        try:
            pid = os.fork()
        except:
            print('error: create child process')
            sys.exit(33)
        if pid == 0:
            host = net.get(hosts[i])

            if hosts[i] in inf_hosts:

                ping_pair = net.get(hosts[i - 1])
                curr_time = monotonic() - start
                interval = (2.5 - curr_time) if (2.5 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), ping_pair.IP(), interval))
                host.cmd(
                    "./runos/src/apps/ddos-defender/scripts/png.sh %s %s" %
                    (ping_pair.IP(), interval))

                ping_pair = net.get(hosts[i - 2])
                curr_time = monotonic() - start
                interval = (5 - curr_time) if (5 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), ping_pair.IP(), interval))
                host.cmd(
                    "./runos/src/apps/ddos-defender/scripts/png.sh %s %s" %
                    (ping_pair.IP(), interval))

                k = 0
                while curr_time < atck_time + 5:
                    curr_time = monotonic() - start
                    sleep_time = grow_time * 2 * k + 5 - curr_time
                    if sleep_time > 0:
                        sleep(sleep_time)
                    send_delay = 0
                    for j in range(num_intervals):
                        curr_time = monotonic() - start
                        send_delay += offset_delay
                        if (curr_time + 2 < atck_time + 5):
                            print("curr_time=%s :: %s start attack" %
                                  (curr_time, host.IP()))
                            host.cmd(
                                "./runos/src/apps/ddos-defender/scripts/atckWithOpts.sh %s %s %s %s"
                                % (host.MAC(), host.IP(), 2, send_delay))
                    for j in range(num_intervals):
                        curr_time = monotonic() - start
                        if (curr_time + 2 < atck_time + 5):
                            print("curr_time=%s :: %s start attack" %
                                  (curr_time, host.IP()))
                            host.cmd(
                                "./runos/src/apps/ddos-defender/scripts/atckWithOpts.sh %s %s %s %s"
                                % (host.MAC(), host.IP(), 2, send_delay))
                        send_delay -= offset_delay
                    k += 1

                while curr_time < test_time + 5:
                    curr_time = monotonic() - start
                    interval = (
                        5 + test_time -
                        curr_time) if (5 + test_time - curr_time) >= 1 else 1
                    print("curr_time=%s :: %s start ping %s for %s sec" %
                          (curr_time, host.IP(), ping_pair.IP(), interval))
                    host.cmd(
                        "./runos/src/apps/ddos-defender/scripts/png.sh %s %s" %
                        (ping_pair.IP(), interval))
                    sleep(0.5)

                file_name = "atck_duration_" + str(i) + ".txt"
                handle = open(file_name, "w")
                handle.write("'%s' : [%s, %s]" %
                             (net.get(hosts[i]).IP(), 5, 45))
                handle.close()
            else:

                ping_pair = net.get(hosts[i - 1])
                curr_time = monotonic() - start
                interval = (5 - curr_time) if (5 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), ping_pair.IP(), interval))
                host.cmd(
                    "./runos/src/apps/ddos-defender/scripts/png.sh %s %s" %
                    (ping_pair.IP(), interval))

                ping_pair = net.get(hosts[i - 2])
                curr_time = monotonic() - start
                interval = (25 - curr_time) if (25 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), ping_pair.IP(), interval))
                host.cmd(
                    "./runos/src/apps/ddos-defender/scripts/png.sh %s %s" %
                    (ping_pair.IP(), interval))

                ping_pair = net.get(hosts[i - 3])
                curr_time = monotonic() - start
                interval = (
                    test_time + 5 -
                    curr_time) if (test_time + 5 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), ping_pair.IP(), interval))
                host.cmd(
                    "./runos/src/apps/ddos-defender/scripts/png.sh %s %s" %
                    (ping_pair.IP(), interval))

            sys.exit(3)
        if pid > 0:
            childs.append(pid)

    for p in childs:
        pid, status = os.wait()
    print('childs end')

    host = net.get(hosts[0])
    handleResult = open("runos/src/apps/ddos-defender/tests/infectedMACs.txt",
                        "w")
    handleResult.write("{")
    for i in range(len(hosts)):
        if hosts[i] in inf_hosts:
            file_name = "atck_duration_" + str(i) + ".txt"
            handle = open(file_name, "r")
            result = handle.read()
            handleResult.write(result)
            if i < (len(hosts) - 1):
                handleResult.write(", ")
            handle.close()
            cmnd = "sudo rm " + file_name
            host.cmd(cmnd)
    handleResult.write("}")
    handleResult.close()

    CLI(net)
    net.stop()
def simpleTest():
    controller = RemoteController('Runos', ip='127.0.0.1', port=6653)
    switch = partial(OVSKernelSwitch, protocols='OpenFlow13')
    net = TreeNet(depth=2,
                  fanout=3,
                  controller=controller,
                  switch=switch,
                  cleanup=True)
    net.start()
    sleep(3)
    start = monotonic()

    attack_hosts = ["h1", "h2", "h5"]
    childs = []
    for hostName in net.topo.hosts():
        try:
            pid = os.fork()
        except:
            print('error: create child process')
            sys.exit(33)
        if pid == 0:
            host = net.get(hostName)

            if hostName == "h1":
                pingPair = net.get("h4")

                curr_time = monotonic() - start
                interval = (12 - curr_time) if (12 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(
                    hostName,
                    host.cmd(
                        "./runos/src/apps/ddos-defender/scripts/png.sh %s %s" %
                        (pingPair.IP(), interval)))

                curr_time = monotonic() - start
                sleep_time = 12.5 - curr_time
                if sleep_time > 0:
                    sleep(sleep_time)

                curr_time = monotonic() - start
                print("curr_time=%s :: %s start attack" %
                      (curr_time, host.IP()))
                start_attack = curr_time
                result = host.cmd(
                    "./runos/src/apps/ddos-defender/scripts/atck.sh %s %s 25" %
                    (host.MAC(), host.IP()))
                curr_time = monotonic() - start
                end_attack = curr_time
                print("curr_time=%s :: %s end attack" % (curr_time, host.IP()))

                pingPair = net.get("h3")
                pingPair.setIP("10.0.0.20")
                while (curr_time < 50):
                    curr_time = monotonic() - start
                    interval = (50 - curr_time) if (50 - curr_time) >= 1 else 1
                    print("curr_time=%s :: %s start ping %s for %s sec" %
                          (curr_time, host.IP(), pingPair.IP(), interval))
                    print(
                        hostName,
                        host.cmd(
                            "./runos/src/apps/ddos-defender/scripts/png.sh %s %s"
                            % (pingPair.IP(), interval)))
                    sleep(0.5)

                file_name = "atck_duration_" + attack_hosts[0] + ".txt"
                handle = open(file_name, "w")
                handle.write("'%s' : [%s, %s]" %
                             (host.IP(), start_attack, end_attack))
                handle.close()

            if hostName == "h2":
                pingPair = net.get("h1")

                curr_time = monotonic() - start
                interval = (4 - curr_time) if (4 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(
                    hostName,
                    host.cmd(
                        "./runos/src/apps/ddos-defender/scripts/png.sh %s %s" %
                        (pingPair.IP(), interval)))

                curr_time = monotonic() - start
                print('curr_time=%s :: %s changed IP with DHCP' %
                      (curr_time, host.IP()))
                host.cmd('dhclient -r')
                host.cmd('dhclient')
                sleep(0.5)
                newIP = host.cmd(
                    "ifconfig | grep 'inet 10.' | cut -f2 -d't' | cut -f1 -d'n'"
                )
                splitnewIP = newIP.split(' ')
                host.setIP(splitnewIP[1])

                pingPair = net.get("h3")
                pingPair.setIP("10.0.0.20")
                curr_time = monotonic() - start
                sleep_time = 6 - curr_time
                if sleep_time > 0:
                    sleep(sleep_time)

                curr_time = monotonic() - start
                interval = (12 - curr_time) if (12 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(
                    hostName,
                    host.cmd(
                        "./runos/src/apps/ddos-defender/scripts/png.sh %s %s" %
                        (pingPair.IP(), interval)))

                curr_time = monotonic() - start
                sleep_time = 12.5 - curr_time
                if sleep_time > 0:
                    sleep(sleep_time)

                curr_time = monotonic() - start
                print("curr_time=%s :: %s start attack" %
                      (curr_time, host.IP()))
                start_attack = curr_time
                result = host.cmd(
                    "./runos/src/apps/ddos-defender/scripts/atck.sh %s %s 35" %
                    (host.MAC(), host.IP()))
                curr_time = monotonic() - start
                end_attack = curr_time
                print("curr_time=%s :: %s end attack" % (curr_time, host.IP()))

                pingPair = net.get("h7")
                while curr_time < 50:
                    curr_time = monotonic() - start
                    interval = (50 - curr_time) if (50 - curr_time) >= 1 else 1
                    print("curr_time=%s :: %s start ping %s for %s sec" %
                          (curr_time, host.IP(), pingPair.IP(), interval))
                    print(
                        hostName,
                        host.cmd(
                            "./runos/src/apps/ddos-defender/scripts/png.sh %s %s"
                            % (pingPair.IP(), interval)))
                    sleep(0.5)
                file_name = "atck_duration_" + attack_hosts[1] + ".txt"
                handle = open(file_name, "w")
                handle.write("'%s' : [%s, %s]" %
                             (host.IP(), start_attack, end_attack))
                handle.close()

            if hostName == "h3":
                pingPair = net.get("h4")

                curr_time = monotonic() - start
                interval = (4 - curr_time) if (4 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(
                    hostName,
                    host.cmd(
                        "./runos/src/apps/ddos-defender/scripts/png.sh %s %s" %
                        (pingPair.IP(), interval)))

                curr_time = monotonic() - start
                print(
                    'curr_time=%s :: %s changed IP STATIC (%s -> 10.0.0.20)' %
                    (curr_time, host.IP(), host.IP()))
                host.cmd('ifconfig h3-eth0 10.0.0.20 netmask 255:0:0:0')
                host.setIP("10.0.0.20")
                sleep(0.5)

                pingPair = net.get("h4")
                curr_time = monotonic() - start
                sleep_time = 6 - curr_time
                if sleep_time > 0:
                    sleep(sleep_time)

                curr_time = monotonic() - start
                interval = (25 - curr_time) if (25 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(
                    hostName,
                    host.cmd(
                        "./runos/src/apps/ddos-defender/scripts/png.sh %s %s" %
                        (pingPair.IP(), interval)))

                pingPair = net.get("h7")
                curr_time = monotonic() - start
                interval = (40 - curr_time) if (40 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(
                    hostName,
                    host.cmd(
                        "./runos/src/apps/ddos-defender/scripts/png.sh %s %s" %
                        (pingPair.IP(), interval)))

                pingPair = net.get("h6")
                curr_time = monotonic() - start
                interval = (50 - curr_time) if (50 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(
                    hostName,
                    host.cmd(
                        "./runos/src/apps/ddos-defender/scripts/png.sh %s %s" %
                        (pingPair.IP(), interval)))

            if hostName == "h4":
                pingPair = net.get("h5")

                curr_time = monotonic() - start
                interval = (12.5 - curr_time) if (12.5 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(
                    hostName,
                    host.cmd(
                        "./runos/src/apps/ddos-defender/scripts/png.sh %s %s" %
                        (pingPair.IP(), interval)))

                pingPair = net.get("h9")
                curr_time = monotonic() - start
                interval = (25 - curr_time) if (25 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(
                    hostName,
                    host.cmd(
                        "./runos/src/apps/ddos-defender/scripts/png.sh %s %s" %
                        (pingPair.IP(), interval)))

                curr_time = monotonic() - start
                print('curr_time=%s :: %s changed IP with DHCP' %
                      (curr_time, host.IP()))
                host.cmd('dhclient -r')
                host.cmd('dhclient')
                sleep(0.5)
                newIP = host.cmd(
                    "ifconfig | grep 'inet 10.' | cut -f2 -d't' | cut -f1 -d'n'"
                )
                splitnewIP = newIP.split(' ')
                host.setIP(splitnewIP[1])

                pingPair = net.get("h6")
                curr_time = monotonic() - start
                sleep_time = 27.5 - curr_time
                if sleep_time > 0:
                    sleep(sleep_time)

                curr_time = monotonic() - start
                interval = (40 - curr_time) if (40 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(
                    hostName,
                    host.cmd(
                        "./runos/src/apps/ddos-defender/scripts/png.sh %s %s" %
                        (pingPair.IP(), interval)))

                curr_time = monotonic() - start
                sleep_time = 45 - curr_time
                if sleep_time > 0:
                    sleep(sleep_time)

                curr_time = monotonic() - start
                interval = (50 - curr_time) if (50 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(
                    hostName,
                    host.cmd(
                        "./runos/src/apps/ddos-defender/scripts/png.sh %s %s" %
                        (pingPair.IP(), interval)))

            if hostName == "h5":
                pingPair = net.get("h6")

                curr_time = monotonic() - start
                interval = (6 - curr_time) if (6 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(
                    hostName,
                    host.cmd(
                        "./runos/src/apps/ddos-defender/scripts/png.sh %s %s" %
                        (pingPair.IP(), interval)))

                pingPair = net.get("h8")
                curr_time = monotonic() - start
                interval = (12 - curr_time) if (12 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(
                    hostName,
                    host.cmd(
                        "./runos/src/apps/ddos-defender/scripts/png.sh %s %s" %
                        (pingPair.IP(), interval)))

                curr_time = monotonic() - start
                sleep_time = 12.5 - curr_time
                if sleep_time > 0:
                    sleep(sleep_time)

                curr_time = monotonic() - start
                print("curr_time=%s :: %s start attack" %
                      (curr_time, host.IP()))
                start_attack = curr_time
                result = host.cmd(
                    "./runos/src/apps/ddos-defender/scripts/atck.sh %s %s 25" %
                    (host.MAC(), host.IP()))
                curr_time = monotonic() - start
                end_attack = curr_time
                print("curr_time=%s :: %s end attack" % (curr_time, host.IP()))

                pingPair = net.get("h8")
                curr_time = monotonic() - start
                interval = (40 - curr_time) if (40 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(
                    hostName,
                    host.cmd(
                        "./runos/src/apps/ddos-defender/scripts/png.sh %s %s" %
                        (pingPair.IP(), interval)))

                curr_time = monotonic() - start
                sleep_time = 46 - curr_time
                if sleep_time > 0:
                    sleep(sleep_time)
                while curr_time < 50:
                    curr_time = monotonic() - start
                    interval = (50 - curr_time) if (50 - curr_time) >= 1 else 1
                    print("curr_time=%s :: %s start ping %s for %s sec" %
                          (curr_time, host.IP(), pingPair.IP(), interval))
                    print(
                        hostName,
                        host.cmd(
                            "./runos/src/apps/ddos-defender/scripts/png.sh %s %s"
                            % (pingPair.IP(), interval)))
                    sleep(0.5)

                file_name = "atck_duration_" + attack_hosts[2] + ".txt"
                handle = open(file_name, "w")
                handle.write("'%s' : [%s, %s]" %
                             (host.IP(), start_attack, end_attack))
                handle.close()

            if hostName == "h6":
                pingPair = net.get("h7")
                curr_time = monotonic() - start
                interval = (6 - curr_time) if (6 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(
                    hostName,
                    host.cmd(
                        "./runos/src/apps/ddos-defender/scripts/png.sh %s %s" %
                        (pingPair.IP(), interval)))

                pingPair = net.get("h8")
                curr_time = monotonic() - start
                interval = (27.5 - curr_time) if (27.5 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(
                    hostName,
                    host.cmd(
                        "./runos/src/apps/ddos-defender/scripts/png.sh %s %s" %
                        (pingPair.IP(), interval)))

                pingPair = net.get("h7")
                curr_time = monotonic() - start
                interval = (40 - curr_time) if (40 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(
                    hostName,
                    host.cmd(
                        "./runos/src/apps/ddos-defender/scripts/png.sh %s %s" %
                        (pingPair.IP(), interval)))

                curr_time = monotonic() - start
                sleep_time = 45 - curr_time
                if sleep_time > 0:
                    sleep(sleep_time)
                curr_time = monotonic() - start
                interval = (50 - curr_time) if (50 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(
                    hostName,
                    host.cmd(
                        "./runos/src/apps/ddos-defender/scripts/png.sh %s %s" %
                        (pingPair.IP(), interval)))

            if hostName == "h7":
                pingPair = net.get("h9")
                curr_time = monotonic() - start
                interval = (6 - curr_time) if (6 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(
                    hostName,
                    host.cmd(
                        "./runos/src/apps/ddos-defender/scripts/png.sh %s %s" %
                        (pingPair.IP(), interval)))

                curr_time = monotonic() - start
                sleep_time = 10 - curr_time
                if sleep_time > 0:
                    sleep(sleep_time)

                curr_time = monotonic() - start
                print('curr_time=%s :: %s move from s4 to s2' %
                      (curr_time, host.IP()))
                hostIP = host.IP()
                moveHost(host, net.get('s4'), net.get('s2'), None, net)
                host = net.get(hostName)
                host.setIP(hostIP)

                curr_time = monotonic() - start
                sleep_time = 17.5 - curr_time
                if sleep_time > 0:
                    sleep(sleep_time)

                curr_time = monotonic() - start
                interval = (50 - curr_time) if (50 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(
                    hostName,
                    host.cmd(
                        "./runos/src/apps/ddos-defender/scripts/png.sh %s %s" %
                        (pingPair.IP(), interval)))

            if hostName == "h8":
                pingPair = net.get("h9")
                curr_time = monotonic() - start
                interval = (15 - curr_time) if (15 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(
                    hostName,
                    host.cmd(
                        "./runos/src/apps/ddos-defender/scripts/png.sh %s %s" %
                        (pingPair.IP(), interval)))

                curr_time = monotonic() - start
                interval = (27.5 - curr_time) if (27.5 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping 10.0.0.20 for %s sec" %
                      (curr_time, host.IP(), interval))
                print(
                    hostName,
                    host.cmd(
                        "./runos/src/apps/ddos-defender/scripts/png.sh 10.0.0.20 %s"
                        % interval))
                curr_time = monotonic() - start
                sleep_time = 30 - curr_time
                if sleep_time > 0:
                    sleep(sleep_time)

                curr_time = monotonic() - start
                print('curr_time=%s :: %s move from s4 to s1' %
                      (curr_time, host.IP()))
                hostIP = host.IP()
                moveHost(host, net.get('s4'), net.get('s1'), None, net)
                host = net.get(hostName)
                host.setIP(hostIP)

                curr_time = monotonic() - start
                sleep_time = 37.5 - curr_time
                if sleep_time > 0:
                    sleep(sleep_time)

                pingPair = net.get("h9")
                curr_time = monotonic() - start
                interval = (50 - curr_time) if (50 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(
                    hostName,
                    host.cmd(
                        "./runos/src/apps/ddos-defender/scripts/png.sh %s %s" %
                        (pingPair.IP(), interval)))

            if hostName == "h9":
                pingPair = net.get("h6")
                curr_time = monotonic() - start
                interval = (50 - curr_time) if (50 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(
                    hostName,
                    host.cmd(
                        "./runos/src/apps/ddos-defender/scripts/png.sh %s %s" %
                        (pingPair.IP(), interval)))

            sys.exit(3)
        if pid > 0:
            childs.append(pid)

    for p in childs:
        pid, status = os.wait()
    curr_time = monotonic() - start
    print("curr_time=%s :: childs end" % curr_time)
    handleResult = open("runos/src/apps/ddos-defender/tests/infectedMACs.txt",
                        "w")
    handleResult.write("{")
    for i in range(len(attack_hosts)):
        host = net.get(attack_hosts[i])
        file_name = "atck_duration_" + attack_hosts[i] + ".txt"
        handle = open(file_name, "r")
        result = handle.read()
        handleResult.write(result)
        if i < (len(attack_hosts) - 1):
            handleResult.write(", ")
        handle.close()
        cmnd = "sudo rm " + file_name
        host.cmd(cmnd)
    handleResult.write("}")
    handleResult.close()
    CLI(net)
    net.stop()
Example #3
0
def simpleTest():
    print("infection hosts rate:")
    inf_rate = eval(input())
    print("k:")
    k = eval(input())
    grow_time = 20
    atck_time = 40
    test_time = 50

    max = grow_time * k

    controller = RemoteController('Runos', ip='127.0.0.1', port=6653)
    switch = partial(OVSKernelSwitch, protocols='OpenFlow13')
    net = TreeNet(depth=2,
                  fanout=3,
                  controller=controller,
                  switch=switch,
                  cleanup=True)
    net.start()
    sleep(3)

    hosts = net.topo.hosts()
    inf_amount = round(inf_rate * len(hosts))
    inf_hosts = []
    while inf_amount:
        num = randint(0, 8)
        if inf_amount and not (hosts[num] in inf_hosts):
            inf_hosts.append(hosts[num])
            inf_amount -= 1

    print(inf_hosts)

    general_capacity_per_sec = max / len(inf_hosts)
    connection_interval = grow_time / len(inf_hosts)
    send_delay_for_host = round(1000 / general_capacity_per_sec)
    print(send_delay_for_host)
    infection_sequence = numpy.arange(len(inf_hosts))
    numpy.random.shuffle(infection_sequence)

    start = monotonic()

    childs = []

    for i in range(len(hosts)):
        try:
            pid = os.fork()
        except:
            print('error: create child process')
            sys.exit(33)
        if pid == 0:
            host = net.get(hosts[i])

            if hosts[i] in inf_hosts:
                index = inf_hosts.index(hosts[i])
                host_turn = connection_interval * infection_sequence[index]

                ping_pair = net.get(hosts[i - 1])
                curr_time = monotonic() - start
                interval = (
                    2.5 + host_turn -
                    curr_time) if (2.5 + host_turn - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), ping_pair.IP(), interval))
                host.cmd(
                    "./runos/src/apps/ddos-defender/scripts/png.sh %s %s" %
                    (ping_pair.IP(), interval))

                ping_pair = net.get(hosts[i - 2])
                curr_time = monotonic() - start
                interval = (
                    5 + host_turn -
                    curr_time) if (5 + host_turn - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), ping_pair.IP(), interval))
                host.cmd(
                    "./runos/src/apps/ddos-defender/scripts/png.sh %s %s" %
                    (ping_pair.IP(), interval))

                curr_time = monotonic() - start
                sleep_time = 5 + host_turn - curr_time
                if sleep_time > 0:
                    sleep(sleep_time)
                curr_time = monotonic() - start
                interval = 5 + atck_time - curr_time if (5 + atck_time -
                                                         curr_time) >= 1 else 1
                print("curr_time=%s :: %s start attack" %
                      (curr_time, host.IP()))
                host.cmd(
                    "./runos/src/apps/ddos-defender/scripts/atckWithOpts.sh %s %s %s %s"
                    % (host.MAC(), host.IP(), interval, send_delay_for_host))

                while curr_time < test_time + 5:
                    curr_time = monotonic() - start
                    interval = (
                        5 + test_time -
                        curr_time) if (5 + test_time - curr_time) >= 1 else 1
                    print("curr_time=%s :: %s start ping %s for %s sec" %
                          (curr_time, host.IP(), ping_pair.IP(), interval))
                    host.cmd(
                        "./runos/src/apps/ddos-defender/scripts/png.sh %s %s" %
                        (ping_pair.IP(), interval))
                    sleep(0.5)

                file_name = "atck_duration_" + str(i) + ".txt"
                handle = open(file_name, "w")
                handle.write("'%s' : [%s, %s]" % (net.get(
                    hosts[i]).IP(), 5 + host_turn + 6, 5 + atck_time + 6))
                handle.close()
            else:
                ping_pair = net.get(hosts[i - 1])
                curr_time = monotonic() - start
                interval = (5 - curr_time) if (5 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), ping_pair.IP(), interval))
                host.cmd(
                    "./runos/src/apps/ddos-defender/scripts/png.sh %s %s" %
                    (ping_pair.IP(), interval))

                ping_pair = net.get(hosts[i - 2])
                curr_time = monotonic() - start
                interval = (25 - curr_time) if (25 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), ping_pair.IP(), interval))
                host.cmd(
                    "./runos/src/apps/ddos-defender/scripts/png.sh %s %s" %
                    (ping_pair.IP(), interval))

                ping_pair = net.get(hosts[i - 3])
                curr_time = monotonic() - start
                interval = (
                    test_time + 5 -
                    curr_time) if (test_time + 5 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), ping_pair.IP(), interval))
                host.cmd(
                    "./runos/src/apps/ddos-defender/scripts/png.sh %s %s" %
                    (ping_pair.IP(), interval))

            sys.exit(3)
        if pid > 0:
            childs.append(pid)

    for p in childs:
        pid, status = os.wait()
    print('childs end')

    host = net.get(hosts[0])
    handleResult = open("runos/src/apps/ddos-defender/tests/infectedMACs.txt",
                        "w")
    handleResult.write("{")
    for i in range(len(hosts)):
        if hosts[i] in inf_hosts:
            file_name = "atck_duration_" + str(i) + ".txt"
            handle = open(file_name, "r")
            result = handle.read()
            handleResult.write(result)
            if i < (len(hosts) - 1):
                handleResult.write(", ")
            handle.close()
            cmnd = "sudo rm " + file_name
            host.cmd(cmnd)
    handleResult.write("}")
    handleResult.close()

    CLI(net)
    net.stop()
def simpleTest():
    controller = RemoteController('Runos', ip='192.168.56.102', port=6653)
    switch = partial(OVSKernelSwitch, protocols='OpenFlow13')
    net = TreeNet(depth=2,
                  fanout=3,
                  controller=controller,
                  switch=switch,
                  cleanup=True)
    net.start()
    sleep(3)
    start = monotonic()

    results = []
    childs = []
    for hostName in net.topo.hosts():
        try:
            pid = os.fork()
        except:
            print('error: create child process')
            sys.exit(33)
        if pid == 0:
            host = net.get(hostName)

            if hostName == "h1":
                pingPair = net.get("h4")

                curr_time = monotonic() - start
                interval = (12 - curr_time) if (12 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(hostName,
                      host.cmd("./png.sh %s %s" % (pingPair.IP(), interval)))

                curr_time = monotonic() - start
                sleep_time = 12.5 - curr_time
                if sleep_time > 0:
                    sleep(sleep_time)

                curr_time = monotonic() - start
                print("curr_time=%s :: %s start attack" %
                      (curr_time, host.IP()))
                result = host.cmd("./atck.sh %s %s 25" %
                                  (host.MAC(), host.IP()))
                print("%s end attack" % host.IP())

            if hostName == "h2":
                pingPair = net.get("h1")

                curr_time = monotonic() - start
                interval = (4 - curr_time) if (4 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(hostName,
                      host.cmd("./png.sh %s %s" % (pingPair.IP(), interval)))

                curr_time = monotonic() - start
                print('curr_time=%s :: %s changed IP with DHCP' %
                      (curr_time, host.IP()))
                host.cmd('dhclient -r')
                host.cmd('dhclient')
                sleep(0.5)
                newIP = host.cmd(
                    "ifconfig | grep 'inet 10.' | cut -f2 -d't' | cut -f1 -d'n'"
                )
                splitnewIP = newIP.split(' ')
                host.setIP(splitnewIP[1])

                pingPair = net.get("h3")
                pingPair.setIP("10.0.0.20")
                curr_time = monotonic() - start
                sleep_time = 6 - curr_time
                if sleep_time > 0:
                    sleep(sleep_time)

                curr_time = monotonic() - start
                interval = (12 - curr_time) if (12 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(hostName,
                      host.cmd("./png.sh %s %s" % (pingPair.IP(), interval)))

                curr_time = monotonic() - start
                sleep_time = 12.5 - curr_time
                if sleep_time > 0:
                    sleep(sleep_time)

                curr_time = monotonic() - start
                print("curr_time=%s :: %s start attack" %
                      (curr_time, host.IP()))
                result = host.cmd("./atck.sh %s %s 25" %
                                  (host.MAC(), host.IP()))
                print("%s end attack" % host.IP())

            if hostName == "h3":
                pingPair = net.get("h9")

                curr_time = monotonic() - start
                interval = (4 - curr_time) if (4 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(hostName,
                      host.cmd("./png.sh %s %s" % (pingPair.IP(), interval)))

                curr_time = monotonic() - start
                print(
                    'curr_time=%s :: %s changed IP STATIC (%s -> 10.0.0.20)' %
                    (curr_time, host.IP(), host.IP()))
                host.cmd('ifconfig h3-eth0 10.0.0.20 netmask 255:0:0:0')
                host.setIP("10.0.0.20")
                sleep(0.5)

                pingPair = net.get("h9")
                curr_time = monotonic() - start
                sleep_time = 6 - curr_time
                if sleep_time > 0:
                    sleep(sleep_time)

                curr_time = monotonic() - start
                interval = (17 - curr_time) if (17 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(hostName,
                      host.cmd("./png.sh %s %s" % (pingPair.IP(), interval)))

                pingPair = net.get("h4")
                curr_time = monotonic() - start
                interval = (25 - curr_time) if (25 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                result = host.cmd("./png.sh %s %s" % (pingPair.IP(), interval))
                handle = open("outputH3-H4.txt", "w")
                handle.write(result)
                handle.close()

                pingPair = net.get("h7")
                curr_time = monotonic() - start
                interval = (40 - curr_time) if (40 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(hostName,
                      host.cmd("./png.sh %s %s" % (pingPair.IP(), interval)))

                pingPair = net.get("h6")
                curr_time = monotonic() - start
                interval = (50 - curr_time) if (50 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(hostName,
                      host.cmd("./png.sh %s %s" % (pingPair.IP(), interval)))

            if hostName == "h4":
                pingPair = net.get("h5")

                curr_time = monotonic() - start
                interval = (17 - curr_time) if (17 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(hostName,
                      host.cmd("./png.sh %s %s" % (pingPair.IP(), interval)))

                pingPair = net.get("h6")
                curr_time = monotonic() - start
                interval = (25 - curr_time) if (25 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                result = host.cmd("./png.sh %s %s" % (pingPair.IP(), interval))
                handle = open("outputH4-H6.txt", "w")
                handle.write(result)
                handle.close()

                curr_time = monotonic() - start
                print('curr_time=%s :: %s changed IP with DHCP' %
                      (curr_time, host.IP()))
                host.cmd('dhclient -r')
                host.cmd('dhclient')
                sleep(0.5)
                newIP = host.cmd(
                    "ifconfig | grep 'inet 10.' | cut -f2 -d't' | cut -f1 -d'n'"
                )
                splitnewIP = newIP.split(' ')
                host.setIP(splitnewIP[1])

                pingPair = net.get("h6")
                curr_time = monotonic() - start
                sleep_time = 27.5 - curr_time
                if sleep_time > 0:
                    sleep(sleep_time)

                curr_time = monotonic() - start
                interval = (50 - curr_time) if (50 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(hostName,
                      host.cmd("./png.sh %s %s" % (pingPair.IP(), interval)))

            if hostName == "h5":
                pingPair = net.get("h6")

                curr_time = monotonic() - start
                interval = (6 - curr_time) if (6 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(hostName,
                      host.cmd("./png.sh %s %s" % (pingPair.IP(), interval)))

                pingPair = net.get("h8")
                curr_time = monotonic() - start
                interval = (12 - curr_time) if (12 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(hostName,
                      host.cmd("./png.sh %s %s" % (pingPair.IP(), interval)))

                curr_time = monotonic() - start
                sleep_time = 12.5 - curr_time
                if sleep_time > 0:
                    sleep(sleep_time)

                curr_time = monotonic() - start
                print("curr_time=%s :: %s start attack" %
                      (curr_time, host.IP()))
                result = host.cmd("./atck.sh %s %s 35" %
                                  (host.MAC(), host.IP()))
                print("%s end attack" % host.IP())

            if hostName == "h6":
                pingPair = net.get("h7")
                curr_time = monotonic() - start
                interval = (6 - curr_time) if (6 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(hostName,
                      host.cmd("./png.sh %s %s" % (pingPair.IP(), interval)))

                pingPair = net.get("h8")
                curr_time = monotonic() - start
                interval = (27.5 - curr_time) if (27.5 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(hostName,
                      host.cmd("./png.sh %s %s" % (pingPair.IP(), interval)))

                pingPair = net.get("h7")
                curr_time = monotonic() - start
                interval = (50 - curr_time) if (50 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(hostName,
                      host.cmd("./png.sh %s %s" % (pingPair.IP(), interval)))

            if hostName == "h7":
                pingPair = net.get("h9")
                curr_time = monotonic() - start
                interval = (6 - curr_time) if (6 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(hostName,
                      host.cmd("./png.sh %s %s" % (pingPair.IP(), interval)))

                curr_time = monotonic() - start
                sleep_time = 10 - curr_time
                if sleep_time > 0:
                    sleep(sleep_time)

                curr_time = monotonic() - start
                print('curr_time=%s :: %s move from s4 to s2' %
                      (curr_time, host.IP()))
                hostIP = host.IP()
                moveHost(host, net.get('s4'), net.get('s2'), None, net)
                host = net.get(hostName)
                host.setIP(hostIP)

                curr_time = monotonic() - start
                sleep_time = 17 - curr_time
                if sleep_time > 0:
                    sleep(sleep_time)

                pingPair = net.get("h8")
                curr_time = monotonic() - start
                interval = (27.5 - curr_time) if (27.5 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                result = host.cmd("./png.sh %s %s" % (pingPair.IP(), interval))
                handle = open("outputH7-H8.txt", "w")
                handle.write(result)
                handle.close()

                pingPair = net.get("h9")
                curr_time = monotonic() - start
                interval = (50 - curr_time) if (50 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(hostName,
                      host.cmd("./png.sh %s %s" % (pingPair.IP(), interval)))

            if hostName == "h8":
                pingPair = net.get("h9")
                curr_time = monotonic() - start
                interval = (15 - curr_time) if (15 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(hostName,
                      host.cmd("./png.sh %s %s" % (pingPair.IP(), interval)))

                curr_time = monotonic() - start
                interval = (27.5 - curr_time) if (27.5 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping 10.0.0.20 for %s sec" %
                      (curr_time, host.IP(), interval))
                print(hostName, host.cmd("./png.sh 10.0.0.20 %s" % interval))
                curr_time = monotonic() - start
                sleep_time = 30 - curr_time
                if sleep_time > 0:
                    sleep(sleep_time)

                curr_time = monotonic() - start
                print('curr_time=%s :: %s move from s4 to s1' %
                      (curr_time, host.IP()))
                hostIP = host.IP()
                moveHost(host, net.get('s4'), net.get('s1'), None, net)
                host = net.get(hostName)
                host.setIP(hostIP)

                curr_time = monotonic() - start
                sleep_time = 37.5 - curr_time
                if sleep_time > 0:
                    sleep(sleep_time)

                pingPair = net.get("h9")
                curr_time = monotonic() - start
                interval = (50 - curr_time) if (50 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(hostName,
                      host.cmd("./png.sh %s %s" % (pingPair.IP(), interval)))

            if hostName == "h9":
                pingPair = net.get("h6")
                curr_time = monotonic() - start
                interval = (50 - curr_time) if (50 - curr_time) >= 1 else 1
                print("curr_time=%s :: %s start ping %s for %s sec" %
                      (curr_time, host.IP(), pingPair.IP(), interval))
                print(hostName,
                      host.cmd("./png.sh %s %s" % (pingPair.IP(), interval)))

            sys.exit(3)
        if pid > 0:
            childs.append(pid)

    curr_time = monotonic() - start
    sleep_time = 27.5 - curr_time
    if sleep_time > 0:
        sleep(sleep_time)
    print('"curr_time=%s :: switch s2 off' % curr_time)
    SwitchOff(net.get('s2'), net)

    curr_time = monotonic() - start
    sleep_time = 40 - curr_time
    if sleep_time > 0:
        sleep(sleep_time)
    print('"curr_time=%s :: switch s2 up' % curr_time)
    SwitchUp(net.get('s2'), net)

    for p in childs:
        pid, status = os.wait()
    print('childs end')

    handleResult = open("outputRTT.txt", "w")
    handle = open("outputH3-H4.txt", "r")
    result = handle.read()
    handleResult.write(result)
    handle.close()
    handle = open("outputH4-H6.txt", "r")
    result = handle.read()
    handleResult.write(result)
    handle.close()
    handle = open("outputH7-H8.txt", "r")
    result = handle.read()
    handleResult.write(result)
    handle.close()
    handleResult.close()

    try:
        pid = os.fork()
    except:
        print('error: create child process')
        sys.exit(33)
    if pid == 0:
        host = net.get("h1")
        host.cmd("sudo rm outputH3-H4.txt outputH4-H6.txt outputH7-H9.txt")
        sys.exit(3)
    pid, status = os.wait()

    CLI(net)
    net.stop()
    """