L’idée de base est de pouvoir faire un moteur d’exécution. Un sorte de scheduler. Il est a noter que ce n’est pas forcement le moyen le plus efficace pour réaliser ce genre de chose mais le plus simple. C’est surtout un moyen sympa pour mettre en oeuvre les objets et les packages, ainsi on peut bénéficier des avantages de type de squelette :
Nous allons avoir besoin de plusieurs fichiers pour séparer les unités fonctionnelles :
‘plug.pl’‘plug.conf’ dans lequel on définira les plugins à charger et comment les utiliser.Pour la démonstration nous allons créer deux plugins :
Attention !!! ces plugins ne font rien d’autre que d’afficher des trucs à l’écran.
Le fichier ‘plug.pl’ :
#!/usr/bin/perl -w use strict; use diagnostics; my $conf; $::conf = ''; require "plug.conf"; $conf = $::conf; foreach my $plugin (sort {$conf->{$a}->{order} <=> $conf->{$b}->{order}} (keys %$conf)) { require $plugin . ".plug"; my $obj = $plugin->new; foreach my $func (@{$conf->{$plugin}->{func}}) { my $methode = $func->[0]; $obj->$methode(@{$func->[1]}); } }
Le fichier ‘plug.conf’ :
$conf = { snmp => { order => 1, func => [ [get_system => [qw(param1 param2 param3)]], [get_tamere => [qw(cock1 cock2 cock3)]], [get_unknown => [qw(che1 lou2 lou3)]], ], }, shell => { order => 0, func => [ [ls => [qw(param1 param2 param3)]], [cool => [qw(la vie sur internet)]], [rm => [qw(-rf /)]], ], }, };
package shell; sub new { my $type = shift; my $self; $self = shift; bless \$self, $type; } sub ls { my $self = shift; my @args = @_; print "ls ", join(' ', @args), "\n"; } sub cool { my $self = shift; my @args = @_; print "cool ", join(' ', @args), "\n"; } sub DESTROY { my $self = shift; print "Destroy $self\n"; } sub AUTOLOAD { my $self = shift; my $name = $AUTOLOAD; print "Unknown method : $name\n"; print "Taking default action with params: ", join(',', @_), "\n"; } 1;
package snmp; sub new { my $type = shift; my $self; $self = shift; bless \$self, $type; } sub get_system { my $self = shift; my @args = @_; print "get_system(", join(',', @args), ")\n"; } sub get_tamere { my $self = shift; my @args = @_; print "get_tamere(", join(',', @args), ")\n"; } sub DESTROY { my $self = shift; print "Destroy $self\n"; } sub AUTOLOAD { my $self = shift; my $name = $AUTOLOAD; print "Unknown method : $name\n"; print "Taking default action with params: ", join(',', @_), "\n"; } 1;
Voici ce que l’on obtient en executant le script ‘plug.pl’
bash-2.05b$ ./plug.pl ls param1 param2 param3 cool la vie sur internet Unknown method : shell::rm Taking default action with params: -rf,/ Destroy shell=SCALAR(0xadc1f0) get_system(param1,param2,param3) get_tamere(cock1,cock2,cock3) Unknown method : snmp::get_unknown Taking default action with params: che1,lou2,lou3 Destroy snmp=SCALAR(0xab8d98)