[X2Go-Commits] [x2gobroker] 01/01: more work on the x2gobroker-testagent tool
git-admin at x2go.org
git-admin at x2go.org
Wed Mar 19 10:01:46 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 d2bcb528625d029129e537cb8358e6797225814d
Author: Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
Date: Wed Mar 19 10:01:49 2014 +0100
more work on the x2gobroker-testagent tool
---
lib/x2gobroker-agent.pl | 19 ++++++++--
sbin/x2gobroker-testagent | 89 ++++++++++++++++++++++++++++++++++++++++-----
x2gobroker/agent.py | 22 +++++++----
3 files changed, 109 insertions(+), 21 deletions(-)
diff --git a/lib/x2gobroker-agent.pl b/lib/x2gobroker-agent.pl
index 02a4b33..ccb8ebb 100755
--- a/lib/x2gobroker-agent.pl
+++ b/lib/x2gobroker-agent.pl
@@ -82,10 +82,15 @@ sub AddAuthKey
# make sure dir and file for authorized_keys do exist
system ("sudo", "-u", "$uid", "--", "mkdir", "-p", "$authkeydir");
system ("sudo", "-u", "$uid", "--", "touch", "$authkeyfile");
- my $authorized_keys = `sudo -u $uid -- "cat $authkeyfile"`;
+ my $authorized_keys = `sudo -u $uid -- cat "$authkeyfile"`;
if ( ! ( $authorized_keys =~ m/$pubkey/ ) )
{
- system("sudo", "-u", "$uid", "--", "echo $pubkey >> $authkeyfile");
+ open my $saveout, ">&STDOUT";
+ open STDOUT, '>', "/dev/null";
+ open(TEE_STDIN, "| sudo -u $uid -- tee -a $authkeyfile");
+ print TEE_STDIN "$pubkey\n";
+ close(TEE_STDIN);
+ open STDOUT, ">&", $saveout;
}
}
@@ -101,7 +106,13 @@ sub DelAuthKey
{
$authkeyfile = "$home/$authkeyfile";
}
- system("sudo", "-u", "$uid", "--", "sed -e s\!'$pubkey'\!''\! -e '/^\$/d' -i $authkeyfile 1>/dev/null 2>/dev/null");
+ open my $saveout, ">&STDOUT";
+ open STDOUT, '>', "/dev/null";
+ open my $saveerr, ">&STDERR";
+ open STDERR, '>', "/dev/null";
+ system("sudo", "-u", "$uid", "--", "sed", "-e", "s!$pubkey!!", "-e", "/^\$/d", "-i", "$authkeyfile");
+ open STDOUT, ">&", $saveout;
+ open STDERR, ">&", $saveerr;
}
$< = $>;
@@ -164,7 +175,7 @@ if( ($mode eq 'findbusyservers_by_sessionstats') || ($mode eq 'findbusyservers')
InitX2GoUser($uid, $uidNumber, $gidNumber, $home);
print "OK\n";
- my $busy_servers = `sudo -u $uid -c \"x2gogetservers\"`;
+ my $busy_servers = `sudo -u $uid -- x2gogetservers`;
my %server_load = ();
my $num_sessions = 0;
diff --git a/sbin/x2gobroker-testagent b/sbin/x2gobroker-testagent
index e09c81f..ade4403 100755
--- a/sbin/x2gobroker-testagent
+++ b/sbin/x2gobroker-testagent
@@ -22,6 +22,7 @@
import os
import sys
+import types
import setproctitle
import argparse
import logging
@@ -52,10 +53,14 @@ if __name__ == "__main__":
agent_options = [
{'args':['--list-tasks'], 'default': False, 'action': 'store_true', 'help': 'List available broker agent tasks', },
{'args':['-u','--username', '--user'], 'default': None, 'metavar': 'USERNAME', 'help': 'When testing the broker agent, test on behalf of this user (default: none)', },
- {'args':['-t','--task'], 'default': 'PING_ICMP', 'metavar': 'AGENT_TASK', 'help': 'Perform this task on the (remote) broker agent', },
+ {'args':['-t','--task'], 'default': 'ping', 'metavar': 'AGENT_TASK', 'help': 'Perform this task on the (remote) broker agent', },
{'args':['-H','--host'], 'default': 'LOCAL', 'metavar': 'HOSTNAME', 'help': 'Test X2Go Session Broker Agent on this (remote) host (default: LOCAL)', },
{'args':['-p','--port'], 'default': 22, 'metavar': 'PORT', 'help': 'For remote agent calls (via SSH) use this port as SSH port (default: 22)', },
]
+ supplementary_options = [
+ {'args':['--session-id'], 'default': None, 'help': 'when testing the \'suspendsession\' or the \'terminatesession\' task, you have to additionally give a session ID to test the tasks on', },
+ {'args':['--pubkey'], 'default': None, 'help': 'use this public key when testing the \'addauthkey\' and the \'delauthkey\' task', },
+ ]
misc_options = [
{'args':['-C','--config-file'], 'default': None, 'metavar': 'CONFIG_FILE', 'help': 'Specify a special configuration file name, default is: {default}'.format(default=x2gobroker.defaults.X2GOBROKER_CONFIG), },
{'args':['-d','--debug'], 'default': False, 'action': 'store_true', 'help': 'enable debugging code', },
@@ -64,9 +69,10 @@ if __name__ == "__main__":
formatter_class=argparse.RawDescriptionHelpFormatter, \
add_help=True, argument_default=None)
p_agent = p.add_argument_group('agent parameters')
+ p_supplimentary = p.add_argument_group('supplimentary parameters')
p_misc = p.add_argument_group('miscellaneous parameters')
- for (p_group, opts) in ( (p_agent, agent_options), (p_misc, misc_options), ):
+ for (p_group, opts) in ( (p_agent, agent_options), (p_supplimentary, supplementary_options), (p_misc, misc_options), ):
for opt in opts:
args = opt['args']
del opt['args']
@@ -88,6 +94,13 @@ if __name__ == "__main__":
print
sys.exit(-1)
+ if cmdline_args.task in ('suspendsession', 'terminatesession') and not cmdline_args.session_id:
+ p.print_help()
+ print
+ print "*** Cannot continue on this task without a given session ID... ***"
+ print
+ sys.exit(0);
+
if cmdline_args.config_file is not None:
x2gobroker.defaults.X2GOBROKER_CONFIG = cmdline_args.config_file
@@ -112,10 +125,23 @@ if local_agent: remote_agent = None
else: remote_agent = {'hostname': hostname, 'port': port, }
def call_agent(task, **kwargs):
- return agent_client_tasks[task](username=username, query_mode=query_mode, remote_agent=remote_agent, **kwargs)
+ try:
+ _result = agent_client_tasks[task](username=username, query_mode=query_mode, remote_agent=remote_agent, **kwargs)
+ if _result == True:
+ print "The broker agent could be reached but the task returned no printable output (which probably is fine)."
+ print
+ return _result
+ except KeyError:
+ print "No such task: '{task_name}'. Use --list-tasks to view information about".format(task_name=task)
+ print "available tasks."
+ print
+ return False
if __name__ == "__main__":
+ # drop root privileges and run as X2GOBROKER_DAEMON_USER
+ drop_privileges(uid=x2gobroker.defaults.X2GOBROKER_DAEMON_USER, gid=x2gobroker.defaults.X2GOBROKER_DAEMON_GROUP)
+
print
print "X2Go Session Broker (Agent Test Utility)"
print "----------------------------------------"
@@ -125,13 +151,10 @@ if __name__ == "__main__":
try:
remote_agent_tasks = x2gobroker.agent.tasks_available(username=username, query_mode=query_mode, remote_agent=remote_agent)
except x2gobroker.x2gobroker_exceptions.X2GoBrokerAgentException, e:
- print e
+ print "{errmsg}.".format(errmsg=e)
print
sys.exit(0)
- # drop root privileges and run as X2GOBROKER_DAEMON_USER
- drop_privileges(uid=x2gobroker.defaults.X2GOBROKER_DAEMON_USER, gid=x2gobroker.defaults.X2GOBROKER_DAEMON_GROUP)
-
if not local_agent and not x2gobroker.agent.has_remote_broker_agent_setup():
print "This instance of X2Go Session Broker is not able to contact any remote"
@@ -152,10 +175,58 @@ if __name__ == "__main__":
sys.exit(0);
kwargs = {}
- if task == 'addauthkey':
+ pubkey = cmdline_args.pubkey
+ if (task == 'addauthkey' or task == 'delauthkey') and not pubkey:
pubkey, privvkey = x2gobroker.agent.genkeypair(local_username=username, client_address="localhost")
+
+ if pubkey:
kwargs.update({
'pubkey_hash': pubkey,
})
- print "\n".join(call_agent(task, **kwargs))
+ if task in ('suspendsession', 'terminatesession'):
+ kwargs.update({
+ 'session_name': cmdline_args.session_id
+ })
+
+ result = call_agent(task, **kwargs)
+ if type(result) is types.ListType:
+ print "\n".join(result)
+ print
+ elif task.startswith('findbusyservers') and type(result) is types.DictType:
+ if result:
+ print "\n".join(result.items())
+ else:
+ print "X2Go Server busy state: All servers are idle."
+ print
+ # even an empty dict means, that we have been successful...
+ result = True
+
+ if task == 'addauthkey' and result:
+ on_host = " on {host}".format(host=cmdline_args.host) if cmdline_args.host != 'LOCAL' else ""
+ print "NOTE: This test-run added the below SSH public key to X2Go's authorized_keys file"
+ print " for user '{username}{on_host}'.".format(username=username, on_host=on_host)
+ print
+ print " The file location for this normally is $HOME/.x2go/authorized_keys."
+ print " MAKE SURE TO REMOVE THIS KEY MANUALLY (or use test the 'delauthkey' task)!!!"
+ print
+ print pubkey
+ print
+
+ if task == 'delauthkey' and result:
+ on_host = " on {host}".format(host=cmdline_args.host) if cmdline_args.host != 'LOCAL' else ""
+ print "NOTE: This test-run attempted to remove all occurences of the below SSH public key from"
+ print " X2Go's authorized_keys file for user '{username}{on_host}'.".format(username=username, on_host=on_host)
+ print
+ print " The file location for this normally is $HOME/.x2go/authorized_keys."
+ print " PLEASE DOUBLE-CHECK THE USER'S authorized_keys file MANUALLY!!!"
+ print
+ print pubkey
+ print
+
+ where = "local" if query_mode == "LOCAL" else "remote"
+ if result:
+ print "The task '{task_name}' could be executed successfully on the {where} broker agent.".format(task_name=task, where=where)
+ else:
+ print "The task '{task_name}' failed to execute on the {where} broker agent.".format(task_name=task, where=where)
+ print
diff --git a/x2gobroker/agent.py b/x2gobroker/agent.py
index 0840023..f8eed07 100644
--- a/x2gobroker/agent.py
+++ b/x2gobroker/agent.py
@@ -20,6 +20,7 @@
# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
import os.path
+import types
import subprocess
import paramiko
import cStringIO
@@ -91,7 +92,7 @@ def call_local_broker_agent(username, mode, cmdline_args=[]):
]
for cmdline_arg in cmdline_args:
- cmd_line.append('\'{arg}\''.format(arg=cmdline_arg))
+ cmd_line.append('{arg}'.format(arg=cmdline_arg))
logger_broker.info('Executing agent command locally: {cmd}'.format(cmd=" ".join(cmd_line)))
result = ['FAILED']
@@ -108,7 +109,7 @@ def call_local_broker_agent(username, mode, cmdline_args=[]):
pass
if result[0].startswith('OK'):
- return [ r for r in result[1:] if r ]
+ return [ r for r in result[1:] if r ] or True
raise x2gobroker.x2gobroker_exceptions.X2GoBrokerAgentException('Query to local X2Go Broker Agent failed with no response')
@@ -135,7 +136,7 @@ def call_remote_broker_agent(username, mode, cmdline_args=[], remote_agent=None)
]
for cmdline_arg in cmdline_args:
- cmd_line.append('\'{arg}\''.format(arg=cmdline_arg))
+ cmd_line.append('{arg}'.format(arg=cmdline_arg))
remote_username = x2gobroker.defaults.X2GOBROKER_AGENT_USER
remote_hostname = remote_agent[u'hostname']
@@ -164,12 +165,15 @@ def call_remote_broker_agent(username, mode, cmdline_args=[], remote_agent=None)
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 and result[0].startswith('OK'):
- return [ r for r in result[1:] if r ]
+ return [ r for r in result[1:] if r ] or True
+ 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))
+ raise x2gobroker.x2gobroker_exceptions.X2GoBrokerAgentException('Query to remote X2Go Broker Agent failed with no response')
def icmp_ping(hostname):
"""\
@@ -321,10 +325,12 @@ def find_busy_servers(username, query_mode='LOCAL', remote_agent=None, **kwargs)
server_usage = {}
if server_list:
- for server_item in server_list:
- if ':' in server_item:
- usage, server = server_item.split(':')
- server_usage.update({ server: int(usage) })
+ if type(server_list) is types.ListType:
+ for server_item in server_list:
+ print server_item
+ if ':' in server_item:
+ usage, server = server_item.split(':')
+ server_usage.update({ server: int(usage) })
return server_usage
tasks['findbusyservers'] = find_busy_servers
--
Alioth's /srv/git/_hooks_/post-receive-email on /srv/git/code.x2go.org/x2gobroker.git
More information about the x2go-commits
mailing list