This is an automated email from the git hooks/post-receive script. x2go pushed a change to branch telekinesis in repository x2goserver. at 80b0986 intermediate commit This branch includes the following new commits: new 80b0986 intermediate commit The 1 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. -- Alioth's /srv/git/_hooks_/post-receive-email on /srv/git/code.x2go.org/x2goserver.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch telekinesis in repository x2goserver. commit 80b098698107e8f6e17d7f61f97556d02b076c7a Author: Mike Gabriel <mike.gabriel@das-netzwerkteam.de> Date: Sat Mar 29 00:00:42 2014 +0100 intermediate commit --- X2Go/Server/DB/PostgreSQL.pm | 25 +++++++++---- X2Go/Server/DB/SQLite3.pm | 31 +++++++++++----- debian/control | 1 + x2goserver-common/etc/x2goserver.conf | 5 +++ x2goserver.spec | 1 + x2goserver/bin/x2goresume-session | 36 ++++++++++++++++--- x2goserver/bin/x2gostartagent | 20 +++++++++-- x2goserver/lib/x2gocreatesession | 4 ++- x2goserver/lib/x2goresume | 5 +-- x2goserver/sbin/x2godbadmin | 64 ++++++++++++++++++++++++++++++--- 10 files changed, 162 insertions(+), 30 deletions(-) diff --git a/X2Go/Server/DB/PostgreSQL.pm b/X2Go/Server/DB/PostgreSQL.pm index 77a593e..e49a87d 100644 --- a/X2Go/Server/DB/PostgreSQL.pm +++ b/X2Go/Server/DB/PostgreSQL.pm @@ -139,7 +139,7 @@ sub dbsys_listsessionsroot my $sth=$dbh->prepare("select agent_pid, session_id, display, server, status, to_char(init_time,'YYYY-MM-DD\"T\"HH24:MI:SS'),cookie,client,gr_port, sound_port,to_char(last_time,'YYYY-MM-DD\"T\"HH24:MI:SS'),uname, - to_char(now()-init_time,'SSSS'),fs_port from sessions + to_char(now()-init_time,'SSSS'),fs_port,tekictrl_port,tekidata_port from sessions where server='$server' order by status desc"); $sth->execute()or die; my @data; @@ -161,7 +161,7 @@ sub dbsys_listsessionsroot_all my $sth=$dbh->prepare("select agent_pid, session_id, display, server, status, to_char(init_time,'YYYY-MM-DD\"T\"HH24:MI:SS'),cookie,client,gr_port, sound_port,to_char(last_time,'YYYY-MM-DD\"T\"HH24:MI:SS'),uname, - to_char(now()-init_time,'SSSS'),fs_port from sessions + to_char(now()-init_time,'SSSS'),fs_port,tekictrl_port,tekidata_port from sessions order by status desc"); $sth->execute()or die; my @data; @@ -292,12 +292,18 @@ sub db_createsession $snd_port = sanitizer('num', $snd_port) or die "argument \"snd_port\" malformed"; my $fs_port=shift or die"argument \"fs_port\" missed"; $fs_port = sanitizer('num', $fs_port) or die "argument \"fs_port\" malformed"; + my $tekictrl_port=shift or die"argument \"tekictrl_port\" missed"; + $tekictrl_port = sanitizer('num', $tekictrl_port) or die "argument \"tekictrl_port\" malformed"; + my $tekidata_port=shift or die"argument \"tekidata_port\" missed"; + $tekidata_port = sanitizer('num', $tekidata_port) or die "argument \"tekidata_port\" malformed"; my $sid=shift or die "argument \"session_id\" missed"; $sid = sanitizer('pnixusername', $sid) or die "argument \"session_id\" malformed"; my $dbh=DBI->connect("dbi:Pg:dbname=$db;host=$host;port=$port;sslmode=$sslmode", "$dbuser", "$dbpass",{AutoCommit => 1}) or die $_; my $sth=$dbh->prepare("update sessions_view set status='R',last_time=now(), cookie='$cookie',agent_pid='$pid',client='$client',gr_port='$gr_port', - sound_port='$snd_port',fs_port='$fs_port' where session_id='$sid'"); + sound_port='$snd_port',fs_port='$fs_port',tekictrl_port='$tekictrl_port', + tekidata_port='$tekidata_port' + where session_id='$sid'"); $sth->execute()or die; $sth->finish(); $dbh->disconnect(); @@ -343,9 +349,14 @@ sub db_resume $snd_port = sanitizer('num', $snd_port) or die "argument \"snd_port\" malformed"; my $fs_port=shift or die "argument \"fs_port\" missed"; $fs_port = sanitizer('num', $fs_port) or die "argument \"fs_port\" malformed"; + my $tekictrl_port=shift or die"argument \"tekictrl_port\" missed"; + $tekictrl_port = sanitizer('num', $tekictrl_port) or die "argument \"tekictrl_port\" malformed"; + my $tekidata_port=shift or die"argument \"tekidata_port\" missed"; + $tekidata_port = sanitizer('num', $tekidata_port) or die "argument \"tekidata_port\" malformed"; my $dbh=DBI->connect("dbi:Pg:dbname=$db;host=$host;port=$port;sslmode=$sslmode", "$dbuser", "$dbpass",{AutoCommit => 1}) or die $_; my $sth=$dbh->prepare("update sessions_view set last_time=now(),status='R',client='$client',gr_port='$gr_port', - sound_port='$snd_port',fs_port='$fs_port' where session_id = '$sid'"); + sound_port='$snd_port',fs_port='$fs_port',tekictrl_port='$tekictrl_port', + tekidata_port='$tekidata_port' where session_id = '$sid'"); $sth->execute()or die; $sth->finish(); $dbh->disconnect(); @@ -492,8 +503,8 @@ sub db_listsessions my $sth=$dbh->prepare("select agent_pid, session_id, display, server, status, to_char(init_time,'YYYY-MM-DD\"T\"HH24:MI:SS'), cookie, client, gr_port, sound_port, to_char( last_time, 'YYYY-MM-DD\"T\"HH24:MI:SS'), uname, - to_char(now()- init_time,'SSSS'), fs_port from sessions_view - where status !='F' and server='$server' and + to_char(now()- init_time,'SSSS'), fs_port, tekictrl_port, tekidata_port from sessions_view + where status !='F' and server='$server' and (session_id not like '%XSHAD%') order by status desc"); $sth->execute() or die; my @data; @@ -515,7 +526,7 @@ sub db_listsessions_all my $sth=$dbh->prepare("select agent_pid, session_id, display, server, status, to_char(init_time,'YYYY-MM-DD\"T\"HH24:MI:SS'), cookie, client, gr_port, sound_port, to_char( last_time, 'YYYY-MM-DD\"T\"HH24:MI:SS'), uname, - to_char(now()- init_time,'SSSS'), fs_port from sessions_view + to_char(now()- init_time,'SSSS'), fs_port, tekictrl_port, tekidata_port from sessions_view where status !='F' and (session_id not like '%XSHAD%') order by status desc"); $sth->execute()or die; diff --git a/X2Go/Server/DB/SQLite3.pm b/X2Go/Server/DB/SQLite3.pm index c3737ad..dacc3bc 100644 --- a/X2Go/Server/DB/SQLite3.pm +++ b/X2Go/Server/DB/SQLite3.pm @@ -41,8 +41,9 @@ use POSIX; #### It is intended that the code in this package cannot do system() calls. use Sys::Syslog qw( :standard :macros ); +use X2Go::Config qw( get_config ); use X2Go::Log qw( loglevel ); -use X2Go::Utils qw( sanitizer ); +use X2Go::Utils qw( sanitizer is_true ); openlog($0,'cons,pid','user'); setlogmask( LOG_UPTO(loglevel()) ); @@ -95,7 +96,8 @@ sub dbsys_listsessionsroot cookie,client,gr_port,sound_port, strftime('%Y-%m-%dT%H:%M:%S',last_time), uname, - strftime('%s','now','localtime') - strftime('%s',init_time),fs_port from sessions + strftime('%s','now','localtime') - strftime('%s',init_time),fs_port, + tekictrl_port, tekidata_port from sessions where server=? order by status desc"); $sth->execute($server); if ($sth->err()) { @@ -118,7 +120,8 @@ sub dbsys_listsessionsroot_all cookie,client,gr_port,sound_port, strftime('%Y-%m-%dT%H:%M:%S',last_time), uname, - strftime('%s','now','localtime') - strftime('%s',init_time),fs_port from sessions + strftime('%s','now','localtime') - strftime('%s',init_time),fs_port, + tekictrl_port, tekidata_port from sessions order by status desc"); $sth->execute(); if ($sth->err()) @@ -258,12 +261,16 @@ sub db_createsession $snd_port = sanitizer('num', $snd_port) or die "argument \"snd_port\" malformed"; my $fs_port=shift or die"argument \"fs_port\" missed"; $fs_port = sanitizer('num', $fs_port) or die "argument \"fs_port\" malformed"; + my $tekictrl_port=shift or die"argument \"tekictrl_port\" missed"; + $tekictrl_port = sanitizer('num', $tekictrl_port) or die "argument \"tekictrl_port\" malformed"; + my $tekidata_port=shift or die"argument \"tekidata_port\" missed"; + $tekidata_port = sanitizer('num', $tekidata_port) or die "argument \"tekidata_port\" malformed"; my $sid=shift or die "argument \"session_id\" missed"; $sid = sanitizer('pnixusername', $sid) or die "argument \"session_id\" malformed"; check_user($sid); my $sth=$dbh->prepare("update sessions set status='R',last_time=datetime('now','localtime'),cookie=?,agent_pid=?, - client=?,gr_port=?,sound_port=?,fs_port=? where session_id=? and uname=?"); - $sth->execute($cookie, $pid, $client, $gr_port, $snd_port, $fs_port, $sid, $realuser); + client=?,gr_port=?,sound_port=?,fs_port=?,tekictrl_port=?,tekidata_port=? where session_id=? and uname=?"); + $sth->execute($cookie, $pid, $client, $gr_port, $snd_port, $fs_port, $tekictrl_port, $tekidata_port, $sid, $realuser); if ($sth->err()) { syslog('error', "createsession (SQLite3 session db backend) failed with exitcode: $sth->err()"); @@ -355,10 +362,14 @@ sub db_resume $snd_port = sanitizer('num', $snd_port) or die "argument \"snd_port\" malformed"; my $fs_port=shift or die "argument \"fs_port\" missed"; $fs_port = sanitizer('num', $fs_port) or die "argument \"fs_port\" malformed"; + my $tekictrl_port=shift or die"argument \"tekictrl_port\" missed"; + $tekictrl_port = sanitizer('num', $tekictrl_port) or die "argument \"tekictrl_port\" malformed"; + my $tekidata_port=shift or die"argument \"tekidata_port\" missed"; + $tekidata_port = sanitizer('num', $tekidata_port) or die "argument \"tekidata_port\" malformed"; check_user($sid); my $sth=$dbh->prepare("update sessions set last_time=datetime('now','localtime'),status='R', - client=?,gr_port=?,sound_port=?,fs_port=? where session_id = ? and uname=?"); - $sth->execute($client, $gr_port, $snd_port, $fs_port, $sid, $realuser); + client=?,gr_port=?,sound_port=?,fs_port=?,tekictrl_port=?,tekidata_port=? where session_id = ? and uname=?"); + $sth->execute($client, $gr_port, $snd_port, $fs_port, $tekictrl_port, $tekidata_port, $sid, $realuser); if ($sth->err()) { syslog('error', "resume (SQLite3 session db backend) failed with exitcode: $sth->err()"); @@ -542,7 +553,8 @@ sub db_listsessions cookie,client,gr_port,sound_port, strftime('%Y-%m-%dT%H:%M:%S',last_time), uname, - strftime('%s','now','localtime') - strftime('%s',init_time),fs_port from sessions + strftime('%s','now','localtime') - strftime('%s',init_time),fs_port, + tekictrl_port,tekidata_port from sessions where status !='F' and server=? and uname=? and ( session_id not like '%XSHAD%') order by status desc"); $sth->execute($server, $realuser); @@ -566,7 +578,8 @@ sub db_listsessions_all cookie,client,gr_port,sound_port, strftime('%Y-%m-%dT%H:%M:%S',last_time), uname, - strftime('%s','now','localtime') - strftime('%s',init_time),fs_port from sessions + strftime('%s','now','localtime') - strftime('%s',init_time),fs_port, + tekictrl_port,tekidata_port from sessions where status !='F' and uname=? and ( session_id not like '%XSHAD%') order by status desc"); $sth->execute($realuser); diff --git a/debian/control b/debian/control index 53f6053..83aa07b 100644 --- a/debian/control +++ b/debian/control @@ -21,6 +21,7 @@ Depends: ${misc:Depends}, libfile-basedir-perl, libfile-readbackwards-perl, + libtry-tiny-perl, libx2go-server-perl (>= ${source:Version}), libx2go-server-db-perl (<< ${source:Version}.1~), x2goagent (>= 2:3.5.0.15-0~), lsof, diff --git a/x2goserver-common/etc/x2goserver.conf b/x2goserver-common/etc/x2goserver.conf index 4f055b0..51e4704 100644 --- a/x2goserver-common/etc/x2goserver.conf +++ b/x2goserver-common/etc/x2goserver.conf @@ -25,6 +25,11 @@ enable=no # the idle nice level (for suspended sessions) #idle-nice-level=19 +[telekinesis] +# telekinesis provides a bidirectional communication framework between X2Go Client +# and X2Go Server +enable=no + [log] # possible levels are: emerg, alert, crit, err, warning, notice, info, debug loglevel=notice diff --git a/x2goserver.spec b/x2goserver.spec index f994b6e..981894a 100644 --- a/x2goserver.spec +++ b/x2goserver.spec @@ -37,6 +37,7 @@ Requires: openssh-server Requires: perl(:MODULE_COMPAT_%(eval "`%{__perl} -V:version`"; echo $version)) Requires: perl(File::ReadBackwards) Requires: perl(Capture::Tiny) +Requires: perl(Try::Tiny) # We need a database # For killall in x2gosuspend-session Requires: psmisc diff --git a/x2goserver/bin/x2goresume-session b/x2goserver/bin/x2goresume-session index 09b31dd..5306005 100755 --- a/x2goserver/bin/x2goresume-session +++ b/x2goserver/bin/x2goresume-session @@ -43,6 +43,7 @@ fi "$X2GO_LIB_PATH/x2gosyslog" "$0" "info" "$(basename $0) called with options: $@" +X2GO_TELEKINESIS_ENABLED=`echo 'use X2Go::Config qw( get_config ); use X2Go::Utils qw( is_true ); my $Config= get_config(); print is_true($Config->param("telekinesis.enable"));' | perl` # rootless sessions require to be resizable if [ "$SESSION_TYPE" == "R" ]; then @@ -97,12 +98,32 @@ if grep -q "|${FS_PORT}|" <<<$SYSTEM_PORTS ; then FS_PORT="" fi +if [ "x$X2GO_TELEKINESIS_ENABLED" == "x1" ]; then + TEKICTRL_PORT=`echo "$SESSIONINFO" | awk -F, {'print $15'}` + TEKIDATA_PORT=`echo "$SESSIONINFO" | awk -F, {'print $16'}` + if grep -q "|${TEKICTRL_PORT}|" <<<$SYSTEM_PORTS ; then + $X2GO_LIB_PATH/x2gosyslog "$0" "debug" "port "$TEKICTRL_PORT" is already in use" + $X2GO_LIB_PATH/x2gormport "$HOSTNAME" "$SESSION_NAME" "$TEKICTRL_PORT" + TEKICTRL_PORT="" + fi + if grep -q "|${TEKIDATA_PORT}|" <<<$SYSTEM_PORTS ; then + $X2GO_LIB_PATH/x2gosyslog "$0" "debug" "port "$TEKIDATA_PORT" is already in use" + $X2GO_LIB_PATH/x2gormport "$HOSTNAME" "$SESSION_NAME" "$TEKIDATA_PORT" + TEKIDATA_PORT="" + fi +else + $X2GO_LIB_PATH/x2gormport "$HOSTNAME" "$SESSION_NAME" "$TEKICTRL_PORT" + $X2GO_LIB_PATH/x2gormport "$HOSTNAME" "$SESSION_NAME" "$TEKIDATA_PORT" + TEKICTRL_PORT="0" + TEKIDATA_PORT="0" +fi + SSH_PORT=30000 #First ssh port 30001 #Get all used in system ports from X2Go database and netstat output USED_PORTS=`$X2GO_LIB_PATH/x2gogetports "$HOSTNAME"; netstat -nt -all | awk '{ n=split($0,lines,"\n"); for(i=1;i<=n;i++){split (lines[i],words," ");delim=split(words[4],ports,":"); if(delim>1)printf ("|%s|\n",ports[delim])} }'` -while [ "$GR_PORT" == "" ] || [ "$SOUND_PORT" == "" ] || [ "$FS_PORT" == "" ]; do +while [ "$GR_PORT" == "" ] || [ "$SOUND_PORT" == "" ] || [ "$FS_PORT" == "" ] || [ "$TEKICTRL_PORT" == "" ] || [ "$TEKIDATA_PORT" == "" ]; do OUTPUT="" while [ "$OUTPUT" != "inserted" ]; do SSH_PORT=$(($SSH_PORT + 1)) @@ -120,8 +141,12 @@ while [ "$GR_PORT" == "" ] || [ "$SOUND_PORT" == "" ] || [ "$FS_PORT" == "" ]; d GR_PORT="$SSH_PORT" elif [ "$SOUND_PORT" == "" ]; then SOUND_PORT="$SSH_PORT" - else + elif [ "$FS_PORT" == "" ]; then FS_PORT="$SSH_PORT" + elif [ "$TEKICTRL_PORT" == "" ]; then + TEKICTRL_PORT="$SSH_PORT" + elif [ "$TEKIDATA_PORT" == "" ]; then + TEKIDATA_PORT="$SSH_PORT" fi done @@ -182,7 +207,7 @@ rm -Rf "$SESSION_DIR/keyboard" kill -HUP "$X2GO_AGENT_PID" &>/dev/null && { - $X2GO_LIB_PATH/x2goresume "$X2GO_CLIENT" "$SESSION_NAME" "$GR_PORT" "$SOUND_PORT" "$FS_PORT" > /dev/null + $X2GO_LIB_PATH/x2goresume "$X2GO_CLIENT" "$SESSION_NAME" "$GR_PORT" "$SOUND_PORT" "$FS_PORT" "$TEKICTRL_PORT" "$TEKIDATA_PORT" > /dev/null $X2GO_LIB_PATH/x2gosyslog "$0" "notice" "client $X2GO_CLIENT has successfully resumed session with ID $SESSION_NAME" # set client-side keyboard model, type, variant, etc. @@ -215,4 +240,7 @@ kill -HUP "$X2GO_AGENT_PID" &>/dev/null && { echo "gr_port=$GR_PORT" echo "sound_port=$SOUND_PORT" echo "fs_port=$FS_PORT" - +if [ "x$X2GO_TELEKINESIS_ENABLED" == "x1" ]; then + echo "tekictrl_port=$TEKICTRL_PORT" + echo "tekidata_port=$TEKIDATA_PORT" +fi diff --git a/x2goserver/bin/x2gostartagent b/x2goserver/bin/x2gostartagent index ae8226f..76f123c 100755 --- a/x2goserver/bin/x2gostartagent +++ b/x2goserver/bin/x2gostartagent @@ -32,6 +32,8 @@ if egrep "^backend[ ]*=[ ]*postgres" /etc/x2go/x2gosql/sql 1>/dev/null 2>/dev/nu exit -1 fi +X2GO_TELEKINESIS_ENABLED=`echo 'use X2Go::Config qw( get_config ); use X2Go::Utils qw( is_true ); my $Config = get_config(); print is_true($Config->param("telekinesis.enable"));' | perl` + X2GO_ROOT="${HOME}/.x2go" export NX_ROOT=$X2GO_ROOT @@ -185,8 +187,12 @@ while [ "$OUTPUT" != "inserted" ]; do fi done +if [ "x$X2GO_TELEKINESIS_ENABLED" == "x0" ]; then + TEKICTRL_PORT="0" + TEKIDATA_PORT="0" +fi -while [ "$GR_PORT" == "" ] || [ "$SOUND_PORT" == "" ] || [ "$FS_PORT" == "" ]; do +while [ "$GR_PORT" == "" ] || [ "$SOUND_PORT" == "" ] || [ "$FS_PORT" == "" ] || [ "$TEKICTRL_PORT" == "" ] || [ "$TEKIDATA_PORT" == "" ]; do OUTPUT="" while [ "$OUTPUT" != "inserted" ]; do SSH_PORT=$(($SSH_PORT + 1)) @@ -212,8 +218,12 @@ while [ "$GR_PORT" == "" ] || [ "$SOUND_PORT" == "" ] || [ "$FS_PORT" == "" ]; d GR_PORT="$SSH_PORT" elif [ "$SOUND_PORT" == "" ]; then SOUND_PORT="$SSH_PORT" - else + elif [ "$FS_PORT" == "" ]; then FS_PORT="$SSH_PORT" + elif [ "$TEKICTRL_PORT" == "" ]; then + TEKICTRL_PORT=$SSH_PORT + elif [ "$TEKIDATA_PORT" == "" ]; then + TEKIDATA_PORT=$SSH_PORT fi done @@ -345,7 +355,7 @@ X2GO_SND_PORT=1024 if [ -n "$SHADREQ_USER" ]; then $X2GO_LIB_PATH/x2gocreateshadowsession "$X2GO_COOKIE" "$X2GO_AGENT_PID" "$X2GO_CLIENT" "$GR_PORT" "$SOUND_PORT" "$FS_PORT" "$SESSION_NAME" "$SHADREQ_USER" > /dev/null else - $X2GO_LIB_PATH/x2gocreatesession "$X2GO_COOKIE" "$X2GO_AGENT_PID" "$X2GO_CLIENT" "$GR_PORT" "$SOUND_PORT" "$FS_PORT" "$SESSION_NAME" > /dev/null + $X2GO_LIB_PATH/x2gocreatesession "$X2GO_COOKIE" "$X2GO_AGENT_PID" "$X2GO_CLIENT" "$GR_PORT" "$SOUND_PORT" "$FS_PORT" "$TEKICTRL_PORT" "$TEKIDATA_PORT" "$SESSION_NAME" > /dev/null fi if [ "$X2GO_SET_KBD" == "0" ] || [ "$X2GO_KBD_TYPE" != "auto" ]; then @@ -360,3 +370,7 @@ echo $SESSION_NAME echo $GR_PORT echo $SOUND_PORT echo $FS_PORT +if [ "x$X2GO_TELEKINESIS_ENABLED" == "x1" ]; then + echo $TEKICTRL_PORT + echo $TEKIDATA_PORT +fi diff --git a/x2goserver/lib/x2gocreatesession b/x2goserver/lib/x2gocreatesession index 94e09e6..795976e 100755 --- a/x2goserver/lib/x2gocreatesession +++ b/x2goserver/lib/x2gocreatesession @@ -36,9 +36,11 @@ my $client=shift or die; my $gr_port=shift or die; my $snd_port=shift or die; my $fs_port=shift or die; +my $tekictrl_port=shift or die; +my $tekidata_port=shift or die; my $sid=shift or die; -db_createsession($cookie,$pid,$client,$gr_port, $snd_port, $fs_port, $sid); +db_createsession($cookie,$pid,$client,$gr_port, $snd_port, $fs_port, $tekictrl_port, $tekidata_port, $sid); # closing syslog closelog; \ No newline at end of file diff --git a/x2goserver/lib/x2goresume b/x2goserver/lib/x2goresume index 3587049..5ae6966 100755 --- a/x2goserver/lib/x2goresume +++ b/x2goserver/lib/x2goresume @@ -35,8 +35,9 @@ my $sid=shift or die; my $gr_port=shift or die; my $snd_port=shift or die; my $fs_port=shift or die; - -db_resume($client, $sid, $gr_port, $snd_port, $fs_port); +my $tekictrl_port=shift or die; +my $tekidata_port=shift or die; +db_resume($client, $sid, $gr_port, $snd_port, $fs_port, $tekictrl_port, $tekidata_port); # closing syslog closelog; diff --git a/x2goserver/sbin/x2godbadmin b/x2goserver/sbin/x2godbadmin index c68072f..ca7d143 100755 --- a/x2goserver/sbin/x2godbadmin +++ b/x2goserver/sbin/x2godbadmin @@ -25,6 +25,7 @@ use Sys::Syslog qw( :standard :macros ); use File::Path qw( make_path ); use Getopt::Long; use DBI; +use Try::Tiny; use X2Go::Config qw( get_sqlconfig ); use X2Go::Log qw( loglevel ); @@ -36,6 +37,7 @@ sub show_usage() { print "X2Go SQL admin interface. Use it to create x2go database and insert or remove users or groups in x2go database\n". "Usage:\nx2godbadmin --createdb\n". + "x2godbadmin --updatedb\n". "x2godbadmin --listusers\n". "x2godbadmin --adduser|rmuser <UNIX user>\n". "x2godbadmin --addgroup|rmgroup <UNIX group>\n"; @@ -43,16 +45,17 @@ sub show_usage() my $help=''; my $createdb=''; +my $updatedb=''; my $adduser=''; my $rmuser=''; my $addgroup=''; my $rmgroup=''; my $listusers=''; -GetOptions('listusers' => \$listusers, 'createdb' => \$createdb, 'help' => \$help, 'adduser=s' => \$adduser, +GetOptions('listusers' => \$listusers, 'createdb' => \$createdb, 'updatedb' => \$updatedb, 'help' => \$help, 'adduser=s' => \$adduser, 'addgroup=s' => \$addgroup, 'rmuser=s' => \$rmuser, 'rmgroup=s' => \$rmgroup); -if ($help || ! ( $createdb || $adduser || $rmuser || $addgroup || $rmgroup || $listusers)) +if ($help || ! ( $createdb || $updatedb || $adduser || $rmuser || $addgroup || $rmgroup || $listusers)) { show_usage(); exit(0); @@ -74,9 +77,56 @@ if ($Config->param("backend") eq 'sqlite') if ($listusers|| $adduser||$addgroup||$rmuser||$rmgroup) { - print "Only \"--createdb\" option is available with sqlite backend\n"; + print "Only \"--createdb\" and \"--updatedb\" options are available with SQLite3 backend\n"; exit(0); } + if ($updatedb) + { + if ( ! -e $dbfile) + { + + $createdb = 1; + + } else { + + # Update the session DB file + my $dbh=DBI->connect("dbi:SQLite:dbname=$dbfile","","",{AutoCommit => 1, PrintError => 0, PrintWarn => 1, RaiseError => 1 }) or die $_; + my $coltest; + my $sth; + # Update missing column on sessions table: tekictrl_port + try + { + $dbh->prepare(" + select tekictrl_port from sessions + "); + } catch { + print "ADDING: tekictrl_port column to table sessions\n"; + $sth=$dbh->prepare(" + alter table sessions add column 'tekictrl_port' int + "); + $sth->execute(); + $sth->finish(); + }; + + # Update missing column on sessions table: tekidata_port + try + { + $dbh->prepare(" + select tekidata_port from sessions + "); + } catch { + print "ADDING: tekidata_port column to table sessions\n"; + $sth=$dbh->prepare(" + alter table sessions add column 'tekidata_port' int + "); + $sth->execute(); + $sth->finish(); + }; + + exit(0); + } + } + if ($createdb) { if (! -d "$dir" ) @@ -104,6 +154,8 @@ if ($Config->param("backend") eq 'sqlite') gr_port int, sound_port int, fs_port int, + tekictrl_port int, + tekidata_port int, unique(display)) "); $sth->execute() or die; @@ -374,6 +426,8 @@ sub create_tables() gr_port int, sound_port int, fs_port int, + tekictrl_port int, + tekictrl_data int, creator_id text NOT NULL default current_user, unique(display)) "); @@ -383,7 +437,7 @@ sub create_tables() create VIEW sessions_view as SELECT agent_pid, session_id, display, server, status, init_time, cookie, client, gr_port, - sound_port, last_time, uname, fs_port from sessions + sound_port, last_time, uname, fs_port, tekictrl_port, tekidata_port from sessions where creator_id = current_user "); $sth->execute() or die; @@ -428,6 +482,8 @@ sub create_tables() gr_port=NEW.gr_port, sound_port=NEW.sound_port, fs_port=NEW.fs_port + tekictrl_port=NEW.tekictrl_port + tekidata_port=NEW.tekidata_port where session_id=OLD.session_id and creator_id=current_user "); $sth->execute() or die; -- Alioth's /srv/git/_hooks_/post-receive-email on /srv/git/code.x2go.org/x2goserver.git