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

xen-devel

[Top] [All Lists]

[Xen-devel] [PATCH 2/4] Client support for XML-RPC over SSH

To: xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH 2/4] Client support for XML-RPC over SSH
From: Anthony Liguori <aliguori@xxxxxxxxxx>
Date: 2006年6月14日 14:33:52 -0500
Cc: Ewan Mellor <ewan@xxxxxxxxxxxxx>
Delivery-date: 2006年6月14日 12:34:38 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
In-reply-to: <44906357.90107@xxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <44906357.90107@xxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Thunderbird 1.5.0.4 (X11/20060612)
This incorporates Ewan's error reporting suggestion and uses lazy evaluation to initialize the ssh connection.
Regards,
Anthony Liguori
# HG changeset patch
# User root@xxxxxxxxxxxxxxxxxxxxx
# Node ID ee7eb0713498591c50f43cabfcf48608b0b7aa32
# Parent 84596b81600e09c83e85eb8c7517747d57d1da98
This patch adds client side support for XML-RPC over ssh. It differs from 
the previous submission in that it now uses lazy evaluation to connect
to the remote server and provides more user friendly error messages if ssh
is not available.
Signed-off-by: Anthony Liguori
diff -r 84596b81600e -r ee7eb0713498 tools/python/xen/util/xmlrpclib2.py
--- a/tools/python/xen/util/xmlrpclib2.py Wed Jun 14 17:09:48 2006
+++ b/tools/python/xen/util/xmlrpclib2.py Wed Jun 14 19:14:27 2006
@@ -24,13 +24,67 @@
 import types
 
 from httplib import HTTPConnection, HTTP
-from xmlrpclib import Transport
+from xmlrpclib import Transport, getparser, Fault
 from SimpleXMLRPCServer import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler
-import xmlrpclib, socket, os, stat
+from subprocess import Popen, PIPE
+from getpass import getuser
+from fcntl import ioctl
+import xmlrpclib, socket, os, stat, termios, errno
 import SocketServer
 
-import xen.xend.XendClient
 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()
 
 
 # A new ServerProxy that also supports httpu urls. An http URL comes in the
@@ -100,9 +154,24 @@
 if protocol == 'httpu':
 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
+ else:
+ host = rest
+ transport = SSHTransport(host, user)
+ uri = 'http://%s/%s' % (host, path)
 xmlrpclib.ServerProxy.__init__(self, uri, transport, encoding,
 verbose, allow_none)
-
 
 def __request(self, methodname, params):
 response = xmlrpclib.ServerProxy.__request(self, methodname, params)
@@ -150,6 +219,7 @@
 except xmlrpclib.Fault, fault:
 response = xmlrpclib.dumps(fault)
 except Exception, exn:
+ import xen.xend.XendClient
 log.exception(exn)
 response = xmlrpclib.dumps(
 xmlrpclib.Fault(xen.xend.XendClient.ERROR_INTERNAL, str(exn)))
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
<Prev in Thread] Current Thread [Next in Thread>
Previous by Date: [Xen-devel] [PATCH 2/4] Add support for an xm serve command , Anthony Liguori
Next by Date: [Xen-devel] [PATCH 4/4] Add support for XM_SERVER variable to choose XML-RPC URI , Anthony Liguori
Previous by Thread: [Xen-devel] [PATCH 2/4] Add support for an xm serve command , Anthony Liguori
Next by Thread: [Xen-devel] [PATCH 4/4] Add support for XM_SERVER variable to choose XML-RPC URI , Anthony Liguori
Indexes: [Date] [Thread] [Top] [All Lists]

Copyright ©, Citrix Systems Inc. All rights reserved. Legal and Privacy
Citrix This site is hosted by Citrix

AltStyle によって変換されたページ (->オリジナル) /