This is an automated email from the git hooks/post-receive script. x2go pushed a change to branch release/4.0.1.x in repository x2goserver. from 35e9b98 x2goserver/sbin/x2godbadmin: revoke all PRIVILEGES before trying to delete a user on postgres. new 08ab5c8 x2goserver/sbin/x2gocleansessions: re-fetch the current sessions' status before handling it. new 68d7d0f x2goserver/sbin/x2gocleansessions: rename %remembered_sessions_since to %remembered_sessions_status_since. new eeddf46 x2goserver/sbin/x2gocleansessions: rename %remembered_sessions_status_since to %remembered_sessions_status_since_time. new 8592542 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 | 67 ++++++++++++++++++++++++------------- 2 files changed, 61 insertions(+), 24 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 release/4.0.1.x in repository x2goserver. commit 08ab5c8b404690062a34f353a3294677e931ff75 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. --- debian/changelog | 5 +++++ x2goserver/sbin/x2gocleansessions | 3 +++ 2 files changed, 8 insertions(+) diff --git a/debian/changelog b/debian/changelog index 183075e..1e6dc72 100644 --- a/debian/changelog +++ b/debian/changelog @@ -18,6 +18,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 897ed88..ef6c463 100755 --- a/x2goserver/sbin/x2gocleansessions +++ b/x2goserver/sbin/x2gocleansessions @@ -197,6 +197,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') { syslog('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 release/4.0.1.x in repository x2goserver. commit 68d7d0fef9717a323e2d431a4eb4e00feb649cd0 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. --- debian/changelog | 6 ++++++ x2goserver/sbin/x2gocleansessions | 36 ++++++++++++++++++------------------ 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/debian/changelog b/debian/changelog index 1e6dc72..5c7dce6 100644 --- a/debian/changelog +++ b/debian/changelog @@ -23,6 +23,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 ef6c463..7131750 100755 --- a/x2goserver/sbin/x2gocleansessions +++ b/x2goserver/sbin/x2gocleansessions @@ -158,7 +158,7 @@ elsif ($pid == 0 ) $SIG{CHLD} = sub { wait }; my %remembered_sessions_status = (); - my %remembered_sessions_since = (); + my %remembered_sessions_status_since = (); while(sleep 2) { @@ -166,12 +166,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}; } } @@ -180,22 +180,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 ) ) - { - dbsys_rmsessionsroot(@sinfo[1]); - next; - } - - if (defined $remembered_sessions_since{ @sinfo[1] } && ($remembered_sessions_status{ @sinfo[1] } =~m/@sinfo[4]/ )) + # 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)) { - $remembered_sessions_since{ @sinfo[1] } += 2; - } else { - $remembered_sessions_status{ @sinfo[1] } = @sinfo[4]; - $remembered_sessions_since{ @sinfo[1] } = 0; + 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]/)) { + $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]"); @@ -203,12 +202,13 @@ elsif ($pid == 0 ) if (@sinfo[4]eq 'F') { syslog('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 syslog('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 release/4.0.1.x in repository x2goserver. commit eeddf466f5bdaa42d4048e3b9565610c1af274f9 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. --- debian/changelog | 5 +++++ x2goserver/sbin/x2gocleansessions | 28 ++++++++++++++++++---------- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/debian/changelog b/debian/changelog index 5c7dce6..cb9c2cc 100644 --- a/debian/changelog +++ b/debian/changelog @@ -29,6 +29,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 7131750..1d82b6e 100755 --- a/x2goserver/sbin/x2gocleansessions +++ b/x2goserver/sbin/x2gocleansessions @@ -158,7 +158,8 @@ 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 = (); while(sleep 2) { @@ -166,12 +167,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}; } } @@ -182,19 +184,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]"); @@ -203,12 +211,12 @@ elsif ($pid == 0 ) { syslog('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 syslog('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 release/4.0.1.x in repository x2goserver. commit 8592542c60e3499f2037656ba7ad033fe84cc49b 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. --- debian/changelog | 2 ++ x2goserver/sbin/x2gocleansessions | 20 ++++++++++++++------ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/debian/changelog b/debian/changelog index cb9c2cc..0458a3d 100644 --- a/debian/changelog +++ b/debian/changelog @@ -34,6 +34,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 1d82b6e..40aecdb 100755 --- a/x2goserver/sbin/x2gocleansessions +++ b/x2goserver/sbin/x2gocleansessions @@ -269,12 +269,20 @@ elsif ($pid == 0 ) } if (@sinfo[4] eq 'S') { - if (is_running(@sinfo[1],@sinfo[11])) - { - syslog('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]"); - syslog('debug', "@sinfo[1] was found running and has now been suspended"); + if (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) { + syslog('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]"); + syslog('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. + syslog('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