File x2gocleansessions of Package x2go
#!/usr/bin/perl
use strict;
sub check_pid
{
my $pid=shift;
my $sess=shift;
my $sec=shift;
if($sec < 30)
{
return 1;
}
open (F,"</proc/$pid/cmdline") or return 0;
my $text=<F>;
close (F);
if($text =~ m/$sess/)
{
return 1;
}
return 0;
}
sub check_stat
{
my $sess=shift;
my $user=shift;
my $log="~$user/.x2go/C-$sess/session.log";
my $text=`tail -1 $log`;
if($text =~ m/Session suspended/)
{
return 0;
}
return 1;
}
sub catch_term
{
unlink("/var/run/x2goserver.pid");
exit;
}
my $uname;
my $serv=$ENV{'HOSTNAME'};
my $pid = fork();
if (not defined $pid)
{
print "resources not avilable.\n";
}
elsif ($pid != 0)
{
open (F,">/var/run/x2goserver.pid");
print F "$pid\n";
close(F);
}
elsif ($pid == 0 )
{
close(STDIN);
close(STDOUT);
close(STDERR);
$SIG{TERM}=\&catch_term;
while(sleep 5)
{
$serv=`hostname`;
my $outp=`x2golistsessions_sql $serv 2>/dev/null`;
my @outp=split("\n","$outp");
for(my $i=0;$i<@outp;$i++)
{
my @sinfo=split('\\|',"@outp[$i]");
if(@sinfo[4]eq 'F')
{
#print "@sinfo[1], is blocked\n";
#print "(@sinfo[1])Unmounting all shares\n";
system( "su @sinfo[11] -c \"export HOSTNAME && x2goumount_session @sinfo[1]\" 2> /dev/null");
}
elsif(! check_pid (@sinfo[0],@sinfo[1],@sinfo[12]))
{
system("su @sinfo[11] -c \"sudo x2gopgwrapper changestatus 'F' @sinfo[1] \" > /dev/null");
#print "@sinfo[1], pid @sinfo[0] not exist, changing status from @sinfo[4] to F\n";
#print "(@sinfo[1])Unmounting all shares\n";
system( "su @sinfo[11] -c \"export HOSTNAME && x2goumount_session @sinfo[1]\" 2> /dev/null");
}
else
{
if(@sinfo[4]eq 'R')
{
if(!check_stat(@sinfo[1],@sinfo[11]))
{
system("su @sinfo[11] -c \"sudo x2gopgwrapper changestatus 'S' @sinfo[1] \" > /dev/null");
#print "@sinfo[1], is suspended, changing status from @sinfo[4] to S\n";
#print "(@sinfo[1])Unmounting all shares\n";
system( "su @sinfo[11] -c \"export HOSTNAME && x2goumount_session @sinfo[1]\" 2> /dev/null");
}
}
}
}
}
}