From aa986aa3377a11de701f65e8da316cc466ff4b4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Oudot?= Date: Fri, 9 Apr 2010 15:43:21 +0000 Subject: [PATCH] purgeCentralCache: * Add debug option and debug message * Manage SAML storage backend * Read local configuration file --- .../example/scripts/purgeCentralCache | 111 +++++++++++++++--- 1 file changed, 92 insertions(+), 19 deletions(-) diff --git a/modules/lemonldap-ng-portal/example/scripts/purgeCentralCache b/modules/lemonldap-ng-portal/example/scripts/purgeCentralCache index 17b9295a9..19a1ec401 100755 --- a/modules/lemonldap-ng-portal/example/scripts/purgeCentralCache +++ b/modules/lemonldap-ng-portal/example/scripts/purgeCentralCache @@ -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;