package Extraopts; use strict; use File::Basename; use Data::Dumper; sub new { my $class = shift; my %params = @_; my $self = { file => $params{file}, commandline => $params{commandline}, config => {}, section => 'default_no_section', }; bless $self, $class; $self->prepare_file_and_section(); $self->init(); return $self; } sub prepare_file_and_section { my $self = shift; if (! defined $self->{file}) { # ./check_stuff --extra-opts $self->{section} = basename($0); $self->{file} = $self->get_default_file(); } elsif ($self->{file} =~ /^[^@]+$/) { # ./check_stuff --extra-opts=special_opts $self->{section} = $self->{file}; $self->{file} = $self->get_default_file(); } elsif ($self->{file} =~ /^@(.*)/) { # ./check_stuff --extra-opts=@/etc/myconfig.ini $self->{section} = basename($0); $self->{file} = $1; } elsif ($self->{file} =~ /^(.*?)@(.*)/) { # ./check_stuff --extra-opts=special_opts@/etc/myconfig.ini $self->{section} = $1; $self->{file} = $2; } } sub get_default_file { my $self = shift; foreach my $default (qw(/etc/nagios/plugins.ini /usr/local/nagios/etc/plugins.ini /usr/local/etc/nagios/plugins.ini /etc/opt/nagios/plugins.ini /etc/nagios-plugins.ini /usr/local/etc/nagios-plugins.ini /etc/opt/nagios-plugins.ini)) { if (-f $default) { return $default; } } return undef; } sub init { my $self = shift; if (! defined $self->{file}) { $self->{errors} = sprintf 'no extra-opts file specified and no default file found'; } elsif (! -f $self->{file}) { $self->{errors} = sprintf 'could not open %s', $self->{file}; } else { my $data = do { local (@ARGV, $/) = $self->{file}; <> }; my $in_section = 'default_no_section'; foreach my $line (split(/\n/, $data)) { if ($line =~ /\[(.*)\]/) { $in_section = $1; } elsif ($line =~ /(.*?)\s*=\s*(.*)/) { $self->{config}->{$in_section}->{$1} = $2; } } } } sub is_valid { my $self = shift; return ! exists $self->{errors}; } sub overwrite { my $self = shift; my %commandline = (); if (scalar(keys %{$self->{config}->{default_no_section}}) > 0) { foreach (keys %{$self->{config}->{default_no_section}}) { $commandline{$_} = $self->{config}->{default_no_section}->{$_}; } } if (exists $self->{config}->{$self->{section}}) { foreach (keys %{$self->{config}->{$self->{section}}}) { $commandline{$_} = $self->{config}->{$self->{section}}->{$_}; } } foreach (keys %commandline) { if (! exists $self->{commandline}->{$_}) { $self->{commandline}->{$_} = $commandline{$_}; } } }