[X2Go-Commits] [x2gobroker] 03/03: agent.py: Allow providing a custom logger instance in all functions.

git-admin at x2go.org git-admin at x2go.org
Thu Mar 26 17:13:07 CET 2015


This is an automated email from the git hooks/post-receive script.

x2go pushed a commit to branch master
in repository x2gobroker.

commit 0ee5cc7aab1e417198ec952216bdbd990d57b35a
Author: Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
Date:   Thu Mar 26 17:08:53 2015 +0100

    agent.py: Allow providing a custom logger instance in all functions.
---
 debian/changelog    |    1 +
 x2gobroker/agent.py |  139 ++++++++++++++++++++++++++++++++++++++-------------
 2 files changed, 105 insertions(+), 35 deletions(-)

diff --git a/debian/changelog b/debian/changelog
index ead864e..baa97ea 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -244,6 +244,7 @@ x2gobroker (0.0.3.0-0x2go1) UNRELEASED; urgency=low
       between the different modes (http/ssh) of the x2gobroker application.
     - Pre-release pyflakes cleanup.
     - agent.py: Capture login failures in checkload() function.
+    - agent.py: Allow providing a custom logger instance in all functions.
   * debian/control:
     + Provide separate bin:package for SSH brokerage: x2gobroker-ssh.
     + Replace LDAP support with session brokerage support in LONG_DESCRIPTION.
diff --git a/x2gobroker/agent.py b/x2gobroker/agent.py
index 8869cf5..19b0c73 100644
--- a/x2gobroker/agent.py
+++ b/x2gobroker/agent.py
@@ -79,7 +79,7 @@ def has_remote_broker_agent_setup():
     return False
 
 
-def call_broker_agent(username, task, cmdline_args=[], remote_agent=None, **kwargs):
+def call_broker_agent(username, task, cmdline_args=[], remote_agent=None, logger=None, **kwargs):
     """\
     Launch X2Go Broker Agent and process its output.
 
@@ -91,18 +91,20 @@ def call_broker_agent(username, task, cmdline_args=[], remote_agent=None, **kwar
     @type cmdline_args: C{list}
     @param remote_agent: if not C{None} call a remote broker agent via SSH
     @type remoate_agent: C{dict}
+    @param logger: logger instance to report log messages to
+    @type logger: C{obj}
 
     @raise: L{X2GoBrokerAgentException}
 
     """
     if remote_agent in (u'LOCAL', None):
-        result = _call_local_broker_agent(username=username, task=task, cmdline_args=cmdline_args)
+        result = _call_local_broker_agent(username=username, task=task, cmdline_args=cmdline_args, logger=logger)
     else:
-        result = _call_remote_broker_agent(username=username, task=task, cmdline_args=cmdline_args, remote_agent=remote_agent)
+        result = _call_remote_broker_agent(username=username, task=task, cmdline_args=cmdline_args, remote_agent=remote_agent, logger=logger)
     return result
 
 
-def _call_local_broker_agent(username, task, cmdline_args=[]):
+def _call_local_broker_agent(username, task, cmdline_args=[], logger=None):
     """\
     Launch X2Go Broker Agent locally and process its output.
 
@@ -112,10 +114,15 @@ def _call_local_broker_agent(username, task, cmdline_args=[]):
     @type task: C{unicode}
     @param cmdline_args: additional command line parameters for the broker agent
     @type cmdline_args: C{list}
+    @param logger: logger instance to report log messages to
+    @type logger: C{obj}
 
     @raise: L{X2GoBrokerAgentException}
 
     """
+    if logger is None:
+        logger = logger_broker
+
     cmd_line = [
         '{x2gobroker_agent_binary}'.format(x2gobroker_agent_binary=x2gobroker.defaults.X2GOBROKER_AGENT_CMD),
         '{username}'.format(username=username),
@@ -125,7 +132,7 @@ def _call_local_broker_agent(username, task, cmdline_args=[]):
     for cmdline_arg in cmdline_args:
         cmd_line.append('{arg}'.format(arg=cmdline_arg))
 
-    logger_broker.info('Executing agent command locally: {cmd}'.format(cmd=" ".join(cmd_line)))
+    logger.info('Executing agent command locally: {cmd}'.format(cmd=" ".join(cmd_line)))
     result = ['FAILED']
     try:
         agent_process = subprocess.Popen(cmd_line,
@@ -140,14 +147,14 @@ def _call_local_broker_agent(username, task, cmdline_args=[]):
         pass
 
     if result:
-        logger_broker.info('Broker agent answered: {answer}'.format(answer="; ".join(result)))
+        logger.info('Broker agent answered: {answer}'.format(answer="; ".join(result)))
     if result[0].startswith('OK'):
         return (True, [ r for r in result[1:] if r ])
 
     raise x2gobroker.x2gobroker_exceptions.X2GoBrokerAgentException('Query to local X2Go Broker Agent failed with no response')
 
 
-def _call_remote_broker_agent(username, task, cmdline_args=[], remote_agent=None):
+def _call_remote_broker_agent(username, task, cmdline_args=[], remote_agent=None, logger=None):
     """\
     Launch remote X2Go Broker Agent via SSH and process its output.
 
@@ -159,10 +166,15 @@ def _call_remote_broker_agent(username, task, cmdline_args=[], remote_agent=None
     @type cmdline_args: C{list}
     @param remote_agent: information about the remote agent that is to be called
     @type remote_agent: C{dict}
+    @param logger: logger instance to report log messages to
+    @type logger: C{obj}
 
     @raise: L{X2GoBrokerAgentException}
 
     """
+    if logger is None:
+        logger = logger_broker
+
     if remote_agent is None:
         logger_error.error('With the SSH agent-query-mode a remote agent host (hostname, hostaddr, port) has to be specified!')
     elif not remote_agent.has_key('host_key_policy'):
@@ -207,15 +219,15 @@ def _call_remote_broker_agent(username, task, cmdline_args=[], remote_agent=None
             if ssh_transport and ssh_transport.is_authenticated():
                 cmd = ' '.join(cmd_line)
                 cmd = 'sh -c \'{cmd}\''.format(cmd=cmd)
-                logger_broker.info('Executing agent command on remote host {hostname} ({hostaddr}): {cmd}'.format(hostname=remote_hostname, hostaddr=remote_hostaddr, cmd=cmd))
+                logger.info('Executing agent command on remote host {hostname} ({hostaddr}): {cmd}'.format(hostname=remote_hostname, hostaddr=remote_hostaddr, cmd=cmd))
                 (stdin, stdout, stderr) = client.exec_command(cmd)
                 result = stdout.read().split('\n')
                 err = stderr.read().replace('\n', ' ')
                 if err:
-                    logger_broker.warning('Remote agent command (host: {hostname} ({hostaddr})) reported an error: {err}'.format(hostname=remote_hostname, hostaddr=remote_hostaddr, err=err))
+                    logger.warning('Remote agent command (host: {hostname} ({hostaddr})) reported an error: {err}'.format(hostname=remote_hostname, hostaddr=remote_hostaddr, err=err))
             client.close()
             if result:
-                logger_broker.info('Broker agent answered: {answer}'.format(answer="; ".join(result)))
+                logger.info('Broker agent answered: {answer}'.format(answer="; ".join(result)))
             if result and result[0].startswith('OK'):
                 return (True, [ r for r in result[1:] if r ])
             else:
@@ -228,28 +240,33 @@ def _call_remote_broker_agent(username, task, cmdline_args=[], remote_agent=None
         raise x2gobroker.x2gobroker_exceptions.X2GoBrokerAgentException('Could not ping remote X2Go Broker Agent host: {hostname} ({hostaddr})'.format(hostname=remote_hostname, hostaddr=remote_hostaddr))
 
 
-def ping(remote_agent=None, **kwargs):
+def ping(remote_agent=None, logger=None, **kwargs):
     """\
     Ping X2Go Broker Agent.
 
     @param remote_agent: information about the remote agent that is to be called
     @type remote_agent: C{dict}
+    @param logger: logger instance to report log messages to
+    @type logger: C{obj}
 
     @return: C{True} if broker agent responds
     @rtype: C{bool}
 
     """
+    if logger is None:
+        logger = logger_broker
+
     username='foo'
     if remote_agent is None:
-        return _call_local_broker_agent(username)[0]
+        return _call_local_broker_agent(username, logger=logger)[0]
     else:
         return remote_agent is not None and \
                (x2gobroker.utils.portscan(remote_agent['hostaddr'], remote_agent['port']) or x2gobroker.utils.portscan(remote_agent['hostname'], remote_agent['port'])) and \
-               _call_remote_broker_agent(username, task='ping', remote_agent=remote_agent)[0]
+               _call_remote_broker_agent(username, task='ping', remote_agent=remote_agent, logger=logger)[0]
 tasks['ping'] = ping
 
 
-def list_sessions(username, remote_agent=None, **kwargs):
+def list_sessions(username, remote_agent=None, logger=None, **kwargs):
     """\
     Query X2Go Broker Agent for a session list for a given username.
 
@@ -257,17 +274,22 @@ def list_sessions(username, remote_agent=None, **kwargs):
     @type username: C{unicode}
     @param remote_agent: information about the remote agent that is to be called
     @type remote_agent: C{dict}
+    @param logger: logger instance to report log messages to
+    @type logger: C{obj}
 
     @return: (<success>, <list-of-sessions>), a tuple with the <success> flag as first item
         and a session C{list} as second item
     @rtype: C{tuple}
 
     """
-    return call_broker_agent(username, task='listsessions', remote_agent=remote_agent, **kwargs)
+    if logger is None:
+        logger = logger_broker
+
+    return call_broker_agent(username, task='listsessions', remote_agent=remote_agent, logger=logger, **kwargs)
 tasks['listsessions'] = list_sessions
 
 
-def suspend_session(username, session_name, remote_agent=None, **kwargs):
+def suspend_session(username, session_name, remote_agent=None, logger=None, **kwargs):
     """\
     Trigger a session suspensions via the X2Go Broker Agent.
 
@@ -275,16 +297,21 @@ def suspend_session(username, session_name, remote_agent=None, **kwargs):
     @type username: C{unicode}
     @param remote_agent: information about the remote agent that is to be called
     @type remote_agent: C{dict}
+    @param logger: logger instance to report log messages to
+    @type logger: C{obj}
 
     @return: (<success>, ), a tuple with the <success> flag as first item
     @rtype: C{tuple}
 
     """
-    return call_broker_agent(username, task='suspendsession', cmdline_args=[session_name, ], remote_agent=remote_agent, **kwargs)
+    if logger is None:
+        logger = logger_broker
+
+    return call_broker_agent(username, task='suspendsession', cmdline_args=[session_name, ], remote_agent=remote_agent, logger=logger, **kwargs)
 tasks['suspendsession'] = suspend_session
 
 
-def terminate_session(username, session_name, remote_agent=None, **kwargs):
+def terminate_session(username, session_name, remote_agent=None, logger=None, **kwargs):
     """\
     Trigger a session termination via the X2Go Broker Agent.
 
@@ -292,16 +319,21 @@ def terminate_session(username, session_name, remote_agent=None, **kwargs):
     @type username: C{unicode}
     @param remote_agent: information about the remote agent that is to be called
     @type remote_agent: C{dict}
+    @param logger: logger instance to report log messages to
+    @type logger: C{obj}
 
     @return: (<success>, ), a tuple with the <success> flag as first item
     @rtype: C{tuple}
 
     """
-    return call_broker_agent(username, task='terminatesession', cmdline_args=[session_name, ], remote_agent=remote_agent, **kwargs)
+    if logger is None:
+        logger = logger_broker
+
+    return call_broker_agent(username, task='terminatesession', cmdline_args=[session_name, ], remote_agent=remote_agent, logger=logger, **kwargs)
 tasks['terminatesession'] = terminate_session
 
 
-def has_sessions(username, remote_agent=None, **kwargs):
+def has_sessions(username, remote_agent=None, logger=None, **kwargs):
     """\
     Query X2Go Broker Agent to detect running/suspended sessions on
     the remote X2Go Server (farm).
@@ -310,19 +342,24 @@ def has_sessions(username, remote_agent=None, **kwargs):
     @type username: C{unicode}
     @param remote_agent: information about the remote agent that is to be called
     @type remote_agent: C{dict}
+    @param logger: logger instance to report log messages to
+    @type logger: C{obj}
 
     @return: (<success>, <has-running-sessions>, <has-suspended-session>), a tuple of two Boolean values
     @rtype: C{tuple}
 
     """
-    _success, _session_list = list_sessions(username, remote_agent=remote_agent, **kwargs)
+    if logger is None:
+        logger = logger_broker
+
+    _success, _session_list = list_sessions(username, remote_agent=remote_agent, logger=logger, **kwargs)
     if type(_session_list) is types.ListType:
         return (_success, [ s.split('|')[3] for s in _session_list if s.split('|')[4] == 'R' ], [ s.split('|')[3] for s in _session_list if s.split('|')[4] == 'S' ])
     else:
         return (False, [], [])
 tasks['has-sessions'] = has_sessions
 
-def find_busy_servers(username, remote_agent=None, **kwargs):
+def find_busy_servers(username, remote_agent=None, logger=None, **kwargs):
     """\
     Query X2Go Broker Agent for a list of  servers with running
     and/or suspended sessions and a percentage that tells about
@@ -334,13 +371,18 @@ def find_busy_servers(username, remote_agent=None, **kwargs):
     @type username: C{unicode}
     @param remote_agent: information about the remote agent that is to be called
     @type remote_agent: C{dict}
+    @param logger: logger instance to report log messages to
+    @type logger: C{obj}
 
     @return: (<success>, <server-usage>), a tuple with the <success> flag as first item
         and a dict reflecting the relative server usage
     @rtype: C{tuple}
 
     """
-    _success, server_list = call_broker_agent(username, task='findbusyservers', remote_agent=remote_agent, **kwargs)
+    if logger is None:
+        logger = logger_broker
+
+    _success, server_list = call_broker_agent(username, task='findbusyservers', remote_agent=remote_agent, logger=logger, **kwargs)
 
     server_usage = {}
     if server_list and type(server_list) is types.ListType:
@@ -355,21 +397,26 @@ def find_busy_servers(username, remote_agent=None, **kwargs):
 tasks['findbusyservers'] = find_busy_servers
 
 
-def checkload(remote_agent=None, **kwargs):
+def checkload(remote_agent=None, logger=None, **kwargs):
     """\
     Query X2Go Broker Agent for a summary of system load specific
     parameters.
 
     @param remote_agent: information about the remote agent that is to be called
     @type remote_agent: C{dict}
+    @param logger: logger instance to report log messages to
+    @type logger: C{obj}
 
     @return: (<success>, <load-factor>), a tuple with the <success> flag as first item
         and the queried server's load factor as second item
     @rtype: C{tuple}
 
     """
+    if logger is None:
+        logger = logger_broker
+
     try:
-        _success, _load_params = call_broker_agent('foo', task='checkload', remote_agent=remote_agent, **kwargs)
+        _success, _load_params = call_broker_agent('foo', task='checkload', remote_agent=remote_agent, logger=logger, **kwargs)
     except x2gobroker.x2gobroker_exceptions.X2GoBrokerAgentException, e:
         logger.error('querying remote agent on host {hostname} failed: {errmsg}'.format(hostname=remote_agent[u'hostname'], errmsg=str(e)))
         return None
@@ -389,7 +436,7 @@ def checkload(remote_agent=None, **kwargs):
     return load_factor
 tasks['checkload'] = checkload
 
-def add_authorized_key(username, pubkey_hash, authorized_keys_file='%h/.x2go/authorized_keys', remote_agent=None, **kwargs):
+def add_authorized_key(username, pubkey_hash, authorized_keys_file='%h/.x2go/authorized_keys', remote_agent=None, logger=None, **kwargs):
     """\
     Add a public key hash to the user's authorized_keys file.
 
@@ -401,16 +448,21 @@ def add_authorized_key(username, pubkey_hash, authorized_keys_file='%h/.x2go/aut
     @type authorized_keys_file: C{unicode}
     @param remote_agent: information about the remote agent that is to be called
     @type remote_agent: C{dict}
+    @param logger: logger instance to report log messages to
+    @type logger: C{obj}
 
     @return: (<success>, ), a tuple with the <success> flag as first item
     @rtype: C{tuple}
 
     """
-    return call_broker_agent(username, task='addauthkey', cmdline_args=[pubkey_hash, authorized_keys_file, ], remote_agent=remote_agent, **kwargs)
+    if logger is None:
+        logger = logger_broker
+
+    return call_broker_agent(username, task='addauthkey', cmdline_args=[pubkey_hash, authorized_keys_file, ], remote_agent=remote_agent, logger=logger, **kwargs)
 tasks['addauthkey'] = add_authorized_key
 
 
-def delete_authorized_key(username, pubkey_hash, authorized_keys_file='%h/.x2go/authorized_keys', remote_agent=None, delay_deletion=0, **kwargs):
+def delete_authorized_key(username, pubkey_hash, authorized_keys_file='%h/.x2go/authorized_keys', remote_agent=None, delay_deletion=0, logger=None, **kwargs):
     """\
     Remove a public key hash from the user's authorized_keys file.
 
@@ -422,11 +474,16 @@ def delete_authorized_key(username, pubkey_hash, authorized_keys_file='%h/.x2go/
     @type authorized_keys_file: C{unicode}
     @param remote_agent: information about the remote agent that is to be called
     @type remote_agent: C{dict}
+    @param logger: logger instance to report log messages to
+    @type logger: C{obj}
 
     @return: (<success>, ), a tuple with the <success> flag as first item
     @rtype: C{tuple}
 
     """
+    if logger is None:
+        logger = logger_broker
+
     # this is for the logger output
     if remote_agent in ('LOCAL', None):
         _hostname = _hostaddr = 'LOCAL'
@@ -436,13 +493,13 @@ def delete_authorized_key(username, pubkey_hash, authorized_keys_file='%h/.x2go/
 
     if delay_deletion > 0:
         delayed_execution(delete_authorized_key, delay=delay_deletion, username=username, pubkey_hash=pubkey_hash, authorized_keys_file=authorized_keys_file, remote_agent=remote_agent, )
-        logger_broker.debug('Scheduled deletion of authorized key in {delay}s: user={user}, hostname={hostname}, hostaddr={hostaddr}'.format(delay=delay_deletion, user=username, hostname=_hostname, hostaddr=_hostaddr))
+        logger.debug('Scheduled deletion of authorized key in {delay}s: user={user}, hostname={hostname}, hostaddr={hostaddr}'.format(delay=delay_deletion, user=username, hostname=_hostname, hostaddr=_hostaddr))
     else:
-        return call_broker_agent(username, task='delauthkey', cmdline_args=[pubkey_hash, authorized_keys_file, ], remote_agent=remote_agent, **kwargs)
+        return call_broker_agent(username, task='delauthkey', cmdline_args=[pubkey_hash, authorized_keys_file, ], remote_agent=remote_agent, logger=logger, **kwargs)
 tasks['delauthkey'] = delete_authorized_key
 
 
-def get_servers(username, remote_agent=None, **kwargs):
+def get_servers(username, remote_agent=None, logger=None, **kwargs):
     """\
     Query X2Go Broker Agent for the list of currently used servers.
 
@@ -452,17 +509,22 @@ def get_servers(username, remote_agent=None, **kwargs):
     @type username: C{unicode}
     @param remote_agent: information about the remote agent that is to be called
     @type remote_agent: C{dict}
+    @param logger: logger instance to report log messages to
+    @type logger: C{obj}
 
     @return: (<success>, <server-list>), a tuple with the <success> flag as first item
         and the list of used X2Go Servers as second item
     @rtype: C{tuple}
 
     """
-    return call_broker_agent(username, task='getservers', remote_agent=remote_agent, **kwargs)
+    if logger is None:
+        logger = logger_broker
+
+    return call_broker_agent(username, task='getservers', remote_agent=remote_agent, logger=logger, **kwargs)
 tasks['getservers'] = get_servers
 
 
-def tasks_available(username, remote_agent=None, **kwargs):
+def tasks_available(username, remote_agent=None, logger=None, **kwargs):
     """\
     Query X2Go Broker Agent for the list of available tasks.
 
@@ -473,17 +535,22 @@ def tasks_available(username, remote_agent=None, **kwargs):
     @type username: C{unicode}
     @param remote_agent: information about the remote agent that is to be called
     @type remote_agent: C{dict}
+    @param logger: logger instance to report log messages to
+    @type logger: C{obj}
 
     @return: (<success>, <server-list>), a tuple with the <success> flag as first item
         and a list of available broker agent tasks as second item
     @rtype: C{tuple}
 
     """
-    return call_broker_agent(username, task='availabletasks', remote_agent=remote_agent, **kwargs)
+    if logger is None:
+        logger = logger_broker
+
+    return call_broker_agent(username, task='availabletasks', remote_agent=remote_agent, logger=logger, **kwargs)
 tasks['availabletasks'] = tasks_available
 
 
-def genkeypair(local_username, client_address, key_type='RSA'):
+def genkeypair(local_username, client_address, key_type='RSA', logger=None):
     """\
     Generate an SSH pub/priv key pair without writing the private key to file.
 
@@ -493,6 +560,8 @@ def genkeypair(local_username, client_address, key_type='RSA'):
     @type client_address: C{unicode}
     @param key_type: either of: RSA, DSA
     @type key_type: C{unicode}
+    @param logger: logger instance to report log messages to
+    @type logger: C{obj}
 
     @return: two-item tuple: (<pubkey>, <privkey>)
     @rtype: C{tuple}

--
Alioth's /srv/git/code.x2go.org/x2gobroker.git//..//_hooks_/post-receive-email on /srv/git/code.x2go.org/x2gobroker.git


More information about the x2go-commits mailing list