-"""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
return spec
sk = None
try:
- if "/" in spec:
+ if ":" in spec:
+ p = spec.rindex(":")
+ first, second = spec[:p], spec[p + 1:]
+ if "/" in second:
+ 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
"""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 = ""
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."""
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")
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
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."""
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 are 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: