[X2Go-Commits] [x2goserver] 01/01: x2gostartagent, x2golistsession, x2gosuspend-session and x2goresume-session getting agent state from ~/.x2go/C-$SID/state. This should help to avoid session damage. (Fixes: #302).
git-admin at x2go.org
git-admin at x2go.org
Wed Jun 25 16:43:33 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 cee48577633c72988dd8563ceae7bf04cfe7d518
Author: Oleksandr Shneyder <o.shneyder at phoca-gmbh.de>
Date: Wed Jun 25 16:43:16 2014 +0200
x2gostartagent, x2golistsession, x2gosuspend-session and x2goresume-session getting agent state from ~/.x2go/C-$SID/state. This should help to avoid session damage. (Fixes: #302).
---
X2Go/Server/Agent.pm | 6 +-
X2Go/Server/Agent/NX.pm | 76 +++++++-------------
debian/changelog | 5 ++
debian/control | 1 +
x2goserver/bin/x2golistsessions | 10 ++-
x2goserver/bin/x2goresume-session | 55 ++++++++++++++
x2goserver/bin/x2gostartagent | 6 +-
x2goserver/bin/x2gosuspend-session | 37 +++++-----
.../Agent.pm => x2goserver/lib/x2gogetagentstate | 46 +++---------
9 files changed, 135 insertions(+), 107 deletions(-)
diff --git a/X2Go/Server/Agent.pm b/X2Go/Server/Agent.pm
index 4641ec0..42d753e 100644
--- a/X2Go/Server/Agent.pm
+++ b/X2Go/Server/Agent.pm
@@ -42,7 +42,7 @@ load_module $agent_module;
use base 'Exporter';
-our @EXPORT=( 'session_has_terminated', 'session_is_running', 'session_is_suspended' );
+our @EXPORT=( 'session_has_terminated', 'session_is_running', 'session_is_suspended' , 'get_agent_state');
@@ -60,4 +60,8 @@ sub session_is_suspended {
return $agent_module->session_is_suspended(@_);
}
+sub get_agent_state {
+ return $agent_module->get_agent_state(@_);
+}
+
1;
diff --git a/X2Go/Server/Agent/NX.pm b/X2Go/Server/Agent/NX.pm
index 1329f5b..7242474 100644
--- a/X2Go/Server/Agent/NX.pm
+++ b/X2Go/Server/Agent/NX.pm
@@ -31,10 +31,9 @@ X2Go::Server::Agent::NX Perl package for X2Go::Server.
=cut
use strict;
-use DBI;
use POSIX;
use Sys::Syslog qw( :standard :macros );
-use File::ReadBackwards;
+use File::HomeDir;
use X2Go::Log qw( loglevel );
@@ -43,22 +42,8 @@ setlogmask( LOG_UPTO(loglevel()) );
sub session_has_terminated
{
- my $sess=shift;
- my $user=shift;
- my $log;
- if ( -d "/tmp-inst/${user}/.x2go-${user}" ) {
- $log="/tmp-inst/${user}/.x2go-${user}/session-C-${sess}.log";
- } else {
- $log="/tmp/.x2go-${user}/session-C-${sess}.log";
- }
- 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/) || ($log_line =~ m/Terminating session/) || ($log_line =~ m/Aborting session/))
+ my $state=get_agent_state(@_);
+ if(($state eq 'TERMINATING')||($state eq 'TERMINATED'))
{
return 1;
}
@@ -68,22 +53,8 @@ sub session_has_terminated
sub session_is_suspended
{
- my $sess=shift;
- my $user=shift;
- my $log;
- if ( -d "/tmp-inst/${user}/.x2go-${user}" ) {
- $log="/tmp-inst/${user}/.x2go-${user}/session-C-${sess}.log";
- } else {
- $log="/tmp/.x2go-${user}/session-C-${sess}.log";
- }
- 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/) || ($log_line =~ m/Suspending session/) || ($log_line =~ m/Display failure detected/))
+ my $state=get_agent_state(@_);
+ if(($state eq 'SUSPENDING')||($state eq 'SUSPENDED'))
{
return 1;
}
@@ -93,26 +64,31 @@ sub session_is_suspended
sub session_is_running
{
- my $sess=shift;
- my $user=shift;
- my $log;
- if ( -d "/tmp-inst/${user}/.x2go-${user}" ) {
- $log="/tmp-inst/${user}/.x2go-${user}/session-C-${sess}.log";
- } else {
- $log="/tmp/.x2go-${user}/session-C-${sess}.log";
- }
- 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 started/) || ($log_line =~ m/Starting session/) || ($log_line =~ m/Session resumed/) || ($log_line =~ m/Resuming session/))
+ my $state=get_agent_state(@_);
+ if(($state eq 'STARTING')||($state eq 'RESUMING')||($state eq 'RUNNING'))
{
return 1;
}
return 0;
}
+sub get_agent_state
+{
+ my $sess=@_[1];
+ my $user=@_[2];
+ my $state;
+ my $stateFile = File::HomeDir->users_home($user) . "/.x2go/C-".$sess."/state";
+ if (! -e $stateFile )
+ {
+ die "state file not exists: $stateFile\n";
+ }
+ else
+ {
+ open(F,"<$stateFile");
+ $state=<F>;
+ close(F);
+ }
+ return $state;
+}
+
1;
diff --git a/debian/changelog b/debian/changelog
index 2f9906f..5a0fc35 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -114,6 +114,11 @@ x2goserver (4.1.0.0-0x2go1.1) UNRELEASED; urgency=low
* New upstream version (4.1.0.0):
- Use new script x2gopath in Perl::API. (Fixes: #86).
+ [ Oleksandr Shneyder ]
+ * x2gostartagent, x2golistsession, x2gosuspend-session and x2goresume-session
+ getting agent state from ~/.x2go/C-$SID/state. This should help to avoid
+ session damage. (Fixes: #302).
+
-- Mike Gabriel <mike.gabriel at das-netzwerkteam.de> Fri, 09 May 2014 13:06:24 +0200
x2goserver (4.0.1.16-0x2go1) UNRELEASED; urgency=low
diff --git a/debian/control b/debian/control
index 373738e..5976f26 100644
--- a/debian/control
+++ b/debian/control
@@ -21,6 +21,7 @@ Depends:
${misc:Depends},
libfile-basedir-perl,
libfile-readbackwards-perl,
+ libfile-homedir-perl,
libtry-tiny-perl,
libx2go-server-perl (>= ${source:Version}), libx2go-server-perl (<< ${source:Version}.1~),
x2goagent (>= 2:3.5.0.25-0~),
diff --git a/x2goserver/bin/x2golistsessions b/x2goserver/bin/x2golistsessions
index eb6f78c..e5cff26 100755
--- a/x2goserver/bin/x2golistsessions
+++ b/x2goserver/bin/x2golistsessions
@@ -27,7 +27,7 @@ use Sys::Syslog qw( :standard :macros );
use File::ReadBackwards;
use X2Go::Server::DB qw(db_listsessions db_listsessions_all db_changestatus);
-use X2Go::Server::Agent qw(session_is_suspended);
+use X2Go::Server::Agent qw(session_is_suspended session_is_running);
use X2Go::Log qw(loglevel);
@@ -81,6 +81,14 @@ for (my $i=0;$i<@outp;$i++)
system("x2goumount-session", "@sinfo[1]");
}
}
+ elsif (@sinfo[4]eq 'S')
+ {
+ if(session_is_running(@sinfo[1], @sinfo[11]))
+ {
+ db_changestatus( 'R', @sinfo[1] );
+ @outp[$i] =~ s/\|S\|/\|R\|/;
+ }
+ }
print "@outp[$i]\n";
}
}
diff --git a/x2goserver/bin/x2goresume-session b/x2goserver/bin/x2goresume-session
index b536434..84f31ec 100755
--- a/x2goserver/bin/x2goresume-session
+++ b/x2goserver/bin/x2goresume-session
@@ -20,6 +20,12 @@
# Copyright (C) 2007-2014 Oleksandr Shneyder <oleksandr.shneyder at obviously-nice.de>
# Copyright (C) 2007-2014 Heinz-Markus Graesing <heinz-m.graesing at obviously-nice.de>
+if [ $# -lt 7 ]
+then
+ echo "not enough arguments"
+ exit -1
+fi
+
SESSION_NAME="$1"
X2GO_GEOMETRY="$2"
X2GO_LINK="$3"
@@ -35,6 +41,55 @@ X2GO_ROOT="${HOME}/.x2go"
X2GO_RESIZE=0
X2GO_FULLSCREEN=0
+
+STATE=`$X2GO_LIB_PATH/x2gogetagentstate "$SESSION_NAME"`
+
+# exit if session terminated
+if [ "$STATE" == "TERMINATED" ] || [ "$STATE" == "TERMINATING" ]
+then
+ echo "Session terminated"
+ exit -1
+fi
+
+i=0
+# wait 15 sec. for starting session
+while [ "$STATE" == "RESUMING" ] || [ "$STATE" == "STARTING" ]
+do
+ sleep 1
+ i=$(($i+1))
+ #if session still not started, try to suspend it
+ if [ $i -gt 15 ]
+ then
+ x2gosuspend-session "$SESSION_NAME"
+ sleep 2
+ i=0
+ fi
+ STATE=`$X2GO_LIB_PATH/x2gogetagentstate "$SESSION_NAME"`
+done
+
+#suspend running session
+if [ "$STATE" == "RUNNING" ]
+then
+ x2gosuspend-session "$SESSION_NAME"
+ sleep 2
+ STATE=`$X2GO_LIB_PATH/x2gogetagentstate "$SESSION_NAME"`
+fi
+
+i=0
+# wait 45 sec., while session suspending
+while [ "$STATE" == "SUSPENDING" ]
+do
+ sleep 1
+ i=$(($i+1))
+ if [ $i -gt 45 ]
+ then
+ echo "Error: taking too long to suspend session. Possible session is damaged"
+ exit -1;
+ fi
+ STATE=`$X2GO_LIB_PATH/x2gogetagentstate "$SESSION_NAME"`
+done
+
+
NX_XINERAMA_CONF="$X2GO_ROOT/C-$SESSION_NAME/xinerama.conf"
if [ -e "$NX_XINERAMA_CONF" ]
then
diff --git a/x2goserver/bin/x2gostartagent b/x2goserver/bin/x2gostartagent
index bf21f7f..3f82c7f 100755
--- a/x2goserver/bin/x2gostartagent
+++ b/x2goserver/bin/x2gostartagent
@@ -252,6 +252,8 @@ if [ "x$X2GO_TELEKINESIS_ENABLED" != "x0" ]; then
mkdir -p "${SESSION_DIR}/telekinesis/remote/"
fi
+STATE_FILE="${X2GO_ROOT}/C-${SESSION_NAME}/state"
+
# do not use $TMP or $TEMP here, the session.log file location has to be accessible by root
SESSION_LOG="/tmp/.x2go-${USER}/session-C-${SESSION_NAME}.log"
mkdir -p $(dirname "${SESSION_LOG}")
@@ -288,9 +290,9 @@ if [ -n "$X2GO_GEOMETRY" ] && [ "$X2GO_GEOMETRY" != "fullscreen" ]; then
fi
if [ "$X2GO_SET_KBD" == "0" ] || [ "$X2GO_KBD_TYPE" == "auto" ];then
- X2GO_HOST="nx/nx,link=${X2GO_LINK},pack=${X2GO_PACK},limit=0,root=${SESSION_DIR},cache=8M,images=32M,type=${X2GO_TYPE},id=${SESSION_NAME},cookie=$X2GO_COOKIE,errors=${SESSION_LOG},kbtype=null/null,${option_geometry}resize=${X2GO_RESIZE},fullscreen=${X2GO_FULLSCREEN},accept=${REMOTE},listen=${GR_PORT},client=linux,menu=0"
+ X2GO_HOST="nx/nx,link=${X2GO_LINK},pack=${X2GO_PACK},limit=0,root=${SESSION_DIR},cache=8M,images=32M,type=${X2GO_TYPE},id=${SESSION_NAME},cookie=$X2GO_COOKIE,errors=${SESSION_LOG},kbtype=null/null,${option_geometry}resize=${X2GO_RESIZE},fullscreen=${X2GO_FULLSCREEN},accept=${REMOTE},listen=${GR_PORT},client=linux,menu=0,state=${STATE_FILE}"
else
- X2GO_HOST="nx/nx,link=${X2GO_LINK},pack=${X2GO_PACK},limit=0,root=${SESSION_DIR},cache=8M,images=32M,type=${X2GO_TYPE},id=${SESSION_NAME},cookie=$X2GO_COOKIE,errors=${SESSION_LOG},kbtype=${X2GO_KBD_TYPE},${option_geometry}resize=${X2GO_RESIZE},fullscreen=${X2GO_FULLSCREEN},accept=${REMOTE},listen=${GR_PORT},client=linux,menu=0"
+ X2GO_HOST="nx/nx,link=${X2GO_LINK},pack=${X2GO_PACK},limit=0,root=${SESSION_DIR},cache=8M,images=32M,type=${X2GO_TYPE},id=${SESSION_NAME},cookie=$X2GO_COOKIE,errors=${SESSION_LOG},kbtype=${X2GO_KBD_TYPE},${option_geometry}resize=${X2GO_RESIZE},fullscreen=${X2GO_FULLSCREEN},accept=${REMOTE},listen=${GR_PORT},client=linux,menu=0,state=${STATE_FILE}"
fi
diff --git a/x2goserver/bin/x2gosuspend-session b/x2goserver/bin/x2gosuspend-session
index 9fc5d48..9f7f61f 100755
--- a/x2goserver/bin/x2gosuspend-session
+++ b/x2goserver/bin/x2gosuspend-session
@@ -54,26 +54,29 @@ x2gofeature X2GO_RUN_EXTENSIONS &>/dev/null && x2goserver-run-extensions "$SESSI
export HOSTNAME
x2goumount-session "$SESSION_NAME"
-if kill -HUP $X2GO_AGENT_PID &>/dev/null; then
- $X2GO_LIB_PATH/x2gosyslog "$0" "notice" "session with ID $SESSION_NAME has been suspended successfully"
+STATE=`$X2GO_LIB_PATH/x2gogetagentstate "$SESSION_NAME"`
- # run x2goserver-extensions for post-suspend
- x2gofeature X2GO_RUN_EXTENSIONS &>/dev/null && x2goserver-run-extensions "$SESSION_NAME" post-suspend || true
+if [ "$STATE" == "RESUMING" ] || [ "$STATE" == "STARTING" ] || [ "$STATE" == "RUNNING" ]
+then
+ if kill -HUP $X2GO_AGENT_PID &>/dev/null; then
+ $X2GO_LIB_PATH/x2gosyslog "$0" "notice" "session with ID $SESSION_NAME has been suspended successfully"
- $X2GO_LIB_PATH/x2gochangestatus 'S' "$SESSION_NAME" > /dev/null
+ # run x2goserver-extensions for post-suspend
+ x2gofeature X2GO_RUN_EXTENSIONS &>/dev/null && x2goserver-run-extensions "$SESSION_NAME" post-suspend || true
- # this makes sure that the socket on localhost blocked by NX agent gets released immediately
- $X2GO_LIB_PATH/x2gonxcleanup
-else
- err_msg="ERROR: failed to suspend session with ID $SESSION_NAME"
- echo "$err_msg" 1>&2
- $X2GO_LIB_PATH/x2gosyslog "$0" "err" "$err_msg"
+ $X2GO_LIB_PATH/x2gochangestatus 'S' "$SESSION_NAME" > /dev/null
+ else
+ err_msg="ERROR: failed to suspend session with ID $SESSION_NAME"
+ echo "$err_msg" 1>&2
+ $X2GO_LIB_PATH/x2gosyslog "$0" "err" "$err_msg"
- # run x2goserver-extensions for fail-suspend
- x2gofeature X2GO_RUN_EXTENSIONS &>/dev/null && x2goserver-run-extensions "$SESSION_NAME" fail-suspend || true
+ # run x2goserver-extensions for fail-suspend
+ x2gofeature X2GO_RUN_EXTENSIONS &>/dev/null && x2goserver-run-extensions "$SESSION_NAME" fail-suspend || true
- # If we reach here it means that the x2goagent process of the session has vanisshed
- # If this happens then we mark the session as finished...
- $X2GO_LIB_PATH/x2gochangestatus 'F' "$SESSION_NAME" > /dev/null
+ # If we reach here it means that the x2goagent process of the session has vanisshed
+ # If this happens then we mark the session as finished...
+ $X2GO_LIB_PATH/x2gochangestatus 'F' "$SESSION_NAME" > /dev/null
+ fi
+else
+ $X2GO_LIB_PATH/x2gosyslog "$0" "notice" "session with ID $SESSION_NAME is not in running state"
fi
-
diff --git a/X2Go/Server/Agent.pm b/x2goserver/lib/x2gogetagentstate
old mode 100644
new mode 100755
similarity index 54%
copy from X2Go/Server/Agent.pm
copy to x2goserver/lib/x2gogetagentstate
index 4641ec0..b84d764
--- a/X2Go/Server/Agent.pm
+++ b/x2goserver/lib/x2gogetagentstate
@@ -1,3 +1,5 @@
+#!/usr/bin/perl
+
# Copyright (C) 2007-2014 X2Go Project - http://wiki.x2go.org
#
# This program is free software; you can redistribute it and/or modify
@@ -18,46 +20,18 @@
# Copyright (C) 2007-2014 Oleksandr Shneyder <oleksandr.shneyder at obviously-nice.de>
# Copyright (C) 2007-2014 Heinz-Markus Graesing <heinz-m.graesing at obviously-nice.de>
-package X2Go::Server::Agent;
-
-=head1 NAME
-
-X2Go::Server::Agent - X2Go Server Agent package for Perl
-
-=head1 DESCRIPTION
-
-X2Go::Server::Agent Perl package for X2Go::Server.
-
-=cut
-
use strict;
-use X2Go::Utils qw( load_module );
-
-# TODO: when other agents may come into play, the AGENT var has to be read from config file or
-# somehow else...
-my $DEFAULT_AGENT="NX";
-my $AGENT=$DEFAULT_AGENT;
-my $agent_module = "X2Go::Server::Agent::$AGENT";
-load_module $agent_module;
-
-use base 'Exporter';
-
-our @EXPORT=( 'session_has_terminated', 'session_is_running', 'session_is_suspended' );
-
-
-sub session_has_terminated {
- return $agent_module->session_has_terminated(@_);
-}
+#use strict;
+#use Sys::Hostname;
+#use Sys::Syslog qw( :standard :macros );
-sub session_is_running {
- return $agent_module->session_is_running(@_);
-}
+use X2Go::Server::DB;
+use X2Go::Server::Agent;
-sub session_is_suspended {
- return $agent_module->session_is_suspended(@_);
-}
+my $sid=shift or die "argument session id missed";
+my $user=getpwuid($<);
-1;
+print get_agent_state($sid, $user);
--
Alioth's /srv/git/_hooks_/post-receive-email on /srv/git/code.x2go.org/x2goserver.git
More information about the x2go-commits
mailing list