This is an automated email from the git hooks/post-receive script. x2go pushed a commit to annotated tag 0.1.4.0 in repository x2goclient. commit 052f0527497ec8b9a5a327dbad270c4c6bb47490 Author: mike <mike@cdb5e8f1-f799-4276-8919-bce57fd91830> Date: Thu Oct 28 21:19:05 2010 +0000 * completely egg'ified / class'ified PyHocaCLI -> PyHocaCLI(args, logger, liblogger) can now be called from within your programmes git-svn-id: https://svn.das-netzwerkteam.de/x2go/pyhoca-cli/trunk@13 cdb5e8f1-f799-4276-8919-bce57fd91830 --- debian/changelog | 6 + pyhoca-cli | 260 ++++---------------------------- pyhoca/__init__.py | 19 +++ pyhoca/cli/{__init.py__ => __init__.py} | 2 + pyhoca/cli/frontend.py | 226 ++++++++++++++++++++++++++- pyhoca/cli/x2go | 2 +- setup.py | 7 +- x2go | 2 +- 8 files changed, 284 insertions(+), 240 deletions(-) diff --git a/debian/changelog b/debian/changelog index cadeb438..0ff76868 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +pyhoca-cli (0.1.0-0~nwt1) lucid maverick testing unstable; urgency=low + + * class'ified and egg'ified: PyHocaCLI is now a class + + -- Mike Gabriel <m.gabriel@das-netzwerkteam.de> Thu, 28 Oct 2010 23:30:00 +0200 + pyhoca-cli (0.0.15-0~nwt1) lucid maverick testing unstable; urgency=low * updated man page diff --git a/pyhoca-cli b/pyhoca-cli index 12da2004..fdda7332 100755 --- a/pyhoca-cli +++ b/pyhoca-cli @@ -1,28 +1,26 @@ #!/usr/bin/python # -*- coding: utf-8 -*- -""" - Copyright (C) 2010 by Mike Gabriel <m.gabriel@das-netzwerkteam.de> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the - Free Software Foundation, Inc., - 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - Contributors to the code of this programme: - Jörg Sawatzki <joerg.sawatzki@web.de> -""" - +# Copyright (C) 2010 by Mike Gabriel <m.gabriel@das-netzwerkteam.de> +# +# PyHoca CLI is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# PyHoca CLI is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# Contributors to the code of this programme: +# 2010 Dick Kniep <dick.kniep@lindix.nl> +# 2010 Jörg Sawatzki <joerg.sawatzki@web.de> ### ### module section @@ -41,15 +39,18 @@ import pprint # Python X2go provides the current local username (OS independent) from x2go.defaults import CURRENT_LOCAL_USER as current_user + from x2go.defaults import X2GO_PRINT_ACTIONS from x2go.defaults import DEFAULT_PDFVIEW_CMD from x2go.defaults import DEFAULT_PDFSAVE_LOCATION from x2go.defaults import DEFAULT_PRINTCMD_CMD +from pyhoca.cli import PyHocaCLI + # version information PROG_NAME = os.path.basename(sys.argv[0]) PROG_PID = os.getpid() -VERSION="0.0.14" +VERSION="0.1.0" VERSION_TEXT=""" %s[%s] - an X2go command line client written in Python ---------------------------------------------------------------------- @@ -59,32 +60,11 @@ VERSION: %s """ % (PROG_NAME, PROG_PID, VERSION) +PRINT_ACTIONS = X2GO_PRINT_ACTIONS.keys() +print_actions_args = {} -def _touch_file(filename): - - if not os.path.isfile(filename): - f = open(filename, 'w') - f.close() - -# ,,constants'' needed for debugging logger = x2go.X2goLogger(tag='MAIN') liblogger = x2go.X2goLogger() -x2go_session_hash = '' - -# use current_home as user home dir -current_home = os.path.expanduser("~") - -# define and create known_hosts file (if not there) -ssh_known_hosts_filename = os.path.join(current_home, '.ssh', 'known_hosts') -if not os.path.isfile(ssh_known_hosts_filename): - _touch_file(ssh_known_hosts_filename) -# define and create ssh_config file (if not there) -ssh_config_filename = os.path.join(current_home, '.ssh', 'config') -if not os.path.isfile(ssh_config_filename): - _touch_file(ssh_config_filename) - -PRINT_ACTIONS = X2GO_PRINT_ACTIONS.keys() -print_action_args = {} ### ### command line arguments @@ -155,18 +135,11 @@ def version(): sys.exit(0) -# sometimes we have to fail... -def runtime_error(m, parser=None, exitcode=-1): - if parser is not None: - parser.print_usage() - sys.stderr.write ("%s: error: %s\n" % (PROG_NAME, m)) - sys.exit(exitcode) - - def parseargs(): global DEBUG global print_action_args + global logger p = argparse.ArgumentParser(description='X2go command line client implemented in Python.',\ epilog=""" @@ -290,6 +263,7 @@ Possible values for the --pack NX option are: ### # check if SERVER is in .ssh/config file, extract information from there... ssh_config = paramiko.SSHConfig() + from pyhoca.cli import ssh_config_filename ssh_config_fileobj = open(ssh_config_filename) ssh_config.parse(ssh_config_fileobj) ssh_host = ssh_config.lookup(a.server) @@ -310,79 +284,8 @@ Possible values for the --pack NX option are: return p, a -def list_sessions(cli, s_hash): - # retrieve a session list - print - print "Available runing/suspended X2go sessions" - print "========================================" - print "Hostname: [%s]:%s" % cli.get_server(s_hash) - print "Username: %s" % cli.get_username(s_hash) - print - session_infos = cli.list_sessions(s_hash) - for session_info in session_infos.values(): - print "Session Name: %s" % session_info - print "-------------" - print "cookie: %s" % session_info.cookie - print "agent PID: %s" % session_info.agent_pid - print "display: %s" % session_info.display - print "status: %s" % session_info.status - print "graphic port: %s" % session_info.graphics_port - print "snd port: %s" % session_info.snd_port - print "sshfs port: %s" % session_info.sshfs_port - print "username: %s" % session_info.username - print "hostname: %s" % session_info.hostname - # TODO: turn into datetime object - print "create date: %s" % session_info.date_created - # TODO: turn into datetime object - print "suspended since: %s" % session_info.date_suspended - print - - -def clean_sessions(cli, s_hash): - # clean all sessions from X2go server - logger('cleaning up all running sessions from X2go server: %s' % args.server, x2go.loglevel_NOTICE, ) - cli.clean_sessions(s_hash) - - -def new_session(cli, s_hash): - # start a new session and run a command - logger('starting a new X2go session', x2go.loglevel_INFO, ) - logger('Command for new session is: %s' % args.command, x2go.loglevel_DEBUG, ) - cli.start_session(s_hash) - - -def resume_session(cli, s_hash): - # resume a running session - logger('resuming X2go session: %s' % args.resume, x2go.loglevel_INFO, ) - available_sessions = cli.list_sessions(s_hash) - if args.resume in available_sessions.keys(): - cli.resume_session(s_hash, args.resume) - else: - runtime_error('requested session not available on X2go server [%s]:%s.' % (args.server, args.remote_ssh_port), exitcode=20) - - -def suspend_session(cli, s_hash): - # send a suspend request to a session - logger('requesting X2go session suspend of session: %s' % args.suspend, x2go.loglevel_INFO, ) - available_sessions = cli.list_sessions(s_hash) - if args.suspend in available_sessions.keys(): - cli.suspend_session(s_hash, args.suspend) - else: - runtime_error('requested session not available on X2go server [%s]:%s.' % (args.server, args.remote_ssh_port), exitcode=21) - -def terminate_session(cli, s_hash): - # send a terminate request to a session - logger('requesting X2go session terminate of session: %s' % args.terminate, x2go.loglevel_INFO, ) - available_sessions = cli.list_sessions(s_hash) - if args.terminate in available_sessions.keys(): - cli.terminate_session(s_hash, args.terminate) - else: - runtime_error('requested session not available on X2go server [%s]:%s.' % (args.server, args.remote_ssh_port), exitcode=22) - - if __name__ == '__main__': - # parse command line parser, args = parseargs() @@ -390,111 +293,10 @@ if __name__ == '__main__': logger('preparing requested X2go session', x2go.loglevel_NOTICE, ) try: - x2goclient = x2go.X2goClient(logger=liblogger) - x2go_session_hash = x2goclient.register_session(args.server, port=int(args.remote_ssh_port), - username=args.username, - password=args.password, - key_filename=args.ssh_privkey, - add_to_known_hosts=args.add_to_known_hosts, - profile_name = 'Pyhoca-Client_Session', - session_type=args.session_type, - link=args.link, - geometry=args.geometry, - pack=args.pack, - cache_type='unix-kde', - kblayout=args.kbd_layout, - kbtype=args.kbd_type, - snd_system=args.sound, - printing=args.printing, - print_action=args.print_action, - print_action_args=print_action_args, - cmd=args.command) - x2goclient.with_session(x2go_session_hash).load_host_keys(ssh_known_hosts_filename) - connected = False - force_password_auth = False - while not connected: - try: - x2goclient.connect_session(x2go_session_hash, password=args.password, force_password_auth=force_password_auth) - connected = True - except x2go.AuthenticationException: - force_password_auth = True - args.password = getpass.getpass() - except x2go.PasswordRequiredException: - args.password = getpass.getpass() - except x2go.BadHostKeyException: - runtime_error('SSH host key verification for remote host [%s]:%s failed' % (args.server, args.remote_ssh_port), exitcode=-254) - except x2go.SSHException, e: - runtime_error(str(e), exitcode=253) - - if args.clean_sessions: - clean_sessions(x2goclient, x2go_session_hash) - - # go through the possible X2go client modes - if args.list_sessions: - # print a beautified session list for the user - list_sessions(x2goclient, x2go_session_hash) - sys.exit(0) - - if args.resume: - resume_session(x2goclient, x2go_session_hash) - - elif args.suspend: - suspend_session(x2goclient, x2go_session_hash) - - elif args.terminate: - terminate_session(x2goclient, x2go_session_hash) - - elif args.new: - new_session(x2goclient, x2go_session_hash) - - - if args.new or args.resume: - # give the session some time to come up... - # no CTRL-C is allowed during this phase... - i=0 - logger("give the X2go session some time to come up...", x2go.loglevel_NOTICE, ) - while i < args.time_to_wait: - time.sleep(1) - i+=1 - - if x2goclient.session_ok(x2go_session_hash): - - profile_name = x2goclient.get_profile_name(x2go_session_hash) - session_name = x2goclient.get_session_name(x2go_session_hash) - logger("X2go session is now running, the X2go client's profile name is: %s." % profile_name, x2go.loglevel_INFO, ) - logger("X2go session name is: %s." % session_name, x2go.loglevel_INFO, ) - logger("Press CTRL+C to suspend the running session.", x2go.loglevel_NOTICE, ) - try: - - session_duration = 0 - mounted = False - while x2goclient.session_ok(x2go_session_hash): - time.sleep(2) - session_duration +=2 - - if session_duration > 2 and not mounted and args.share_local_folders is not None: - if x2goclient.with_session(x2go_session_hash).get_transport().reverse_tunnels['sshfs'][1] is not None: - for _folder in args.share_local_folders: - x2goclient.share_local_folder(x2go_session_hash, _folder) - mounted = True - - # wait a little longer before telling the user what had happened - time.sleep(2) - - if x2goclient.has_terminated(x2go_session_hash): - logger("X2go session %s has terminated." % session_name, x2go.loglevel_NOTICE, ) - elif x2goclient.is_suspended(x2go_session_hash): - logger("X2go session %s has been suspended." % session_name, x2go.loglevel_NOTICE, ) - elif x2goclient.is_running(x2go_session_hash): - logger("X2go session %s has been moved to a different screen." % session_name, x2go.loglevel_NOTICE, ) - - except KeyboardInterrupt: - logger("Suspending X2go session %s." % session_name, x2go.loglevel_INFO, ) - x2goclient.suspend_session(x2go_session_hash) - # giving nxproxy's SSH tunnel some time to settle - time.sleep(2) - logger("X2go session %s has been suspended." % session_name, x2go.loglevel_NOTICE, ) + thisPyHocaCLI = PyHocaCLI(args, logger=logger, liblogger=liblogger) + thisPyHocaCLI.authenticate() + thisPyHocaCLI.MainLoop() sys.exit(0) except (KeyboardInterrupt, SystemExit), e: diff --git a/pyhoca/__init__.py b/pyhoca/__init__.py index e69de29b..6d579482 100644 --- a/pyhoca/__init__.py +++ b/pyhoca/__init__.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- + +# Copyright (C) 2010 by Dick Kniep <m.gabriel@das-netzwerkteam.de> +# +# PyHoca CLI is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# PyHoca CLI is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the +# Free Software Foundation, Inc., +# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + diff --git a/pyhoca/cli/__init.py__ b/pyhoca/cli/__init__.py similarity index 94% rename from pyhoca/cli/__init.py__ rename to pyhoca/cli/__init__.py index aa21dc44..aaeed7ba 100644 --- a/pyhoca/cli/__init.py__ +++ b/pyhoca/cli/__init__.py @@ -20,4 +20,6 @@ """\ STILL UNDOCUMENTED """ +__VERSION__ = "0.1.0" + from frontend import * \ No newline at end of file diff --git a/pyhoca/cli/frontend.py b/pyhoca/cli/frontend.py index 47a11461..4c07f325 100644 --- a/pyhoca/cli/frontend.py +++ b/pyhoca/cli/frontend.py @@ -1,6 +1,7 @@ +#!/usr/bin/python # -*- coding: utf-8 -*- -# Copyright (C) 2010 by Dick Kniep <dick.kniep@lindix.nl> +# Copyright (C) 2010 by Mike Gabriel <m.gabriel@das-netzwerkteam.de> # # PyHoca CLI is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -15,10 +16,223 @@ # You should have received a copy of the GNU General Public License # along with this program; if not, write to the # Free Software Foundation, Inc., -# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# Contributors to the code of this programme: +# 2010 Dick Kniep <dick.kniep@lindix.nl> +# 2010 Jörg Sawatzki <joerg.sawatzki@web.de> + +import sys, os +import time +import argparse +import getpass +import x2go +import paramiko +from types import * + +# for debugging +import pprint + +# a list of available X2go print actions +from x2go.defaults import X2GO_PRINT_ACTIONS + +# use current_home as user home dir +current_home = os.path.expanduser("~") + +# define and create known_hosts file (if not there) +ssh_known_hosts_filename = os.path.join(current_home, '.ssh', 'known_hosts') +if not os.path.isfile(ssh_known_hosts_filename): + self._touch_file(ssh_known_hosts_filename) +# define and create ssh_config file (if not there) +ssh_config_filename = os.path.join(current_home, '.ssh', 'config') +if not os.path.isfile(ssh_config_filename): + self._touch_file(ssh_config_filename) + +def _touch_file(self, filename): + + if not os.path.isfile(filename): + f = open(filename, 'w') + f.close() + + +class PyHocaCLI(x2go.X2goClient): + """\ + STILL UNDOCUMENTED + """ + x2go_session_hash = None + + # sometimes we have to fail... + def runtime_error(self, m, exitcode=-1): + sys.stderr.write ("%s: error: %s\n" % (sys.argv[0], m)) + sys.exit(exitcode) + + + def list_sessions(self, s_hash): + # retrieve a session list + print + print "Available runing/suspended X2go sessions" + print "========================================" + print "Hostname: [%s]:%s" % self.get_server(s_hash) + print "Username: %s" % self.get_username(s_hash) + print + session_infos = x2go.X2goClient.list_sessions(self, s_hash) + for session_info in session_infos.values(): + print "Session Name: %s" % session_info + print "-------------" + print "cookie: %s" % session_info.cookie + print "agent PID: %s" % session_info.agent_pid + print "display: %s" % session_info.display + print "status: %s" % session_info.status + print "graphic port: %s" % session_info.graphics_port + print "snd port: %s" % session_info.snd_port + print "sshfs port: %s" % session_info.sshfs_port + print "username: %s" % session_info.username + print "hostname: %s" % session_info.hostname + # TODO: turn into datetime object + print "create date: %s" % session_info.date_created + # TODO: turn into datetime object + print "suspended since: %s" % session_info.date_suspended + print + + + def clean_sessions(self, s_hash): + # clean all sessions from X2go server + self.logger('cleaning up all running sessions from X2go server: %s' % self.args.server, x2go.loglevel_NOTICE, ) + X2goClient.clean_sessions(self, s_hash) + + + def new_session(self, s_hash): + # start a new session and run a command + self.logger('starting a new X2go session', x2go.loglevel_INFO, ) + self.logger('Command for new session is: %s' % self.args.command, x2go.loglevel_DEBUG, ) + self.start_session(s_hash) + + + def resume_session(self, s_hash): + # resume a running session + self.logger('resuming X2go session: %s' % self.args.resume, x2go.loglevel_INFO, ) + available_sessions = self.list_sessions(s_hash) + if self.args.resume in available_sessions.keys(): + x2go.X2goClient.resume_session(self, s_hash, self.args.resume) + else: + self.runtime_error('requested session not available on X2go server [%s]:%s.' % (self.args.server, self.args.remote_ssh_port), exitcode=20) + + + def suspend_session(self, s_hash): + # send a suspend request to a session + self.logger('requesting X2go session suspend of session: %s' % self.args.suspend, x2go.loglevel_INFO, ) + available_sessions = self.list_sessions(s_hash) + if self.args.suspend in available_sessions.keys(): + x2go.X2goClient.suspend_session(self, s_hash, self.args.suspend) + else: + self.runtime_error('requested session not available on X2go server [%s]:%s.' % (self.args.server, self.args.remote_ssh_port), exitcode=21) + + + def terminate_session(self, s_hash): + # send a terminate request to a session + self.logger('requesting X2go session terminate of session: %s' % self.args.terminate, x2go.loglevel_INFO, ) + available_sessions = self.list_sessions(s_hash) + if self.args.terminate in available_sessions.keys(): + x2go.X2goClient.terminate_session(self, s_hash, self.args.terminate) + else: + self.runtime_error('requested session not available on X2go server [%s]:%s.' % (self.args.server, self.args.remote_ssh_port), exitcode=22) + + + def __init__(self, args, logger=None, liblogger=None): + + self.args = args + if logger is None: + logger = x2go.X2goLogger(tag='PyHocaCLI') + + # initialize the X2goClient context and start the connection to the X2go server + self.logger('preparing requested X2go session', x2go.loglevel_NOTICE, ) + + x2go.X2goClient.__init__(logger=liblogger) + self.x2go_session_hash = self.register_session(args.server, port=int(self.args.remote_ssh_port), + username=self.args.username, + password=self.args.password, + key_filename=self.args.ssh_privkey, + add_to_known_hosts=self.args.add_to_known_hosts, + profile_name = 'Pyhoca-Client_Session', + session_type=self.args.session_type, + link=self.args.link, + geometry=self.args.geometry, + pack=self.args.pack, + cache_type='unix-kde', + kblayout=self.args.kbd_layout, + kbtype=self.args.kbd_type, + snd_system=self.args.sound, + printing=self.args.printing, + print_action=self.args.print_action, + print_action_args=print_action_args, + cmd=self.args.command) + self.with_session(self.x2go_session_hash).load_host_keys(ssh_known_hosts_filename) + + + def authenticate(self): + + connected = False + force_password_auth = False + while not connected: + try: + self.connect_session(self.x2go_session_hash, password=self.args.password, force_password_auth=force_password_auth) + connected = True + except x2go.AuthenticationException: + force_password_auth = True + self.args.password = getpass.getpass() + except x2go.PasswordRequiredException: + self.args.password = getpass.getpass() + except x2go.BadHostKeyException: + self.runtime_error('SSH host key verification for remote host [%s]:%s failed' % (self.args.server, self.args.remote_ssh_port), exitcode=-254) + except x2go.SSHException, e: + self.runtime_error(str(e), exitcode=253) + + + def MainLoop(self): + + # give the session some time to come up... + # no CTRL-C is allowed during this phase... + i=0 + self.logger("give the X2go session some time to come up...", x2go.loglevel_NOTICE, ) + while i < self.args.time_to_wait: + time.sleep(1) + i+=1 + + if self.session_ok(self.x2go_session_hash): + + profile_name = self.get_profile_name(self.x2go_session_hash) + session_name = self.get_session_name(self.x2go_session_hash) + self.logger("X2go session is now running, the X2go client's profile name is: %s." % profile_name, x2go.loglevel_INFO, ) + self.logger("X2go session name is: %s." % session_name, x2go.loglevel_INFO, ) + self.logger("Press CTRL+C to suspend the running session.", x2go.loglevel_NOTICE, ) + try: + + session_duration = 0 + mounted = False + while self.session_ok(self.x2go_session_hash): + time.sleep(2) + session_duration +=2 + + if session_duration > 2 and not mounted and self.args.share_local_folders is not None: + if self.with_session(self.x2go_session_hash).get_transport().reverse_tunnels['sshfs'][1] is not None: + for _folder in self.args.share_local_folders: + self.share_local_folder(self.x2go_session_hash, _folder) + mounted = True + + # wait a little longer before telling the user what had happened + time.sleep(2) + + if self.has_terminated(self.x2go_session_hash): + self.logger("X2go session %s has terminated." % session_name, x2go.loglevel_NOTICE, ) + elif self.is_suspended(self.x2go_session_hash): + self.logger("X2go session %s has been suspended." % session_name, x2go.loglevel_NOTICE, ) + elif self.is_running(self.x2go_session_hash): + self.logger("X2go session %s has been moved to a different screen." % session_name, x2go.loglevel_NOTICE, ) -"""\ -STILL UNDOCUMENTED -""" + except KeyboardInterrupt: + self.logger("Suspending X2go session %s." % session_name, x2go.loglevel_INFO, ) + self.suspend_session(self.x2go_session_hash) + # giving nxproxy's SSH tunnel some time to settle + time.sleep(2) + self.logger("X2go session %s has been suspended." % session_name, x2go.loglevel_NOTICE, ) -class ... diff --git a/pyhoca/cli/x2go b/pyhoca/cli/x2go index b7003701..6c7076fe 120000 --- a/pyhoca/cli/x2go +++ b/pyhoca/cli/x2go @@ -1 +1 @@ -../../../../python/python-x2go/trunk/x2go \ No newline at end of file +../../../../python/python-x2go/trunk/x2go/ \ No newline at end of file diff --git a/setup.py b/setup.py index a257db18..3ba5fe43 100755 --- a/setup.py +++ b/setup.py @@ -22,13 +22,14 @@ from setuptools import setup, find_packages import pyhoca.cli setup( - name = "pyhoca-cli", + name = "PyHoca CLI", version = pyhoca.cli.__VERSION__, description = "PyHoca CLI is a cross-platform (Windows, MacOS X, Linux) X2go client for the command line.", license = 'GPL', author = 'Mike Gabriel', url = 'http://www.x2go.org', - packages = find_packages('.'), + packages = [ 'pyhoca.cli', ], package_dir = {'': '.'}, - install_requires = ['setuptools', ] + exclude = [ 'pyhoca.cli.x2go', ], + install_requires = [ 'setuptools', ] ) diff --git a/x2go b/x2go index 3e762901..74dfe276 120000 --- a/x2go +++ b/x2go @@ -1 +1 @@ -../../python/python-x2go/trunk/x2go \ No newline at end of file +../../python/python-x2go/trunk/x2go/ \ No newline at end of file -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2goclient.git