This is an automated email from the git hooks/post-receive script. x2go pushed a change to branch master in repository x2gobroker. from 17dbffb Makefile: Add installation rules for x2gobroker-loadchecker. new 6f1fe3c fix changelog new c4d25bb agent.py: Capture login failures in checkload() function. new 0ee5cc7 agent.py: Allow providing a custom logger instance in all functions. The 3 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Summary of changes: debian/changelog | 26 +++++----- x2gobroker/agent.py | 143 ++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 122 insertions(+), 47 deletions(-) -- Alioth's /srv/git/code.x2go.org/x2gobroker.git//..//_hooks_/post-receive-email on /srv/git/code.x2go.org/x2gobroker.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository x2gobroker. commit 6f1fe3c31eacb17526840e1ce9dca4804bbf58c5 Author: Mike Gabriel <mike.gabriel@das-netzwerkteam.de> Date: Thu Mar 26 16:55:15 2015 +0100 fix changelog --- debian/changelog | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/debian/changelog b/debian/changelog index 04403a3..4ed820c 100644 --- a/debian/changelog +++ b/debian/changelog @@ -231,6 +231,18 @@ x2gobroker (0.0.3.0-0x2go1) UNRELEASED; urgency=low - Provide desktop sharing (shadow session) example in x2gobroker-sessionprofiles.conf. - Makefile: Add installation rules for x2gobroker-loadchecker. + - x2gobroker.1: Since systemd there are not only init scripts. Rephrasing + man page. + - New feature: x2gobroker-loadchecker daemon. + - x2gobroker-agent.pl: Use var name server_usage instead of server_load. + Reflects better what that var denotes. + - agent.py: Completion of several __doc__ strings (missing @return:, + @rtype: fields). + - X2GoBroker.check_for_sessions(): Fix check for shadow / non-shadow + sessions. + - x2gobroker.1: Mention x2gobroker-ssh in its man page, differentiate + between the different modes (http/ssh) of the x2gobroker application. + - Pre-release pyflakes cleanup. * debian/control: + Provide separate bin:package for SSH brokerage: x2gobroker-ssh. + Replace LDAP support with session brokerage support in LONG_DESCRIPTION. @@ -243,18 +255,6 @@ x2gobroker (0.0.3.0-0x2go1) UNRELEASED; urgency=low executable's name. + Bump Standards: to 3.9.6. No changes needed. + Add to D (python-x2gobroker): python-urllib3. - + x2gobroker.1: Since systemd there are not only init scripts. Rephrasing - man page. - + New feature: x2gobroker-loadchecker daemon. - + x2gobroker-agent.pl: Use var name server_usage instead of server_load. - Reflects better what that var denotes. - + agent.py: Completion of several __doc__ strings (missing @return:, - @rtype: fields). - + X2GoBroker.check_for_sessions(): Fix check for shadow / non-shadow - sessions. - + x2gobroker.1: Mention x2gobroker-ssh in its man page, differentiate - between the different modes (http/ssh) of the x2gobroker application. - + Pre-release pyflakes cleanup. * debian/x2gobroker-agent.dirs: + Provide empty log file directory. * x2gobroker-wsgi postinst/postrm: -- Alioth's /srv/git/code.x2go.org/x2gobroker.git//..//_hooks_/post-receive-email on /srv/git/code.x2go.org/x2gobroker.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository x2gobroker. commit c4d25bbc8cd61ef1875b78a8861ed04f9cf0d2d2 Author: Mike Gabriel <mike.gabriel@das-netzwerkteam.de> Date: Thu Mar 26 17:08:25 2015 +0100 agent.py: Capture login failures in checkload() function. --- debian/changelog | 1 + x2gobroker/agent.py | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 4ed820c..ead864e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -243,6 +243,7 @@ x2gobroker (0.0.3.0-0x2go1) UNRELEASED; urgency=low - x2gobroker.1: Mention x2gobroker-ssh in its man page, differentiate between the different modes (http/ssh) of the x2gobroker application. - Pre-release pyflakes cleanup. + - agent.py: Capture login failures in checkload() function. * 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 566a8c0..8869cf5 100644 --- a/x2gobroker/agent.py +++ b/x2gobroker/agent.py @@ -368,7 +368,11 @@ def checkload(remote_agent=None, **kwargs): @rtype: C{tuple} """ - _success, _load_params = call_broker_agent('foo', task='checkload', remote_agent=remote_agent, **kwargs) + try: + _success, _load_params = call_broker_agent('foo', task='checkload', remote_agent=remote_agent, **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 p = {} for _param in _load_params: -- Alioth's /srv/git/code.x2go.org/x2gobroker.git//..//_hooks_/post-receive-email on /srv/git/code.x2go.org/x2gobroker.git
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@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