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 5b39fdfd819a677c3258f900b9bf43714098787a
Author: mike <mike@cdb5e8f1-f799-4276-8919-bce57fd91830>
Date:   Sun Oct 24 15:44:51 2010 +0000

    * re-importing projects
    
    
    git-svn-id: https://svn.das-netzwerkteam.de/x2go/pyhoca-cli/trunk@3 
cdb5e8f1-f799-4276-8919-bce57fd91830
---
 README                     |  51 +++++
 TODO                       |  25 +++
 debian/changelog           | 137 +++++++++++++
 debian/compat              |   1 +
 debian/control             |  15 ++
 debian/copyright           |  13 ++
 debian/pycompat            |   1 +
 debian/pyhoca-cli.docs     |   2 +
 debian/pyhoca-cli.install  |   1 +
 debian/pyhoca-cli.manpages |   1 +
 debian/rules               |  24 +++
 debian/source/format       |   1 +
 man/pyhoca-cli.1           | 174 ++++++++++++++++
 pyhoca-cli                 | 502 +++++++++++++++++++++++++++++++++++++++++++++
 x2go                       |   1 +
 15 files changed, 949 insertions(+)

diff --git a/README b/README
new file mode 100644
index 00000000..902cce5a
--- /dev/null
+++ b/README
@@ -0,0 +1,51 @@
+pyhoca-cli - Copyright (C) 2010 by Mike Gabriel <m.gabr...@das-netzwerkteam.de>
+
+Contributors:
+    Jörg Sawatzki <joerg.sawat...@web.de>
+
+Published under the terms of the GNU General Public License.
+See http://www.gnu.org/licenses/gpl.html for a recent copy.
+
+
+=== What is pyhoca-cli? ===
+
+=== Requirements ===
+
+* the python-x2go module needs to be installed (of course)
+* the python-argparse module needs to be available
+* a working version of nxproxy/nxproxy.exe somewhere on your system (if you 
have 
+  installed x2goclient, everything should be fine)
+
+
+=== Current features ===
+
+* start a new session on an X2go server
+* resume a suspended session on an X2go server
+* suspend a running session (hit Ctrl+C)
+* terminate a running session 
+* retrieve a list of running sessions
+* sound support available
+* local folder sharing
+
+=== How to use it ===
+
+Please refer to the man page: 
+
+  man pyhoca-cli
+
+=== Known issues ===
+Please refer to the TODO file that has been shipped with pyhoca-cli.
+
+
+Thanks in advance for your feedback and contributions,
+
+Kiel (Germany), 20101013,
+
+  Mike Gabriel <m.gabr...@das-netzwerkteam.de>
+
+
+
+
+
+
+
diff --git a/TODO b/TODO
new file mode 100644
index 00000000..0be537da
--- /dev/null
+++ b/TODO
@@ -0,0 +1,25 @@
+pyhoca-cli - Copyright (C) 2010 by Mike Gabriel <m.gabr...@das-netzwerkteam.de>
+
+Contributors:
+    Jörg Sawatzki <joerg.sawat...@web.de>
+
+Published under the terms of the GNU General Public License.
+See http://www.gnu.org/licenses/gpl.html for a recent copy.
+
+
+=== pyhoca-cli TODOs ===
+
+* enable printing support
+* enable shadow session support
+
+
+=== pyhoca-cli Wishlist ===
+
+* SOCKS client support
+
+
+If you find any issues with this programme please let me know.
+
+Kiel (Germany), 20101013,
+
+  Mike Gabriel <m.gabr...@das-netzwerkteam.de>
diff --git a/debian/changelog b/debian/changelog
new file mode 100644
index 00000000..cadeb438
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,137 @@
+pyhoca-cli (0.0.15-0~nwt1) lucid maverick testing unstable; urgency=low
+
+  * updated man page
+  * support for --libdebug-sftpxfer option
+
+ -- Mike Gabriel <m.gabr...@das-netzwerkteam.de>  Wed, 13 Oct 2010 23:30:00 
+0200
+
+pyhoca-cli (0.0.14-0~nwt2) lucid maverick testing unstable; urgency=low
+
+  * depending on bugfix Python X2go version 0.0.12 (or higher)
+
+ -- Mike Gabriel <m.gabr...@das-netzwerkteam.de>  Wed, 13 Oct 2010 14:12:00 
+0200
+
+pyhoca-cli (0.0.14-0~nwt1) lucid maverick testing unstable; urgency=low
+
+  * added local folder sharing support
+
+ -- Mike Gabriel <m.gabr...@das-netzwerkteam.de>  Wed, 13 Oct 2010 14:00:00 
+0200
+
+pyhoca-cli (0.0.13-0~nwt1) lucid maverick testing unstable; urgency=low
+
+  * adding cleanup functionality of remaining X2goSession (sub)threads
+
+ -- Mike Gabriel <m.gabr...@das-netzwerkteam.de>  Thu, 07 Oct 2010 01:22:00 
+0200
+
+pyhoca-cli (0.0.12-0~nwt1) lucid maverick testing unstable; urgency=low
+
+  * if no SSH private key file is specified (default) pyhoca looks 
+    for standard private key files and if present tries to use them 
+    (imitates behaviour of openssh-client). If you do not want to use
+    SSH pub/priv key authentication, remove your priv key files from the
+    .ssh folder.
+
+ -- Mike Gabriel <m.gabr...@das-netzwerkteam.de>  Wed, 06 Oct 2010 18:36:00 
+0200
+
+pyhoca-cli (0.0.11-0~nwt1) lucid maverick testing unstable; urgency=low
+
+  * more bugfixing for not-existent SSH private key file
+
+ -- Mike Gabriel <m.gabr...@das-netzwerkteam.de>  Wed, 06 Oct 2010 16:42:00 
+0200
+
+pyhoca-cli (0.0.10-0~nwt1) lucid maverick testing unstable; urgency=low
+
+  * bugfix for the last bugfix
+
+ -- Mike Gabriel <m.gabr...@das-netzwerkteam.de>  Wed, 06 Oct 2010 16:32:00 
+0200
+
+pyhoca-cli (0.0.9-0~nwt1) lucid maverick testing unstable; urgency=low
+
+  * bugfix release for case where there is not id_rsa file in the SSH home dir
+    of a user
+
+ -- Mike Gabriel <m.gabr...@das-netzwerkteam.de>  Wed, 06 Oct 2010 16:30:00 
+0200
+
+pyhoca-cli (0.0.8-0~nwt1) lucid maverick testing unstable; urgency=low
+
+  * moved the _touch_file function further up
+
+ -- Mike Gabriel <m.gabr...@das-netzwerkteam.de>  Wed, 06 Oct 2010 16:25:00 
+0200
+
+pyhoca-cli (0.0.7-0~nwt4) lucid maverick testing unstable; urgency=low
+
+  * added build destination Ubuntu lucid/maverick, Debian squeeze/sid
+
+ -- Mike Gabriel <m.gabr...@das-netzwerkteam.de>  Wed, 06 Oct 2010 16:08:00 
+0200
+
+pyhoca-cli (0.0.7-0~nwt3) unstable; urgency=low
+
+  * bugfix (typo) for pyhoca-cli version string
+
+ -- Mike Gabriel <m.gabr...@das-netzwerkteam.de>  Wed, 06 Oct 2010 13:30:00 
+0200
+
+pyhoca-cli (0.0.7-0~nwt2) unstable; urgency=low
+
+  * version was derived from python-x2go, now pyhoca-cli displays
+    its own version number
+
+ -- Mike Gabriel <m.gabr...@das-netzwerkteam.de>  Wed, 06 Oct 2010 10:00:00 
+0200
+
+pyhoca-cli (0.0.7-0~nwt1) unstable; urgency=low
+
+  * added an internal session duration counter
+
+ -- Mike Gabriel <m.gabr...@das-netzwerkteam.de>  Tue, 05 Oct 2010 18:50:00 
+0200
+
+pyhoca-cli (0.0.6-0~nwt1) unstable; urgency=low
+
+  * activated sound support option
+  * activated local ssh port option
+  * distro codename lucid -> unstable (to be more general)
+
+ -- Mike Gabriel <m.gabr...@das-netzwerkteam.de>  Tue, 05 Oct 2010 13:30:00 
+0200
+
+pyhoca-cli (0.0.5-0~nwt1) lucid; urgency=low
+
+  * updated man page
+
+ -- Mike Gabriel <m.gabr...@das-netzwerkteam.de>  Fri, 01 Oct 2010 22:41:00 
+0200
+
+pyhoca-cli (0.0.4-0~nwt1) lucid; urgency=low
+
+  * renamed --timeout option to --time-to-wait, because it is more descriptive 
for
+    what it does
+
+ -- Mike Gabriel <m.gabr...@das-netzwerkteam.de>  Fri, 01 Oct 2010 21:22:00 
+0200
+
+pyhoca-cli (0.0.3-0~nwt1) lucid; urgency=low
+
+  * at end of session: added a small pause before telling the user what
+    happened to the running session
+
+ -- Mike Gabriel <m.gabr...@das-netzwerkteam.de>  Fri, 01 Oct 2010 20:58:00 
+0200
+
+pyhoca-cli (0.0.2-0~nwt3) lucid; urgency=low
+
+  * updated python-x2go dependency in control file
+
+ -- Mike Gabriel <m.gabr...@das-netzwerkteam.de>  Fri, 01 Oct 2010 20:51:00 
+0200
+
+pyhoca-cli (0.0.2-0~nwt2) lucid; urgency=low
+
+  * fixed control file
+
+ -- Mike Gabriel <m.gabr...@das-netzwerkteam.de>  Fri, 01 Oct 2010 01:32:00 
+0200
+
+pyhoca-cli (0.0.2-0~nwt1) lucid; urgency=low
+
+  * first test release
+
+ -- Mike Gabriel <m.gabr...@das-netzwerkteam.de>  Fri, 01 Oct 2010 01:30:00 
+0200
+
+pyhoca-cli (0.0.1-0~nwt1) lucid; urgency=low
+
+  * resetting changelog after rewrite of python-x2go
+
+ -- Mike Gabriel <m.gabr...@das-netzwerkteam.de>  Sat, 25 Sep 2010 16:00:00 
+0200
+
diff --git a/debian/compat b/debian/compat
new file mode 100644
index 00000000..7f8f011e
--- /dev/null
+++ b/debian/compat
@@ -0,0 +1 @@
+7
diff --git a/debian/control b/debian/control
new file mode 100644
index 00000000..79179389
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,15 @@
+Source: pyhoca-cli
+Section: python
+Priority: optional
+Maintainer: Mike Gabriel <m.gabr...@das-netzwerkteam.de>
+Build-Depends: debhelper (>= 7), python, python-setuptools, python-support
+Standards-Version: 3.9.0
+Homepage: http://das-netzwerkteam.de/site/?q=node/71
+XS-Python-Version: all
+
+Package: pyhoca-cli
+Architecture: all
+Depends: ${misc:Depends}, python, python-x2go (>=0.0.14-0~nwt1), 
python-argparse
+Description: X2go client written in Python
+ A fully functional X2go client implementation written 
+ in Python.
diff --git a/debian/copyright b/debian/copyright
new file mode 100644
index 00000000..fc67feca
--- /dev/null
+++ b/debian/copyright
@@ -0,0 +1,13 @@
+pyhoca-cli - Copyright (C) 2010 by Mike Gabriel <m.gabr...@das-netzwerkteam.de>
+
+Published under the terms of the GNU General Public License.
+See http://www.gnu.org/licenses/gpl.html for a recent copy.
+
+On Debian/Ubuntu systems a local copy of the GPL license can also be 
+found in /usr/share/common-licenses.
+
+The code has been packaged for Debian/Ubuntu by Mike Gabriel 
+<m.gabr...@das-netzwerkteam.de>
+
+light+love,
+Mike Gabriel
diff --git a/debian/pycompat b/debian/pycompat
new file mode 100644
index 00000000..0cfbf088
--- /dev/null
+++ b/debian/pycompat
@@ -0,0 +1 @@
+2
diff --git a/debian/pyhoca-cli.docs b/debian/pyhoca-cli.docs
new file mode 100644
index 00000000..1d23e9b9
--- /dev/null
+++ b/debian/pyhoca-cli.docs
@@ -0,0 +1,2 @@
+README
+TODO
\ No newline at end of file
diff --git a/debian/pyhoca-cli.install b/debian/pyhoca-cli.install
new file mode 100644
index 00000000..b6c7254f
--- /dev/null
+++ b/debian/pyhoca-cli.install
@@ -0,0 +1 @@
+pyhoca-cli /usr/bin/
\ No newline at end of file
diff --git a/debian/pyhoca-cli.manpages b/debian/pyhoca-cli.manpages
new file mode 100644
index 00000000..6a255bff
--- /dev/null
+++ b/debian/pyhoca-cli.manpages
@@ -0,0 +1 @@
+man/pyhoca-cli.1
\ No newline at end of file
diff --git a/debian/rules b/debian/rules
new file mode 100755
index 00000000..ecc98712
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,24 @@
+#!/usr/bin/make -f
+# debian/rules file - for pyhoca-cli
+# Based on sample debian/rules file - for GNU Hello (1.3).
+# Copyright 2010 by Mike Gabriel
+
+#PYVERS=$(shell pyversions -vr)
+
+%:
+       dh ${@}
+
+build:
+       dh ${@}
+
+install:
+       dh ${@}
+
+
+binary-indep:
+       dh ${@}
+
+clean:
+       rm -Rfv debian/pyhoca-cli debian/pyhoca-cli.*.debhelper 
debian/pyhoca-cli.substvars
+       rm -Rfv debian/tmp debian/patches
+       dh ${@}
diff --git a/debian/source/format b/debian/source/format
new file mode 100644
index 00000000..163aaf8d
--- /dev/null
+++ b/debian/source/format
@@ -0,0 +1 @@
+3.0 (quilt)
diff --git a/man/pyhoca-cli.1 b/man/pyhoca-cli.1
new file mode 100644
index 00000000..79fae870
--- /dev/null
+++ b/man/pyhoca-cli.1
@@ -0,0 +1,174 @@
+'\" -*- coding: utf-8 -*-
+.if \n(.g .ds T< \\FC
+.if \n(.g .ds T> \\F[\n[.fam]]
+.de URL
+\\$2 \(la\\$1\(ra\\$3
+..
+.if \n(.g .mso www.tmac
+.TH pyhoca-cli 1 "21 Sep 2010" "Version 0.0.6" "X2go Application"
+.SH NAME
+pyhoca-cli \- X2go command line client written in Python
+.SH SYNOPSIS
+'nh
+.fi
+.ad l
+\fBpyhoca-cli\fR \kx
+.if (\nx>(\n(.l/2)) .nr x (\n(.l/5)
+'in \n(.iu+\nxu
+[
+\fIoptions\fR
+]
+'in \n(.iu-\nxu
+.ad b
+'hy
+.SH DESCRIPTION
+\fBpyhoca-cli\fR is an X2go command line client written in Python.
+.PP
+You can use it 
+for scripting remote X2go sessions or simply starting, resuming or shadowing 
X2go sessions from
+the command line in a terminal. 
+.PP
+It supports versatile
+command line options as well as parsing \fBx2goclient\fR configuration
+files.
+.PP
+See the included README and TODO for further information on \fBpyhoca-cli\fR.
+.SH COMMON OPTIONS
+\fBpyhoca-cli\fR accepts the following common options:
+.TP
+\*(T<\fB\-h, \-\-help\fR\*(T> 
+Display a help with all available command line options and exit.
+.TP 
+\*(T<\fB\-V, \-\-version\fR\*(T> 
+Output version information and exit.
+.TP 
+\*(T<\fB\-d, \-\-debug\fR\*(T> 
+Enable debugging output.
+.TP 
+\*(T<\fB\-\-libdebug\fR\*(T> 
+Enable debugging code of the unterlying Python X2go module.
+.TP 
+\*(T<\fB\-\-libdebug-sftpxfer\fR\*(T> 
+Enable debugging code of Python X2go\'s sFTP server code (very verbose, and it 
may even reveal promiscuous data).
+.SH SERVER
+.TP
+\*(T<\fB\-\-server\fR \fI<HOSTNAME_or_IP>\fR\*(T> 
+If not in LDAP mode you always have to name the remote X2go server's hostname 
or IP address.
+.SH ACTIONS
+\fBpyhoca-cli\fR accepts exclusively one of the listed actions:
+.TP
+\*(T<\fB\-N, \-\-new\fR\*(T> 
+Start a new X2go session on server (default mode if no mode is explicitly 
specified).
+.TP 
+\*(T<\fB\-R, \-\-resume\fR \fI<SESSION_NAME>\fR\*(T> 
+Resume existing X2go session <SESSION_NAME> on server.
+.TP 
+\*(T<\fB\-S, \-\-suspend\fR \fI<SESSION_NAME>\fR\*(T> 
+Suspend running X2go session <SESSION_NAME>.
+.TP 
+\*(T<\fB\-T, \-\-terminate\fR \fI<SESSION_NAME>\fR\*(T> 
+Terminate running X2go session <SESSION_NAME> .
+.TP 
+\*(T<\fB\-L, \-\-list-sessions\fR\*(T> 
+List user's X2go sessions on server.
+.TP 
+\*(T<\fB\-I, \-\-import-session\fR\*(T> 
+NOT IMPLEMENTED YET: Import a session from an x2goclient config file and run 
it (requires \fB\-\-config\fR option).
+.SH X2GO OPTIONS
+.TP
+\*(T<\fB\-\-config\fR \fI<CONFIG_FILENAME>\fR\*(T> 
+NOT IMPLEMENTED YET: X2goclient config file containing x2go client session 
settings (default: ~/.x2goclient/sessions).
+.TP 
+\*(T<\fB\-c, \-\-command\fR \fI<CMD>\fR\*(T> 
+Command to run with \fB\-\-new\fR mode on server (default: xterm).
+.TP 
+\*(T<\fB\-u, \-\-username\fR \fI<USERNAME>\fR\*(T> 
+Username for the session (default: currently logged in user).
+.TP 
+\*(T<\fB\-p, \-\-password\fR \fI<secret>\fR\*(T> 
+User password, usage not recommended directly from the command line, useful 
for scripting, though (default: not set).
+.TP 
+\*(T<\fB\-r, \-\-remote-ssh-port\fR \fI<R_PORT>\fR\*(T> 
+Remote X2go server's SSH port (default: 22).
+.TP 
+\*(T<\fB\-k, \-\-ssh-privkey\fR \fI<SSH_PRIVKEY>\fR\*(T> 
+Use file <SSH_PRIVKEY> as private key for SSH connections (default: 
~/.ssh/id_rsa).
+.TP 
+\*(T<\fB\-\-add\-to\-known\-hosts\fR\*(T> 
+Add RSA/DSA host key to ~/.ssh/known_hosts if authenticity of server can't be 
established (default: not set).
+.TP 
+\*(T<\fB\-\-sound\fR \fI{pulse|esd|none}\fR\*(T> 
+X2go server's sound system (default: 'pulse').
+.TP 
+\*(T<\fB\-F, \-\-share-local-folders\fR \fI<folder1>[,<folder2>[,...]]\fR\*(T> 
+A comma separated list of local folders that shall be made available in the 
remote X2go session.
+.TP 
+\*(T<\fB\-\-printing\fR\*(T> 
+Use X2go printing (default: disabled).
+.TP 
+\*(T<\fB\-\-clean-sessions\fR\*(T> 
+Clean all of the user's suspended sessions before starting a new one on the 
named X2go server.
+.TP 
+\*(T<\fB\-\-time-to-wait\fR\*(T> 
+Time to wait for session startup/resume (default: 8s). There should be no need 
to touch this, unless on very slow network connections.
+.SH LDAP OPTIONS
+LDAP support is planned to be added into \fBpyhoca-cli\fR in the near future. 
So stay tuned...
+.PP
+.SH NX OPTIONS (Version 3) 
+.TP
+\*(T<\fB\-g, \-\-geometry\fR \fI{<WIDTH>x<HEIGHT>|fullscreen}\fR\*(T> 
+Screen geometry (default: '800x600').
+.TP 
+\*(T<\fB\-q, \-\-link\fR \fI{modem|isdn|adsl|wan|lan}\fR\*(T> 
+link quality (default: 'adsl')
+.TP 
+\*(T<\fB\-t, \-\-session\-type\fR \fI{desktop|application}\fR\*(T> 
+Session type (default: 'application'). Note: there are also some 
auto-detection 
+feature for the session type built into the code. 
+It might not always happen what you expect from setting this option.
+.TP 
+\*(T<\fB\-p, \-\-pack\-type\fR \fI<PACK_METHOD>\fR\*(T>
+Compression methods (see below for possible values).
+.TP 
+\*(T<\fB\-\-kbd\-layout\fR \fI{us|de|fr|...}\fR\*(T>
+Use keyboard layout (default: 'us').
+.TP 
+\*(T<\fB\-\-kbd\-type\fR \fI{pc105/us|pc105/de|...}\fR\*(T>
+Set Keyboard type (default 'pc105/us').
+.SH COMPATIBILITY OPTIONS
+\fBpyhoca-cli\fR aims at being fully compatible with all command line options 
and session config files of the X2go project's X2go command
+line client \fBx2goclient-cli\fR as well as the \fBx2goclient\fR GUI. 
+To achieve this, some compatibility options have 
+been added (\fBx2goclient-cli\fR compatibility only, for now):
+.TP
+\*(T<\fB\-\-port\fR \fI<R_PORT>\fR\*(T>
+Compatibility option, synonymous to \fB\-\-remote\-ssh\-port\fR \fI<R_PORT>\fR.
+.TP 
+\*(T<\fB\-\-ssh\-key\fR \fI<SSH_PRIVKEY>\fR\*(T>
+Compatibility option, synonymous to \fB\-\-ssh-privkey\fR \fISSH_KEY\fR.
+.TP 
+\*(T<\fB\-\-use\-sound\fR \fI{yes|no}\fR\*(T>
+Compatibility option, synonymous to \fB\-\-sound\fR \fI{pulse|none}\fR.
+.TP 
+\*(T<\fB\-\-client-ssh-port\fR \fI<PORT>\fR\*(T> 
+Compatibility option for the x2goclient GUI. PyHoca-Cli (resp. Python X2go) 
brings its own internal sFTP server. Thus, this option will be ignored.
+.SH NX COMPRESSION METHODS
+As NX compression methods (\fB--pack\fR options) the following values are 
possible. The % character must be replaced by a digit 0-9.
+.PP
+nopack, 8, 64, 256, 512, 4k, 32k, 64k, 256k, 2m, 16m
+256-rdp, 256-rdp-compressed, 32k-rdp, 32k-rdp-compressed, 64k-rdp
+64k-rdp-compressed, 16m-rdp, 16m-rdp-compressed
+rfb-hextile, rfb-tight, rfb-tight-compressed
+8-tight, 64-tight, 256-tight, 512-tight, 4k-tight, 32k-tight
+64k-tight, 256k-tight, 2m-tight, 16m-tight
+8-jpeg-%, 64-jpeg, 256-jpeg, 512-jpeg, 4k-jpeg, 32k-jpeg
+64k-jpeg, 256k-jpeg, 2m-jpeg, 16m-jpeg-%
+8-png-jpeg-%, 64-png-jpeg, 256-png-jpeg, 512-png-jpeg, 4k-png-jpeg
+32k-png-jpeg, 64k-png-jpeg, 256k-png-jpeg, 2m-png-jpeg, 16m-png-jpeg-%
+8-png-%, 64-png, 256-png, 512-png, 4k-png
+32k-png, 64k-png, 256k-png, 2m-png, 16m-png-%
+16m-rgb-%, 16m-rle-%
+.SH "SEE ALSO"
+\fB/usr/share/doc/python-x2go\fR
+.SH AUTHOR
+This manual has been written by Mike Gabriel <m.gabr...@das-netzwerkteam.de>
diff --git a/pyhoca-cli b/pyhoca-cli
new file mode 100755
index 00000000..12da2004
--- /dev/null
+++ b/pyhoca-cli
@@ -0,0 +1,502 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+"""
+    Copyright (C) 2010 by Mike Gabriel <m.gabr...@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.sawat...@web.de>
+"""
+
+
+###
+### module section
+###
+
+import sys, os
+import time
+import argparse
+import getpass
+import x2go
+import paramiko
+from types import *
+
+# for debugging
+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
+
+# version information
+PROG_NAME = os.path.basename(sys.argv[0])
+PROG_PID  = os.getpid()
+VERSION="0.0.14"
+VERSION_TEXT="""
+%s[%s] - an X2go command line client written in Python
+----------------------------------------------------------------------
+developed by Mike Gabriel <m.gabr...@das-netzwerkteam.de>
+
+VERSION: %s
+
+""" % (PROG_NAME, PROG_PID, VERSION)
+
+
+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
+###
+
+# exclusive client control options
+action_options =   [ 
+                   {'args':['-N','--new'], 'default': False, 'action': 
'store_true', 'help': 'start a new X2go session on server (default)', },
+                   {'args':['-R','--resume'], 'default': None, 'metavar': 
'SESSION_NAME', 'help': 'resume a suspended X2go session with name 
SESSION_NAME', },
+                   {'args':['-S','--suspend'], 'default': None, 'metavar': 
'SESSION_NAME', 'help': 'suspend running X2go session SESSION_NAME', },
+                   {'args':['-T','--terminate'], 'default': None, 'metavar': 
'SESSION_NAME', 'help': 'terminate running X2go session SESSION_NAME', },
+                   {'args':['-L','--list-sessions'], 'default': False, 
'action': 'store_true', 'help': 'list user\'s X2go sessions on server', },
+                   # NOT IMPLEMENTED {'args':['-I','--import-session'], 
'default': False, 'action': 'store_true', 'help': 'import a session from an 
x2goclient config file and run it', },
+                 ]
+# debug options...
+debug_options =  [ 
+                   {'args':['-d','--debug'], 'default': False, 'action': 
'store_true', 'help': 'enable application debugging code', },
+                   {'args':['--libdebug'], 'default': False, 'action': 
'store_true', 'help': 'enable debugging code of the underlying Python X2go 
module', },
+                   {'args':['--libdebug-sftpxfer'], 'default': False, 
'action': 'store_true', 'help': 'enable debugging code of Python X2go\'s sFTP 
server code (very verbose, and even promiscuous)', },
+                   {'args':['-V', '--version'], 'default': False, 'action': 
'store_true', 'help': 'print version number and exit', },
+                 ]
+# possible programme options are
+x2go_options =   [ 
+                   # NOT IMPLEMENTED {'args':['--config'], 'default': 
'~/.x2goclient/sessions', 'help': 'x2goclient config file containing x2go 
session settings (default: ~/.x2goclient/sessions)', },
+                   {'args':['-c','--command'], 'default': 'TERMINAL', 'help': 
'command to run with -R mode on server (default: xterm)', },
+                   {'args':['-u','--username'], 'default': None, 'help': 
'username for the session (default: current user)', },
+                   {'args':['-p','--password'], 'default': None, 'help': 'user 
password (not recommended from the command line, default: not set)', },
+                   {'args':['-r','--remote-ssh-port'], 'default': '22', 
'help': 'remote SSH port (default: 22)', },
+                   {'args':['-k','--ssh-privkey'], 'default': None, 'help': 
'use file \'SSH_PRIVKEY\' as private key for the SSH connection (e.g. 
~/.ssh/id_rsa)', },
+                   {'args':['--add-to-known-hosts'], 'default': False, 
'action': 'store_true', 'help': 'add RSA host key fingerprint to 
~/.ssh/known_hosts if authenticity of server can\'t be established (default: 
not set)', },
+                   {'args':['--sound'], 'default': 'pulse', 'choices': 
('pulse', 'esd', 'none'), 'help': 'X2go server sound system (default: 
\'pulse\')', },
+                   {'args':['--printing'], 'default': False, 'action': 
'store_true', 'help': 'use X2go printing (default: disabled)', },
+                   {'args':['-F', '--share-local-folders'], 'metavar': 
'<folder1>[,<folder2[,...]]', 'default': None, 'help': 'a comma separated list 
of local folder names to mount in the X2go session', },
+                   {'args':['--clean-sessions'], 'default': False, 'action': 
'store_true', 'help': 'clean all suspended sessions before starting a new one', 
},
+                   {'args':['--time-to-wait'], 'default': '8', 'help': 'time 
to wait for session startup/resume (default: 8s)', },
+                 ]
+print_options =  [ 
+                   {'args':['--print-action'], 'default': 'PDFVIEW', 
'choices': PRINT_ACTIONS, 'help': 'action to be performed for incoming X2go 
print jobs (default: \'PDFVIEW\')', },
+                   {'args':['--pdfview-cmd'], 'default': None, 'help': 'PDF 
viewer command for displaying incoming X2go print jobs (default: \'%s\'); this 
option selects \'--print-action PDFVIEW\'' % DEFAULT_PDFVIEW_CMD,},
+                   {'args':['--save-to-folder'], 'default': None, 'metavar': 
'PRINT_DEST', 'help': 'save print jobs as PDF files to folder PRINT_DEST 
(default: \'%s\'); this option selects \'--print-action PDFSAVE\'' % 
DEFAULT_PDFSAVE_LOCATION,},
+                   {'args':['--printer'], 'default': None, 'help': 'target 
CUPS print queue for incoming X2go print jobs (default: CUPS default printer); 
this option selects \'--print-action CUPS\'',},
+                   {'args':['--print-cmd'], 'default': None, 'help': 'print 
command including cmd line arguments (default: \'%s\'); this option selects 
\'--print-action PRINTCMD\'' % DEFAULT_PRINTCMD_CMD,},
+                 ]
+nx_options =     [ 
+                   {'args':['-g','--geometry'], 'default': '800x600','help': 
'screen geometry: \'<width>x<height>\' or \'fullscreen\' (default: 
\'800x600\')',},
+                   {'args':['-q','--link'], 'default': 'adsl', 'choices': 
('modem','isdn','adsl','wan','lan'), 'help': 'link quality (default: 
\'adsl\')',},
+                   {'args':['-t','--session-type'], 'default': 'application', 
'choices': ('desktop', 'application'), 'help': 'session type (default: 
\'application\')', },
+                   {'args':['--pack'], 'default': '16m-jpeg-9', 'help': 
'compression methods (see below for possible values)', },
+                   {'args':['--kbd-layout'], 'default': 'us', 'help': 'use 
keyboard layout (default: \'us\')',},
+                   {'args':['--kbd-type'], 'default': 'pc105/us', 'help': 'set 
Keyboard type (default: \'pc105/us\')',},
+                 ]
+compat_options = [ 
+                   {'args':['--port'], 'default': None, 'help': 'compatibility 
option, synonymous to --remote-ssh-port PORT', },
+                   {'args':['--ssh-key'], 'default': None, 'help': 
'compatibility option, synonymous to --ssh-privkey SSH_KEY', },
+                   {'args':['--use-sound'], 'default': None, 'choices': 
('yes', 'no'), 'help': 'compatibility option, synonymous to --sound 
{pulse|none}', },
+                   {'args':['--client-ssh-port'], 'default': None, 'help': 
'compatibility option for the x2goclient GUI; as Python X2go brings its own 
internal SFTP server, this option will be ignored', },
+                 ]
+
+
+###
+### beginning of code
+###
+
+# print version text and exit
+def version():
+
+    sys.stderr.write ("%s\n" % VERSION_TEXT)
+    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
+
+    p = argparse.ArgumentParser(description='X2go command line client 
implemented in Python.',\
+                                epilog="""
+Possible values for the --pack NX option are: 
+    %s
+""" % x2go.defaults.pack_methods_nx3_formatted, \
+                                
formatter_class=argparse.RawDescriptionHelpFormatter, \
+                                add_help=True, argument_default=None)
+    p_reqargs = p.add_argument_group('X2go server name is always required')
+    p_reqargs.add_argument('--server', help='server hostname or IP address')
+    p_actionopts = p.add_argument_group('client actions')
+    p_debugopts = p.add_argument_group('debug options')
+    p_x2goopts = p.add_argument_group('X2go options')
+    p_printopts = p.add_argument_group('X2go print options')
+    p_nxopts = p.add_argument_group('NX options')
+    p_compatopts = p.add_argument_group('compatibility options')
+
+    for (p_group, opts) in ((p_x2goopts, x2go_options), (p_printopts, 
print_options), (p_actionopts, action_options), (p_debugopts, debug_options), 
(p_nxopts, nx_options), (p_compatopts, compat_options)):
+        required = False
+        for opt in opts:
+
+            args = opt['args']
+            del opt['args']
+            p_group.add_argument(*args, **opt)
+
+    a = p.parse_args()
+
+    if a.debug:
+        logger.set_loglevel_debug()
+
+    if a.libdebug:
+        liblogger.set_loglevel_debug()
+
+    if a.libdebug_sftpxfer:
+        liblogger.enable_debug_sftpxfer()
+
+    if a.version:
+        version()
+
+    # the --server options is required for most operations
+    if not a.server:
+        runtime_error ("argument --server is required", parser=p, exitcode=1)
+
+    # check for mutual exclusiveness of -N, -R, -S, -T and -L, -N is default 
if none of them is set
+    if bool(a.new) + bool(a.resume) + bool(a.suspend) + bool(a.terminate) + 
bool(a.list_sessions) > 1:
+        runtime_error ("modes --new, --resume, --suspend, --terminate and 
--list-sessions are mutually exclusive", parser=p, exitcode=2)
+    if bool(a.new) + bool(a.resume) + bool(a.suspend) + bool(a.terminate) + 
bool(a.list_sessions) == 0:
+        a.new = True
+
+    # check if pack method is available
+    if not x2go.utils.is_in_nx3packmethods(a.pack):
+        runtime_error("unknown pack method '%s'" % args.pack, parser=p, 
exitcode=10)
+
+    # if no username is given we use the uid under which this programme is run
+    if a.username is None:
+        a.username = current_user
+
+    # time-to-wait needs to be an integer
+    try:
+        a.time_to_wait = int(a.time_to_wait)
+    except ValueError:
+        runtime_error("--time_to_wait value needs to be an integer value", 
parser=p, exitcode=80)
+
+    # X2go printing
+    if ((a.pdfview_cmd and a.printer) or
+        (a.pdfview_cmd and a.save_to_folder) or
+        (a.pdfview_cmd and a.print_cmd) or
+        (a.printer    and a.save_to_folder) or
+        (a.printer    and a.print_cmd) or
+        (a.print_cmd  and a.save_to_folder)):
+        runtime_error("--pdfviewer, --save-to-folder, --printer and 
--print-cmd options are mutually exclusive", parser=p, exitcode=81)
+
+    if a.pdfview_cmd:
+        a.print_action = 'PDFVIEW'
+    elif a.save_to_folder:
+        a.print_action = 'PDFSAVE'
+    elif a.printer:
+        a.print_action = 'PRINT'
+    elif a.print_cmd:
+        a.print_action = 'PRINTCMD'
+
+    if a.pdfview_cmd is None and a.print_action == 'PDFVIEW':
+        a.pdfview_cmd = DEFAULT_PDFVIEW_CMD
+
+    if a.save_to_folder is None and a.print_action == 'PDFSAVE':
+        a.save_to_folder = DEFAULT_PDFSAVE_LOCATION
+
+    if a.printer is None and a.print_action == 'PRINT':
+        # None means CUPS default printer...
+        a.printer = None
+
+    if a.print_cmd is None and a.print_action == 'PRINTCMD':
+        a.print_cmd = DEFAULT_PRINTCMD_CMD
+
+    if a.pdfview_cmd:
+        print_action_args={'pdfview_cmd': a.pdfview_cmd, }
+    elif a.save_to_folder:
+        print_action_args={'save_to_folder': a.save_to_folder, }
+    elif a.printer:
+        print_action_args={'printer': a.printer, }
+    elif a.print_cmd:
+        print_action_args={'print_cmd': a.print_cmd, }
+
+    ### take care of compatibility options
+    # option --use-sound yes as synonomyn for --sound
+    if a.use_sound is not None: 
+        if a.use_sound == 'yes': a.sound = 'pulse'
+        if a.use_sound == 'no':  a.sound = 'none'
+
+    if a.ssh_key is not None:
+        a.ssh_privkey = a.ssh_key
+
+    if a.port is not None:
+        a.remote_ssh_port = a.port
+
+    if a.share_local_folders is not None:
+        a.share_local_folders = a.share_local_folders.split(',')
+
+    ###
+    ### initialize SSH context
+    ###
+    # check if SERVER is in .ssh/config file, extract information from there...
+    ssh_config = paramiko.SSHConfig()
+    ssh_config_fileobj = open(ssh_config_filename)
+    ssh_config.parse(ssh_config_fileobj)
+    ssh_host = ssh_config.lookup(a.server)
+    if ssh_host:
+        if 'hostname' in ssh_host.keys():
+            a.server = ssh_host['hostname']
+        if 'port' in ssh_host.keys():
+            a.remote_ssh_port = ssh_host['port']
+    ssh_config_fileobj.close()
+    # check if ssh priv key exists
+    if a.ssh_privkey and not os.path.isfile(a.ssh_privkey):
+        runtime_error("SSH private key %s file does not exist." % 
a.ssh_privkey, parser=p, exitcode=30)
+    if not a.ssh_privkey and os.path.isfile('%s/.ssh/id_rsa' % current_home):
+        a.ssh_privkey = '%s/.ssh/id_rsa' % current_home
+    if not a.ssh_privkey and os.path.isfile('%s/.ssh/id_dsa' % current_home):
+        a.ssh_privkey = '%s/.ssh/id_dsa' % current_home
+
+    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()
+
+    # initialize the X2GoClient context and start the connection to the X2go 
server
+    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, )
+
+        sys.exit(0)
+
+    except (KeyboardInterrupt, SystemExit), e:
+        x2go.x2go_cleanup(e)
+
diff --git a/x2go b/x2go
new file mode 120000
index 00000000..64abb4d8
--- /dev/null
+++ b/x2go
@@ -0,0 +1 @@
+../../../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
_______________________________________________
x2go-commits mailing list
x2go-commits@lists.x2go.org
https://lists.x2go.org/listinfo/x2go-commits

Reply via email to