diff --git a/monitorix b/monitorix index f9ac036..e100274 100755 --- a/monitorix +++ b/monitorix @@ -46,8 +46,8 @@ $SIG{'TERM'} = 'INT_handler'; $SIG{'CHLD'} = 'CHLD_handler'; $SIG{'HUP' } = 'HUP_handler'; -use constant VERSION => "3.4.92"; -use constant RELDATE => "04-Mar-2014"; +use constant VERSION => "3.4.93"; +use constant RELDATE => "11-Mar-2014"; my @suppsys = ("Linux", "FreeBSD", "OpenBSD", "NetBSD"); our %config; @@ -92,7 +92,6 @@ sub HUP_handler { } sub daemonize { - chdir("/") || die "Can't chdir to /: $!"; open(STDIN, "< /dev/null") || die "Can't read /dev/null: $!"; open(STDOUT, ">> $config{log_file}") || die "Can't write to LOG: $!"; umask(022) || die "Unable to umask 022: $!"; @@ -381,7 +380,7 @@ if(!stat($options{c})) { die "can't open file '$options{c}': $!"; } -# load configuration file +# load main configuration file my $conf = new Config::General( -ConfigFile => $options{c}, ); @@ -412,7 +411,6 @@ $0 = sprintf("%s %s%s%s%s", $options{d} ? " -d $options{d}" : "", $options{v} ? " -v" : ""); -daemonize(); logger("Starting Monitorix version " . VERSION . " (pid $$)."); # save the pidfile @@ -429,6 +427,7 @@ unless(chdir("/tmp")) { die "can't chdir to /tmp: $!"; } +daemonize(); if($options{d}) { if($options{d} ne "none" && $options{d} ne "all") { @{$config{debug}} = split(',', $options{d}); @@ -442,12 +441,60 @@ if($options{d}) { logger("Changed process name to '$0'."); } +# load additional configuration files +if(opendir(DIR, $config{include_dir})) { + my @files = grep { !/^[.]/ } readdir(DIR); + close(DIR); + foreach my $c (sort @files) { + my $conf_inc = new Config::General( + -ConfigFile => $config{include_dir} . "/$c", + ); + my %config_inc = $conf_inc->getall; + my $g = $config_inc{graph_name}; + if(!$g) { + logger("ERROR: graph name not defined."); + next; + } + if(grep {trim($_) eq $g} (split(',', $config{graph_name}))) { + logger("ERROR: graph name '$config_inc{graph_name}' already exist."); + next; + } + if(!$config_inc{graph_enable}->{$g}) { + logger("ERROR: graph name '$config_inc{graph_name}' doesn't have a 'graph_enable' entry."); + next; + } + if(!$config_inc{graph_title}->{$g}) { + logger("ERROR: graph name '$config_inc{graph_name}' doesn't have a 'graph_title' entry."); + next; + } + if(!$config_inc{$g}) { + logger("ERROR: graph name '$config_inc{graph_name}' doesn't have its own ''."); + next; + } + $config{graph_enable}->{$g} = $config_inc{graph_enable}->{$g}; + $config{$g} = $config_inc{$g}; + $config{graph_title}->{$g} = $config_inc{graph_title}->{$g}; + $config{graph_name} .= ", $g"; + foreach my $k (sort keys %{$config_inc{graphs}}) { + $config{graphs}->{$k} = $config_inc{graphs}->{$k}; + } + delete $config_inc{graph_name}; + delete $config_inc{graph_enable}; + delete $config_inc{$g}; + delete $config_inc{graph_title}; + delete $config_inc{graphs}; + @config{keys %config_inc} = values %config_inc; + } +} else { + logger("Can't read directory '$config{include_dir}'. $!"); +} + # save the path of the configuration file if(open(OUT, "> " . $config{base_dir} . "/cgi/monitorix.conf.path")) { print(OUT "$options{c}\n"); close(OUT); } else { - logger("Unable to create the file '$config{base_dir}/cgi/monitorix.conf.path'."); + logger("Unable to create the file '$config{base_dir}/cgi/monitorix.conf.path'. $!"); } flush_accounting_rules(\%config, $options{d}); @@ -474,14 +521,14 @@ foreach (split(',', $config{graph_name} . ", traffacct")) { eval "use $g qw(" . $init . " " . $g . "_update)"; if($@) { - logger("WARNING: unable to find module '$g'"); + logger("WARNING: unable to find module '$g'."); next; } { no strict "refs"; eval { &$init($g, \%config, $d); }; } - logger("WARNING: unexpected errors in function $init()") if($@); + logger("WARNING: unexpected errors in function $init().") if($@); } } diff --git a/monitorix.conf b/monitorix.conf index 573a8ee..d054ca6 100644 --- a/monitorix.conf +++ b/monitorix.conf @@ -16,6 +16,7 @@ show_gaps = n global_zoom = 1 max_historic_years = 1 accept_selfsigned_certs = y +include_dir = /etc/monitorix/conf.d base_dir = /var/lib/monitorix/www/ base_lib = /var/lib/monitorix/