Forum Programmation.shell Script de purge sous linux

Posté par . Licence CC by-sa
Tags : aucun
1
1
fév.
2013

Bonjour,
Explication du contexte…
J'ai des switchs CISCO qui envoient leur configuration sur un serveur tftp automatiquement a chaque modification de celle ci sur l'equipement.
L'objectif est de garder seulement 5 sauvegardes, soit les 5 plus recentes.
La forme du nom des fichiers est:
switch01-421--Mar--1-1993-01-03-34.974-GMT-0
Où "switch01" correspond au nom de l'equipement; "421" represente l'usine où est l'equipement (qui pourrait etre supprimé); ensuite la date, et tout a la fin un numero d'increment (le numero d'increment repart a "0" a chaque reboot de l'equipement.
Sur le serveur tftp, j'ai un repertoire par usine… soit une arboressence:
serveur-tftp/421
/533
/679
Note importante, il peut y avoir 50 sauvegardes du meme equipement en une journée comme une seule par an…
L'idée serait de programmer un tache cron tous les jours, qu'elle scanne le repertoire "serveur-tftp" (recursivement) et que dans chaque repertoire elle garde seulement les 5 dernieres sauvagerdes de chaque equipement…
alors ca fait un moment que j'ait pas fait de bash ou autre script… donc je viens vers vous pour savoir comment faire cette fameuse boucle, et le decoupage de nom de fichiers (ou utilisation de la date de creation de fichier) pour pouvoir selectionner les fichiers a garder ou effacer…
PS : j'espere etre dans la bonne categorie pour poster…
Merci

  • # Quelques billes

    Posté par . Évalué à -2. Dernière modification le 01/02/13 à 10:51.

    Bonjour,

    Pour faire ton script il te faut déjà avoir accès au serveur FTP pour récupérer l'information et effectuer les suppressions.
    De ce coté je te conseille lftp qui est un client ftp en console avec pleins de possibilités.

    Exemple:
    echo "find / > list_files" |lftp user:pass@ftp_serveur

    Cette commande va te lister les fichier du ftp dans le fichier list_files en local, ainsi tu pourras dans ton script sélectionner les fichiers à supprimer et envoyer les commandes de suppression de la même manière.

    voir le man de lftp pour lister les possibilités.

  • # Proposition

    Posté par . Évalué à 2. Dernière modification le 01/02/13 à 14:30.

    C'est vraiment brutal (non testé… remplace le premier echo par rm une fois que tu es sûr ;-)):

    echo $(for sw in `find -type f|cut -d- -f -2|sort|uniq`; do echo `ls -1t $sw*|tail -n +6`; done)
    
    
  • # logrotate est ton ami

    Posté par . Évalué à 3.

    tout est dans le titre

    logrotate fait ca tres bien,
    il le fait deja pour les logs du systeme
    il peut faire la rotation/suppression selon une date, selon une taille
    tu peux preciser combien tu en gardes…

  • # tout ca est intéressent :)

    Posté par . Évalué à 1. Dernière modification le 01/02/13 à 14:30.

    Merci pour les réponses…

    Lay, en faite mon script tournera sur la même machine où est le serveur tftp…
    du coup un "ls" fera l'affaire pour ca… mais il faudra plus creuser ;)

    Bluewhisper,

    ~# echo $(for sw in `find -type f|cut -d- -f -2|sort|uniq`; do echo `ls -1t $sw*|tail -n +6`; done)
    
    

    alors j'ai compris certain bout mais pas tout :P
    le "find" cherche les fichiers de type fichier, ensuite le "cut" prend le début du nom avec un delimiteur "-", le "sort" trie le résultat, et le "uniq" permet de supprimer les doublons de lignes… le "ls -1t" permet de faire un listing des fichiers en colonne et trié par date… le "tail -n +6" alors je comprends pas le "+6" mois je connais juste avec "6" sans le "+" pour afficher seulement les 6 derniers lignes…

    mais il y a de endroits ou je comprends pas grand chose…
    le "for sw in" et le "$sw*"…? c'est le paramètre de boucle mais je comprends pas trop…

    neox,
    je connaissais logrotate (jamais mis en place) mais pour gérer le log justement ^
    j'ai lu un peu de doc dessus mais la aussi j'ai des interrogations…
    Car dans chaque répertoire qui correspond a une usine, il va y avoir toutes les sauvegardes, comment logrotate fait la distinction entre les différents fichiers?
    Mon problème est que les noms de fichiers sont différents pour chaque switch et en plus chaque sauvegarde aura un nom différent a cause de l'inclusion de la date dans le nom (et je peux pas le changer…). Il ne doit pas jouer que sur la date car certain switchs seront modifier souvent et d'autre presque jamais…

    Merciiiii

    • [^] # Re: tout ca est intéressent :)

      Posté par . Évalué à 1. Dernière modification le 01/02/13 à 14:39.

      logratote gere tres bien les noms avec caracteres generiques

      ex pour apache

      /var/log/apache2/*.log {
              weekly
              missingok
              rotate 52
              compress
              delaycompress
              notifempty
              create 640 root adm
              sharedscripts
              postrotate
                      /etc/init.d/apache2 reload > /dev/null
              endscript
              prerotate
                      if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
                              run-parts /etc/logrotate.d/httpd-prerotate; \
                      fi; \
              endscript
      }
      
      

      on voit clairement qu'il doit traiter les fichiers *.log du dossier /var/log/apache2
      il fera le traitement toutes les semaines avec l'option weekly
      il en gardera 52 grace à l'option rotate 52

      et il execute meme des commandes avant/apres la rotation (prerotate et postrotate)

      de memoire il se base sur la date du fichier pour calculer ceux qu'il doit virer et pas sur leur nom.
      mais avec un rotate de 10, il ne gardera que les 10 derniers fichiers, et s'ils sont creer 1 fois par an, ben il gardera 10ans

      il faut evidemment tester, mais j'ai souvenir d'avoir configuré ca pour des backups de sites web en .tgz

      • [^] # Re: tout ca est intéressent :)

        Posté par . Évalué à -1.

        Hummmm pas mal mais…

        comme j'ai expliqué le switch envois automatiquement le backup quand sa configuration est modifiée (a chaque "write memory" si tu connais CISCO), et tu me dis qu'il se base sur une date… mais dans une même usine il se peu que certain switchs soient modifiés 100 fois par an et d'autre seulement 5… et biensur pas forcement au mêmes dates dans ce cas ca va poser problème non?

        • [^] # Re: tout ca est intéressent :)

          Posté par . Évalué à 2.

          dans mon var/log/apache2
          j'ai des fichiers access.log, des fichiers error.log

          et avec la config donnée plus haut (qui dit de traiter /var/log/apache2/*.log), il fait bien la rotation de
          access.log.5.gz => suppression
          access.log.4.gz => access.log.5.gz
          access.log.3.gz => access.log.4.gz
          access.log.2.gz => access.log.3.gz
          access.log.1 => access.log.2.gz
          access.log => access.log.1

          la meme chose pour error.log

          donc je ne vois pas pourquoi il ne pourrait pas le faire pour
          /var/log/usineA/*.bckp

          avec switchA-20120131.bkcp, switchB-20111231.bckp

          sauf peut-etre qu'il va falloir l'aider au debut
          en renommant le premier fichier switchA.bckp
          celui d'avant en switchA.bckp.1
          etc
          ainsi il garde la date de la creation dans les infos du fichier, sur le systeme de fichier.

          bon, j'avoue que je ne sais pas comment il peut se comporter si tu le fais tourner plus regulierement que daily
          car à ce que tu dis, on pourrait avoir 40 fichiers dans une journée
          puis rien pendant 6 mois

          mais tu auras un probleme similaire avec ton script de purge,
          que tu feras tourner toutes les X jours
          et qui devra purger tout ce qui est plus vieux de Y jours

          ex : avec Y = 6 mois (180jours)
          pour un switch il ne va te garder que la config de fin janvier 2013 car la precedente (fin janvier 2012) date de plus de 6 mois
          mais il va te garder les 25 sauvegardes d'un autre switch qui a été modifié 25 fois entre aout 2012 et janvier 2013.

          alors que logrotate à l'inverse, tu lui dis de ne garder que les 25 dernieres,
          il se fichera de savoir de quand date le fichier, il gardera 25 fichiers : xxxx.bckp et xxxx.bkcp.1 à xxxx.bckp.24

          si un switch a été modifié 30 fois (1 par jour) en janvier, il ne gardera que les 25 dernieres (les 25 derniers jours)
          mais si un switch a été modifié 5 fois par ans pendant 5 ans, il gardera bien les 25 dernieres configs (soit 5 ans)

          Bref, il y a des outils pour faire ce que tu demandes, il faut juste prendre le temps de tester
          (et de toutes facons il aurait aussi fallu tester ton script)
          donc tu prends quelques fichiers que tu 'cp -p' (pour conserver les infos de date en autre) dans un dossier de test

          tu configure logrotate sur ce dossier de test
          avec une rotation daily (on peut peut-etre descendre à hourly pour un changement toute les heures)

          et tu verras ce qu'il fait avec tes fichiers dans test

          • [^] # Re: tout ca est intéressent :)

            Posté par . Évalué à 1.

            Cela dit, je me souviens bien des cisco, lorsque l'on sauvegarde avec archive path, il rajoute tout seul la date… ça me semble difficile à gérer avec logrotate…

    • [^] # Re: tout ca est intéressent :)

      Posté par . Évalué à 2.

      Alors tu as juste pour la compréhension. Le tail -n +x affiche à partir de la x-ième ligne (cf. page de man):

         -n, --lines=K
                output the last K lines, instead of the last 10; or use -n +K to output lines starting with the Kth
      
      

      Donc au final le for va parcourir toute les préfixes ($sw) du type 421/switch01-421.

      On va garder tous les résultats à partir du 6ème de (par ex) ls -1t 421/switch01-421*. (je viens de remarquer qu'il faudrait plutôt mettre $sw-* plutôt, ça évite le problème s'il y a un switch 4210 par exemple).

      Pour tous ceux qui suggèrent logrotate: je veux bien qu'on arrive à faire quelque chose de ce genre, mais ce serait possible d'avoir une réponse concrète (fonctionnant pour la spécification du problème)? C'est bien facile de dire "on y arrive".

  • # rancid ?

    Posté par (page perso) . Évalué à 2.

  • # Hummmmm :)

    Posté par . Évalué à 0.

    Salut, désolé de répondre si tard mais j’étais en weekend ;)
    vien dieu! vous m'avez séché… y a des beaux scripts et il va falloir que je comprenne tout ca maintenant…
    Alors pour info la structure est comme ca :
    /tftpboot/save-sw-ur / CM420
    US380
    US240
    US680
    US210
    CM156
    CM890
    Par exemple "CM420" est une usine, "US210" une autre… le nombre de répertoires est bien défini et ne bougera pas (environ 10).

    Finalement la structure du nom de fichier sera plutôt celle ci dessous désolé…
    dans chacun de ces répertoires il y aura cela comme fichiers:
    STACK1-CM420-Feb--4-2013-10-24-11-GMT-0
    STACK1-CM420-Feb-10-2013-10-24-11-GMT-1
    STACK2-CM420-Feb--4-2013-11-24-13-GMT-0
    STACK2-CM420-Feb--4-2013-10-24-14-GMT-2
    STACK2-CM420-Feb-15-2013-10-24-16-GMT-3

    exemple : STACK1-CM420-Feb--4-2013-10-24-10-GMT-0
    Où "STACK1-CM420" est le nom de l’équipement, donc ça ira de "STACK1-CM420" a "STACK6-CM420" par exemple;
    "Feb--4-2013-10-24-10-GMT" c'est la date de création du fichier archive, soit ici le 4 février 2013 a 10h24 et 11 seconde, GMT c'est le fuseau horaire…
    ensuite il y a un chiffre, c'est un incrément sur lequel on ne peut pas se fier (remise a zero si reboot du switch par exemple)

    Bon, je vais essayer de comprendre vos scripts et d'en adapter un pour mon cas…

    Merci de m'avoir aidé, le sujet n'est pas clos… je mettrai résolu quand ca sera ok de mon coté ;)

  • # .

    Posté par . Évalué à -2. Dernière modification le 04/02/13 à 13:43.

    .

  • # oups...

    Posté par . Évalué à -1.

    En fait j'ai poster mon PBM sur plusieurs forum et ce commentaire devais etre posté sur un autre forum notamment devoloppez.net… je tiens au jus quand j'ai la solution :)

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.