Source code for bronx.system.mf

"""
Meteo France specific system related tools.
"""

from io import BytesIO

import ftplib
import netrc
import re
import uuid

from bronx.fancies import loggers

logger = loggers.getLogger(__name__)

#: No automatic export
__all__ = []


[docs]def prestage(resource_paths, mail=None, archive_machine='hendrix', stagedir='/DemandeMig/ChargeEnEspaceRapide'): """ Puts a pre-staging request on **archive_machine** for the given list of resources **resource_paths**, and return the path to the submitted request file. :param resource_paths: list of paths to requested resources :param mail: if given, used for informing about the request progress. :param archive_machine: name of the archive machine. Will probably not work for other than *hendrix* for now... :param stagedir: directory in which prestaging request are to be put on **archive_machine** .. note:: Uses *~/.netrc* to connect to **archive_machine**. """ # build request if mail is not None: if re.match(r'([a-zA-Z\-]+)\.([a-zA-Z\-]+)\@meteo.fr', mail): request = ["#MAIL=" + mail + '\n', ] else: logger.warning('invalid **mail** format: ' + mail) request = [] else: request = [] request += [r + '\n' for r in resource_paths] # connect to archive try: (_login, _, _passwd) = netrc.netrc().authenticators(archive_machine) except TypeError: if netrc.netrc().authenticators(archive_machine) is None: raise OSError("host " + archive_machine + " is unknown in .netrc") else: raise ftp = ftplib.FTP(archive_machine) ftp.login(_login, _passwd) # send request request_filename = '.'.join([_login, 'staging_request', uuid.uuid4().hex[:8], # [:8] safe enough ? 'MIG']) f = BytesIO() f.writelines([line.encode('utf-8') for line in request]) f.seek(0) ftp.cwd(stagedir) ftp.storbinary('STOR ' + request_filename, f) f.close() ftp.quit() # send back request identifier return '/'.join([stagedir, request_filename])