MOL 319, connector code integrated in run_test.py
diff --git a/scripts/agent.py b/scripts/agent.py
index 2873cb5..ec73736 100644
--- a/scripts/agent.py
+++ b/scripts/agent.py
@@ -1,9 +1,51 @@
import argparse
import subprocess
import sys
+import socket
+import fcntl
+import struct
+import array
-def make_tunnels(ips, base_port=12345, delete=False):
+def all_interfaces():
+ max_possible = 128 # arbitrary. raise if needed.
+ bytes = max_possible * 32
+ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+ names = array.array('B', '\0' * bytes)
+ outbytes = struct.unpack('iL', fcntl.ioctl(
+ s.fileno(),
+ 0x8912, # SIOCGIFCONF
+ struct.pack('iL', bytes, names.buffer_info()[0])
+ ))[0]
+ namestr = names.tostring()
+ lst = []
+ for i in range(0, outbytes, 40):
+ name = namestr[i:i+16].split('\0', 1)[0]
+ ip = namestr[i+20:i+24]
+ lst.append((name, ip))
+ return lst
+
+
+def format_ip(addr):
+ return str(ord(addr[0])) + '.' + \
+ str(ord(addr[1])) + '.' + \
+ str(ord(addr[2])) + '.' + \
+ str(ord(addr[3]))
+
+
+def find_interface_by_ip(ext_ip):
+ ifs = all_interfaces()
+ for i in ifs:
+ ip = format_ip(i[1])
+
+ if ip == ext_ip:
+ return str(i[0])
+
+ print "External ip doesnt corresponds to any of available interfaces"
+ return None
+
+
+def make_tunnels(ips, ext_ip, base_port=12345, delete=False):
node_port = {}
if delete is True:
@@ -11,9 +53,11 @@
else:
mode = "-A"
+ iface = find_interface_by_ip(ext_ip)
+
for ip in ips:
p = subprocess.Popen(["iptables -t nat " + mode + " PREROUTING " +
- "-p tcp -i eth1 --dport " + str(base_port) +
+ "-p tcp -i " + iface + " --dport " + str(base_port) +
" -j DNAT --to " + str(ip) + ":22"],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
@@ -35,12 +79,20 @@
def parse_command_line(argv):
- parser = argparse.ArgumentParser(description="Connect to fuel master " +
+ parser = argparse.ArgumentParser(description=
+ "Connect to fuel master "
"and setup ssh agent")
- parser.add_argument("--base_port", type=int, required=True)
- # To do: fix clean to be False when string is False
- parser.add_argument("--clean", type=bool, default=False)
- parser.add_argument("--ports", type=str, nargs='+')
+ parser.add_argument(
+ "--base_port", type=int, required=True)
+
+ parser.add_argument(
+ "--ext_ip", type=str, required=True)
+
+ parser.add_argument(
+ "--clean", type=bool, default=False)
+
+ parser.add_argument(
+ "--ports", type=str, nargs='+')
return parser.parse_args(argv)
@@ -48,6 +100,7 @@
def main(argv):
arg_object = parse_command_line(argv)
mapping = make_tunnels(arg_object.ports,
+ ext_ip=arg_object.ext_ip,
base_port=arg_object.base_port,
delete=arg_object.clean)