This is an automated email from the git hooks/post-receive script. x2go pushed a change to branch master in repository x2gobroker. from a9bc46b Fix remote agent detection if one ore more X2Go Servers are offline and hostname does not match host address (plus unit test). new c4c77cb Allow remote agent calls via hostname or host address when using the format "<hostname> (<hostaddr>)" in the session profile. This can be useful if the <hostname> is a valid address on the local network (broker <-> <server> communication), but the host address is valid for clients (client <-> server communication). The 1 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 | 5 +++++ x2gobroker/agent.py | 33 ++++++++++++++++++++------------- x2gobroker/brokers/base_broker.py | 6 +++--- x2gobroker/tests/test_broker_agent.py | 21 ++++++++++++++++++++- 4 files changed, 48 insertions(+), 17 deletions(-) -- Alioth's /srv/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 c4c77cbeb42ffd47f6b499ca615b528b0ba385de Author: Mike Gabriel <mike.gabriel@das-netzwerkteam.de> Date: Wed Dec 10 15:41:39 2014 +0100 Allow remote agent calls via hostname or host address when using the format "<hostname> (<hostaddr>)" in the session profile. This can be useful if the <hostname> is a valid address on the local network (broker <-> <server> communication), but the host address is valid for clients (client <-> server communication). --- debian/changelog | 5 +++++ x2gobroker/agent.py | 33 ++++++++++++++++++++------------- x2gobroker/brokers/base_broker.py | 6 +++--- x2gobroker/tests/test_broker_agent.py | 21 ++++++++++++++++++++- 4 files changed, 48 insertions(+), 17 deletions(-) diff --git a/debian/changelog b/debian/changelog index ad3eb5e..935041e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -217,6 +217,11 @@ x2gobroker (0.0.3.0-0x2go1) UNRELEASED; urgency=low left bogus in the session DB (plus unit tests). - Fix remote agent detection if one ore more X2Go Servers are offline and hostname does not match host address (plus unit test). + - Allow remote agent calls via hostname or host address when using the format + "<hostname> (<hostaddr>)" in the session profile. This can be useful + if the <hostname> is a valid address on the local network (broker <-> + <server> communication), but the host address is valid for clients + (client <-> server communication). * 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 56c66fd..43d8b69 100644 --- a/x2gobroker/agent.py +++ b/x2gobroker/agent.py @@ -174,17 +174,24 @@ def _call_remote_broker_agent(username, task, cmdline_args=[], remote_agent=None else: remote_port = 22 - if x2gobroker.utils.portscan(remote_hostaddr, remote_port): - cmd_line = [ - '{x2gobroker_agent_binary}'.format(x2gobroker_agent_binary=x2gobroker.defaults.X2GOBROKER_AGENT_CMD), - '{username}'.format(username=username), - '{task}'.format(task=task), - ] + cmd_line = [ + '{x2gobroker_agent_binary}'.format(x2gobroker_agent_binary=x2gobroker.defaults.X2GOBROKER_AGENT_CMD), + '{username}'.format(username=username), + '{task}'.format(task=task), + ] + for cmdline_arg in cmdline_args: + cmd_line.append('"{arg}"'.format(arg=cmdline_arg)) + + remote_username = x2gobroker.defaults.X2GOBROKER_AGENT_USER - for cmdline_arg in cmdline_args: - cmd_line.append('"{arg}"'.format(arg=cmdline_arg)) + # check how we shall connect to the remote agent's SSH host... + _remote_sshserver = None + if x2gobroker.utils.portscan(remote_hostname, remote_port): + _remote_sshserver = remote_hostname + elif x2gobroker.utils.portscan(remote_hostaddr, remote_port): + _remote_sshserver = remote_hostaddr - remote_username = x2gobroker.defaults.X2GOBROKER_AGENT_USER + if _remote_sshserver: # now, connect and use paramiko Client to negotiate SSH2 across the connection try: client = paramiko.SSHClient() @@ -192,19 +199,19 @@ def _call_remote_broker_agent(username, task, cmdline_args=[], remote_agent=None if os.path.exists(os.path.expanduser("~/.ssh/known_hosts")): client.load_host_keys(os.path.expanduser("~/.ssh/known_hosts")) client.set_missing_host_key_policy(remote_agent['host_key_policy']) - client.connect(remote_hostaddr, remote_port, remote_username, look_for_keys=True, allow_agent=True) + client.connect(_remote_sshserver, remote_port, remote_username, look_for_keys=True, allow_agent=True) result = [] ssh_transport = client.get_transport() 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 ({remote_agent}): {cmd}'.format(remote_agent=remote_agent['hostname'], cmd=cmd)) + logger_broker.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: {remote_agent}) reported an error: {err}'.format(remote_agent=remote_agent['hostname'], err=err)) + logger_broker.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))) @@ -233,7 +240,7 @@ def ping(remote_agent=None, **kwargs): return _call_local_broker_agent(username)[0] else: return remote_agent is not None and \ - (x2gobroker.utils.portscan(remote_agent['hostname'], remote_agent['port']) or x2gobroker.utils.portscan(remote_agent['hostname'], remote_agent['port'])) 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] tasks['ping'] = ping diff --git a/x2gobroker/brokers/base_broker.py b/x2gobroker/brokers/base_broker.py index ebcf4af..a8d0ffb 100644 --- a/x2gobroker/brokers/base_broker.py +++ b/x2gobroker/brokers/base_broker.py @@ -1092,9 +1092,9 @@ class X2GoBroker(object): try: success, running_sessions, suspended_sessions = x2gobroker.agent.has_sessions(username, remote_agent=remote_agent) if running_sessions: - logger_broker.debug('base_broker.X2GoBroker.list_profiles(): found running sessions on host(s): {hosts}'.format(hosts=', '.join(running_sessions))) + logger_broker.debug('base_broker.X2GoBroker.get_profile_for_user(): found running sessions on host(s): {hosts}'.format(hosts=', '.join(running_sessions))) if suspended_sessions: - logger_broker.debug('base_broker.X2GoBroker.list_profiles(): found running sessions on host(s): {hosts}'.format(hosts=', '.join(suspended_sessions))) + logger_broker.debug('base_broker.X2GoBroker.get_profile_for_user(): found running sessions on host(s): {hosts}'.format(hosts=', '.join(suspended_sessions))) suspended_matching_hostnames = x2gobroker.utils.matching_hostnames(profile['host'], suspended_sessions) running_matching_hostnames = x2gobroker.utils.matching_hostnames(profile['host'], running_sessions) if suspended_matching_hostnames: @@ -1107,7 +1107,7 @@ class X2GoBroker(object): profile['host'] = [profile['host'][0]] if profile.has_key('status') and profile['status']: - logger_broker.debug('base_broker.X2GoBroker.list_profiles(): marking session profile {name} as {status}'.format(name=profile['name'], status=profile['status'])) + logger_broker.debug('base_broker.X2GoBroker.get_profile_for_user(): marking session profile {name} as {status}'.format(name=profile['name'], status=profile['status'])) except x2gobroker.x2gobroker_exceptions.X2GoBrokerAgentException: pass diff --git a/x2gobroker/tests/test_broker_agent.py b/x2gobroker/tests/test_broker_agent.py index e9ead47..36c7b70 100644 --- a/x2gobroker/tests/test_broker_agent.py +++ b/x2gobroker/tests/test_broker_agent.py @@ -449,7 +449,13 @@ broker-autologin = true def _fake_portscan(addr, port=22): if addr == 'host3.internal': return False - if addr.startswith('downhost'): + elif addr.startswith('downhost'): + return False + elif addr == '10.0.2.11': + return False + elif addr.endswith('.local'): + return True + elif addr.endswith('.external'): return False return True @@ -473,6 +479,12 @@ host = downhost1.internal (10.0.2.11), host2.internal (10.0.2.12), host3.interna broker-agent-query-mode = SSH broker-portscan-x2goservers = true +[testprofile2] +name = testprofile2 +host = downhost1.local (downhost1.external), host2.local (host2.external), host3.local (host3.external) +broker-agent-query-mode = SSH +broker-portscan-x2goservers = true + """ tf = tempfile.NamedTemporaryFile() print >> tf, _session_profiles @@ -485,6 +497,13 @@ broker-portscan-x2goservers = true self.assertTrue ( remote_agent['hostaddr'] != '10.0.2.11') i += 1 + i = 0 + while i < 50: + remote_agent = inifile_backend.get_remote_agent('testprofile2') + self.assertTrue ( bool(remote_agent) ) + self.assertTrue ( remote_agent['hostaddr'] != 'downhost1.external') + i += 1 + def test_suite(): from unittest import TestSuite, makeSuite suite = TestSuite() -- Alioth's /srv/git/_hooks_/post-receive-email on /srv/git/code.x2go.org/x2gobroker.git