All of lore.kernel.org
 help / color / mirror / Atom feed
From: Anthony Liguori <aliguori@us.ibm.com>
To: xen-devel <xen-devel@lists.xensource.com>
Cc: Ewan Mellor <ewan@xensource.com>
Subject: [PATCH 2/3] Add SSH over XML-RPC support to xmlrpclib2.ServerProxy
Date: Sat, 10 Jun 2006 14:38:17 -0500	[thread overview]
Message-ID: <448B1FA9.4090507@us.ibm.com> (raw)
In-Reply-To: <448B1EF2.5050801@us.ibm.com>

[-- Attachment #1: Type: text/plain, Size: 81 bytes --]

This is the client-side support for SSH over XML-RPC.

Regards,

Anthony Liguori

[-- Attachment #2: sshtransport.diff --]
[-- Type: text/plain, Size: 4195 bytes --]

# HG changeset patch
# User anthony@rhesis.austin.ibm.com
# Node ID 03bbc156d3e8fb01eee2af990176bb64e012c4e1
# Parent  cf8e253723daf8b95b54b24f6988a8e74c6cc0aa
Add support to our ServerProxy class for XML-RPC over SSH.

This adds a new XML-RPC transport (SSHTransport) and a new supported
protocol to the ServerProxy class.  This protocol is accessed with a URI of
the following form:

  ssh://[user@]hostname[/path]

While xm makes too many assumptions about being on a local system for all
commands to work when a remote URI is used, many of the commands do work.

This is mostly useful to people who are using xmlrpclib2 to write Xen
management tools.  It may prove more useful in the future to support
authenticated migration though.

Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>

diff -r cf8e253723da -r 03bbc156d3e8 tools/python/xen/util/xmlrpclib2.py
--- a/tools/python/xen/util/xmlrpclib2.py	Sat Jun 10 19:11:55 2006
+++ b/tools/python/xen/util/xmlrpclib2.py	Sat Jun 10 19:16:33 2006
@@ -24,13 +24,51 @@
 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
 import SocketServer
 
-import xen.xend.XendClient
 from xen.xend.XendLogging import log
+
+class SSHTransport(object):
+    def __init__(self, host, user, askpass=None):
+        if askpass:
+            f = open('/dev/tty', 'w')
+            os.environ['SSH_ASKPASS'] = askpass
+            ioctl(f.fileno(), termios.TIOCNOTTY)
+            f.close()
+            
+        self.ssh = Popen(['ssh', '%s@%s' % (user, host), 'xm serve'],
+                         bufsize=0, stdin=PIPE, stdout=PIPE)
+
+    def request(self, host, handler, request_body, verbose=0):
+        p, u = getparser()
+        self.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))
+        self.ssh.stdin.flush()
+
+        content_length = 0
+        line = self.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 = self.ssh.stdout.readline()
+        content = self.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 +138,22 @@
             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
+                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 +201,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)))

[-- Attachment #3: Type: text/plain, Size: 138 bytes --]

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

  parent reply	other threads:[~2006-06-10 19:38 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-06-10 19:35 [PATCH 0/3] Add support for XML-RPC over SSH Anthony Liguori
2006-06-10 19:37 ` [PATCH 1/3] Add an xm serve command Anthony Liguori
2006-06-10 19:38 ` Anthony Liguori [this message]
2006-06-10 19:39 ` [PATCH 3/3] Let xm user choose XML-RPC URI Anthony Liguori

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=448B1FA9.4090507@us.ibm.com \
    --to=aliguori@us.ibm.com \
    --cc=ewan@xensource.com \
    --cc=xen-devel@lists.xensource.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.