This is an automated email from the git hooks/post-receive script. x2go pushed a change to branch master in repository x2goserver. from 126b18d x2goserver/sbin/x2godbadmin: revoke all PRIVILEGES before trying to delete a user on postgres. new 2108538 x2goserver/sbin/x2gocleansessions: re-fetch the current sessions' status before handling it. new 1767104 x2goserver/sbin/x2gocleansessions: rename %remembered_sessions_since to %remembered_sessions_status_since. new f13c44b x2goserver/sbin/x2gocleansessions: rename %remembered_sessions_status_since to %remembered_sessions_status_since_time. new a35aa9c x2goserver/sbin/x2gocleansessions: give suspended-but-running sessions a grace period of one iteration. The 4 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: debian/changelog | 18 +++++++++++ x2goserver/sbin/x2gocleansessions | 60 ++++++++++++++++++++++++------------- 2 files changed, 58 insertions(+), 20 deletions(-) -- Alioth's /srv/git/code.x2go.org/x2goserver.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 2108538530130044766907444e4b55fb2901ae8b Author: Mihai Moldovan <ionic@ionic.de> Date: Sun Jun 21 22:39:05 2015 +0200 x2goserver/sbin/x2gocleansessions: re-fetch the current sessions' status before handling it. Using the "cached" value from the initial x2golistsessions run may be desynchronized with the actual current value. Avoids a race condition logging users out after they attached to a session. Cherry-picked from release/4.0.1.x branch. --- debian/changelog | 5 +++++ x2goserver/sbin/x2gocleansessions | 3 +++ 2 files changed, 8 insertions(+) diff --git a/debian/changelog b/debian/changelog index 125de2d..d4b36cb 100644 --- a/debian/changelog +++ b/debian/changelog @@ -187,6 +187,11 @@ x2goserver (4.0.1.20-0x2go1) UNRELEASED; urgency=low file. Only check the primary and secondary groups as returned by getgid()/getgroups(). Fixes long delays in session startup on machines with a gazillion of groups. + - x2goserver/sbin/x2gocleansessions: re-fetch the current sessions' status + before handling it. Using the "cached" value from the initial + x2golistsessions run may be desynchronized with the actual current + value. Avoids a race condition logging users out after they attached to a + session. * x2goserver.spec: - Add sudo and logcheck as BuildRequires and Requires. Don't own directories that are owned by sudo and logcheck. Logcheck is not diff --git a/x2goserver/sbin/x2gocleansessions b/x2goserver/sbin/x2gocleansessions index 83e57a1..11c98a3 100755 --- a/x2goserver/sbin/x2gocleansessions +++ b/x2goserver/sbin/x2gocleansessions @@ -189,6 +189,9 @@ elsif ($pid == 0 ) #print @sinfo[1], ': ', $remembered_sessions_since{@sinfo[1]},' ',$remembered_sessions_status{@sinfo[1]},"\n"; + # Update current status once per session. Avoids race conditions. + @sinfo[4] = system_capture_stdout_output ("$x2go_lib_path/x2gogetstatus", "@sinfo[1]"); + if (@sinfo[4]eq 'F') { log_message('debug', "@sinfo[1] is blocked"); -- Alioth's /srv/git/code.x2go.org/x2goserver.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 17671041f4234ecbdb45516fea6d35e6ae4ffca3 Author: Mihai Moldovan <ionic@ionic.de> Date: Sun Jun 21 22:44:41 2015 +0200 x2goserver/sbin/x2gocleansessions: rename %remembered_sessions_since to %remembered_sessions_status_since. That's what it really is. Add comments to further clarify what it's actually doing. Change it to include a timestamp instead of the "iteration count multiplied by two" value. Compare timestamps to see if killing hanging nxagent processes is necessary. Cherry-picked from release/4.0.1.x branch. --- debian/changelog | 6 ++++++ x2goserver/sbin/x2gocleansessions | 28 ++++++++++++++-------------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/debian/changelog b/debian/changelog index d4b36cb..0ddd829 100644 --- a/debian/changelog +++ b/debian/changelog @@ -192,6 +192,12 @@ x2goserver (4.0.1.20-0x2go1) UNRELEASED; urgency=low x2golistsessions run may be desynchronized with the actual current value. Avoids a race condition logging users out after they attached to a session. + - x2goserver/sbin/x2gocleansessions: rename %remembered_sessions_since to + %remembered_sessions_status_since. That's what it really is. Add + comments to further clarify what it's actually doing. Change it to + include a timestamp instead of the "iteration count multiplied by two" + value. Compare timestamps to see if killing hanging nxagent processes is + necessary. * x2goserver.spec: - Add sudo and logcheck as BuildRequires and Requires. Don't own directories that are owned by sudo and logcheck. Logcheck is not diff --git a/x2goserver/sbin/x2gocleansessions b/x2goserver/sbin/x2gocleansessions index 11c98a3..8e374aa 100755 --- a/x2goserver/sbin/x2gocleansessions +++ b/x2goserver/sbin/x2gocleansessions @@ -146,7 +146,7 @@ elsif ($pid == 0 ) $SIG{CHLD} = sub { wait }; my %remembered_sessions_status = (); - my %remembered_sessions_since = (); + my %remembered_sessions_status_since = (); my $last_reniced = 0; my $user; @@ -158,12 +158,12 @@ elsif ($pid == 0 ) my @outp=split("\n","$outp"); # forget earlier remembered blocked sessions - while ( my ($session, $remembered_since) = each(%remembered_sessions_since) ) + while ( my ($session, $remembered_since) = each(%remembered_sessions_status_since) ) { if (! join(',', @outp)=~m/$session/) { delete $remembered_sessions_status{$session}; - delete $remembered_sessions_since{$session}; + delete $remembered_sessions_status_since{$session}; } } @@ -172,22 +172,21 @@ elsif ($pid == 0 ) my @sinfo=split('\\|',"@outp[$i]"); - # clean up invalid sessions from the session database - if ( ( ! @sinfo[0] ) && ( $remembered_sessions_since{ @sinfo[1] } ge 10 ) ) + # Clean up invalid sessions (i.e., those for which no nxagent process is running anymore) + # from the session database, if the status didn't change for more than 10 seconds. + if ((!@sinfo[0]) && (defined ($remembered_sessions_status_since{@sinfo[1]})) && ((gmtime (time) - $remembered_sessions_status_since{@sinfo[1]}) >= 10)) { dbsys_rmsessionsroot(@sinfo[1]); next; } - if (defined $remembered_sessions_since{ @sinfo[1] } && ($remembered_sessions_status{ @sinfo[1] } =~m/@sinfo[4]/ )) - { - $remembered_sessions_since{ @sinfo[1] } += 2; - } else { - $remembered_sessions_status{ @sinfo[1] } = @sinfo[4]; - $remembered_sessions_since{ @sinfo[1] } = 0; + # Record the status of previously unseen sessions and the current time. + if (!(defined ($remembered_sessions_status_since{@sinfo[1]})) || ($remembered_sessions_status{@sinfo[1]} !~ m/@sinfo[4]/)) { + $remembered_sessions_status{@sinfo[1]} = @sinfo[4]; + $remembered_sessions_status_since{@sinfo[1]} = gmtime (time); } - #print @sinfo[1], ': ', $remembered_sessions_since{@sinfo[1]},' ',$remembered_sessions_status{@sinfo[1]},"\n"; + #print @sinfo[1], ': ', $remembered_sessions_status_since{@sinfo[1]},' ',$remembered_sessions_status{@sinfo[1]},"\n"; # Update current status once per session. Avoids race conditions. @sinfo[4] = system_capture_stdout_output ("$x2go_lib_path/x2gogetstatus", "@sinfo[1]"); @@ -195,12 +194,13 @@ elsif ($pid == 0 ) if (@sinfo[4]eq 'F') { log_message('debug', "@sinfo[1] is blocked"); - if ($remembered_sessions_since{@sinfo[1]} ge 20) + # Kill the process if blocked for more than 20 seconds. + if ((gmtime (time) - $remembered_sessions_status_since{@sinfo[1]}) >= 20) { # send SIGKILL to dangling X-server processes log_message('warning', "@sinfo[1]: found stale X-server process (@sinfo[0]), sending SIGKILL"); system("kill", "-9", "@sinfo[0]"); - delete $remembered_sessions_since{@sinfo[1]}; + delete $remembered_sessions_status_since{@sinfo[1]}; } my $display = @sinfo[2]; if (-S "/tmp/.X11-unix/X$display") { -- Alioth's /srv/git/code.x2go.org/x2goserver.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 f13c44b590521b3b41dca6dfc079c7906c631894 Author: Mihai Moldovan <ionic@ionic.de> Date: Sun Jun 21 22:55:53 2015 +0200 x2goserver/sbin/x2gocleansessions: rename %remembered_sessions_status_since to %remembered_sessions_status_since_time. Add %remembered_sessions_status_since_iterations that will come in handy for the next change. Cherry-picked from release/4.0.1.x branch. --- debian/changelog | 5 +++++ x2goserver/sbin/x2gocleansessions | 29 +++++++++++++++++++---------- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/debian/changelog b/debian/changelog index 0ddd829..13e7288 100644 --- a/debian/changelog +++ b/debian/changelog @@ -198,6 +198,11 @@ x2goserver (4.0.1.20-0x2go1) UNRELEASED; urgency=low include a timestamp instead of the "iteration count multiplied by two" value. Compare timestamps to see if killing hanging nxagent processes is necessary. + - x2goserver/sbin/x2gocleansessions: rename + %remembered_sessions_status_since to + %remembered_sessions_status_since_time. Add + %remembered_sessions_status_since_iterations that will come in handy for + the next change. * x2goserver.spec: - Add sudo and logcheck as BuildRequires and Requires. Don't own directories that are owned by sudo and logcheck. Logcheck is not diff --git a/x2goserver/sbin/x2gocleansessions b/x2goserver/sbin/x2gocleansessions index 8e374aa..7d28c05 100755 --- a/x2goserver/sbin/x2gocleansessions +++ b/x2goserver/sbin/x2gocleansessions @@ -146,7 +146,9 @@ elsif ($pid == 0 ) $SIG{CHLD} = sub { wait }; my %remembered_sessions_status = (); - my %remembered_sessions_status_since = (); + my %remembered_sessions_status_since_time = (); + my %remembered_sessions_status_since_iterations = (); + my $last_reniced = 0; my $user; @@ -158,12 +160,13 @@ elsif ($pid == 0 ) my @outp=split("\n","$outp"); # forget earlier remembered blocked sessions - while ( my ($session, $remembered_since) = each(%remembered_sessions_status_since) ) + while ( my ($session, $remembered_since) = each(%remembered_sessions_status_since_time) ) { if (! join(',', @outp)=~m/$session/) { delete $remembered_sessions_status{$session}; - delete $remembered_sessions_status_since{$session}; + delete $remembered_sessions_status_since_time{$session}; + delete $remembered_sessions_status_since_iterations{$session}; } } @@ -174,19 +177,25 @@ elsif ($pid == 0 ) # Clean up invalid sessions (i.e., those for which no nxagent process is running anymore) # from the session database, if the status didn't change for more than 10 seconds. - if ((!@sinfo[0]) && (defined ($remembered_sessions_status_since{@sinfo[1]})) && ((gmtime (time) - $remembered_sessions_status_since{@sinfo[1]}) >= 10)) + if ((!@sinfo[0]) && (defined ($remembered_sessions_status_since_time{@sinfo[1]})) && ((gmtime (time) - $remembered_sessions_status_since_time{@sinfo[1]}) >= 10)) { dbsys_rmsessionsroot(@sinfo[1]); next; } - # Record the status of previously unseen sessions and the current time. - if (!(defined ($remembered_sessions_status_since{@sinfo[1]})) || ($remembered_sessions_status{@sinfo[1]} !~ m/@sinfo[4]/)) { + # Record the status of either previously unseen or status-changing sessions and the current time. + if (!(defined ($remembered_sessions_status_since_time{@sinfo[1]})) || ($remembered_sessions_status{@sinfo[1]} !~ m/@sinfo[4]/)) { $remembered_sessions_status{@sinfo[1]} = @sinfo[4]; - $remembered_sessions_status_since{@sinfo[1]} = gmtime (time); + $remembered_sessions_status_since_time{@sinfo[1]} = gmtime (time); + $remembered_sessions_status_since_iterations{@sinfo[1]} = 0; + } + else { + # Current status matches previously seen status and a time is recorded. + # Increment counter for this session. + ++$remembered_sessions_status_since_iterations{$sinfo[1]}; } - #print @sinfo[1], ': ', $remembered_sessions_status_since{@sinfo[1]},' ',$remembered_sessions_status{@sinfo[1]},"\n"; + #print @sinfo[1], ': ', $remembered_sessions_status_since_time{@sinfo[1]},' (' , $remembered_sessions_status_since_iterations{@sinfo[1]} ,'iterations) ',$remembered_sessions_status{@sinfo[1]},"\n"; # Update current status once per session. Avoids race conditions. @sinfo[4] = system_capture_stdout_output ("$x2go_lib_path/x2gogetstatus", "@sinfo[1]"); @@ -195,12 +204,12 @@ elsif ($pid == 0 ) { log_message('debug', "@sinfo[1] is blocked"); # Kill the process if blocked for more than 20 seconds. - if ((gmtime (time) - $remembered_sessions_status_since{@sinfo[1]}) >= 20) + if ((gmtime (time) - $remembered_sessions_status_since_time{@sinfo[1]}) >= 20) { # send SIGKILL to dangling X-server processes log_message('warning', "@sinfo[1]: found stale X-server process (@sinfo[0]), sending SIGKILL"); system("kill", "-9", "@sinfo[0]"); - delete $remembered_sessions_status_since{@sinfo[1]}; + delete $remembered_sessions_status_since_time{@sinfo[1]}; } my $display = @sinfo[2]; if (-S "/tmp/.X11-unix/X$display") { -- Alioth's /srv/git/code.x2go.org/x2goserver.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 a35aa9c5a7eaeaea164dda0e0069265359417540 Author: Mihai Moldovan <ionic@ionic.de> Date: Sun Jun 21 23:28:04 2015 +0200 x2goserver/sbin/x2gocleansessions: give suspended-but-running sessions a grace period of one iteration. Fixes: #888. Cherry-picked from release/4.0.1.x branch. --- debian/changelog | 2 ++ x2goserver/sbin/x2gocleansessions | 20 ++++++++++++++------ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/debian/changelog b/debian/changelog index 13e7288..92bb7a3 100644 --- a/debian/changelog +++ b/debian/changelog @@ -203,6 +203,8 @@ x2goserver (4.0.1.20-0x2go1) UNRELEASED; urgency=low %remembered_sessions_status_since_time. Add %remembered_sessions_status_since_iterations that will come in handy for the next change. + - x2goserver/sbin/x2gocleansessions: give suspended-but-running sessions a + grace period of one iteration. Fixes: #888. * x2goserver.spec: - Add sudo and logcheck as BuildRequires and Requires. Don't own directories that are owned by sudo and logcheck. Logcheck is not diff --git a/x2goserver/sbin/x2gocleansessions b/x2goserver/sbin/x2gocleansessions index 7d28c05..81dcf4a 100755 --- a/x2goserver/sbin/x2gocleansessions +++ b/x2goserver/sbin/x2gocleansessions @@ -273,12 +273,20 @@ elsif ($pid == 0 ) } if (@sinfo[4] eq 'S') { - if (session_is_running(@sinfo[1],@sinfo[11])) - { - log_message('debug', "@sinfo[1]: unmounting all shares"); - system("su", "@sinfo[11]", "-s", "/bin/sh", "-c", "export HOSTNAME && x2goumount-session @sinfo[1]"); - system("su", "@sinfo[11]", "-s", "/bin/sh", "-c", "x2gosuspend-session @sinfo[1]"); - log_message('debug', "@sinfo[1] was found running and has now been suspended"); + if (session_is_running(@sinfo[1],@sinfo[11])) { + # Give the session a grace period of one iteration. + # If it didn't change into suspended state by then, suspend it "forcefully". + if ($remembered_sessions_status_since_iterations{@sinfo[1]} == 1) { + log_message('debug', "@sinfo[1]: unmounting all shares"); + system("su", "@sinfo[11]", "-s", "/bin/sh", "-c", "export HOSTNAME && x2goumount-session @sinfo[1]"); + system("su", "@sinfo[11]", "-s", "/bin/sh", "-c", "x2gosuspend-session @sinfo[1]"); + log_message('debug', "@sinfo[1] was found running and has now been suspended"); + } + elsif ($remembered_sessions_status_since_iterations{@sinfo[1]} == 2) { + # Issue a diagnostic warning in case suspension was already tried, but failed to + # actually change the status for some reason. + log_message('warning', "@sinfo[1]: session status @sinfo[4] desynchronized with current status (R) and session suspend already tried unsuccessfully"); + } } } if (@sinfo[4] eq 'T') -- Alioth's /srv/git/code.x2go.org/x2goserver.git//..//_hooks_/post-receive-email on /srv/git/code.x2go.org/x2goserver.git