Package flumotion :: Package common :: Module connection
[hide private]

Source Code for Module flumotion.common.connection

  1  # Flumotion - a streaming media server 
  2  # Copyright (C) 2004,2005,2006,2007 Fluendo, S.L. (www.fluendo.com). 
  3  # All rights reserved. 
  4   
  5  # This file may be distributed and/or modified under the terms of 
  6  # the GNU General Public License version 2 as published by 
  7  # the Free Software Foundation. 
  8  # This file is distributed without any warranty; without even the implied 
  9  # warranty of merchantability or fitness for a particular purpose. 
 10  # See "LICENSE.GPL" in the source distribution for more information. 
 11   
 12  # Licensees having purchased or holding a valid Flumotion Advanced 
 13  # Streaming Server license may use this file in accordance with the 
 14  # Flumotion Advanced Streaming Server Commercial License Agreement. 
 15  # See "LICENSE.Flumotion" in the source distribution for more information. 
 16   
 17  # Headers in this file shall remain intact. 
 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   
32 -class PBConnectionInfo(pb.Copyable, pb.RemoteCopy):
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
44 - def __str__(self):
45 # have to use getattr in the case that the authenticator was 46 # transferred over the wire, because the remote reference is not 47 # an authenticator 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]+))?$')
59 -def parsePBConnectionInfo(string, username='user', password='test', 60 port=7531, use_ssl=True):
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