Besoin d'un coup de main (fonction strftime)

Fermé
Ghost Line Messages postés 2 Date d'inscription jeudi 16 novembre 2000 Statut Membre Dernière intervention 6 mars 2017 - Modifié par Ghost Line le 6/03/2017 à 11:47
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 7 mars 2017 à 13:00
Salut à tous !

J'ai besoin d'un coup de main ... je suis en galère sur un script en Perl, alors que je ne programme pas du tout dans ce langage (je "dev" en AutoIt, c'est dire :)).

#!/usr/bin/env perl

use warnings;
use strict;
use Sys::Hostname;
use POSIX;

#print strftime("MAG_%Y%M%d_nbcli_%H00.%a", localtime());

#Prefix CodeSoc f1 f2 f3 ...

my $hmin=0;
my $hmax=2400;
my $pivot=0;

while(1) {
if($ARGV[0] eq "-hmin" || $ARGV[0] eq "hmin" ) {
shift;
$hmin=$ARGV[0];
} elsif($ARGV[0] eq "-hmax" || $ARGV[0] eq "hmax" ) {
shift;
$hmax=$ARGV[0];
} elsif($ARGV[0] eq "-pivot" || $ARGV[0] eq "pivot" ) {
shift;
$pivot=$ARGV[0];
} else {
last;
}
shift;
}

if($#ARGV<2) {
print "$0 Prefix CodeSoc F1 [F2 [F3 ... ]]\n";
exit(3);
}

my $magnum="999";
my $name=hostname();
#$name="SRVSC0150";
if ($name =~ /^POS([0-9]{3})([0-9]{3})/ ) {
$magnum=$1;
} elsif ($name =~ /^SRVSC[0-9]([0-9]{3})/) {
$magnum=$1;
}

my $prefix=$ARGV[0];
my $codesoc="$ARGV[1]";
my $msg="Prefix: $prefix, codesoc=$codesoc, ";
my $res=0;

my $now=time();
my @today=localtime($now);
my @fileday;

if($today[2]*100+$today[1]<$pivot) {
@fileday=localtime($now-3600*24);
} else {
@fileday=@today;
}

if(!(($today[2]*100+$today[1])>=$hmin && ($today[2]*100+$today[1])<$hmax)) {
print "En dehors des heures d'export ($hmin-$hmax)\n";
exit(0);
}

for(my $f=2; $f<=$#ARGV; $f++) {
my $fn=$ARGV[$f];
$fn =~ s/%cs/$codesoc/g;
$fn =~ s/%mg/$magnum/g;
$fn=strftime($fn, @fileday);
$msg=$msg.$fn." ";
if(-f $prefix."/".$fn) {
$msg.="OK.";
} else {
$msg.="KO";
$res=2;
}
$msg.=" ";
}
print $msg."\n";
exit($res);


Mon problème est le suivant : ce script (destiné à fonctionner dans Nagios) est censé détecter la présence de fichiers ayant une extension .lun, .mar, .mer, etc. , fichier qui doit être généré côté client suivant le jour de la semaine.

Le truc, c'est que le script fait une contrôle sur des .mon, .sun, .wed, etc. car Nagios est hébergé sur une Debian localisée en anglais. Il va de soi que je n'ai pas les droits pour changer la localisation (ce serait trop facile).

Donc le coup de main dont j'ai besoin, ce serait d'avoir avant le contrôle du nom du fichier une petite table de correspondance qui modifie la valeur de la variable de telle façon que l'extension soit dans la bonne langue ...

Merci d'avance !

1 réponse

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 7/03/2017 à 13:08
Salut,

Si tu n'as pas la possibilité de changer la locale du système par défaut, il peut, en revanche, être possible que la locale française soit installée, bien que non activée par défaut.

Pour voir si c'est le cas, en ligne de commande tape
locale -a
et vois ce qui sort.

Si tu as une locale française installée, tu peux l'utiliser pour tes dates dans le cadre de l'environnement d'exécution de ton script Perl en utilisant
setlocale()
, par exemple si la locale s'appelle fr_FR :

   use locale;
   use POSIX qw(locale_h); # Imports setlocale() and the LC_ constants.
   setlocale(LC_TIME, "fr_FR") or die "Pardon";

Cela modifiera la locale pour le process de ton script Perl (pas pour le système).

Sinon, tu peux simplement faire un tableau associatif, qui va te permettre de faire correspondre les Mon, Tue, Wed, Thu, Fri, Sat, Sun en lun, mar, mer, jeu, ven, sam, dim. Un truc comme cela :

#!/usr/bin/perl

use warnings;
use strict;
use POSIX qw(strftime locale_h);
use locale;

my %hash = ('Mon' => 'lun',
    'Tue' => 'mar',
    'Wed' => 'mer',
    'Thu' => 'jeu',
    'Fri' => 'ven',
    'Sat' => 'sam',
    'Sun' => 'dim'
);

setlocale(LC_TIME, "C");
my $fr_dayname = $hash{strftime("%a", localtime())};
print strftime("MAG_%Y%M%d_nbcli_%H00.", localtime()) . $fr_dayname;

donne :
MAG_20170307_nbcli_1300.mar

J'ai importé locale_h de POSIX et locale pour mon test, afin de forcer la locale à un format de date US avec setlocale(), pour la démo (sur ma Debian, la locale est fr_FR.utf8 par défaut).

Tu n'as pas à le faire, vu que ta locale est déjà en date US.

A la réflexion, cela peut avoir du sens de le faire, si ton script doit fonctionner dans des environnements hétérogènes, avec des locales éventuellement exotiques, de forcer la locale en C, qui sera toujours présente, pour avoir un résultat toujours cohérent.


Dal
0