#!/usr/bin/env python # # NEPI, a framework to manage network experiments # Copyright (C) 2013 INRIA # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # Author: Lucia Guevgeozian from nepi.execution.ec import ExperimentController from nepi.execution.resource import ResourceAction, ResourceState def add_node(ec, host, user): node = ec.register_resource("LinuxNode") ec.set(node, "hostname", host) ec.set(node, "username", user) ec.set(node, "cleanHome", True) ec.set(node, "cleanProcesses", True) return node def add_app(ec, command, node, sudo=None, video=None, depends=None, forward_x11=None, \ env=None): app = ec.register_resource("LinuxApplication") if sudo is not None: ec.set(app, "sudo", sudo) if video is not None: ec.set(app, "sources", video) if depends is not None: ec.set(app, "depends", depends) if forward_x11 is not None: ec.set(app, "forwardX11", forward_x11) if env is not None: ec.set(app, "env", env) ec.set(app, "command", command) ec.register_connection(app, node) return app exp_id = "transfer_file" # Create the EC ec = ExperimentController(exp_id) # PlanetLab choosen nodes for the experiment, change for PlanetLab nodes in your slice or # other linux nodes server_name = "planetlab2.ionio.gr" client_name = "planetlab2.fri.uni-lj.si" slicename = "inria_sfatest" # Location of the video in local machine video= "../big_buck_bunny_240p_mpeg4_lq.ts" # Packets needed for running the experiment depends_server = "pv nc tcpdump" depends_client = "nc" # Add resource managers for the linux nodes server = add_node(ec, server_name, slicename) client = add_node(ec, client_name, slicename) # Add resource managers for the linux applications app_server = add_app(ec, "cat ${SRC}/big_buck_bunny_240p_mpeg4_lq.ts | pv -fbt 2> \ bw.txt | nc %s 1234" % client_name, server, video=video, depends=depends_server) # Note: is important to add the -d option in nc command to not attempt to read from the # stdin # if not nc in the client side close the socket suddently if runned in background app_client = add_app(ec, "nc -dl 1234 > big_buck_copied_movie.ts", client, \ depends=depends_client) capture = add_app(ec, "tcpdump -ni eth0 -w video_transfer.pcap -s0 port 1234 2>&1", \ server, sudo=True) # Register conditions 1. nodes ; 2. start tcpdump capture ; 3. client listen port 1234 ; # 4. server start sending video ec.register_condition(app_server, ResourceAction.START, app_client, ResourceState.STARTED) ec.register_condition(app_client, ResourceAction.START, capture, ResourceState.STARTED) # Deploy ec.deploy() # Wait until the applications are finish to retrive the traces ec.wait_finished([app_server, app_client]) bw = ec.trace(app_server, "bw.txt") pcap = ec.trace(capture, "video_transfer.pcap") # Choose a directory to store the traces, example f = open("/home//bw.txt", "w") f = open("examples/linux/transfer/bw.txt", "w") f.write(bw) f.close() f = open("examples/linux/transfer/video_transfer.pcap", "w") f.write(pcap) f.close() ec.shutdown()