X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=pdm%2Fcli.py;h=7cfa2635fd5d60a369f44bd9bf764fa14a8f8b5c;hb=3e02e6b54c766318d60405e16c556d8fcaff4143;hp=9924d40da79064c546fe0ecac2be03e570f167c2;hpb=144c745cd600fc7c050f5426fe438430885ef5b8;p=pdm.git diff --git a/pdm/cli.py b/pdm/cli.py index 9924d40..7cfa263 100644 --- a/pdm/cli.py +++ b/pdm/cli.py @@ -1,7 +1,9 @@ -"""Management for daemon processes +"""Python Daemon Management -- Client functions -This module provides some client support for the daemon management -provided in the pdm.srv module. +This module implements the client part of the PDM protocols. The +primary objects of interest are the replclient and perfclient classes, +which implement support for their respective protocols. See their +documentation for details. """ import socket, pickle, struct, select, threading @@ -17,16 +19,21 @@ def resolve(spec): return spec sk = None try: - if "/" in spec: + if ":" in spec: + p = spec.rindex(":") + first, second = spec[:p], spec[p + 1:] + if "/" in second: + from . import sshsock + sk = sshsock.sshsocket(first, second) + else: + sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sk.connect((first, second)) + elif "/" in spec: sk = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) sk.connect(spec) elif spec.isdigit(): sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sk.connect(("localhost", int(spec))) - elif ":" in spec: - sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - p = spec.rindex(":") - sk.connect((spec[:p], int(spec[p + 1:]))) else: raise Exception("Unknown target specification %r" % spec) rv = sk @@ -49,12 +56,12 @@ class client(object): """Create a client object connected to the specified server. `sk' can either be a socket object, which is used as it is, or a string specification very similar to the - specification for pdm.srv.listen, so see its documentation for - details. The differences are only that this function does not - take arguments specific to socket creation, like the mode and - group arguments for Unix sockets. If `proto' is given, that - subprotocol will negotiated with the server (by calling the - select() method). + specification for L{pdm.srv.listen}, so see its documentation + for details. The differences are only that this function does + not take arguments specific to socket creation, like the mode + and group arguments for Unix sockets. If `proto' is given, + that subprotocol will negotiated with the server (by calling + the select() method). """ self.sk = resolve(sk) self.buf = b"" @@ -106,8 +113,8 @@ class client(object): class replclient(client): """REPL protocol client - Implements the client side of the REPL protocol; see pdm.srv.repl - for details on the protocol and its functionality. + Implements the client side of the REPL protocol; see + L{pdm.srv.repl} for details on the protocol and its functionality. """ def __init__(self, sk): """Create a connected client as documented in the `client' class.""" @@ -115,8 +122,8 @@ class replclient(client): def run(self, code): """Run a single block of Python code on the server. Returns - the output of the command (as documented in pdm.srv.repl) as a - string. + the output of the command (as documented in L{pdm.srv.repl}) + as a string. """ while True: ncode = code.replace("\n\n", "\n") @@ -207,8 +214,8 @@ class perfproxy(object): class perfclient(client): """PERF protocol client - Implements the client side of the PERF protocol; see pdm.srv.perf - for details on the protocol and its functionality. + Implements the client side of the PERF protocol; see + L{pdm.srv.perf} for details on the protocol and its functionality. This client class implements functions for finding PERF objects on the server, and returns, for each server-side object looked up, a @@ -218,8 +225,8 @@ class perfclient(client): they implement a close() method for that purpose, and can also be used in `with' statements. - See pdm.srv.perf for details on the various PERF interfaces that - the proxy objects might implement. + See L{pdm.srv.perf} for details on the various PERF interfaces + that the proxy objects might implement. """ def __init__(self, sk): """Create a connected client as documented in the `client' class.""" @@ -315,6 +322,11 @@ class perfclient(client): of the slash. For instance, find("pdm.perf.sysres/cputime") will return the built-in attribute for reading the CPU time used by the server process. + + The proxy objects returned by this function are cached and the + same object is returned the next time the same name is + requested, which means that they are kept live until the + client connection is closed. """ ret = self.names.get(name) if ret is None: