# 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
|