1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 """helpers for dealing with Twisted PB connections.
20 """
21
22 import re
23
24 from twisted.spread import pb
25
26 from flumotion.common import common
27 from flumotion.twisted import pb as fpb
28
29 __version__ = "$Rev: 6968 $"
30
31
33 """
34 I hold information on how to connect to a PB server somewhere. I can
35 be transferred over the wire.
36 """
37
38 - def __init__(self, host, port, use_ssl, authenticator):
39 self.host = host
40 self.port = port
41 self.use_ssl = use_ssl
42 self.authenticator = authenticator
43
45
46
47
48 if (self.authenticator
49 and getattr(self.authenticator, 'username', None)):
50 return '%s@%s:%d' % (self.authenticator.username,
51 self.host, self.port)
52 else:
53 return '%s:%d' % (self.host, self.port)
54
55 pb.setUnjellyableForClass(PBConnectionInfo, PBConnectionInfo)
56
57
58 _pat = re.compile('^(([^:@]*)(:([^:@]+))?@)?([^:@]+)(:([0-9]+))?$')
61 """
62 Parse a string representation of a PB connection into a
63 PBConnectionInfo object.
64
65 The expected format is [user[:pass]@]host[:port]. Only the host is
66 mandatory. The default values for username, password, and port will
67 be taken from the optional username, password and port arguments.
68
69 @param string: A string describing the PB connection.
70 @type string: str
71 @param username: Default username, or 'user' if not given.
72 @type username: str
73 @param password: Default password, or 'test' if not given.
74 @type password: str
75 @param port: Default port, or 7531 if not given.
76 @type port: int
77 @param use_ssl: Whether to use SSL, or True if not given. Note that
78 there is no syntax in the connection string for specifying
79 whether or not to use SSL; if you want to control this you
80 will have to provide another method.
81 @type use_ssl: bool
82
83 @rtype: L{PBConnectionInfo}
84 """
85 auth = fpb.Authenticator(username=username, password=password)
86 ret = PBConnectionInfo(None, port, use_ssl, auth)
87
88 matched = _pat.search(string)
89 if not matched:
90 raise TypeError('Invalid connection string: %s '
91 '(looking for [user[:pass]@]host[/ssl|/tcp][:port])'
92 % string)
93
94 groups = matched.groups()
95 for o, k, i, f in ((auth, 'username', 1, str),
96 (auth, 'password', 3, str),
97 (ret, 'host', 4, str),
98 (ret, 'port', 6, int)):
99 if groups[i]:
100 setattr(o, k, f(groups[i]))
101 return ret
102