purgeCentralCache:
* Add debug option and debug message * Manage SAML storage backend * Read local configuration file
This commit is contained in:
parent
7fef157210
commit
aa986aa337
|
@ -1,51 +1,124 @@
|
|||
#!/usr/bin/perl
|
||||
# Cleaner for Lemonldap::NG : removes old sessions from Apache::Session
|
||||
#=============================================================================
|
||||
# Cleaner for LemonLDAP::NG: removes old sessions from Apache::Session
|
||||
#
|
||||
# This module is written to be used by cron to clean old sessions from
|
||||
# Apache::Session.
|
||||
# Apache::Session. It does not works with Apache::Session::Memcached
|
||||
#
|
||||
# This is part of LemonLDAP::NG product, released under GPL
|
||||
#=============================================================================
|
||||
|
||||
use Lemonldap::NG::Common::Conf;
|
||||
use Lemonldap::NG::Common::Conf::Constants;
|
||||
use Lemonldap::NG::Common::Apache::Session;
|
||||
use strict;
|
||||
|
||||
my $lmconf = Lemonldap::NG::Common::Conf->new();
|
||||
my $debug = 0;
|
||||
my $nb_purged = 0;
|
||||
|
||||
#=============================================================================
|
||||
# Load configuration
|
||||
#=============================================================================
|
||||
my $lmconf = Lemonldap::NG::Common::Conf->new();
|
||||
my $conf = $lmconf->getConf or die "Unable to get configuration ($!)";
|
||||
my $localconf = $lmconf->getLocalConf(PORTALSECTION)
|
||||
or die "Unable to get local configuration ($!)";
|
||||
|
||||
my $tmp = $conf->{globalStorage};
|
||||
if ($localconf) {
|
||||
$conf->{$_} = $localconf->{$_} foreach ( keys %$localconf );
|
||||
}
|
||||
|
||||
eval "use $tmp";
|
||||
die $@ if ($@);
|
||||
print "Configuration loaded\n" if $debug;
|
||||
|
||||
#=============================================================================
|
||||
# Timeout
|
||||
#=============================================================================
|
||||
$conf->{timeout} ||= 7200;
|
||||
|
||||
my @t;
|
||||
$tmp->get_key_from_all_sessions(
|
||||
$conf->{globalStorageOptions},
|
||||
print "Timeout value: ".$conf->{timeout}."\n" if $debug;
|
||||
|
||||
#=============================================================================
|
||||
# Apache::Session backends
|
||||
#=============================================================================
|
||||
my @backends;
|
||||
my $module;
|
||||
|
||||
# Sessions
|
||||
if ( defined $conf->{globalStorage}
|
||||
and $conf->{globalStorage} ne "Apache::Session::Memcached" )
|
||||
{
|
||||
|
||||
# Load module
|
||||
$module = $conf->{globalStorage};
|
||||
eval "use $module";
|
||||
die $@ if ($@);
|
||||
|
||||
# Add module in managed backends
|
||||
push @backends, [ $conf->{globalStorage}, $conf->{globalStorageOptions} ];
|
||||
|
||||
print "Session backend $module will be used\n" if $debug;
|
||||
}
|
||||
|
||||
# SAML
|
||||
if ( defined $conf->{samlStorage}
|
||||
and $conf->{samlStorage} ne $conf->{globalStorage}
|
||||
and $conf->{samlStorage} ne "Apache::Session::Memcached" )
|
||||
{
|
||||
|
||||
# Load module
|
||||
$module = $conf->{samlStorage};
|
||||
eval "use $module";
|
||||
die $@ if ($@);
|
||||
|
||||
# Add module in managed backends
|
||||
push @backends, [ $conf->{samlStorage}, $conf->{samlStorageOptions} ];
|
||||
|
||||
print "SAML backend $module will be used\n" if $debug;
|
||||
}
|
||||
|
||||
#=============================================================================
|
||||
# Load and purge sessions
|
||||
#=============================================================================
|
||||
for my $backend (@backends) {
|
||||
|
||||
my ( $storage, $options ) = splice @$backend;
|
||||
my @t;
|
||||
|
||||
# Get all expired sessions
|
||||
$storage->get_key_from_all_sessions(
|
||||
$options,
|
||||
sub {
|
||||
my $entry = shift;
|
||||
my $id = shift;
|
||||
push @t, $id if ( time - $entry->{_utime} > $conf->{timeout} );
|
||||
my $time = time;
|
||||
push @t, $id if ( $time - $entry->{_utime} > $conf->{timeout} );
|
||||
undef;
|
||||
}
|
||||
);
|
||||
);
|
||||
|
||||
for my $id (@t) {
|
||||
# Delete sessions
|
||||
for my $id (@t) {
|
||||
my %h;
|
||||
eval { tie %h, $tmp, $id, $conf->{globalStorageOptions} };
|
||||
eval { tie %h, $storage, $id, $options };
|
||||
if ($@) {
|
||||
next;
|
||||
}
|
||||
tied(%h)->delete;
|
||||
}
|
||||
print "Session $id has been purged\n" if $debug;
|
||||
$nb_purged++;
|
||||
}
|
||||
|
||||
if ( $tmp =~ /^Apache::Session::(?:Browseable::)?File$/i ) {
|
||||
# Remove lock files for File backend
|
||||
if ( $storage =~ /^Apache::Session::(?:Browseable::)?File$/i ) {
|
||||
require Apache::Session::Lock::File;
|
||||
my $l = new Apache::Session::Lock::File;
|
||||
$l->clean( $conf->{globalStorageOptions}->{LockDirectory},
|
||||
$conf->{timeout} );
|
||||
my $lock_directory = $options->{LockDirectory} || $options->{Directory};
|
||||
$l->clean( $lock_directory, $conf->{timeout} );
|
||||
}
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
#=============================================================================
|
||||
# Exit with success
|
||||
#=============================================================================
|
||||
print "$nb_purged sessions have been purged\n" if $debug;
|
||||
exit 0;
|
||||
|
|
Loading…
Reference in New Issue
Block a user