[PERL] Rafraichissement variable

Bonjour à tous !

Voilà, je viens poster ici en dernier recours.
C’est a propos du PERL.

J’ai un fichier, qui contient des adresse IP bannies, qui se fait modifier quasi toutes les minutes.

Mais … Le programme, lui, ne ré-actualise pas le fichier !
Donc, je me retrouve avec l’ancien fichier : ca sert a rien.

Alors, je ne sais pas si vous avez besoin de code ou quoi, je ne vous passe rien ( je suis crevé :laughing: )

Merci pour vos réponses, et demandez moi si besoin !!

Décris plus précisément ton problème car là il me sera dur de t’aider.

Concrètement :

  • Quel est le programme qui va lire le fichier ? quel est son rôle ?
  • Qui est-ce qui est en Perl ?

Bon, j’en etais sur qu’il fallait debloké l’bloc:

J’ai un serveur TeamSpeak.
Sur ce server, j’ai un ROBOT.
Ce robot est constitué de shell et de perl.

Les fichiers qui m’interressenet, les fichiers-cœur, sont en perl.
Il include un fichier .txt dans une liste, la liste des bannis.

Ma liste s’actualise toutes les 1 minutes ( un bannissement rajouté )
Mais mon Rebot garde le fichier .txt tel qu’il etait au démarrage.

Donc ! C’etait pour savoir s’il y avait un moyen d’actualiser le ficher.

Merci

et pas moyen de relancer le robot ? il n’a pas une option pour relire sa conf ?

Bein si je le fait redemarrer toutes les 30 secondes ca ne s’apelle plus robot …
Car il est la pour automatiser les taches chiantes.

Tu me vois redemarrer toutes les minutes un robot … ca sert strictement a rien.

Si ce sont des “append” à la fin du fichier, tu peux faire une lecture “pipe” de ton fichier en adaptant la lecture en continu de la manière suivante:
initialisation

open(LEFIC,"</chemin/vers/le_fichier"); while (<LEFIC>) { }; # on ignore l'existant qu'on a déjà traité my $curPos=tell(LEFIC);

aprés, quand tu as besoin de regarder les nouvelles lignes du fichier:

seek(LEFIC,$curPos,0); while(<LEFIC>){ faire_qqchose_avec($_); }; $curPos=tell(LEFIC); Et tu en fais un démon qui ne réagit que quand il y a du nouveau.

Ok …
Merci ca a l’air un peu plus poussé que j’esperé mais au moins ca marcherait.

Je vais te demander quelque chose :

On marque quoi dans les bloucles while ?

Faut-il que je change quelques chose ( a part le chemin fichier ) ?

Je te remercie, j’essaie de trouver le bloc de code qui sert a l’ouverture du fichier et j’te post cela.

Merci

EDIT :

Voila le code :

    if($config{"BADIP-YUKSERV"}{"Enabled"}) {
    my @content = &readFile("Bad IP:         ",$config{"BADIP-YUKSERV"}{"File"});
    $settings{"badip"}{"content"} = \@content;
    }

On prend en consideration que l’Option BADIP-YUKSERV est Activée ( Enabled ).

Merci

quote="Yukiz"
On marque quoi dans les bloucles while ?[/quote] Ben ce que tu veux (à chaque itération, $_ contient une ligne). Le premier bloc lit donc ligne à ligne l’ensemble du fichier une première fois (je partais de l’idée que seules les nouvelles lignes t’interressaient donc cette boucle ne fait rien mais tu peux y faire ce que tu veux), et le bloc suivant reprend dans le fichier là ou était la fin avant, puis relit ligne à ligne les nouveaux ajouts (et là, à toi de faire quelquechose avec le $_ contenant la ligne lue).[quote=“Yukiz”]
Faut-il que je change quelques chose ( a part le chemin fichier ) ?[/quote]Ca dépend. Tu veux faire un programme qui fait quelquechose, ou c’est pour imprimer le code et l’afficher sur le mur ? [quote=“Yukiz”] (…)
Je te remercie, j’essaie de trouver le bloc de code qui sert a l’ouverture du fichier et j’te post cela.

Merci

EDIT : if($config{"BADIP-YUKSERV"}{"Enabled"}) { my @content = &readFile("Bad IP: ",$config{"BADIP-YUKSERV"}{"File"}); $settings{"badip"}{"content"} = \@content; }
On prend en consideration que l’Option BADIP-YUKSERV est Activée ( Enabled ).

Merci[/quote]
Oui, ben c’est du code… Et donc ?

Bien, en faite, il faut que le fichier soit lu et relu du debut.
Par forcement de la derniere ligne obtenue.

Ce serait plus simple, non ?

Le Robot procede comme ca :


Le Robot lit le code toutes les 2 secondes
Il rafraichit la liste des utilisateurs connectés.
Arrivé a mon bout de code, il verifie son adresse IP.
Si son adresse IP est equivalant que les IPs dans le fichier, alors il procède a un bannissement.

Donc, il faudrait que le bot, a chaque relecture, renitialise la variable ayant le contenu du fichier des bannis, et replace toutes lignes du fichier dans la variable.

Peut-etre qu’un simple renitialisment sufierait … Sais tu le faire ?

Je ne comprend toujours pas ton problême.
Si ce que tu veux, c’est revenir au début et relire tout le fichier à chaque fois, il suffit soit de le réouvrir quand tu as besoin, soit de lui dire seek(LEFIC,0,0) et le fichier est alors remboniné. Dans ce cas là, je ne vois pas trop la difficulté.

Mais si le processus qui alimente ta blacklist ne fait que rajouter des nouvelles adresses à la fin du fichier, je ne vois pas pkoi tu veux le relire intégralement à chaque fois. Autant entretenir en mêmoire une version en liste de tes adresses interdites et l’utiliser pour vérifier les adresses des connectés (grep /^$ipconnectée$/,@la_liste_des_adresses_interdites), plutot que de relire le fichier à chaque fois que tu vérifies une adresse. Tu fabrique ta liste au démarrage, et tu fais une routine qui la met à jour régulièrement. Aprés, quand tu as besoin, tu vérifies la présence ou non des ips que tu veux tester dans cette liste.

Pourrais tu m’expliquer comment marche ’ seek(LEFIC,0,0) '?

Je le metrais ou dans ce bloc de lignes :

   if($config{"BADIP-YUKSERV"}{Enabled} && !$protected) {
       if(!exists($nicks_not_checked{$player->{p_id}})) {
       $nicks_not_checked{$player->{p_id}} = time();
        }
       if(exists($nicks_not_checked{$player->{p_id}})) {
         foreach my $ip (@{$settings{badip}{content}}) {
            if(lc($player->{ip}) == $ip ) {
            $player->kick("Adresse IP BANNIE");
            $server->sendMessage("Anna -> USER : ".$player->{nick}." [".$player->{ip}."] Adresse IP Bannie");
            &log($log, "[BADIP-YUKSERV] ".$player->{nick}." ".$player->getFlags());
          }
      delete $nicks_not_checked{$player->{p_id}};
       }
     }
     }

[quote=“Yukiz”]Pourrais tu m’expliquer comment marche ’ seek(LEFIC,0,0) '?[/quote] perldoc.perl.org/functions/seek.html [quote=“Yukiz”]Je le metrais ou dans ce bloc de lignes :
(…)[/quote]Aucune idée: je ne sais pas ce que tu veux faire avec ce seek.