The branch, master has been updated via 11ac71b5991581581645a906f75d46b92df79b75 (commit) from 0a9acf654da524a5ce58b221c97f5843a07ef836 (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 11ac71b5991581581645a906f75d46b92df79b75 Author: Mike Gabriel <mike.gabriel@das-netzwerkteam.de> Date: Sat Dec 28 22:34:42 2013 +0100 Avoid one argument system calls and backticks in x2gocleansessions and x2golistsessions_root. ----------------------------------------------------------------------- Summary of changes: debian/changelog | 2 ++ debian/control | 1 + x2goserver.spec | 1 + x2goserver/sbin/x2gocleansessions | 44 ++++++++++++++++++++++----------- x2goserver/sbin/x2golistsessions_root | 20 ++++++++++----- 5 files changed, 47 insertions(+), 21 deletions(-) The diff of changes is: diff --git a/debian/changelog b/debian/changelog index 61cff6b..7950bad 100644 --- a/debian/changelog +++ b/debian/changelog @@ -102,6 +102,8 @@ x2goserver (4.0.1.10-0x2go1) UNRELEASED; urgency=low - Provide RHEL/Fedora support in x2goserver-xsession. - Only sanity check for existence of /etc/x2go/Xsession.d on Debian (derived) systems. + - Avoid one argument system calls and backticks in x2gocleansessions and + x2golistsessions_root. * x2goserver.spec: + Ship x2goserver.spec (RPM package definitions) in upstream project. (Thanks to the Fedora package maintainers). diff --git a/debian/control b/debian/control index 9d3aa80..42678a3 100644 --- a/debian/control +++ b/debian/control @@ -20,6 +20,7 @@ Depends: x2goserver-common (>= 4.1.0.0-0~), ${misc:Depends}, libfile-basedir-perl, + libfile-readbackwards-perl, libx2go-server-perl (>= ${source:Version}), libx2go-server-db-perl (<< ${source:Version}.1~), x2goagent (>= 2:3.5.0.15-0~), lsof, diff --git a/x2goserver.spec b/x2goserver.spec index 47f9e69..59edf21 100644 --- a/x2goserver.spec +++ b/x2goserver.spec @@ -34,6 +34,7 @@ Requires: bc Requires: net-tools Requires: openssh-server Requires: perl(:MODULE_COMPAT_%(eval "`%{__perl} -V:version`"; echo $version)) +Requires: perl(File::ReadBackwards) # We need a database # For killall in x2gosuspend-session Requires: psmisc diff --git a/x2goserver/sbin/x2gocleansessions b/x2goserver/sbin/x2gocleansessions index 7b8c731..8daffcd 100755 --- a/x2goserver/sbin/x2gocleansessions +++ b/x2goserver/sbin/x2gocleansessions @@ -27,6 +27,8 @@ $ENV{'PATH'} = "/bin:/sbin:/usr/bin:/usr/sbin"; use Sys::Hostname; use Sys::Syslog qw( :standard :macros ); +use File::ReadBackwards; + my $x2go_lib_path = `x2gopath libexec`; use X2Go::Config qw( get_config ); use X2Go::Log qw( loglevel ); @@ -59,8 +61,14 @@ sub has_terminated my $sess=shift; my $user=shift; my $log="/tmp/.x2go-${user}/session-C-${sess}.log"; - my $text=`tail -1 $log 2>/dev/null`; - if ($text =~ m/Session terminated/) + my $log_line; + my $log_file = File::ReadBackwards->new( $log ) or return 1; + while( defined( $log_line = $log_file->readline ) ) { + next if ( ! ( $log_line =~ m/^Session:/ ) ); + last; + } + $log_file->close(); + if ($log_line =~ m/Session terminated/) { return 1; } @@ -72,8 +80,14 @@ sub is_suspended my $sess=shift; my $user=shift; my $log="/tmp/.x2go-${user}/session-C-${sess}.log"; - my $text=`grep Session: $log 2>/dev/null|tail -1`; - if ($text =~ m/Session suspended/) + my $log_line; + my $log_file = File::ReadBackwards->new( $log ) or return 0; + while( defined( $log_line = $log_file->readline ) ) { + next if ( ! ( $log_line =~ m/^Session:/ ) ); + last; + } + $log_file->close(); + if ($log_line =~ m/Session suspended/) { return 1; } @@ -183,30 +197,30 @@ elsif ($pid == 0 ) { # send SIGKILL to dangling X-server processes syslog('warning', "@sinfo[1]: found stale X-server process (@sinfo[0]), sending SIGKILL"); - qw(kill -9 @sinfo[0]); + system("kill", "-9", "@sinfo[0]"); delete $remembered_sessions_since{@sinfo[1]}; } syslog('debug', "@sinfo[1]: unmounting all shares"); - system( "su @sinfo[11] -c \"export HOSTNAME && x2goumount-session @sinfo[1]\" 2> /dev/null"); + system( "su", "@sinfo[11]", "-c", "export HOSTNAME && x2goumount-session @sinfo[1]"); } elsif (! check_pid (@sinfo[0],@sinfo[1],@sinfo[12])) { - system("su @sinfo[11] -c \"$x2go_lib_path/x2gochangestatus 'F' @sinfo[1] \" 1> /dev/null 2> /dev/null"); + system("su", "@sinfo[11]", "-c", "$x2go_lib_path/x2gochangestatus 'F' @sinfo[1]"); syslog('debug', "@sinfo[1], pid @sinfo[0] does not exist, changing status from @sinfo[4] to F"); syslog('debug', "@sinfo[1]: unmounting all shares"); - system( "su @sinfo[11] -c \"export HOSTNAME && x2goumount-session @sinfo[1]\" 2> /dev/null"); + system("su", "@sinfo[11]", "-c", "export HOSTNAME && x2goumount-session @sinfo[1]"); } else - { + { if ( (@sinfo[4] eq 'R') && ( $remembered_sessions_since{ @sinfo[1] } ge 2 )) { if (is_suspended(@sinfo[1],@sinfo[11])) { - system("su @sinfo[11] -c \"$x2go_lib_path/x2gochangestatus 'S' @sinfo[1] \" 1> /dev/null 2>/dev/null"); + system("su", "@sinfo[11]", "-c", "$x2go_lib_path/x2gochangestatus S @sinfo[1]"); syslog('debug', "@sinfo[1] is suspended, changing status from @sinfo[4] to S"); syslog('debug', "@sinfo[1]: unmounting all shares"); - system( "su @sinfo[11] -c \"export HOSTNAME && x2goumount-session @sinfo[1]\" 2> /dev/null"); + system("su", "@sinfo[11]", "-c", "export HOSTNAME && x2goumount-session @sinfo[1]"); } } if (@sinfo[4] eq 'S') @@ -214,8 +228,8 @@ elsif ($pid == 0 ) if (is_running(@sinfo[1],@sinfo[11])) { syslog('debug', "@sinfo[1]: unmounting all shares"); - system( "su @sinfo[11] -c \"export HOSTNAME && x2goumount-session @sinfo[1]\" 2> /dev/null"); - system("su @sinfo[11] -c \"x2gosuspend-session @sinfo[1] \" 1> /dev/null 2>/dev/null"); + system("su", "@sinfo[11]", "-c", "export HOSTNAME && x2goumount-session @sinfo[1]"); + system("su", "@sinfo[11]", "-c", "x2gosuspend-session @sinfo[1]"); syslog('debug', "@sinfo[1] was found running and has now been suspended"); } } @@ -224,8 +238,8 @@ elsif ($pid == 0 ) if (!has_terminated(@sinfo[1],@sinfo[11])) { syslog('debug', "@sinfo[1]: unmounting all shares"); - system( "su @sinfo[11] -c \"export HOSTNAME && x2goumount-session @sinfo[1]\" 2> /dev/null"); - system("su @sinfo[11] -c \"x2goterminate-session @sinfo[1] \" 1> /dev/null 2>/dev/null"); + system("su", "@sinfo[11]", "-c", "export HOSTNAME && x2goumount-session @sinfo[1]"); + system("su", "@sinfo[11]", "-c", "x2goterminate-session @sinfo[1]"); syslog('debug', "@sinfo[1] has been requested for termination via the session DB"); } } diff --git a/x2goserver/sbin/x2golistsessions_root b/x2goserver/sbin/x2golistsessions_root index e1070dc..2f2d64b 100755 --- a/x2goserver/sbin/x2golistsessions_root +++ b/x2goserver/sbin/x2golistsessions_root @@ -23,22 +23,30 @@ use strict; use Sys::Hostname; use Sys::Syslog qw( :standard :macros ); +use File::ReadBackwards; + use X2Go::Log qw(loglevel); openlog($0,'cons,pid','user'); setlogmask( LOG_UPTO(loglevel()) ); -sub check_stat +sub is_suspended { my $sess=shift; my $user=shift; my $log="/tmp/.x2go-${user}/session-C-${sess}.log"; - my $text=`tail -1 $log 2>/dev/null`; - if ($text =~ m/Session suspended/) + my $log_line; + my $log_file = File::ReadBackwards->new( $log ) or return 0; + while( defined( $log_line = $log_file->readline ) ) { + next if ( ! ( $log_line =~ m/^Session:/ ) ); + last; + } + $log_file->close(); + if ($log_line =~ m/Session suspended/) { - return 0; + return 1; } - return 1; + return 0; } my $x2go_lib_path = `x2gopath libexec`; @@ -66,7 +74,7 @@ for (my $i=0;$i<@outp;$i++) { if (@sinfo[4]eq 'R') { - if (!check_stat(@sinfo[1],@sinfo[11])) + if (is_suspended(@sinfo[1],@sinfo[11])) { system("su - @sinfo[11] -c \"$x2go_lib_path/x2gochangestatus 'S' @sinfo[1]\" > /dev/null"); @outp[$i] =~ s/\|R\|/\|S\|/; 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).