[X2Go-Commits] [x2goserver] 01/01: Add tunneling port allocation for TeleKinesis framework.

git-admin at x2go.org git-admin at x2go.org
Sun Apr 27 10:30:19 CEST 2014


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 at 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



More information about the x2go-commits mailing list