[X2Go-Commits] [x2gobroker] 01/02: Do an ICMP ping before querying a remote agent via SSH.
git-admin at x2go.org
git-admin at x2go.org
Sun Dec 7 00:08:23 CET 2014
This is an automated email from the git hooks/post-receive script.
x2go pushed a commit to branch master
in repository x2gobroker.
commit 01be4facc37f05abe9dd87e99b7c4c0ed15a9f20
Author: Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
Date: Sun Dec 7 00:05:25 2014 +0100
Do an ICMP ping before querying a remote agent via SSH.
---
debian/changelog | 1 +
x2gobroker/agent.py | 93 ++++++++++++++++++++++++++-------------------------
2 files changed, 48 insertions(+), 46 deletions(-)
diff --git a/debian/changelog b/debian/changelog
index a0cc46b..9b765eb 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -202,6 +202,7 @@ x2gobroker (0.0.3.0-0x2go1) UNRELEASED; urgency=low
- Enable basic/random load-balancing for UCCS broker frontend. Make UCCS
frontend aware of host session profile options of the form
"host=<fqdn> (<ipaddr>:<port>).
+ - Do an ICMP ping before querying a remote agent via SSH.
* 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 e4bef4d..531c407 100644
--- a/x2gobroker/agent.py
+++ b/x2gobroker/agent.py
@@ -167,55 +167,56 @@ def _call_remote_broker_agent(username, task, cmdline_args=[], remote_agent=None
elif not remote_agent.has_key('host_key_policy'):
remote_agent['host_key_policy'] = paramiko.WarningPolicy()
- 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
remote_hostname = remote_agent[u'hostname']
- if remote_agent.has_key(u'port'):
- remote_port = int(remote_agent[u'port'])
- else:
- remote_port = 22
-
- # now, connect and use paramiko Client to negotiate SSH2 across the connection
- try:
- client = paramiko.SSHClient()
- client.load_system_host_keys()
- 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_hostname, 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))
- (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))
- client.close()
- if result:
- logger_broker.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 ])
+ if icmp_ping(remote_hostname):
+ 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
+ if remote_agent.has_key(u'port'):
+ remote_port = int(remote_agent[u'port'])
else:
- return (False, [])
- except paramiko.AuthenticationException:
- raise x2gobroker.x2gobroker_exceptions.X2GoBrokerAgentException('Authentication to remote X2Go Broker Agent Host failed (user: {user}, hostname: {hostname}, port: {port}) failed'.format(user=remote_username, hostname=remote_hostname, port=remote_port))
- except (paramiko.SSHException, paramiko.BadHostKeyException, socket.error):
- raise x2gobroker.x2gobroker_exceptions.X2GoBrokerAgentException('Query to remote X2Go Broker Agent (user: {user}, hostname: {hostname}, port: {port}) failed'.format(user=remote_username, hostname=remote_hostname, port=remote_port))
+ remote_port = 22
- raise x2gobroker.x2gobroker_exceptions.X2GoBrokerAgentException('Query to remote X2Go Broker Agent failed with no response')
+ # now, connect and use paramiko Client to negotiate SSH2 across the connection
+ try:
+ client = paramiko.SSHClient()
+ client.load_system_host_keys()
+ 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_hostname, 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))
+ (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))
+ client.close()
+ if result:
+ logger_broker.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:
+ return (False, [])
+ except paramiko.AuthenticationException:
+ raise x2gobroker.x2gobroker_exceptions.X2GoBrokerAgentException('Authentication to remote X2Go Broker Agent Host failed (user: {user}, hostname: {hostname}, port: {port}) failed'.format(user=remote_username, hostname=remote_hostname, port=remote_port))
+ except (paramiko.SSHException, paramiko.BadHostKeyException, socket.error):
+ raise x2gobroker.x2gobroker_exceptions.X2GoBrokerAgentException('Query to remote X2Go Broker Agent (user: {user}, hostname: {hostname}, port: {port}) failed'.format(user=remote_username, hostname=remote_hostname, port=remote_port))
+ else:
+ raise x2gobroker.x2gobroker_exceptions.X2GoBrokerAgentException('Could not ping remote X2Go Broker Agent host ({remote_hostname})'.format(remote_hostname=remote_hostname))
def icmp_ping(hostname):
--
Alioth's /srv/git/_hooks_/post-receive-email on /srv/git/code.x2go.org/x2gobroker.git
More information about the x2go-commits
mailing list