Un autre utilisation possible des capacités de Perl à ce niveau et
qui a en commun avec les sub la méthode de fonctionnement et la
simplification du codage et de la maintenance sont les modules.
Cette fois ci, les sous programmes ne sont plus au sein même du script mais dans dans des fichiers séparés.
Créez dans votre répertoire personnel un sous répertoire nommé
modules dans le quel vous placerez vos modules
.
L'écriture d'un module n'est pas vraiment différente de l'écriture
d'un script Perl normal. Il convient par contre de lui donner
l'extension .pm plutôt que pl .
#!/usr/bin/perl -w
# ============================================================================
#
# Description: package Getfileconf
#
#
# Functions : use this package to get the file configuration
#
# Attributes : none
#
#
#
# ============================================================================
package Conffilemngt;
use strict;
my $homedir = "/home/nesget";
my $etcdir = "$homedir/etc";
#my $confFileGeneric = "$etcdir/$ARGV[0]";
# ReadFile
# This function takes only one parameter which point out
# a variable in the configuration file
# then returns this variable
# the syntax is "ReadFile conf variable"
# &ReadFile($confFileGeneric);
sub ReadFile
{
my $line;
my @GenericArray;
my $confFile = $_[0];
my $variable = $_[1];
if(open(ReadFileIN,"<$confFile"))
{
while($line = <ReadFileIN>)
{
chomp($line);
unless($line =~/^\#/)
{
unless($line eq "")
{
@GenericArray = split(/\=/,$line);
if($GenericArray[0] eq $variable)
{
close(ReadFileIN);
return $GenericArray[1];
}
}
}
}
}
else
{
die("File $confFile doesn't exist $!\n");
}
close(ReadFileIN);
}
# DefinePriorityLess and DefinePriorityMore
# DefinePriority takes as argument a test value
# and return the right corresponding priority level.
# The syntax is
# &definePriority($confFile,$valueToTest);
sub DefinePriorityLess
{
my $confFile = "$etcdir/$_[0]";
my $reference;
my $medium;
my $bad;
my $testValue = $_[1];
$reference = &ReadFile($confFile,"reference");
$medium = &ReadFile($confFile,"medium");
$bad = &ReadFile($confFile,"bad");
print("$reference $medium $bad $testValue\n");
if($testValue == $reference)
{
return 0;
}
if($testValue < $reference and $testValue >= $medium)
{
return 1;
}
if($testValue < $medium and $testValue >= $bad)
{
return 2;
}
else
{
return 3;
}
}
sub DefinePriorityMore
{
my $confFile = "$etcdir/$_[0]";
my $reference;
my $medium;
my $bad;
my $testValue = $_[1];
$reference = &ReadFile($confFile,"reference");
$medium = &ReadFile($confFile,"medium");
$bad = &ReadFile($confFile,"bad");
print("$reference $medium $bad $testValue\n");
if($testValue == $reference)
{
return 0;
}
if($testValue > $reference and $testValue <= $medium)
{
return 1;
}
if($testValue > $medium and $testValue <= $bad)
{
return 2;
}
else
{
return 3;
}
}
1;
On remarque l'utilisation de la commande
package Conffilemngt; et l'ajout de
de 1; pour cloturer le module. Hormis cela, tout n'est que du
Perl très conventionnel.
Pour utiliser ce module au sein d'un script, il convient de préciser
à perl ou il se trouve avec l'option -I et les modules à
utiliser. La commande propre au module se fait ensuite comme l'appel à
un sub mais avec la forme suivante nom_du_module::fonction .
L'exemple ci dessous utilise le module déjà donné en
exemple
:
#!/usr/bin/perl -I/home/elair/modules
use SqlLaunch;
use Netfunction;
use SystemInfo;
use Conffilemngt;
use Alert;
use Sqlscript;
use strict;
my $ip = "192.168.10.35";
my $loadCpu = SystemInfo::TestLinuxCpu();
my $relCpu = int $loadCpu * 100;
print "Charge CPU $relCpu \n";
my $nbrValue = 96;
my $confFile = "pluton.loadCpu";
my $date = localtime();
my $coeff = 100;
my $name = "loadcpu";
my $type = "int";
my $home = "/home/elair";
my $data = "$home/data/loadcpu";
my $gnuplotCf = "$home/etc/loadcpu.cf";
SqlLaunch::Insert("$type","$name","$date","$ip",$relCpu);
my $loadCpuPriority=Conffilemngt::DefinePriorityMore($confFile,$relCpu);
print "La priorite est de $loadCpuPriority\n";
Alert::Alerte($confFile,$loadCpuPriority);
my @returnTabular = SqlLaunch::SelectxlastType("$type","$name","$ip",$nbrValue);
if(open(OUT,">$data"))
{
my @date = localtime();
my $tmp;
foreach $tmp(@returnTabular)
{
my @tmpTabular = split(/\;/,$tmp);
my @date = split(/\./,$tmpTabular[1]);
my $realValue = $tmpTabular[0] / $coeff;
print OUT"$date[0]\t$realValue\t\n";
}
close(OUT);
}
else
{
die("No write possible");
}
system("gnuplot $gnuplotCf");