Code source de pywws.Upload

#!/usr/bin/env python

"""Upload files to a directory by ftp
::

%s

"""

__docformat__ = "restructuredtext en"
__usage__ = """
 usage: python RunModule.py Upload [options] data_dir file [file...]
 options are:
  -h or --help    display this help
 data_dir is the root directory of the weather data
 file is a file to be uploaded

Login and ftp site details are read from the weather.ini file in
data_dir.
"""
__doc__ %= __usage__
__usage__ = __doc__.split('\n')[0] + __usage__

import getopt
import logging
import os
import shutil
import sys

from . import DataStore
from .Logger import ApplicationLogger

[docs]def Upload(params, files): logger = logging.getLogger('pywws.Upload') if eval(params.get('ftp', 'local site', 'False')): logger.info("Copying to local directory") # copy to local directory directory = params.get( 'ftp', 'directory', os.path.expanduser('~/public_html/weather/data/')) if not os.path.isdir(directory): os.makedirs(directory) for file in files: shutil.copy2(file, directory) return True logger.info("Uploading to web site") # get remote site details secure = eval(params.get('ftp', 'secure', 'False')) site = params.get('ftp', 'site', 'ftp.username.your_isp.co.uk') user = params.get('ftp', 'user', 'username') password = params.get('ftp', 'password', 'secret') directory = params.get('ftp', 'directory', 'public_html/weather/data/') # open connection if secure: import paramiko try: transport = paramiko.Transport((site, 22)) transport.connect(username=user, password=password) ftp = paramiko.SFTPClient.from_transport(transport) ftp.chdir(directory) except Exception, ex: logger.error(str(ex)) return False else: import ftplib try: ftp = ftplib.FTP(site, user, password) logger.debug(ftp.getwelcome()) ftp.cwd(directory) except Exception, ex: logger.error(str(ex)) return False OK = True for file in files: target = os.path.basename(file) # have three tries before giving up for n in range(3): try: if secure: ftp.put(file, target) else: if os.path.splitext(file)[1] in ('.txt', '.xml', '.html'): if sys.version_info[0] >= 3: f = open(file, 'rb') else: f = open(file, 'r') ftp.storlines('STOR %s' % (target), f) else: f = open(file, 'rb') ftp.storbinary('STOR %s' % (target), f) f.close() break except Exception, ex: logger.error(str(ex)) else: OK = False ftp.close() if secure: transport.close() return OK
[docs]def main(argv=None): if argv is None: argv = sys.argv try: opts, args = getopt.getopt(argv[1:], "h", ['help']) except getopt.error, msg: print >>sys.stderr, 'Error: %s\n' % msg print >>sys.stderr, __usage__.strip() return 1 # process options for o, a in opts: if o in ('-h', '--help'): print __usage__.strip() return 0 # check arguments if len(args) < 2: print >>sys.stderr, "Error: at least 2 arguments required" print >>sys.stderr, __usage__.strip() return 2 logger = ApplicationLogger(1) if Upload(DataStore.params(args[0]), args[1:]): return 0 return 3
if __name__ == "__main__": sys.exit(main())