From 4de3374dd96dbbdcfe824bdfd9d200e74c23ea1e Mon Sep 17 00:00:00 2001 From: Adriana Draghici Date: Tue, 26 Jan 2010 11:38:34 +0200 Subject: [PATCH] bt_comm: added xml files and client code --- bt_comm/client/ParserConf.py | 0 bt_comm/client/SSHCommander.py | 21 +++++++ bt_comm/client/TrafficControl.py | 98 +++++++++++++++++++++++++++++ bt_comm/client/XMLParser.py | 104 +++++++++++++++++++++++++++++++ bt_comm/xml/.clients.xml.swp | Bin 0 -> 12288 bytes bt_comm/xml/.nodes.xml.swp | Bin 0 -> 12288 bytes bt_comm/xml/ParserConf.py | 0 bt_comm/xml/SSHCommander.py | 21 +++++++ bt_comm/xml/TrafficControl.py | 98 +++++++++++++++++++++++++++++ bt_comm/xml/XMLParser.py | 104 +++++++++++++++++++++++++++++++ bt_comm/xml/clients.xml | 39 ++++++++++++ bt_comm/xml/nodes.xml | 39 ++++++++++++ bt_comm/xml/swarm.xml | 48 ++++++++++++++ 13 files changed, 572 insertions(+) create mode 100644 bt_comm/client/ParserConf.py create mode 100644 bt_comm/client/SSHCommander.py create mode 100644 bt_comm/client/TrafficControl.py create mode 100644 bt_comm/client/XMLParser.py create mode 100644 bt_comm/xml/.clients.xml.swp create mode 100644 bt_comm/xml/.nodes.xml.swp create mode 100644 bt_comm/xml/ParserConf.py create mode 100644 bt_comm/xml/SSHCommander.py create mode 100644 bt_comm/xml/TrafficControl.py create mode 100644 bt_comm/xml/XMLParser.py create mode 100644 bt_comm/xml/clients.xml create mode 100644 bt_comm/xml/nodes.xml create mode 100644 bt_comm/xml/swarm.xml diff --git a/bt_comm/client/ParserConf.py b/bt_comm/client/ParserConf.py new file mode 100644 index 0000000..e69de29 diff --git a/bt_comm/client/SSHCommander.py b/bt_comm/client/SSHCommander.py new file mode 100644 index 0000000..71cfc41 --- /dev/null +++ b/bt_comm/client/SSHCommander.py @@ -0,0 +1,21 @@ +import paramiko +import os +paramiko.util.log_to_file('/tmp/paramiko.log') + +client = paramiko.SSHClient() +client.load_system_host_keys() +client.connect(hostname='141.85.37.237', username='marius', password='marius') +#client.connect(hostname='p2p-next-07.grid.pub.ro', username='p2p') +stdin, stdout, stderr = client.exec_command('touch gugu dudu') +stdin, stdout, stderr = client.exec_command('ls -l') +print stdout.readlines() +client.close() +#~ host = "p2p-next-09.grid.pub.ro" +#~ port = 22 +#~ transport = paramiko.Transport((host, port)) + +#~ privatekeyfile = os.path.expanduser('~/.ssh/id_rsa') +#~ mykey = paramiko.RSAKey.from_private_key_file(privatekeyfile) +#~ username = 'p2p' +#~ transport.connect(username = username, pkey = mykey) + diff --git a/bt_comm/client/TrafficControl.py b/bt_comm/client/TrafficControl.py new file mode 100644 index 0000000..27d8be2 --- /dev/null +++ b/bt_comm/client/TrafficControl.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python + +""" + Traffic control interface for Linux tc + 2010, Razvan Deaconescu, razvan.deaconescu@cs.pub.ro +""" + +import sys +import sqlite3 +import os.path + +DEBUG = False + +class TrafficControl: + """ + Basic class interface to Linux tc + """ + + def __init__(self, node_type): + self.node_type = node_type + self.upload_limit = -1 + self.download_limit = -1 + + def config(self, host_address, host_port, host_iface, + vm_address = None, vm_port = -1, vm_iface = None): + self.host_address = host_address + self.host_port = host_port + self.host_iface = host_iface + self.vm_address = vm_address + self.vm_port = vm_port + self.vm_iface = vm_iface + + """ + Set upload limit. Argument in KB/s (kilobytes/s) + """ + def set_upload_limit(self, upload_limit): + self.upload_limit = upload_limit + + """ + Set download limit. Argument in KB/s (kilobytes/s) + """ + def set_download_limit(self, download_limit): + self.download_limit = download_limit + + def get_upload_limit_commands(self): + upload_limit_commands = [] + upload_limit_commands.append("tc qdisc add dev %s root handle 1: htb default 90" % (self.vm_iface)) + upload_limit_commands.append("tc class add dev %s parent 1: classid 1:1 htb rate %dkb ceil %dkb" % (self.vm_iface, self.upload_limit, self.upload_limit)) + upload_limit_commands.append("tc qdisc add dev %s parent 1:1 handle 10: sfq perturb 10" % (self.vm_iface)) + upload_limit_commands.append("tc filter add dev %s parent 1:0 protocol ip u32 match ip dst %s match ip dport %d 0xffff classid 1:1" % (self.vm_iface, self.vm_address, self.vm_port)) + + return upload_limit_commands + + def get_download_limit_commands(self): + download_limit_commands = [] + download_limit_commands.append("tc qdisc add dev %s root handle 1: htb default 90" % (self.host_iface)) + download_limit_commands.append("tc class add dev %s parent 1: classid 1:1 htb rate %dkb ceil %dkb" % (self.host_iface, self.download_limit, self.download_limit)) + download_limit_commands.append("tc qdisc add dev %s parent 1:1 handle 10: sfq perturb 10" % (self.host_iface)) + download_limit_commands.append("tc filter add dev %s parent 1:0 protocol ip u32 match ip src %s classid 1:1" % (self.host_iface, self.vm_address)) + + return download_limit_commands + + def get_flush_commands(self): + flush_commands = [] + flush_commands.append("tc qdisc del dev %s root handle 1:" % (self.host_iface)) + flush_commands.append("tc qdisc del dev %s root handle 1:" % (self.vm_iface)) + + return flush_commands + + +def print_commands(commands, header): + print "\n\t== %s ==\n" % (header) + + for c in commands: + print c + +def main(): + + """ + Test case + """ + + tc = TrafficControl("openvz") + tc.config("141.85.224.201", 10150, "eth0", + "172.16.10.0", 10150, "venet0") + tc.set_upload_limit(512) + tc.set_download_limit(256) + + upload_limit_commands = tc.get_upload_limit_commands() + download_limit_commands = tc.get_download_limit_commands() + flush_commands = tc.get_flush_commands() + + print_commands(upload_limit_commands, "upload limit commands") + print_commands(download_limit_commands, "download limit commands") + print_commands(flush_commands, "flush commands") + +if __name__ == "__main__": + sys.exit(main()) diff --git a/bt_comm/client/XMLParser.py b/bt_comm/client/XMLParser.py new file mode 100644 index 0000000..1f473b5 --- /dev/null +++ b/bt_comm/client/XMLParser.py @@ -0,0 +1,104 @@ +from lxml import etree + +class SwarmInstance: + def __init__(self, id, node_id, list): + self.id = id; + self.node_id = node_id; + self.btclient = list[0]; + self.upload_limit = list[1]; + self.download_limit = list[2]; + self.port = list[3]; + self.download_dir = list[4]; + self.upload_dir = list[5]; + + def __str__(self): + return '[%s: %s: %s: %s: %s: %s: %s: %s]' \ + %(self.id, self.node_id, self.btclient, self.upload_limit, \ + self.download_limit, self.port, self.upload_dir, self.download_dir); + +class NodeConfig: + def __init__(self, list): + self.id = list[0]; + self.public_address = list[1]; + self.public_port = list[2]; + self.private_address = list[3]; + self.private_port = list[4]; + self.ssh_port= list[5]; + self.clients_base_dir = list[6]; + + #~ def __str__(self): + #~ return '[%s: %s: %s: %s: %s: %s: %s]' \ + #~ %(self.id, self.btclient, self.upload_limit, self.download_limit, self.port, self.upload_dir, self.download_dir); + +class ClientConfig: + def __init__(self, id, node_path, filetype, options): + self.id = id; + self.filetype = filetype; + self.options = options; + #~ self.upload_limit_option= list[2]; + #~ self.download_limit_option = list[3]; + #~ self.port_option = list[4]; + #~ self.logging_dir_option = list[5]; + #~ self.download_dir_option = list[6]; + + #~ def __str__(self): + #~ return '[%s: %s: %s: %s: %s: %s: %s]' \ + #~ %(self.id, self.btclient, self.upload_limit, self.download_limit, self.port, self.upload_dir, self.download_dir); + +class FileType: + def __init__(self, list): + self.type = list[0]; + self.file = list[1]; + self.interpreter = list[2]; + self.prefix = list[3]; + self.sufix = list[4]; + + def __str__(self): + return '[%s: %s: %s: %s: %s: %s: %s]' \ + %(self.id, self.btclient, self.upload_limit, self.download_limit, self.port, self.upload_dir, self.download_dir); + +try: + tree = etree.parse("clients.xml") + root = tree.getroot() + clients_options = {} + for elem in root: + id = elem.get("id") + options = [elem2.text for elem2 in elem[1:]] + filetype = [elem[0].get("type")] + filetype.extend([elem2.text for elem2 in elem[0]]) + clients_options[id] = [filetype, options] + + print clients_options +except IOError as e: + print e + +try: + tree = etree.parse("nodes.xml") + root = tree.getroot() + nodes = {} + for elem in root: + id = elem.get("id") + list = [elem2.text for elem2 in elem[:len(elem)-1]] + client_paths = {} + for elem2 in elem[len(elem)-1]: + client_id = elem2.get("id"); + client_paths [client_id]=elem2[0].text; + nodes[id] = [client_paths, list] + print nodes + print "==================================" +except IOError as e: + print e + +try: + tree = etree.parse("swarm.xml") + root = tree.getroot() + swarm = {} + for elem in root: + id = elem.get("id") + list = [elem2.text for elem2 in elem[:len(elem)-1]] + swarm[id] = list + print swarm + print "==================================" +except IOError as e: + print e + diff --git a/bt_comm/xml/.clients.xml.swp b/bt_comm/xml/.clients.xml.swp new file mode 100644 index 0000000000000000000000000000000000000000..9d644504653cc1379cc397902046dfd9fa5daeeb GIT binary patch literal 12288 zcmeI2y=xRf7>6e*1V0i*(^$D~kW_nU9d|KlLIdSK?s}ONit+_W|*Cg7eNaP z!QMu!1;IuH8$qxZOB+k={1lJL zz*J43I&~Y}+lmx#w^AObQYe>IP~T^0>LvqZU|$0x>~eK#a@@b@ojbdE+a-ko5qbrK80@Bf|u0em{m*az?mJOc*IflFW%90Q+68G8X9gF7Gq7r-$1Hp19P z@De-$_dyPp!2~!DzMo?33wR5jf`?!e#NY}T0$=e=Z@?qa2AyY20TnVp2FL&zAOmE8 z43Ggb@Lw1Rdna1!%tPs2*4gne(RWp7vs6x4G~pAsl&^|_HJOTfW@GMbq_URGGMEc+a5&`MF3gU}J-2N{%@=JE z=Pp`JgYP z9=8&lqZbvkJ!r?W*h=Gi8`77x-9gY37N_M=o5g{7Z%f$DyHN9|DwDn^RIC$xW7Pcl RTZ_TW%++hbls{W%KLIk$%S8YH literal 0 HcmV?d00001 diff --git a/bt_comm/xml/.nodes.xml.swp b/bt_comm/xml/.nodes.xml.swp new file mode 100644 index 0000000000000000000000000000000000000000..2fe42617ac671e7acdbb5c8d4743a1836ba9dff6 GIT binary patch literal 12288 zcmeI2zi$&U6vth*0tG}XR*vhyl=InbNsunriJ?M3BvjVwlCxS%$z5b$q6i6gBt|ya zD*gZlmP$ylcR_+3iItrNseCVYY0{zju}06*N3qW@FZRbTOX8;gV(*Dl^&~^P#aN@a z|G4&bgKcgw7R5$KNtDk_ZEczr8<4JcW<}GC&5%02v?yWPl8i z0Wz>m2D0u7JHv*qfcs#j1TWOc02v?yWPl8i0Wv@a$N(8217v^)`JV#DnkP7`y|0@CZBrcfjv81tc3Ozg^iTxGFoW|W0kpe)3EWl^M@ zzbwS8vJlu`FuX61*IithclyfYU-h~xJl}Ox(n@2U9M;{v=g%s&+Rnp@aCbxYA2KnY Ab^rhX literal 0 HcmV?d00001 diff --git a/bt_comm/xml/ParserConf.py b/bt_comm/xml/ParserConf.py new file mode 100644 index 0000000..e69de29 diff --git a/bt_comm/xml/SSHCommander.py b/bt_comm/xml/SSHCommander.py new file mode 100644 index 0000000..71cfc41 --- /dev/null +++ b/bt_comm/xml/SSHCommander.py @@ -0,0 +1,21 @@ +import paramiko +import os +paramiko.util.log_to_file('/tmp/paramiko.log') + +client = paramiko.SSHClient() +client.load_system_host_keys() +client.connect(hostname='141.85.37.237', username='marius', password='marius') +#client.connect(hostname='p2p-next-07.grid.pub.ro', username='p2p') +stdin, stdout, stderr = client.exec_command('touch gugu dudu') +stdin, stdout, stderr = client.exec_command('ls -l') +print stdout.readlines() +client.close() +#~ host = "p2p-next-09.grid.pub.ro" +#~ port = 22 +#~ transport = paramiko.Transport((host, port)) + +#~ privatekeyfile = os.path.expanduser('~/.ssh/id_rsa') +#~ mykey = paramiko.RSAKey.from_private_key_file(privatekeyfile) +#~ username = 'p2p' +#~ transport.connect(username = username, pkey = mykey) + diff --git a/bt_comm/xml/TrafficControl.py b/bt_comm/xml/TrafficControl.py new file mode 100644 index 0000000..27d8be2 --- /dev/null +++ b/bt_comm/xml/TrafficControl.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python + +""" + Traffic control interface for Linux tc + 2010, Razvan Deaconescu, razvan.deaconescu@cs.pub.ro +""" + +import sys +import sqlite3 +import os.path + +DEBUG = False + +class TrafficControl: + """ + Basic class interface to Linux tc + """ + + def __init__(self, node_type): + self.node_type = node_type + self.upload_limit = -1 + self.download_limit = -1 + + def config(self, host_address, host_port, host_iface, + vm_address = None, vm_port = -1, vm_iface = None): + self.host_address = host_address + self.host_port = host_port + self.host_iface = host_iface + self.vm_address = vm_address + self.vm_port = vm_port + self.vm_iface = vm_iface + + """ + Set upload limit. Argument in KB/s (kilobytes/s) + """ + def set_upload_limit(self, upload_limit): + self.upload_limit = upload_limit + + """ + Set download limit. Argument in KB/s (kilobytes/s) + """ + def set_download_limit(self, download_limit): + self.download_limit = download_limit + + def get_upload_limit_commands(self): + upload_limit_commands = [] + upload_limit_commands.append("tc qdisc add dev %s root handle 1: htb default 90" % (self.vm_iface)) + upload_limit_commands.append("tc class add dev %s parent 1: classid 1:1 htb rate %dkb ceil %dkb" % (self.vm_iface, self.upload_limit, self.upload_limit)) + upload_limit_commands.append("tc qdisc add dev %s parent 1:1 handle 10: sfq perturb 10" % (self.vm_iface)) + upload_limit_commands.append("tc filter add dev %s parent 1:0 protocol ip u32 match ip dst %s match ip dport %d 0xffff classid 1:1" % (self.vm_iface, self.vm_address, self.vm_port)) + + return upload_limit_commands + + def get_download_limit_commands(self): + download_limit_commands = [] + download_limit_commands.append("tc qdisc add dev %s root handle 1: htb default 90" % (self.host_iface)) + download_limit_commands.append("tc class add dev %s parent 1: classid 1:1 htb rate %dkb ceil %dkb" % (self.host_iface, self.download_limit, self.download_limit)) + download_limit_commands.append("tc qdisc add dev %s parent 1:1 handle 10: sfq perturb 10" % (self.host_iface)) + download_limit_commands.append("tc filter add dev %s parent 1:0 protocol ip u32 match ip src %s classid 1:1" % (self.host_iface, self.vm_address)) + + return download_limit_commands + + def get_flush_commands(self): + flush_commands = [] + flush_commands.append("tc qdisc del dev %s root handle 1:" % (self.host_iface)) + flush_commands.append("tc qdisc del dev %s root handle 1:" % (self.vm_iface)) + + return flush_commands + + +def print_commands(commands, header): + print "\n\t== %s ==\n" % (header) + + for c in commands: + print c + +def main(): + + """ + Test case + """ + + tc = TrafficControl("openvz") + tc.config("141.85.224.201", 10150, "eth0", + "172.16.10.0", 10150, "venet0") + tc.set_upload_limit(512) + tc.set_download_limit(256) + + upload_limit_commands = tc.get_upload_limit_commands() + download_limit_commands = tc.get_download_limit_commands() + flush_commands = tc.get_flush_commands() + + print_commands(upload_limit_commands, "upload limit commands") + print_commands(download_limit_commands, "download limit commands") + print_commands(flush_commands, "flush commands") + +if __name__ == "__main__": + sys.exit(main()) diff --git a/bt_comm/xml/XMLParser.py b/bt_comm/xml/XMLParser.py new file mode 100644 index 0000000..1f473b5 --- /dev/null +++ b/bt_comm/xml/XMLParser.py @@ -0,0 +1,104 @@ +from lxml import etree + +class SwarmInstance: + def __init__(self, id, node_id, list): + self.id = id; + self.node_id = node_id; + self.btclient = list[0]; + self.upload_limit = list[1]; + self.download_limit = list[2]; + self.port = list[3]; + self.download_dir = list[4]; + self.upload_dir = list[5]; + + def __str__(self): + return '[%s: %s: %s: %s: %s: %s: %s: %s]' \ + %(self.id, self.node_id, self.btclient, self.upload_limit, \ + self.download_limit, self.port, self.upload_dir, self.download_dir); + +class NodeConfig: + def __init__(self, list): + self.id = list[0]; + self.public_address = list[1]; + self.public_port = list[2]; + self.private_address = list[3]; + self.private_port = list[4]; + self.ssh_port= list[5]; + self.clients_base_dir = list[6]; + + #~ def __str__(self): + #~ return '[%s: %s: %s: %s: %s: %s: %s]' \ + #~ %(self.id, self.btclient, self.upload_limit, self.download_limit, self.port, self.upload_dir, self.download_dir); + +class ClientConfig: + def __init__(self, id, node_path, filetype, options): + self.id = id; + self.filetype = filetype; + self.options = options; + #~ self.upload_limit_option= list[2]; + #~ self.download_limit_option = list[3]; + #~ self.port_option = list[4]; + #~ self.logging_dir_option = list[5]; + #~ self.download_dir_option = list[6]; + + #~ def __str__(self): + #~ return '[%s: %s: %s: %s: %s: %s: %s]' \ + #~ %(self.id, self.btclient, self.upload_limit, self.download_limit, self.port, self.upload_dir, self.download_dir); + +class FileType: + def __init__(self, list): + self.type = list[0]; + self.file = list[1]; + self.interpreter = list[2]; + self.prefix = list[3]; + self.sufix = list[4]; + + def __str__(self): + return '[%s: %s: %s: %s: %s: %s: %s]' \ + %(self.id, self.btclient, self.upload_limit, self.download_limit, self.port, self.upload_dir, self.download_dir); + +try: + tree = etree.parse("clients.xml") + root = tree.getroot() + clients_options = {} + for elem in root: + id = elem.get("id") + options = [elem2.text for elem2 in elem[1:]] + filetype = [elem[0].get("type")] + filetype.extend([elem2.text for elem2 in elem[0]]) + clients_options[id] = [filetype, options] + + print clients_options +except IOError as e: + print e + +try: + tree = etree.parse("nodes.xml") + root = tree.getroot() + nodes = {} + for elem in root: + id = elem.get("id") + list = [elem2.text for elem2 in elem[:len(elem)-1]] + client_paths = {} + for elem2 in elem[len(elem)-1]: + client_id = elem2.get("id"); + client_paths [client_id]=elem2[0].text; + nodes[id] = [client_paths, list] + print nodes + print "==================================" +except IOError as e: + print e + +try: + tree = etree.parse("swarm.xml") + root = tree.getroot() + swarm = {} + for elem in root: + id = elem.get("id") + list = [elem2.text for elem2 in elem[:len(elem)-1]] + swarm[id] = list + print swarm + print "==================================" +except IOError as e: + print e + diff --git a/bt_comm/xml/clients.xml b/bt_comm/xml/clients.xml new file mode 100644 index 0000000..57c96da --- /dev/null +++ b/bt_comm/xml/clients.xml @@ -0,0 +1,39 @@ + + + + + Tribler/Tools/cmdline.py + python + PYTHONPATH=. + + + + + -p + -l + -d + + + + hrktorrent + + + + + -p + -d + + + + src/transmission-cli + + + + + -u + -d + -p + -l + -o + + diff --git a/bt_comm/xml/nodes.xml b/bt_comm/xml/nodes.xml new file mode 100644 index 0000000..def3961 --- /dev/null +++ b/bt_comm/xml/nodes.xml @@ -0,0 +1,39 @@ + + + + 141.85.224.201 + 10150 + 172.30.10.0 + 10150 + 10122 + + + /home/p2p/p2p-clients/tribler/ + + + /home/p2p/p2p-clients/libtorrent/ + + + /home/p2p/p2p-clients/transmission/ + + + + + 141.85.224.202 + 10250 + 172.30.20.0 + 10250 + 10222 + + + /home/p2p/p2p-clients/tribler/ + + + /home/p2p/p2p-clients/libtorrent/ + + + /home/p2p/p2p-clients/transmission/ + + + + diff --git a/bt_comm/xml/swarm.xml b/bt_comm/xml/swarm.xml new file mode 100644 index 0000000..e0ba485 --- /dev/null +++ b/bt_comm/xml/swarm.xml @@ -0,0 +1,48 @@ + + + + 1 + triber + 512 + 256 + 9999 + /this/dir + /this/dir + + + + + + + + + + + 2 + transmission + + + + + + + + + + + + + + 3 + libtorrent + + + + + + + + + + + -- 2.20.1