X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fnepi%2Fresources%2Fplanetlab%2Fscripts%2Fpl-vif-create.py;h=1c19e3ee8348e55e4fa80201d53a6fc7ce84f4b6;hb=039fbd9629d7570d4c175a5448d24badcd0f3aba;hp=758cfc4ecdc8024955ba39219cab5b1f25feb288;hpb=c505d0f175a08073733ac8ff79dfa694de6e07f3;p=nepi.git diff --git a/src/nepi/resources/planetlab/scripts/pl-vif-create.py b/src/nepi/resources/planetlab/scripts/pl-vif-create.py index 758cfc4e..1c19e3ee 100644 --- a/src/nepi/resources/planetlab/scripts/pl-vif-create.py +++ b/src/nepi/resources/planetlab/scripts/pl-vif-create.py @@ -3,9 +3,8 @@ # 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. +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation; # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -17,15 +16,17 @@ # # Author: Alina Quereilhac +from __future__ import print_function + import base64 import errno -import vsys +import passfd import socket -from optparse import OptionParser, SUPPRESS_HELP - -# TODO: GRE OPTION!! CONFIGURE THE VIF-UP IN GRE MODE!! +import vsys +from optparse import OptionParser STOP_MSG = "STOP" +PASSFD_MSG = "PASSFD" def create_socket(socket_name): sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) @@ -52,8 +53,18 @@ def recv_msg(conn): break msg = ''.join(msg).split('\n')[0] - decoded = base64.b64decode(msg) - return decoded.rstrip() + # The message might have arguments that will be appended + # as a '|' separated list after the message type + args = msg.split("|") + msg = args.pop(0) + + dmsg = base64.b64decode(msg) + dargs = [] + for arg in args: + darg = base64.b64decode(arg) + dargs.append(darg.rstrip()) + + return (dmsg.rstrip(), dargs) def send_reply(conn, reply): encoded = base64.b64encode(reply) @@ -62,12 +73,21 @@ def send_reply(conn, reply): def stop_action(): return "STOP-ACK" -def reply_action(msg): - return "Reply to: %s" % msg +def passfd_action(fd, args): + """ Sends the file descriptor associated to the TAP device + to another process through a unix socket. + """ + address = args.pop(0) + print(address) + sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM) + sock.connect(address) + passfd.sendfd(sock, fd, '0') + return "PASSFD-ACK" def get_options(): usage = ("usage: %prog -t -a -n " - "-s -p -f -S ") + "-s -p -q -f " + "-S ") parser = OptionParser(usage = usage) @@ -92,13 +112,18 @@ def get_options(): help = "Peer end point for the interface ", default = None, type="str") - parser.add_option("-f", "--if-name-file", dest="if_name_file", - help = "File to store the interface name assigned by the OS", - default = "if_name", type="str") + parser.add_option("-q", "--txqueuelen", dest="txqueuelen", + help = "Size of transmision queue. Defaults to 0.", + default = 0, + type="int") + + parser.add_option("-f", "--vif-name-file", dest="vif_name_file", + help = "File to store the virtual interface name assigned by the OS", + default = "vif_name", type="str") parser.add_option("-S", "--socket-name", dest="socket_name", help = "Name for the unix socket used to interact with this process", - default = "tap.sock", type="str") + type="str") (options, args) = parser.parse_args() @@ -106,20 +131,23 @@ def get_options(): if options.vif_type and options.vif_type == "IFF_TUN": vif_type = vsys.IFF_TUN - return (vif_type, options.ip4_address, options.net_prefix, options.snat, - options.pointopoint, options.if_name_file, options.socket_name) + return (vif_type, options.ip4_address, options.net_prefix, + options.snat, options.pointopoint, options.txqueuelen, + options.vif_name_file, options.socket_name) if __name__ == '__main__': - (vif_type, ip4_address, net_prefix, snat, pointopoint, - if_name_file, socket_name) = get_options() - - (fd, if_name) = vsys.fd_tuntap(vif_type) - vsys.vif_up(if_name, ip4_address, net_prefix, snat, pointopoint) - - # Saving interface name to 'if_name_file - f = open(if_name_file, 'w') - f.write(if_name) + (vif_type, ip4_address, net_prefix, snat, pointopoint, + txqueuelen, vif_name_file, socket_name) = get_options() + + (fd, vif_name) = vsys.fd_tuntap(vif_type) + + vsys.vif_up(vif_name, ip4_address, net_prefix, snat = snat, + pointopoint = pointopoint, txqueuelen = txqueuelen) + + # Saving interface name to vif_name_file + f = open(vif_name_file, 'w') + f.write(vif_name) f.close() # create unix socket to receive instructions @@ -135,7 +163,7 @@ if __name__ == '__main__': while not stop: try: - msg = recv_msg(conn) + (msg, args) = recv_msg(conn) except socket.timeout, e: # Ingore time-out continue @@ -147,8 +175,8 @@ if __name__ == '__main__': if msg == STOP_MSG: stop = True reply = stop_action() - else: - reply = reply_action(msg) + elif msg == PASSFD_MSG: + reply = passfd_action(fd, args) try: send_reply(conn, reply)