The branch, master has been updated via d2e3018311a85734001bde6da8cbff6a060d3c4c (commit) from 58e58ea304d91945a96e1757b419283ac696c830 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit d2e3018311a85734001bde6da8cbff6a060d3c4c Author: Mike Gabriel <mike.gabriel@das-netzwerkteam.de> Date: Sat Jan 19 15:52:59 2013 +0100 Add X2Go Server feature X2GO_LIST_SHADOWSESSIONS. ----------------------------------------------------------------------- Summary of changes: X2Go/Server/DB.pm | 25 +++++++++ X2Go/Server/DB/PostgreSQL.pm | 49 ++++++++++++++++- X2Go/Server/DB/SQLite3.pm | 53 ++++++++++++++++++- debian/changelog | 1 + .../lib/libx2go-server-db-sqlite3-wrapper.pl | 2 +- .../{x2golistsessions => x2golistshadowsessions} | 34 ++++++------ x2goserver/man/man8/x2golistshadowsessions.8 | 55 ++++++++++++++++++++ x2goserver/share/x2gofeature.d/x2goserver.features | 1 + 8 files changed, 199 insertions(+), 21 deletions(-) copy x2goserver/bin/{x2golistsessions => x2golistshadowsessions} (74%) create mode 100644 x2goserver/man/man8/x2golistshadowsessions.8 The diff of changes is: diff --git a/X2Go/Server/DB.pm b/X2Go/Server/DB.pm index c9a83a1..c87334d 100644 --- a/X2Go/Server/DB.pm +++ b/X2Go/Server/DB.pm @@ -424,3 +424,28 @@ sub db_listsessions_all return split("\n",`$x2go_lib_path/libx2go-server-db-sqlite3-wrapper listsessions_all`); } } + +sub db_listshadowsessions +{ + my $server=shift or die "argument \"server\" missed"; + if ($backend eq 'postgres') + { + return X2Go::Server::DB::PostgreSQL::db_listshadowsessions($server); + } + if ($backend eq 'sqlite') + { + return split("\n",`$x2go_lib_path/libx2go-server-db-sqlite3-wrapper listshadowsessions $server`); + } +} + +sub db_listshadowsessions_all +{ + if($backend eq 'postgres') + { + return X2Go::Server::DB::PostgreSQL::db_listshadowsessions_all(); + } + if ($backend eq 'sqlite') + { + return split("\n",`$x2go_lib_path/libx2go-server-db-sqlite3-wrapper listshadowsessions_all`); + } +} diff --git a/X2Go/Server/DB/PostgreSQL.pm b/X2Go/Server/DB/PostgreSQL.pm index 72ba833..f1233e9 100644 --- a/X2Go/Server/DB/PostgreSQL.pm +++ b/X2Go/Server/DB/PostgreSQL.pm @@ -45,7 +45,7 @@ use base 'Exporter'; our @EXPORT=('db_listsessions','db_listsessions_all', 'db_getservers', 'db_getagent', 'db_resume', 'db_changestatus', 'db_getstatus', 'db_getdisplays', 'db_insertsession', 'db_getports', 'db_insertport', 'db_rmport', 'db_createsession', 'db_insertmount', 'db_getmounts', 'db_deletemount', 'db_getdisplay', 'dbsys_getmounts', 'dbsys_listsessionsroot', - 'dbsys_listsessionsroot_all', 'dbsys_rmsessionsroot', 'dbsys_deletemounts'); + 'dbsys_listsessionsroot_all', 'dbsys_rmsessionsroot', 'dbsys_deletemounts', 'db_listshadowsessions','db_listshadowsessions_all'); my ($uname, $pass, $uid, $pgid, $quota, $comment, $gcos, $homedir, $shell, $expire) = getpwuid(getuid()); @@ -493,4 +493,51 @@ sub db_listsessions_all return @sessions; } +sub db_listshadowsessions +{ + init_db(); + my $server=shift or die "argument \"server\" missed"; + my @sessions; + my $dbh=DBI->connect("dbi:Pg:dbname=$db;host=$host;port=$port;sslmode=$sslmode", "$dbuser", "$dbpass",{AutoCommit => 1}) or die $_; + my $sth=$dbh->prepare("select agent_pid, session_id, display, server, status, + to_char(init_time,'YYYY-MM-DDTHH24:MI:SS'), cookie, client, gr_port, + sound_port, to_char( last_time, 'YYYY-MM-DDTHH24:MI:SS'), uname, + to_char(now()- init_time,'SSSS'), fs_port from sessions_view + where status !='F' and server='$server' and + (session_id like '%XSHAD%') order by status desc"); + $sth->execute() or die; + my @data; + my $i=0; + while (@data = $sth->fetchrow_array) + { + @sessions[$i++]=join('|',@data); + } + $sth->finish(); + $dbh->disconnect(); + return @sessions; +} + +sub db_listshadowsessions_all +{ + init_db(); + my @sessions; + my $dbh=DBI->connect("dbi:Pg:dbname=$db;host=$host;port=$port;sslmode=$sslmode", "$dbuser", "$dbpass",{AutoCommit => 1}) or die $_; + my $sth=$dbh->prepare("select agent_pid, session_id, display, server, status, + to_char(init_time,'YYYY-MM-DDTHH24:MI:SS'), cookie, client, gr_port, + sound_port, to_char( last_time, 'YYYY-MM-DDTHH24:MI:SS'), uname, + to_char(now()- init_time,'SSSS'), fs_port from sessions_view + where status !='F' and + (session_id is like '%XSHAD%') order by status desc"); + $sth->execute()or die; + my @data; + my $i=0; + while (@data = $sth->fetchrow_array) + { + @sessions[$i++]=join('|',@data); + } + $sth->finish(); + $dbh->disconnect(); + return @sessions; +} + 1; diff --git a/X2Go/Server/DB/SQLite3.pm b/X2Go/Server/DB/SQLite3.pm index 6abdb82..b615c76 100644 --- a/X2Go/Server/DB/SQLite3.pm +++ b/X2Go/Server/DB/SQLite3.pm @@ -54,8 +54,8 @@ use base 'Exporter'; our @EXPORT=('db_listsessions','db_listsessions_all', 'db_getservers', 'db_getagent', 'db_resume', 'db_changestatus', 'db_getstatus', 'db_getdisplays', 'db_insertsession', 'db_getports', 'db_insertport', 'db_rmport', 'db_createsession', 'db_insertmount', - 'db_getmounts', 'db_deletemount', 'db_getdisplay', 'dbsys_getmounts', 'dbsys_listsessionsroot', - 'dbsys_listsessionsroot_all', 'dbsys_rmsessionsroot', 'dbsys_deletemounts'); + 'db_getmounts', 'db_deletemount', 'db_getdisplay', 'dbsys_getmounts', 'dbsys_listsessionsroot',. + 'dbsys_listsessionsroot_all', 'dbsys_rmsessionsroot', 'dbsys_deletemounts', 'db_listshadowsessions','db_listshadowsessions_all', ); sub init_db { @@ -509,6 +509,55 @@ sub db_listsessions_all return @sessions; } +sub db_listshadowsessions +{ + my $dbh = init_db(); + my $server=shift or die "argument \"server\" missed"; + my @strings; + my $sth=$dbh->prepare("select agent_pid, session_id, display, server, status, + strftime('%Y-%m-%dT%H:%M:%S',init_time), + 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 + where status !='F' and server=? and uname=? + and ( session_id like '%XSHAD%') order by status desc"); + $sth->execute($server, $realuser); + if ($sth->err()) + { + syslog('error', "listsessions (SQLite3 session db backend) failed with exitcode: $sth->err()"); + die(); + } + my @sessions = fetchrow_array_datasets($sth); + $sth->finish(); + $dbh->disconnect(); + return @sessions; +} + +sub db_listshadowsessions_all +{ + my $dbh = init_db(); + my @strings; + my $sth=$dbh->prepare("select agent_pid, session_id, display, server, status, + strftime('%Y-%m-%dT%H:%M:%S',init_time), + 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 + where status !='F' and uname=? and ( session_id like '%XSHAD%') order by status desc"); + + $sth->execute($realuser); + if ($sth->err()) + { + syslog('error', "listsessions_all (SQLite3 session db backend) failed with exitcode: $sth->err()"); + die(); + } + my @sessions = fetchrow_array_datasets($sth); + $sth->finish(); + $dbh->disconnect(); + return @sessions; +} + sub check_root { if ($realuser ne "root") diff --git a/debian/changelog b/debian/changelog index 4349cbf..f4ab554 100644 --- a/debian/changelog +++ b/debian/changelog @@ -18,6 +18,7 @@ x2goserver (4.1.0.0-0~x2go1) UNRELEASED; urgency=low - Make session type label XFCE a valid session that starts xfce4-session. - Fix failures of x2gogetagent that was related to faulty regexp in SQLite3 DB wrapper script. + - Add X2Go Server feature X2GO_LIST_SHADOWSESSIONS. * /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/libx2go-server-db-perl/lib/libx2go-server-db-sqlite3-wrapper.pl b/libx2go-server-db-perl/lib/libx2go-server-db-sqlite3-wrapper.pl index 751aa69..97c63fd 100755 --- a/libx2go-server-db-perl/lib/libx2go-server-db-sqlite3-wrapper.pl +++ b/libx2go-server-db-perl/lib/libx2go-server-db-sqlite3-wrapper.pl @@ -55,7 +55,7 @@ my $cmd=shift or die "command not specified"; switch ($cmd) { case /.*listsessions.*root/ { @result_list = eval("X2Go::Server::DB::SQLite3::dbsys_$cmd(\@ARGV)") } - case /.*(listsessions|getmounts).*/ { @result_list = eval("X2Go::Server::DB::SQLite3::db_$cmd(\@ARGV)") } + case /.*(list.*sessions|getmounts).*/ { @result_list = eval("X2Go::Server::DB::SQLite3::db_$cmd(\@ARGV)") } case /.*root/ { $result = eval("X2Go::Server::DB::SQLite3::dbsys_$cmd(\@ARGV)") } else { $result = eval("X2Go::Server::DB::SQLite3::db_$cmd(\@ARGV)") } } diff --git a/x2goserver/bin/x2golistsessions b/x2goserver/bin/x2golistshadowsessions similarity index 74% copy from x2goserver/bin/x2golistsessions copy to x2goserver/bin/x2golistshadowsessions index 75ff45a..46893ce 100755 --- a/x2goserver/bin/x2golistsessions +++ b/x2goserver/bin/x2golistshadowsessions @@ -24,30 +24,30 @@ use strict; use Sys::Hostname; use Sys::Syslog qw( :standard :macros ); -use X2Go::Server::DB qw(db_listsessions db_listsessions_all); +use X2Go::Server::DB qw(db_listshadowsessions db_listshadowsessions_all); use X2Go::Log qw(loglevel); openlog($0,'cons,pid','user'); setlogmask( LOG_UPTO(loglevel()) ); if ( @ARGV ) { - syslog('info', "x2golistsessions has been called with options: @ARGV"); + syslog('info', "x2golistshadowsessions has been called with options: @ARGV"); } else { - # hiding normal x2golistsessions calls into debug loglevel - syslog('debug', "x2golistsessions has been called with no option"); + # hiding normal x2golistshadowsessions calls into debug loglevel + syslog('debug', "x2golistshadowsessions has been called with no option"); } -sub check_stat -{ - my $sess=shift; - my $log="$ENV{'HOME'}/.x2go/C-$sess/session.log"; - my $text=`tail -1 $log 2>/dev/null`; - if ($text =~ m/Session suspended/) - { - return 0; - } - return 1; -} +#sub check_stat +#{ +# my $sess=shift; +# my $log="$ENV{'HOME'}/.x2go/C-$sess/session.log"; +# my $text=`tail -1 $log 2>/dev/null`; +# if ($text =~ m/Session suspended/) +# { +# return 0; +# } +# return 1; +#} my $serv=shift; if( ! $serv) @@ -58,11 +58,11 @@ if( ! $serv) my @outp; if($serv eq "--all-servers") { - @outp=db_listsessions_all(); + @outp=db_listshadowsessions_all(); } else { - @outp=db_listsessions($serv); + @outp=db_listshadowsessions($serv); } for (my $i=0;$i<@outp;$i++) diff --git a/x2goserver/man/man8/x2golistshadowsessions.8 b/x2goserver/man/man8/x2golistshadowsessions.8 new file mode 100644 index 0000000..b832147 --- /dev/null +++ b/x2goserver/man/man8/x2golistshadowsessions.8 @@ -0,0 +1,55 @@ +'\" -*- coding: utf-8 -*- +.if \n(.g .ds T< \\FC +.if \n(.g .ds T> \\F[\n[.fam]] +.de URL +\\$2 \(la\\$1\(ra\\$3 +.. +.if \n(.g .mso www.tmac +.TH x2golistshadowsessions 8 "Jan 2013" "Version 4.0.x.y" "X2Go Server Tool" +.SH NAME +x2golistshadowsessions \- List Available X2Go Shadow Sessions for User +.SH SYNOPSIS +'nh +.fi +.ad l +x2golistshadowsessions [<server_hostname>|--all-servers] + +.SH DESCRIPTION +\fBx2golistshadowsessions\fR returns a list of running or suspended X2Go shadow sessions +(sessions that provide the X2Go Desktop Sharing feature) for X2Go server <server_hostname>. +If no server hostname is given at the command line, the shadow session list query runs for the local system. +.PP +\fBx2golistshadowsessions\fR is run with normal user privileges and it is used by X2Go clients to render +a list of available X2Go shadow sessions. +.SH X2GO CLUSTER MODE +If \fBx2golistshadowsessions\fR is executed with the \fI--all-servers\fR option then the central database +of your X2Go cluster is queried for running/suspended shadow sessions belonging to the user executing this command. +These sessions may be active on any of the X2Go servers within your cluster. +.SH RETURN VALUES +A line-by-line list of available X2Go sessions. Each line consists of several session attribute fields separated by the pipe +symbol (,,|''). +.PP +The meaning of the session attributes of each output line are shown below: + + field 01: <agent_pid> + field 02: <session_id> + field 03: <port> + field 04: <host> + field 05: <state> + field 06: <init_time> + field 07: <session_cookie> + field 08: <client_ip> + field 09: <gr_port> + field 10: <snd_port> + field 11: <last_time> + field 12: <user> + field 13: <age_in_secs> + field 14: <sshfs_port> + +.PP +As exitcode \fBx2golistshadowsessions\fR always returns 0. +.SH SEE ALSO +x2golistsessions(8), x2golistdesktops(8), x2goresume-session(8), x2gosuspend-session(8), x2goterminate-session(8) +.SH AUTHOR +This manual has been written by Mike Gabriel <mike.gabriel@das-netzwerkteam.de> for the X2Go project +(http://www.x2go.org). diff --git a/x2goserver/share/x2gofeature.d/x2goserver.features b/x2goserver/share/x2gofeature.d/x2goserver.features index 1d23695..5e4ce76 100755 --- a/x2goserver/share/x2gofeature.d/x2goserver.features +++ b/x2goserver/share/x2gofeature.d/x2goserver.features @@ -36,6 +36,7 @@ case "$X2GO_FEATURE" in "X2GO_PUBLISHED_APPLICATIONS") echo "ok"; exit 0;; "X2GO_SERVERSIDE_DESKTOPCOMMANDS") echo "ok"; exit 0;; "X2GO_SET_KEYBOARD") echo "ok"; exit 0;; + "X2GO_LIST_SHADOWSESSIONS") echo "ok"; exit 0;; *) exit -1;; esac hooks/post-receive -- x2goserver.git (X2Go Server) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "x2goserver.git" (X2Go Server).