package Lemonldap::NG::Manager::Conf::File; use strict; use Lemonldap::NG::Manager::Conf::Constants; our $VERSION = 0.2; sub prereq { my $self = shift; unless ( $self->{dirName} ) { print STDERR "No directory specified (dirName) !"; return 0; } unless ( -d $self->{dirName} ) { print STDERR "Directory \"$self->{dirName}\" does not exist !"; return 0; } 1; } sub available { my $self = shift; opendir D, $self->{dirName}; my @conf = readdir(D); close D; @conf = sort { $a <=> $b } map { /lmConf-(\d+)/ ? $1 : () } @conf; return @conf; } sub lastCfg { my $self = shift; my @avail = $self->available; return $avail[$#avail]; } # TODO: LOCK sub lock { my $self = shift; if( $self->isLocked ) { sleep 2; return 0 if( $self->isLocked ); } unless( open F, $self->{dirName} . "/lmConf.lock" ) { print STDERR "Unable to lock\n"; return 0; } print F $$; close F; return 1; } sub isLocked { my $self = shift; -e $self->{dirName} . "/lmConf.lock"; } sub unlock { my $self = shift; unlink $self->{dirName} . "/lmConf.lock"; } sub store { my ( $self, $fields ) = @_; unless( open FILE, '>' . $self->{dirName} . "/lmConf-" . $fields->{cfgNum} ) { print STDERR "Open file failed: $!"; $self->unlock; return UNKNOWN_ERROR; } while ( my ( $k, $v ) = each(%$fields) ) { print FILE "$k\n\t$v\n\n"; } close FILE; $self->unlock; return $fields->{cfgNum}; } sub load { my ( $self, $cfgNum, $fields ) = @_; my $f; local $/ = ""; open FILE, $self->{dirName} . "/lmConf-$cfgNum"; while () { 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; } } close FILE; return $f; } __END__