Code source de pywws.Upload

#!/usr/bin/env python

# pywws - Python software for USB Wireless Weather Stations
# http://github.com/jim-easterbrook/pywws
# Copyright (C) 2008-13  Jim Easterbrook  jim@jim-easterbrook.me.uk

# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

"""Upload files to a web server by ftp or copy them to a local directory
::

%s

"""

__docformat__ = "restructuredtext en"
__usage__ = """
 usage: python -m pywws.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) text_file = os.path.splitext(file)[1] in ('.txt', '.xml', '.html') # have three tries before giving up for n in range(3): try: if secure: ftp.put(file, target) else: if text_file and sys.version_info[0] < 3: f = open(file, 'r') else: f = open(file, 'rb') if text_file: ftp.storlines('STOR %s' % (target), f) else: ftp.storbinary('STOR %s' % (target), f) f.close() break except Exception, ex: logger.error(str(ex)) else: OK = False break 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())