Faire un programme perl sous forme de plugins

But

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 :

  • Séparer les unités fonctionnelles,
  • Activer des fonctions via un fichier de configuration,
  • Gérer des cas inconnu avec les méthodes par défauts,
  • Profiter des héritages.

Principes

Nous allons avoir besoin de plusieurs fichiers pour séparer les unités fonctionnelles :

  1. Le moteur ‘plug.pl
  2. Le fichier de configuration ‘plug.conf’ dans lequel on définira les plugins à charger et comment les utiliser.
  3. Un fichier par plugins.

Code

Pour la démonstration nous allons créer deux plugins :

  • Un plugin shell
  • Un plugin snmp

Attention !!! ces plugins ne font rien d’autre que d’afficher des trucs à l’écran.

Le moteur

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 de configuration

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 /)]],
			   ],
		 },
 };

Les plugins

shell

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;

SNMP

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;

Exécution

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)
 
tech/faire_un_programme_sous_forme_de_plugins.txt · Dernière modification: 2006/08/26 11:39 par danjer
 
Recent changes RSS feed Valid XHTML 1.0 Valid CSS Driven by DokuWiki Powered by Lescampeurs