Lemonldap-NG-Common

 view release on metacpan or  search on metacpan

lib/Lemonldap/NG/Common/Conf/Backends/File.pm  view on Meta::CPAN

    }
    unless ( open F, ">", $self->_lock ) {
        $Lemonldap::NG::Common::Conf::msg .=
          "Unable to lock (" . $self->_lock . ") \n";
        return 0;
    }
    print F $$;
    close F;
    return 1;
}

sub isLocked {
    my $self = shift;
    -e $self->_lock;
}

sub unlock {
    my $self = shift;
    unlink $self->_lock;
    1;
}

sub store {
    my ( $self, $fields ) = @_;
    my $mask = umask;
    umask( oct('0027') );
    unless ( open FILE, '>', $self->_file( $fields->{cfgNum} ) ) {
        $Lemonldap::NG::Common::Conf::msg = "Open file failed: $! \n";
        $self->unlock;
        return UNKNOWN_ERROR;
    }
    binmode(FILE);
    my $json_options = {
        allow_nonref => 1,
        (
            $self->{prettyPrint}
            ? (
                pretty    => 1,
                canonical => 1
              )
            : ()
        )
    };
    my $f = to_json( $fields, $json_options );
    print FILE $f;
    close FILE;
    umask($mask);
    return $fields->{cfgNum};
}

sub load {
    my ( $self, $cfgNum, $fields ) = @_;
    my ( $f, $filename );
    if ( -e $self->_file($cfgNum) ) {
        $filename = $self->_file($cfgNum);
    }
    elsif ( -e "$self->{dirName}/lmConf-$cfgNum.js" ) {
        $filename = "$self->{dirName}/lmConf-$cfgNum.js";
    }
    if ($filename) {
        local $/ = '';
        my $ret;
        unless ( open FILE, '<', $filename ) {
            $Lemonldap::NG::Common::Conf::msg .= "Read error: $!$@";
            return undef;
        }
        binmode FILE;
        $f = join( '', <FILE> );
        close FILE;
        eval { $ret = from_json( $f, { allow_nonref => 1 } ) };
        if ($@) {
            print STDERR "$@\n";
            $Lemonldap::NG::Common::Conf::msg .=
              "JSON fails to read file: $@ \n";
            return undef;
        }
        return $ret;
    }

    # Old format
    elsif ( -e "$self->{dirName}/lmConf-$cfgNum" ) {
        open FILE, '<', "$self->{dirName}/lmConf-$cfgNum" or die "$!$@";
        local $/ = "";
        unless ( open FILE, '<', $self->{dirName} . "/lmConf-$cfgNum" ) {
            $Lemonldap::NG::Common::Conf::msg .= "Open file failed: $! \n";
            return undef;
        }
        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;
            }
        }
        close FILE;
        require Lemonldap::NG::Common::Conf::Serializer;
        return $self->unserialize($f);
    }
    else {
        $Lemonldap::NG::Common::Conf::msg .=
          "Unable to find configuration file";
        return undef;
    }
}

sub delete {
    my ( $self, $cfgNum ) = @_;
    my $file = $self->_file($cfgNum);
    if ( -e $file ) {
        my $res = unlink($file);
        $Lemonldap::NG::Common::Conf::msg .= $! unless ($res);
        return $res;
    }
    else {
        $Lemonldap::NG::Common::Conf::msg .=
          "Unable to delete conf $cfgNum, no such file";
        return 0;
    }
}

1;
__END__



( run in 0.641 second using v1.01-cache-2.11-cpan-8dfa8b56332 )