def pseudo_url(self): if self._pseudo_url is None: entryid = HrGetOneProp(self.mapistore, PR_STORE_ENTRYID).Value self._pseudo_url = entryid[entryid.find(b'pseudo:'):-1] # XXX ECSERVER return self._pseudo_url
def __init__(self, options=None, config=None, sslkey_file=None, sslkey_pass=None, server_socket=None, auth_user=None, auth_pass=None, log=None, service=None, mapisession=None, parse_args=True): """ Create Server instance. By default, tries to connect to a storage server as configured in ``/etc/kopano/admin.cfg`` or at UNIX socket ``/var/run/kopano/server.sock`` Looks at command-line to see if another server address or other related options were given (such as -c, -s, -k, -p) :param server_socket: similar to 'server_socket' option in config file :param sslkey_file: similar to 'sslkey_file' option in config file :param sslkey_pass: similar to 'sslkey_pass' option in config file :param config: path of configuration file containing common server options, for example ``/etc/kopano/admin.cfg`` :param auth_user: username to user for user authentication :param auth_pass: password to use for user authentication :param log: logger object to receive useful (debug) information :param options: OptionParser instance to get settings from (see :func:`parser`) :param parse_args: set this True if cli arguments should be parsed """ self.options = options self.config = config self.sslkey_file = sslkey_file self.sslkey_pass = sslkey_pass self.server_socket = server_socket self.service = service self.log = log self.mapisession = mapisession self._store_cache = {} if not self.mapisession: # get cmd-line options if parse_args and not self.options: self.options, args = parser().parse_args() # determine config file if config: pass elif getattr(self.options, 'config_file', None): config_file = os.path.abspath(self.options.config_file) config = _config.Config(None, filename=self.options.config_file) else: config_file = '/etc/kopano/admin.cfg' try: open(config_file) # check if accessible config = _config.Config(None, filename=config_file) except IOError: pass self.config = config # get defaults if os.getenv("KOPANO_SOCKET"): # env variable used in testset self.server_socket = os.getenv("KOPANO_SOCKET") elif config: if not (server_socket or getattr(self.options, 'server_socket')): # XXX generalize self.server_socket = config.get('server_socket') self.sslkey_file = config.get('sslkey_file') self.sslkey_pass = config.get('sslkey_pass') self.server_socket = self.server_socket or "default:" # override with explicit or command-line args self.server_socket = server_socket or getattr(self.options, 'server_socket', None) or self.server_socket self.sslkey_file = sslkey_file or getattr(self.options, 'sslkey_file', None) or self.sslkey_file self.sslkey_pass = sslkey_pass or getattr(self.options, 'sslkey_pass', None) or self.sslkey_pass # make actual connection. in case of service, wait until this succeeds. self.auth_user = auth_user or getattr(self.options, 'auth_user', None) or 'SYSTEM' # XXX override with args self.auth_pass = auth_pass or getattr(self.options, 'auth_pass', None) or '' flags = EC_PROFILE_FLAGS_NO_NOTIFICATIONS # Username and password was supplied, so let us do verfication # (OpenECSession will not check password unless this parameter is provided) if self.auth_user and self.auth_pass: flags |= EC_PROFILE_FLAGS_NO_UID_AUTH while True: try: self.mapisession = OpenECSession(self.auth_user, self.auth_pass, self.server_socket, sslkey_file=self.sslkey_file, sslkey_pass=self.sslkey_pass, flags=flags) break except (MAPIErrorNetworkError, MAPIErrorDiskError): if service: service.log.warn("could not connect to server at '%s', retrying in 5 sec" % self.server_socket) time.sleep(5) else: raise Error("could not connect to server at '%s'" % self.server_socket) except MAPIErrorLogonFailed: raise LogonError('Could not logon to server: username or password incorrect') # start talking dirty self.mapistore = GetDefaultStore(self.mapisession) self.sa = self.mapistore.QueryInterface(IID_IECServiceAdmin) self.ems = self.mapistore.QueryInterface(IID_IExchangeManageStore) self._ab = None self._admin_store = None self._gab = None entryid = HrGetOneProp(self.mapistore, PR_STORE_ENTRYID).Value self.pseudo_url = entryid[entryid.find(b'pseudo:'):-1] # XXX ECSERVER self.name = self.pseudo_url[9:].decode('ascii') # XXX encoding, get this kind of stuff from pr_ec_statstable_servers..?