[tor-commits] [ooni-probe/master] added ssh command and sftp methods

art at torproject.org art at torproject.org
Wed Apr 4 18:05:47 UTC 2012


commit 127f9410c4df41d14bb795386e72e6630de18683
Author: Isis Lovecruft <isis at patternsinthevoid.net>
Date:   Wed Mar 7 21:01:26 2012 -0800

    added ssh command and sftp methods
---
 plugoo/nodes.py |   78 +++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 56 insertions(+), 22 deletions(-)

diff --git a/plugoo/nodes.py b/plugoo/nodes.py
index 5b16d22..ccdaa44 100644
--- a/plugoo/nodes.py
+++ b/plugoo/nodes.py
@@ -12,6 +12,7 @@
 
 """
 
+import cmd
 import os
 from binascii import hexlify
 
@@ -93,6 +94,7 @@ class CodeExecNode(Node):
 
 class PlanetLab(Node, CodeExecNode):
     def __init__(self, address, auth_creds, ooni):
+        self.node = Node(address, 22)
         self.auth_creds = auth_creds
 
         self.config = ooni.config
@@ -130,8 +132,10 @@ class PlanetLab(Node, CodeExecNode):
             print 'Adding nodes %s' % node['hostname']
 
     def _auth_login(slicename, machinename):
-        """Attempt to authenticate to the given PL node, slicename and
-        machinename, using any of the private keys in ~/.ssh/ """
+        """
+        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()
@@ -147,27 +151,57 @@ class PlanetLab(Node, CodeExecNode):
             except paramiko.SSHException:
                 print 'Public key authentication to PlanetLab node %s failed.' % machinename,
 
-    def _get_command:
-        pass
-
-    def ssh_and_run_(slicename, machinename, command):
-        """Attempt to make a standard OpenSSH client to PL node, and run
-        commands from a .conf file."""
-
-        ## needs a way to specify 'ssh -l <slicename> <machinename>'
-        ## with public key authentication.
-
-        command = PlanetLab.get_command()
-
+    def _ssh_to_node(slicename, machinename, sshkeypasswd):
+        """
+        Attempt to make an SSH2 connection to added PL nodes.
+        """
+        
+        self.hosts = []
+        self.connections = []
+
+        if slicename, machinename, sshkeypasswd:
+            Node(machinename, 22)
+            for node in self.node:
+                self.hosts.append([slicename, machinename, sshkeypasswd])
+        
+        for host in self.hosts:
+            client = paramiko.SSHClient()
+            if (self.config.main.auto_add_new_hosts == 1):
+                client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+            client.load_system_host_keys()
+            client.connect(host[1], username=host[0], password=host[2])
+            self.connections.append(client)
+
+        return (self.hosts, self.connections)
+
+    def _ssh_and_run_(slicename, machinename, sshkeypasswd, command):
+        """
+        Attempt to make an SSH2 connection to PL nodes, and run
+        commands.
+        """
+        
+        PlanetLab._ssh_to_node(slicename, machinename, sshkeypasswd)
+
+        if command:
+            for host, conn in zip(self.hosts, self.connections):
+                stdin, stdout, stderr = conn.exec_command(command)
+                stdin.close()
+                for line in stdout.read().splitlines():
+                    print 'host: %s: %s' % (host[0], line)
+
+        for conn in self.connections:
+            conn.close()
+
+    def send_files_to_node(slicename, machinename, sshkeypasswd, 
+                           remotefile, localfile):
+        """Attempt to stfp files to the PL node."""
+        
+        PlanetLab._ssh_to_node(slicename, machinename, sshkeypasswd)
+        
         client = paramiko.SSHClient()
-        client.load_system_host_keys()
-        client.connect(machinename)
-
-        stdin, stdout, stderr = client.exec_command(command)
-
-    def send_files_to_node(directory, files):
-        """Attempt to rsync a tree to the PL node."""
-        pass
+        sftp = client.open_sftp()
+        sftp.get(localfile, remotefile)
+        sftp.close()
 
     def add_unit:
         pass





More information about the tor-commits mailing list