On 25/08/10 11:03, Franck Lavis - Micro38 Informatique wrote:
(snip)
J'ai besoin d'un script que je ferais tourner sur une de mes machines
Ubuntu, qui, periodiquement, irait scruter un serveur FTP donné,
downloaderait le contenu d'une liste de dossiers données, en excluant les
fichiers récents (de moins d'une période récente donnée, par exemple: tout
sauf ceux de  moins de 2 semaines). En gros, un script qui irait
régulièrement faire de la place sur un serveur FTP qui me sert pour des
sauvegardes externes. Le top serait qu'il m'avertisse par mail de ce qu'il a
fait en m'envoyant un log. Il lirait les différents paramètres dans un
fichier texte que je pourrais modifier, qui contiendrait la liste des
dossiers, la période à exclure du download, le mot de passe FTP ce qui me
permettrait de le modifier moi-même, etc.)
(snip)

Voici un script qui répond grosso modo au cahier des charges ... c'est du quick'n dirty, testé sur une vm faisant tourner un pure-ftpd: <you've been warned>.

Il suffit de rendre le script ftp_delete_old_files.py exécutable
chmod +x ftp_delete_old_files.py
le lancer une fois dans le vide:
./ftp_delete_old_files.py
il crée alors un fichier de configuration:
$HOME/.ftp_delete_old_files.conf
qui est, je l'espère, suffisamment explicite. Il n'est pas vraiment nécessaire de modifier le champ "from_address", à moins que la boîte de réception filtres ces mails comme du spam (testé sur gmail, les mails envoyés sont considéré comme du spam, il suffit alors de les signaler comme du non-spam pour les recevoir normalement par la suite).
Enfin il suffit d'ajouter ce script à son crontab:
crontab -e
en ajoutant la ligne suivante:
0 20 * * * /path/to/ftp_delete_old_files.py

le script n'envoie un mail que si il a supprimé des fichiers ... sinon il ne se passe rien.

En espérant que c'était bien ce qui était recherché ...

Bonne continuation

Ju
--
A computer once beat me at chess, but it was no match for me at kick boxing.
#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""ftp_delete_old_files.py
This script logs on an ftp server, delete "old" files and send the
list of deleted files through email.
usage: launch the script once, it should create its config file:
~/.ftp_delete_old_files.conf
fill in the config file and use cron to launch periodically.
exemple: to launch the script everyday at 20h00 use "crontab -e"
and input this line:
0 20 * * * /path/to/ftp_delete_old_files.py
"""

__author__    = "Avell Diroll <[email protected]>"
__version__   = "0.1"
__date__      = "2010-08-25"
__copyright__ = "Copyright (c) 2010 %s. All rights reserved." % __author__
__license__   = "BSD"

import sys, os, time, ftplib
import collections
import smtplib
from ConfigParser import ConfigParser

FTPDir= collections.namedtuple("FTPDir", "name size mtime tree")
FTPFile= collections.namedtuple("FTPFile", "name size mtime")

class FTPDirectory(object):
    """this class written by ΤΖΩΤΖΙΟΥ was found here:
http://stackoverflow.com/questions/2867217/how-to-delete-files-with-a-python-script-from-a-ftp-server-which-are-older-than-7""";
    def __init__(self, path='.'):
        self.dirs= []
        self.files= []
        self.path= path

    def getdata(self, ftpobj):
        ftpobj.retrlines('MLSD', self.addline)

    def addline(self, line):
        data, _, name= line.partition('; ')
        fields= data.split(';')
        for field in fields:
            field_name, _, field_value= field.partition('=')
            if field_name == 'type':
                target= self.dirs if field_value == 'dir' else self.files
            elif field_name in ('sizd', 'size'):
                size= int(field_value)
            elif field_name == 'modify':
                mtime= time.mktime(time.strptime(field_value, "%Y%m%d%H%M%S"))
        if target is self.files:
            target.append(FTPFile(name, size, mtime))
        else:
            target.append(FTPDir(name, size, mtime, self.__class__(os.path.join(self.path, name))))

    def walk(self):
        for ftpfile in self.files:
            yield self.path, ftpfile
        for ftpdir in self.dirs:
            for path, ftpfile in ftpdir.tree.walk():
                yield path, ftpfile


class FTPTree(FTPDirectory):
    """this class written by ΤΖΩΤΖΙΟΥ was found here:
http://stackoverflow.com/questions/2867217/how-to-delete-files-with-a-python-script-from-a-ftp-server-which-are-older-than-7""";
    def getdata(self, ftpobj):
        super(FTPTree, self).getdata(ftpobj)
        for dirname in self.dirs:
            ftpobj.cwd(dirname.name)
            dirname.tree.getdata(ftpobj)
            ftpobj.cwd('..')


def send_log(fromAddress, toAddress, ftpserver, log):
    """Send log to toAddress, thanks to Fredrik Lundh
http://effbot.org/pyfaq/how-do-i-send-mail-from-a-python-script.htm""";
    SERVER = "localhost"
    FROM = fromAddress
    TO = [toAddress] # must be a list
    SUBJECT = "Log from ftp_delete_old_files.py on %s" % (ftpserver)
    TEXT = "Deleted files : \n%s" % ("\n".join(log))

    # Prepare actual message
    message = """\
From: %s
To: %s
Subject: %s

%s
    """ % (FROM, ", ".join(TO), SUBJECT, TEXT)

    # Send the mail
    server = smtplib.SMTP(SERVER)
    server.sendmail(FROM, TO, message)
    server.quit()


if __name__ == "__main__":

    config_file = ".ftp_delete_old_files.conf"
    config_path = os.path.join(os.environ["HOME"], config_file)

    if os.path.exists(config_path):
        config = ConfigParser()
        config.read([config_path])
    else:
        with open(config_path, 'w') as config :
            config.write("""\
# Configuration file of the ftp_delete_old_files.py script

[ftp]
hostname = yourftpserver.tld
username = yourlogin
password = yourpassword
#use . as working directory if you want to run ftp_delete_old_files.py
#on all the accessible files
working_directory = .
#number of days after which a file is considered for deletion
number_of_days = 15

[mail]
from_address = [email protected]
to_address = [email protected]
""")
            config.close()
            os.chmod(config_path, 0600) #because the file contains a password
            sys.exit()

    hostname = config.get('ftp', 'hostname')
    username = config.get('ftp', 'username')
    password = config.get('ftp', 'password')
    cwd      = config.get('ftp', 'working_directory')
    ndays    = int(config.get('ftp', 'number_of_days'))
    fromAddress = config.get('mail', 'from_address')
    toAddress   = config.get('mail', 'to_address')

    quite_old= time.time() - ndays*60*60*24

    site= ftplib.FTP(hostname, username, password)
    site.cwd(cwd) # if it's '.', you can skip this line
    folder= FTPTree()
    folder.getdata(site) # get the filenames
    log=[]
    for path, ftpfile in folder.walk():
        if ftpfile.mtime < quite_old:
            log.append(os.path.join(path, ftpfile.name))
            site.delete(os.path.join(path, ftpfile.name))


    if log:
        send_log(fromAddress, toAddress, hostname, log)
-- 
ubuntu-fr mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-fr

Répondre à