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