This is an automated email from the git hooks/post-receive script. x2go pushed a change to branch master in repository x2goserver. from 35d80de Give thanks to Eugene San for the last commit. new ae9da46 Add tunneling port allocation for TeleKinesis framework. 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. Summary of changes: 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(-) -- 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 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