WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] Move the SSHTransport class to its own fi

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] Move the SSHTransport class to its own file, so that we may disable SSH
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Tue, 20 Jun 2006 15:02:01 +0000
Delivery-date: Tue, 20 Jun 2006 08:04:46 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User emellor@xxxxxxxxxxxxxxxxxxxxxx
# Node ID 7d6fe353cda473bd7d5ce5dc9b4c2ea6d840ecc4
# Parent  c5da6b25744add631ff9eddec2da4e328b5c4321
Move the SSHTransport class to its own file, so that we may disable SSH
transport when running on Python <2.4.  SSHTransport uses the new subprocess
class, and so it doesn't work on older versions.

Signed-off-by: Ewan Mellor <ewan@xxxxxxxxxxxxx>
---
 tools/python/xen/util/SSHTransport.py |  102 ++++++++++++++++++++++++++++++++++
 tools/python/xen/util/xmlrpclib2.py   |   86 +++++-----------------------
 tools/python/xen/xend/XendClient.py   |    8 ++
 3 files changed, 124 insertions(+), 72 deletions(-)

diff -r c5da6b25744a -r 7d6fe353cda4 tools/python/xen/util/xmlrpclib2.py
--- a/tools/python/xen/util/xmlrpclib2.py       Tue Jun 20 12:12:44 2006 +0100
+++ b/tools/python/xen/util/xmlrpclib2.py       Tue Jun 20 13:32:21 2006 +0100
@@ -13,7 +13,7 @@
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 #============================================================================
 # Copyright (C) 2006 Anthony Liguori <aliguori@xxxxxxxxxx>
-# Copyright (C) 2006 XenSource Ltd.
+# Copyright (C) 2006 XenSource Inc.
 #============================================================================
 
 """
@@ -24,67 +24,20 @@ import types
 import types
 
 from httplib import HTTPConnection, HTTP
-from xmlrpclib import Transport, getparser, Fault
+from xmlrpclib import Transport
 from SimpleXMLRPCServer import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler
-from subprocess import Popen, PIPE
-from getpass import getuser
-from fcntl import ioctl
-import xmlrpclib, socket, os, stat, termios, errno
 import SocketServer
+import xmlrpclib, socket, os, stat
 
 from xen.xend.XendLogging import log
 
-class SSHTransport(object):
-    def __init__(self, host, user, askpass=None):
-        self.host = host
-        self.user = user
-        self.askpass = askpass
-        self.ssh = None
-
-    def getssh(self):
-        if self.ssh == None:
-            if self.askpass:
-                f = open('/dev/tty', 'w')
-                try:
-                    os.environ['SSH_ASKPASS'] = self.askpass
-                    ioctl(f.fileno(), termios.TIOCNOTTY)
-                finally:
-                    f.close()
-
-            cmd = ['ssh', '%s@%s' % (self.user, self.host), 'xm serve']
-            try:
-                self.ssh = Popen(cmd, bufsize=0, stdin=PIPE, stdout=PIPE)
-            except OSError, (err, msg):
-                if err == errno.ENOENT:
-                    raise Fault(0, "ssh executable not found!")
-                raise
-        return self.ssh
-
-    def request(self, host, handler, request_body, verbose=0):
-        p, u = getparser()
-        ssh = self.getssh()
-        ssh.stdin.write("""POST /%s HTTP/1.1
-User-Agent: Xen
-Host: %s
-Content-Type: text/xml
-Content-Length: %d
-
-%s""" % (handler, host, len(request_body), request_body))
-        ssh.stdin.flush()
-
-        content_length = 0
-        line = ssh.stdout.readline()
-        if line.split()[1] != '200':
-            raise Fault(0, 'Server returned %s' % (' '.join(line[1:])))
-        
-        while line not in ['', '\r\n', '\n']:
-            if line.lower().startswith('content-length:'):
-                content_length = int(line[15:].strip())
-            line = ssh.stdout.readline()
-        content = ssh.stdout.read(content_length)
-        p.feed(content)
-        p.close()
-        return u.close()
+try:
+    import SSHTransport
+    ssh_enabled = True
+except ImportError:
+    # SSHTransport is disabled on Python <2.4, because it uses the subprocess
+    # package.
+    ssh_enabled = False
 
 
 # A new ServerProxy that also supports httpu urls.  An http URL comes in the
@@ -155,21 +108,12 @@ class ServerProxy(xmlrpclib.ServerProxy)
                 uri = 'http:' + rest
                 transport = UnixTransport()
             elif protocol == 'ssh':
-                if not rest.startswith('//'):
-                    raise ValueError("Invalid ssh URL '%s'" % uri)
-                rest = rest[2:]
-                user = getuser()
-                path = 'RPC2'
-                if rest.find('@') != -1:
-                    (user, rest) = rest.split('@', 1)
-                if rest.find('/') != -1:
-                    (host, rest) = rest.split('/', 1)
-                    if len(rest) > 0:
-                        path = rest
+                global ssh_enabled
+                if ssh_enabled:
+                    (transport, uri) = SSHTransport.getHTTPURI(uri)
                 else:
-                    host = rest
-                transport = SSHTransport(host, user)
-                uri = 'http://%s/%s' % (host, path)
+                    raise ValueError(
+                        "SSH transport not supported on Python <2.4.")
         xmlrpclib.ServerProxy.__init__(self, uri, transport, encoding,
                                        verbose, allow_none)
 
diff -r c5da6b25744a -r 7d6fe353cda4 tools/python/xen/xend/XendClient.py
--- a/tools/python/xen/xend/XendClient.py       Tue Jun 20 12:12:44 2006 +0100
+++ b/tools/python/xen/xend/XendClient.py       Tue Jun 20 13:32:21 2006 +0100
@@ -19,6 +19,7 @@
 
 from xen.util.xmlrpclib2 import ServerProxy
 import os
+import sys
 
 XML_RPC_SOCKET = "/var/run/xend/xmlrpc.sock"
 
@@ -30,4 +31,9 @@ if os.environ.has_key('XM_SERVER'):
 if os.environ.has_key('XM_SERVER'):
     uri = os.environ['XM_SERVER']
 
-server = ServerProxy(uri)
+try:
+    server = ServerProxy(uri)
+except ValueError, exn:
+    print >>sys.stderr, exn
+    sys.exit(1)
+
diff -r c5da6b25744a -r 7d6fe353cda4 tools/python/xen/util/SSHTransport.py
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/python/xen/util/SSHTransport.py     Tue Jun 20 13:32:21 2006 +0100
@@ -0,0 +1,102 @@
+#============================================================================
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of version 2.1 of the GNU Lesser General Public
+# License as published by the Free Software Foundation.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#============================================================================
+# Copyright (C) 2006 Anthony Liguori <aliguori@xxxxxxxxxx>
+# Copyright (C) 2006 XenSource Inc.
+#============================================================================
+
+"""
+XML-RPC SSH transport.
+"""
+
+from xmlrpclib import getparser, Fault
+from subprocess import Popen, PIPE
+from getpass import getuser
+from fcntl import ioctl
+import errno
+import os
+import termios
+
+
+def getHTTPURI(uri):
+    (protocol, rest) = uri.split(':', 1)
+    if not rest.startswith('//'):
+        raise ValueError("Invalid ssh URL '%s'" % uri)
+    rest = rest[2:]
+    user = getuser()
+    path = 'RPC2'
+    if rest.find('@') != -1:
+        (user, rest) = rest.split('@', 1)
+    if rest.find('/') != -1:
+        (host, rest) = rest.split('/', 1)
+        if len(rest) > 0:
+            path = rest
+    else:
+        host = rest
+    transport = SSHTransport(host, user)
+    uri = 'http://%s/%s' % (host, path)
+    return transport, uri
+
+
+class SSHTransport(object):
+    def __init__(self, host, user, askpass=None):
+        self.host = host
+        self.user = user
+        self.askpass = askpass
+        self.ssh = None
+
+    def getssh(self):
+        if self.ssh == None:
+            if self.askpass:
+                f = open('/dev/tty', 'w')
+                try:
+                    os.environ['SSH_ASKPASS'] = self.askpass
+                    ioctl(f.fileno(), termios.TIOCNOTTY)
+                finally:
+                    f.close()
+
+            cmd = ['ssh', '%s@%s' % (self.user, self.host), 'xm serve']
+            try:
+                self.ssh = Popen(cmd, bufsize=0, stdin=PIPE, stdout=PIPE)
+            except OSError, (err, msg):
+                if err == errno.ENOENT:
+                    raise Fault(0, "ssh executable not found!")
+                raise
+        return self.ssh
+
+    def request(self, host, handler, request_body, verbose=0):
+        p, u = getparser()
+        ssh = self.getssh()
+        ssh.stdin.write("""POST /%s HTTP/1.1
+User-Agent: Xen
+Host: %s
+Content-Type: text/xml
+Content-Length: %d
+
+%s""" % (handler, host, len(request_body), request_body))
+        ssh.stdin.flush()
+
+        content_length = 0
+        line = ssh.stdout.readline()
+        if line.split()[1] != '200':
+            raise Fault(0, 'Server returned %s' % (' '.join(line[1:])))
+        
+        while line not in ['', '\r\n', '\n']:
+            if line.lower().startswith('content-length:'):
+                content_length = int(line[15:].strip())
+            line = ssh.stdout.readline()
+        content = ssh.stdout.read(content_length)
+        p.feed(content)
+        p.close()
+        return u.close()

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] Move the SSHTransport class to its own file, so that we may disable SSH, Xen patchbot-unstable <=