package Linux::Monitor; use strict; use warnings; use Config::General; use UNIVERSAL::require; use Carp; # Falls der Interval nicht in der Config # gesetzt oder auf 0 steht, nehmen # wir INTERVAL als Default use constant INTERVAL => 60; sub run { my ($class, $basedir) = @_; my $self = bless { basedir => $basedir, loaded => { }, }, $class; my $config = $self->get_config("$basedir/etc/monitor.conf"); $self->{config} = $config; while ( 1 ) { $self->run_monitor(); sleep $config->{interval}; } } sub run_monitor { my $self = shift; my $config = $self->{config}; my $loaded = $self->{loaded}; my %status = (); foreach my $check (@{$config->{check}}) { # next wenn der Check nicht aktiv ist next unless $check->{active}; my $module = $check->{name}; # Nur require ausführen, wenn das Modul # noch nicht geladen wurde if (!exists $loaded->{$module}) { $module->require or croak "Unable to require '$module'"; $loaded->{$module} = 1; } # Das Checkmodul muss die Routinen # new(), set_options() und get() besitzen! my $obj = $module->new(); if (exists $check->{set_options}) { $obj->set_options($check->{set_options}); } $status{$module} = $obj->get(); } # Die Daten verarbeiten.... $self->process_status(\%status); } sub get_config { my ($self, $config_file) = @_; my $config = Config::General->new($config_file); my %config = $config->getall(); # Check sollte immer ein Array sein, damit # wir dies später nicht mehr prüfen müssen if (exists $config{check}) { if (ref($config{check}) eq 'HASH') { $config{check} = [ $config{check} ]; } } else { croak "Nothing to do!"; } # Interval setzen if (!$config{interval}) { $config{interval} = INTERVAL; } return \%config; } 1;