2008-11-17 17:59:56 +01:00
|
|
|
package Lemonldap::NG::Common::Conf::File;
|
2006-12-18 12:32:33 +01:00
|
|
|
|
|
|
|
use strict;
|
2008-11-17 17:59:56 +01:00
|
|
|
use Lemonldap::NG::Common::Conf::Constants;
|
2006-12-18 12:32:33 +01:00
|
|
|
|
2007-05-05 16:13:44 +02:00
|
|
|
our $VERSION = 0.22;
|
2006-12-18 12:32:33 +01:00
|
|
|
|
|
|
|
sub prereq {
|
|
|
|
my $self = shift;
|
2007-01-04 09:42:13 +01:00
|
|
|
unless ( $self->{dirName} ) {
|
|
|
|
print STDERR "No directory specified (dirName) !";
|
|
|
|
return 0;
|
2006-12-18 12:32:33 +01:00
|
|
|
}
|
2007-01-04 09:42:13 +01:00
|
|
|
unless ( -d $self->{dirName} ) {
|
|
|
|
print STDERR "Directory \"$self->{dirName}\" does not exist !";
|
|
|
|
return 0;
|
2006-12-18 12:32:33 +01:00
|
|
|
}
|
|
|
|
1;
|
|
|
|
}
|
|
|
|
|
|
|
|
sub available {
|
|
|
|
my $self = shift;
|
|
|
|
opendir D, $self->{dirName};
|
|
|
|
my @conf = readdir(D);
|
|
|
|
close D;
|
2007-01-04 09:42:13 +01:00
|
|
|
@conf = sort { $a <=> $b } map { /lmConf-(\d+)/ ? $1 : () } @conf;
|
2006-12-18 12:32:33 +01:00
|
|
|
return @conf;
|
|
|
|
}
|
|
|
|
|
|
|
|
sub lastCfg {
|
2007-01-04 09:42:13 +01:00
|
|
|
my $self = shift;
|
2006-12-18 12:32:33 +01:00
|
|
|
my @avail = $self->available;
|
|
|
|
return $avail[$#avail];
|
|
|
|
}
|
|
|
|
|
2007-03-04 15:52:51 +01:00
|
|
|
sub lock {
|
2007-03-09 20:46:09 +01:00
|
|
|
my $self = shift;
|
|
|
|
if( $self->isLocked ) {
|
|
|
|
sleep 2;
|
|
|
|
return 0 if( $self->isLocked );
|
|
|
|
}
|
2007-03-11 21:18:28 +01:00
|
|
|
unless( open F, ">".$self->{dirName} . "/lmConf.lock" ) {
|
|
|
|
print STDERR "Unable to lock (".$self->{dirName}."/lmConf.lock)\n";
|
2007-03-09 20:46:09 +01:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
print F $$;
|
|
|
|
close F;
|
2007-03-04 15:52:51 +01:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
sub isLocked {
|
2007-03-09 20:46:09 +01:00
|
|
|
my $self = shift;
|
2007-03-18 19:33:38 +01:00
|
|
|
-e $self->{dirName} . "/lmConf.lock";
|
2007-03-04 15:52:51 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
sub unlock {
|
2007-03-09 20:46:09 +01:00
|
|
|
my $self = shift;
|
|
|
|
unlink $self->{dirName} . "/lmConf.lock";
|
2007-03-04 15:52:51 +01:00
|
|
|
}
|
|
|
|
|
2006-12-18 12:32:33 +01:00
|
|
|
sub store {
|
2007-01-04 09:42:13 +01:00
|
|
|
my ( $self, $fields ) = @_;
|
2007-04-29 16:36:57 +02:00
|
|
|
my $mask = umask;
|
|
|
|
umask ( oct ( '0027' ) );
|
2007-03-04 15:52:51 +01:00
|
|
|
unless( open FILE, '>' . $self->{dirName} . "/lmConf-" . $fields->{cfgNum} ) {
|
|
|
|
print STDERR "Open file failed: $!";
|
|
|
|
$self->unlock;
|
|
|
|
return UNKNOWN_ERROR;
|
|
|
|
}
|
2007-01-04 09:42:13 +01:00
|
|
|
while ( my ( $k, $v ) = each(%$fields) ) {
|
2006-12-18 12:32:33 +01:00
|
|
|
print FILE "$k\n\t$v\n\n";
|
|
|
|
}
|
|
|
|
close FILE;
|
2007-04-29 16:36:57 +02:00
|
|
|
umask( $mask );
|
2007-03-04 15:52:51 +01:00
|
|
|
$self->unlock;
|
2006-12-18 12:32:33 +01:00
|
|
|
return $fields->{cfgNum};
|
|
|
|
}
|
|
|
|
|
|
|
|
sub load {
|
2007-01-04 09:42:13 +01:00
|
|
|
my ( $self, $cfgNum, $fields ) = @_;
|
2006-12-18 12:32:33 +01:00
|
|
|
my $f;
|
|
|
|
local $/ = "";
|
2007-01-04 09:42:13 +01:00
|
|
|
open FILE, $self->{dirName} . "/lmConf-$cfgNum";
|
|
|
|
while (<FILE>) {
|
|
|
|
my ( $k, $v ) = split /\n\s+/;
|
|
|
|
chomp $k;
|
|
|
|
$v =~ s/\n*$//;
|
|
|
|
if ($fields) {
|
|
|
|
$f->{$k} = $v if ( grep { $_ eq $k } @$fields );
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
$f->{$k} = $v;
|
|
|
|
}
|
2006-12-18 12:32:33 +01:00
|
|
|
}
|
|
|
|
close FILE;
|
|
|
|
return $f;
|
|
|
|
}
|
|
|
|
|
2007-05-05 16:13:44 +02:00
|
|
|
sub delete {
|
|
|
|
my ( $self, $cfgNum ) = @_;
|
|
|
|
unlink ( $self->{dirName} . "/lmConf-$cfgNum" );
|
|
|
|
}
|
|
|
|
|
2006-12-18 12:32:33 +01:00
|
|
|
__END__
|