Config-HAProxy
view release on metacpan or search on metacpan
lib/Config/HAProxy.pm view on Meta::CPAN
}
croak "unrecognized keywords" if keys %_;
} else {
croak "bad number of arguments";
}
}
if ($self->{_lint}{enable}) {
$self->{_lint}{command} ||= 'haproxy -c -f';
if ($self->{_lint}{path}) {
my ($prog, $args) = split /\s+/, $self->{_lint}{command}, 2;
if (!File::Spec->file_name_is_absolute($prog)) {
foreach my $dir (split /:/, $self->{_lint}{path}) {
my $name = File::Spec->catfile($dir, $prog);
if (-x $name) {
$prog = $name;
last;
}
}
if ($args) {
$prog .= ' '.$args;
}
$self->{_lint}{command} = $prog;
}
}
return $self->{_lint}{command};
}
}
sub save {
my $self = shift;
croak "bad number of arguments" if @_ % 2;
local %_ = @_;
my $dry_run = delete $_{dry_run};
my @wrargs = %_;
return unless $self->tree;# FIXME
return unless $self->tree->is_dirty;
my ($fh, $tempfile) = tempfile('haproxy.XXXXXX',
DIR => dirname($self->filename));
$self->write($fh, @wrargs);
close($fh);
if (my $cmd = $self->lint) {
my ($ok, $err, $full, $outbuf, $errbuf) =
run(command => "$cmd $tempfile");
unless ($ok) {
unlink $tempfile;
if ($errbuf && @$errbuf) {
croak "Syntax check failed: ".join("\n", @$errbuf)."\n";
}
croak $err;
}
}
return 1 if $dry_run;
my $sb = stat($self->filename);
$self->backup;
rename($tempfile, $self->filename)
or croak "can't rename $tempfile to ".$self->tempfile.": $!";
# This will succeed: we've created the file, so we're owning it.
chmod $sb->mode & 0777, $self->filename;
# This will fail unless we are root, let it be so.
chown $sb->uid, $sb->gid, $self->filename;
$self->tree->clear_dirty;
return 1;
}
sub backup_name {
my $self = shift;
$self->filename . '~'
}
sub backup {
my $self = shift;
my $backup = $self->backup_name;
if (-f $backup) {
unlink $backup
or croak "can't unlink $backup: $!"
}
rename $self->filename, $self->backup_name
or croak "can't rename :"
. $self->filename
. " to "
. $self->backup_name
. ": $!";
}
1;
__END__
=head1 NAME
Config::HAProxy - Parser for HAProxy configuration file
=head1 SYNOPSIS
use Config::HAProxy;
$cfg = new Config::HAProxy($filename);
$cfg->parse;
$name = $cfg->filename;
@frontends = $cfg->select(name => 'frontend');
$itr = $cfg->iterator(inorder => 1);
while (defined($node = $itr->next)) {
# do something with $node
}
$cfg->lint(enable => 1, command => 'haproxy -c -f',
path => '/sbin:/usr/sbin')
$cfg->save(%hash);
$cfg->write($file_or_handle, %hash);
$cfg->backup;
$name = $self->backup_name;
$cfg->reset;
( run in 0.765 second using v1.01-cache-2.11-cpan-39bf76dae61 )