Schrift
[thread]12284[/thread]

Linux: Allgemeine Vorgehensweise zu Monitoring-Skript in Perl (Seite 2)

Leser: 2


<< |< 1 2 3 >| >> 23 Einträge, 3 Seiten
Duff
 2008-08-04 22:03
#113083 #113083
User since
2006-10-06
283 Artikel
BenutzerIn

user image
@bloonix: Dass sieht super aus. So würde ich es gerne realisieren. Wobei ich eigentlich noch nie mit Modulen bzw. selbst geschriebenen Modulen beschäftigt habe. Habe bisher immer alle Funktionen in ein Skript verlagert.

Zudem finde ich die config-Datei super, nur wie lese ich sie ein bzw. werte sie aus?

Hast du eventuell ein kleines Beispiel aus einem anderen Bereich?
D'OH
Daniel
bloonix
 2008-08-05 11:47
#113097 #113097
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Die Config kannst du mit CPAN:Config::General auslesen.
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
Duff
 2008-08-05 11:54
#113098 #113098
User since
2006-10-06
283 Artikel
BenutzerIn

user image
bloonix+2008-08-05 09:47:18--
Die Config kannst du mit CPAN:Config::General auslesen.


Ok, und dann in monitor.pl einbinden?
D'OH
Daniel
bloonix
 2008-08-06 17:32
#113159 #113159
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hmmm, du stellst aber Fragen ... ;)

Also ich würde monitor.pl nur zum Starten verwenden.

Nehmen wir die Beispielstruktur aus einem vorherigen Thread:

Code: (dl )
1
2
3
4
5
6
7
bin/monitor.pl
etc/monitor.conf
lib/Linux/Monitor.pm
lib/Linux/Monitor/Memory.pm
lib/Linux/Monitor/CPU.pm
lib/Linux/Monitor/Disk.pm
lib/Linux/Monitor/Net.pm


Dann könnte monitor.pl so ausssehen:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/perl
use strict;
use warnings;
my $BASEDIR; # danke @pq für den Tipp

BEGIN {
use FindBin;
$BASEDIR = $FindBin::Bin;
$BASEDIR =~ s@/bin$@@;
}

use lib "$BASE_DIR/lib";
use Linux::Monitor;
Linux::Monitor->run($BASEDIR);


Die gesamte Steuerung wird dann in Linux/Monitor.pm erledigt.

Wenn die Config (etc/monitor.conf) wie folgt aussieht:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
interval = 60

<check>
name = Linux::Monitor::Memory
active = 1
<set_options>
foo = 1
bar = 2
baz = 3
</set_options>
</check>

<check>
name = Linux::Monitor::Net
active = 1
<set_options>
foo = 1
bar = 2
baz = 3
</set_options>
</check>


Könnte lib/Linux/Monitor.pm so aussehen:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
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;


Das habe ich eben schnell zusammen gehackt... debuggen, erweitern,
verschönern, verbessern und den ganzen $foo musst du selber, aber
es sollte ein Ansatz sein.

Wenn du dich mit Modulen etc. noch nicht so gut auskennst, dann solltest
du dir die Perldoc durchlesen. :)

Gruss
bloonix

Edit: pq's Einwand berücksichtigt + einige diverse Änderungen
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
Duff
 2008-08-06 17:56
#113161 #113161
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Gefällt mir vom Aufbau her super, nur wie du schon erwähnt hast, kenne ich mich noch nicht wirklich mit Modulen aus.

Wie genau meinst du das mit dem Durchlesen der perldoc???
Bestimme Stellen?

Heißt mit Modulen auch gleichzeitig objektorientiert.

(Sorry für die vielleicht etwas komischen Fragen, aber mir ist es nicht so ganz klar)
D'OH
Daniel
pq
 2008-08-06 17:57
#113162 #113162
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
bloonix+2008-08-06 15:32:47--
Code: (dl )
1
2
3
4
5
6
7
use vars qw/$BASEDIR/;

BEGIN {
use FindBin;
$BASEDIR = $FindBin::Bin;
$BASEDIR =~ s@/bin$@@;
}

darf ich fragen, wieso es hier eine globale variable sein muss? ich würde da eine variable
mit my() definieren. oder hab ich übersehen, dass du die noch woanders benutzt?
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
bloonix
 2008-08-06 18:54
#113168 #113168
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
@pq, Copy+Paste :)

"my" wäre natürlich an dieser Stelle besser
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
bloonix
 2008-08-06 19:07
#113169 #113169
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Duff+2008-08-06 15:56:24--
Gefällt mir vom Aufbau her super, nur wie du schon erwähnt hast, kenne ich mich noch nicht wirklich mit Modulen aus.

Wie genau meinst du das mit dem Durchlesen der perldoc???
Bestimme Stellen?


Alles, was du nicht weißt, aber wissen möchtest findest du hier:

Perldoc-Tutorials

Duff+2008-08-06 15:56:24--
Heißt mit Modulen auch gleichzeitig objektorientiert.


Nein, heißt es nicht, aber meine Empfehlung ist es auf jeden Fall
objektorientiert zu entwickeln.

Wird es solangsam gruselig? Denk an die vielen Tipps zu Nagios, Munin etc ;-)
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
Duff
 2008-08-06 20:37
#113173 #113173
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Danke, danke.

Gibt es so ein Tutorial nicht auch auf deutsch?
Finde, dass sowas "komplizierte" besser auf deutsch für mich verständlich ist.
D'OH
Daniel
bloonix
 2008-08-07 12:58
#113183 #113183
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Eine deutsche Übersetzung gibt teilweise hier in der Perl-Community
im WIKI. Vielleicht magst du da mal reinschauen.
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
<< |< 1 2 3 >| >> 23 Einträge, 3 Seiten



View all threads created 2008-08-01 14:38.