%CFG = (
'servers' => {
'SRV1' => {
'IP' => 99.32.4.0,
'user' => 'aname',
'pswd' => 'p4ssw0rd',
'status' => 'unavailable'
},
'SRV2' => {
'IP' => 129.99.10.5
'user' => 'guest',
'pswd' => 'guest'
'status' => 'unavailable'
}
},
'timeout' => 60,
'log' => {
'file' => '/var/log/my_log.log',
'level' => 'warn',
},
'temp' => 'remove me'
);
####
# Read a configuration file
# The arg can be a relative or full path, or
# it can be a file located somewhere in @INC.
sub ReadCfg
{
my $file = $_[0];
our $err;
{ # Put config data into a separate namespace
package CFG;
# Process the contents of the config file
my $rc = do($file);
# Check for errors
if ($@) {
$::err = "ERROR: Failure compiling '$file' - $@";
} elsif (! defined($rc)) {
$::err = "ERROR: Failure reading '$file' - $!";
} elsif (! $rc) {
$::err = "ERROR: Failure processing '$file'";
}
}
return ($err);
}
# Get our configuration information
if (my $err = ReadCfg('my_cfg.cfg')) {
print(STDERR $err, "\n");
exit(1);
}
##
##
# Add last access time
$CFG::CFG{'servers'}{'SRV1'}{'last_access'} = time();
# Change server availablility
$CFG::CFG{'servers'}{'SRV1'}{'status'} = 'online';
# Delete temporary data
delete($CFG::CFG{'temp'});
# Open log file
my $LOG;
if (! open($LOG, "> $CFG::CFG{'log'}{'file'}")) {
print(STDERR "ERROR: Failure opening log file: $!\n");
exit(1);
}
##
##
use Data::Dumper;
# Save configuration data
# Use the same arg as used with ReadCfg()
# so that file can be found in the %INC.
sub SaveCfg
{
my $file = $INC{$_[0]};
my $CFG;
if (! open($CFG, "> $file")) {
return ("ERROR: Failure opening '$file' - $!");
}
print $CFG <<_MARKER_;
#####
#
# My configuration file
#
#####
use strict;
use warnings;
our (%CFG);
# The configuration data
@{[Data::Dumper->Dump([\%CFG::CFG], ['*CFG'])]}
1;
# EOF
_MARKER_
close($CFG);
return (undef); # Success
}
# Save our configuration file
if (my $err = SaveCfg('my_cfg.cfg')) {
print(STDERR $err, "\n");
exit(1);
}
##
##
perl -c my_cfg.cfg