[tor-commits] [ooni-probe/master] Adding script for searching and adding PL nodes, .conf parameters, and class file for PL

art at torproject.org art at torproject.org
Mon Mar 5 21:50:38 UTC 2012


commit 739229d24a3cc12cce0c2d8cf24e25d53f92b8b0
Author: Isis Lovecruft <isis at patternsinthevoid.net>
Date:   Sun Mar 4 21:52:04 2012 -0800

    Adding script for searching and adding PL nodes, .conf parameters, and class file for PL
---
 addnodes.py            |   59 +++++++++++++++++++++++++++++
 ooni-probe.conf        |    8 +++-
 planetlab/planetlab.py |   97 ++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 163 insertions(+), 1 deletions(-)

diff --git a/addnodes.py b/addnodes.py
new file mode 100755
index 0000000..d6814a2
--- /dev/null
+++ b/addnodes.py
@@ -0,0 +1,59 @@
+#!/usr/bin/python
+""" 
+    addnodes.py
+    ***********
+    Script to add PlanetLab nodes to a slice. Takes an argument in the
+    form of a dictionary boot_state_filter, which searches for nodes which
+    match a pattern. Authentication patterns can be optionally defined in
+    ooniprobe.config.
+
+    :copyright: (c)2012 Isis Lovecruft
+    :license: see LICENSE for more details
+"""
+
+from ooniprobe import ooni
+try:
+    import paramiko
+except:
+    "Error: paramiko module was not found."
+import pprint
+try:
+    import pyXMLRPCssh
+except:
+    "Error: pyXMLRPCssh module was not found. Please download and install from: https://pypi.python.org/pypi/pyXMLRPCssh/1.0-0"
+import xmlrpclib
+
+class PlanetLab:
+    def __init__(self, ooni):
+        self.config = ooni.config
+        self.logger = ooni.logger
+        self.name = "PlanetLab"
+
+    def api_auth(self):
+        api_server = xmlrpclib.ServerProxy('https://www.planet-lab.org/PLCAPI/')
+        auth = {}
+        auth['Username'] = self.config.main.pl_username
+        auth['AuthString'] = self.config.main.pl_password
+        auth['AuthMethod'] = "password"
+        authorized = api_server.AuthCheck(auth)
+        
+        if authorized:
+            print 'We are authorized!'
+            return auth
+        else:
+            print 'Authorization failed. Please check the ooni-probe.conf file.'
+            
+    def search_for_nodes(self, boot_state_filter=None):
+        api_server = xmlrpclib.ServerProxy('https://www.planet-lab.org/PLCAPI/')
+        boot_state_filter = {'hostname': '*.cert.org.cn'}
+        all_nodes = api_server.GetNodes(self.api_auth(), boot_state_filter)
+        pp = pprint.PrettyPrinter()
+        pp.pprint(all_nodes)
+
+def main():
+    o = ooni()
+    pl = PlanetLab(o)
+    pl.search_for_nodes()
+
+if __name__=="__main__":
+    main()
diff --git a/ooni-probe.conf b/ooni-probe.conf
index 8ea67e3..1a0e607 100644
--- a/ooni-probe.conf
+++ b/ooni-probe.conf
@@ -1,6 +1,6 @@
 # ooni-probe
 #
-# These are the global configuration paramters necessary to
+# These are the global configuration parameters necessary to
 # make ooni-probe work
 [main]
 reportdir = reports/
@@ -11,6 +11,12 @@ testdir = tests/
 loglevel = DEBUG
 proxyaddress = 127.0.0.1:9050
 
+# The following configurations are for searching for PlanetLab
+# nodes, adding them to a slice, and PlanetLab general API 
+# authentication:
+pl_username = you at youraddress.com
+pl_password = yourpassword
+
 # These are configurations specific to the tests that should be
 # run by ooni-probe
 [tests]
diff --git a/planetlab/planetlab.py b/planetlab/planetlab.py
new file mode 100644
index 0000000..0a8648e
--- /dev/null
+++ b/planetlab/planetlab.py
@@ -0,0 +1,97 @@
+#!/usr/bin/env python
+"""
+    planetlab.py
+    ************
+
+    Classes for using ooni-probe with PlanetLab nodes.
+    
+    :copyright: (c)2012 Isis Lovecruft
+    :license: see LICENSE for more details
+"""
+
+from binascii import hexlify
+from ooniprobe import ooni
+import os
+import xmlrpclib
+import pprint
+try:
+    import paramiko
+except:
+    print "Error: paramiko module is not installed."
+try:
+    import pyXMLRPCssh
+except:
+    print "Error: pyXMLRPCssh module was not found. Please download and install from : https://pypi.python.org/pypi/pyXMLRPCssh/1.0-0"
+
+class PlanetLab:
+    
+    """Defines a PlanetLab node"""
+    
+    ## should inherit from CODE EXEC NODE and NETWORK
+    ## ADD UNIT OF WORK, adds the unit to pl's schedule
+    ## needs GET STATUS method for reporting
+    ## needs upload() and run() private methods
+
+    def __init__(self, ooni):
+        self.config = ooni.config
+        self.logger = ooni.logger
+        self.name = "PlanetLab"
+    
+    def api_auth(self):
+        api_server = xmlrpclib.ServerProxy('https://www.planet-lab.org/PLCAPI/')
+        auth = {}
+        ## should be changed to separate node.conf file
+        auth['Username'] = self.config.main.pl_username
+        auth['AuthString'] = self.config.main.pl_password
+        auth['AuthMethod'] = "password"
+        authorized = api_server.AuthCheck(auth)
+        
+        if authorized:
+            print 'We are authorized!'
+            return auth
+        else:
+            print 'Authorization failed. Please check your settings for pl_username and pl_password in the ooni-probe.conf file.'
+
+    def search_for_nodes(self, boot_state_filter=None):
+        api_server = xmlrpclib.ServerProxy('https://www.planet-lab.org/PLCAPI/')
+        boot_state_filter = {'hostname': '*.cert.org.cn'}
+        all_nodes = api_server.GetNodes(self.api_auth(), boot_state_filter)
+        pp = pprint.PrettyPrinter()
+        pp.pprint(all_nodes)
+
+    def auth_login(slicename, machinename):
+        """Attempt to authenticate to the given PL node, slicename and 
+        machinename, using any of the private keys in ~/.ssh/ """
+        
+        agent = paramiko.Agent()
+        agent_keys = agent.get_keys()
+        if len(agent_keys) == 0:
+            return
+        
+        for key in agent_keys:
+            print 'Trying ssh-agent key %s' % hexlify(key.get_fingerprint()),
+            try:
+                paramiko.transport.auth_publickey(machinename, slicename)
+                print 'Public key authentication to PlanetLab node %s successful.' % machinename,
+                return
+            except paramiko.SSHException:
+                print 'Public key authentication to PlanetLab node %s failed.' % machinename,
+
+    def make_client(slicename, machinename, command):
+        """Attempt to make a standard OpenSSH client to PL node."""
+
+        command = PlanetLab.get_command()
+        
+        client = paramiko.SSHClient()
+        client.load_system_host_keys()
+        client.connect(machinename)
+
+        stdin, stdout, stderr = client.exec_command(command)
+        
+    def send_files(files):
+        """Attempt to rsync a tree to the PL node. Requires PyRsync:
+        https://pypi.python.org/pypi/pyrsync/0.1.0"""
+        pass
+        
+    def get_command:
+        pass





More information about the tor-commits mailing list