This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository x2goserver. commit ae9da463efbb01d58333243cc3b8a5ecffbc65c0 Author: Mike Gabriel <mike.gabriel@das-netzwerkteam.de> Date: Sat Mar 29 00:00:42 2014 +0100 Add tunneling port allocation for TeleKinesis framework. --- X2Go/Server/DB.pm | 16 +++++---- X2Go/Server/DB/PostgreSQL.pm | 25 +++++++++---- X2Go/Server/DB/SQLite3.pm | 31 +++++++++++----- X2Go/Utils.pm | 6 ++++ debian/changelog | 1 + 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 ++++++++++++++++++++++++++++++--- 13 files changed, 179 insertions(+), 36 deletions(-) diff --git a/X2Go/Server/DB.pm b/X2Go/Server/DB.pm index 4682cc4..18bba34 100644 --- a/X2Go/Server/DB.pm +++ b/X2Go/Server/DB.pm @@ -240,20 +240,22 @@ sub db_createsession my $gr_port=shift or die"argument \"gr_port\" missed"; my $snd_port=shift or die"argument \"snd_port\" missed"; my $fs_port=shift or die"argument \"fs_port\" missed"; + my $tekictrl_port=shift or die"argument \"tekictrl_port\" missed"; + my $tekidata_port=shift or die"argument \"tekidata_port\" missed"; my $sid=shift or die "argument \"session_id\" missed"; if ($backend eq 'postgres') { - X2Go::Server::DB::PostgreSQL::db_createsession($cookie, $pid, $client, $gr_port, $snd_port, $fs_port, $sid); + X2Go::Server::DB::PostgreSQL::db_createsession($cookie, $pid, $client, $gr_port, $snd_port, $fs_port, $tekictrl_port, $tekidata_port, $sid); } if ($backend eq 'sqlite') { - my $err= system_capture_merged_output("$x2go_lib_path/libx2go-server-db-sqlite3-wrapper", "createsession", "$cookie", "$pid", "$client", "$gr_port", "$snd_port", "$fs_port", "$sid"); + my $err= system_capture_merged_output("$x2go_lib_path/libx2go-server-db-sqlite3-wrapper", "createsession", "$cookie", "$pid", "$client", "$gr_port", "$snd_port", "$fs_port", "$tekictrl_port", "$tekidata_port", "$sid"); if ($err ne "ok") { die $err; } } - syslog('debug', "db_createsession called, session ID: $sid, cookie: $cookie, client: $client, pid: $pid, graphics port: $gr_port, sound port: $snd_port, file sharing port: $fs_port"); + syslog('debug', "db_createsession called, session ID: $sid, cookie: $cookie, client: $client, pid: $pid, graphics port: $gr_port, sound port: $snd_port, file sharing port: $fs_port. telekinesis ctrl port: $tekictrl_port, telekinesis data port: $tekidata_port"); } sub db_createshadowsession @@ -325,15 +327,17 @@ sub db_resume my $gr_port=shift or die "argument \"gr_port\" missed"; my $snd_port=shift or die "argument \"snd_port\" missed"; my $fs_port=shift or die "argument \"fs_port\" missed"; + my $tekictrl_port=shift or die"argument \"tekictrl_port\" missed"; + my $tekidata_port=shift or die"argument \"tekidata_port\" missed"; if ($backend eq 'postgres') { - X2Go::Server::DB::PostgreSQL::db_resume($client, $sid, $gr_port, $snd_port, $fs_port); + X2Go::Server::DB::PostgreSQL::db_resume($client, $sid, $gr_port, $snd_port, $fs_port, $tekictrl_port, $tekidata_port); } if ($backend eq 'sqlite') { - system_capture_merged_output("$x2go_lib_path/libx2go-server-db-sqlite3-wrapper", "resume", "$client", "$sid", "$gr_port", "$snd_port", "$fs_port"); + system_capture_merged_output("$x2go_lib_path/libx2go-server-db-sqlite3-wrapper", "resume", "$client", "$sid", "$gr_port", "$snd_port", "$fs_port", "$tekictrl_port", "$tekidata_port"); } - syslog('debug', "db_resume called, session ID: $sid, client: $client, gr_port: $gr_port, sound_port: $snd_port, fs_port: $fs_port"); + syslog('debug', "db_resume called, session ID: $sid, client: $client, gr_port: $gr_port, sound_port: $snd_port, fs_port: $fs_port, telekinesis ctrl port: $tekictrl_port, telekinesis data port: $tekidata_port"); } sub db_changestatus diff --git a/X2Go/Server/DB/PostgreSQL.pm b/X2Go/Server/DB/PostgreSQL.pm index 8e0657a..6f46b64 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('x2gosid', $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 9acecde..bde6edf 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('pnnum', $tekictrl_port) or die "argument \"tekictrl_port\" malformed"; + my $tekidata_port=shift or die "argument \"tekidata_port\" missed"; + $tekidata_port = sanitizer('pnnum', $tekidata_port) or die "argument \"tekidata_port\" malformed"; my $sid=shift or die "argument \"session_id\" missed"; $sid = sanitizer('x2gosid', $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('pnnum', $tekictrl_port) or die "argument \"tekictrl_port\" malformed"; + my $tekidata_port=shift or die"argument \"tekidata_port\" missed"; + $tekidata_port = sanitizer('pnnum', $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/X2Go/Utils.pm b/X2Go/Utils.pm index 9de854a..1ffcd2f 100644 --- a/X2Go/Utils.pm +++ b/X2Go/Utils.pm @@ -106,6 +106,12 @@ sub sanitizer { $string = $1; return $string; } else {return 0;} + } elsif ($type eq "pnnum") { + $string =~ s/[^0-9\+\-]//g; + if ($string =~ /^([0-9\+\-]*)$/) { + $string = $1; + return $string; + } else {return 0;} } elsif ($type eq "anumazcsdaus") { $string =~ s/[^a-zA-Z0-9\_\-]//g; if ($string =~ /^([a-zA-Z0-9\_\-]*)$/) { diff --git a/debian/changelog b/debian/changelog index 588d7dc..05d6ba3 100644 --- a/debian/changelog +++ b/debian/changelog @@ -44,6 +44,7 @@ x2goserver (4.1.0.0-0x2go1) UNRELEASED; urgency=low Move duplicate code into that new Perl package. - Security audit of complete code tree, avoid one-argument system calls where possible, avoid backticks, use more quotes in shell scripts. + - Add tunneling port allocation for TeleKinesis framework. * debian/control: + Package X2Go::Log in separate package: libx2go-log-perl. + Package X2Go::Server::DB in separate package: libx2go-server-db-perl. diff --git a/debian/control b/debian/control index 606547f..aa97942 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-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 8e406c3..fd7d775 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..984281a 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="-1" + TEKIDATA_PORT="-1" +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..50597b6 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