#! /usr/bin/env python # encoding: utf-8 ''' @author: nick.bearson@ssec.wisc.edu Copyright (c) 2012 University of Wisconsin SSEC. All rights reserved. Util script to go out and retrieve the dynamic input files needed to run VCM. ''' import os import subprocess from datetime import datetime from optparse import OptionParser from ftplib import FTP import fnmatch from pypre.util import make_filename, get_file_date import pyvcm.vcm_config as vcmc from pyvcm.vcm_include import imgr_bands # All strings... def ftp_mget(server, remotedir, pattern, localdir): ftp = FTP(server, "anonymous", "anonymous") ftp.cwd(remotedir) filenames = [] ftp.retrlines('LIST', filenames.append) # import pdb; pdb.set_trace() for fname in filenames: fname = fname.split()[-1] if fnmatch.fnmatch(fname, pattern): localfile = localdir + "/" + fname print "Downloading: ", fname if os.access(localfile, os.F_OK): print localfile, "already exists, overwriting!" os.remove(localfile) f = open(localfile, 'w') ftp.retrbinary('RETR '+ fname, f.write) f.close() print "" ftp.close() def wrapped_wget(remotestr, localdir): cmd = "mkdir -p %s; cd %s; " % (localdir, localdir) cmd+= "wget -N %s" % (remotestr) subprocess.check_call(cmd, shell=True) def rsync(remotestr, localdir): cmd = "mkdir -p %s; cd %s; " % (localdir, localdir) cmd+= "rsync -vuthP --copy-links %s ." % (remotestr) print cmd subprocess.check_call(cmd, shell=True) def get_gdas(datetime): # gdas_str = "ftp://peate.ssec.wisc.edu/allData/ingest/ancillary/%(yyyy)04d/%(ddd)03d/GDAS_0ZF/gdas1.PGrbF00.%(yy)02d%(mm)02d%(dd)02d.%(hh)02dz" gdas_str = "rsync://peate02/allData/ingest/ancillary/%(yyyy)04d/%(ddd)03d/GDAS_0ZF/gdas1.PGrbF00.%(yy)02d%(mm)02d%(dd)02d.%(hh)02dz" gdas_dates = get_file_date(datetime, "gdas") for gdas_date in gdas_dates: gdas_loc = make_filename(gdas_str, gdas_date) local = make_filename(vcmc.get('inputs', 'GDAS'), gdas_date) localdir, localfile = local.rsplit('/', 1) rsync(gdas_loc, localdir) def get_nise(datetime): nise_str ="ftp://n4ftl01u.ecs.nasa.gov/SAN/OTHR/NISE.004/%(yyyy)04d.%(mm)02d.%(dd)02d/NISE_SSMISF17_%(yyyy)04d%(mm)02d%(dd)02d.HDFEOS" nise_loc = make_filename(nise_str, datetime) local = make_filename(vcmc.get('inputs', 'NISE'), datetime) localdir, localfile = local.rsplit('/', 1) wrapped_wget(nise_loc, localdir) # rsync(nise_loc, localdir) def get_viirs(datetime, datestr): # viirs_str = "ftp://peate.ssec.wisc.edu/allData/ingest/viirs/npp/%(yyyy)04d/%(ddd)03d/%(sds_tag)s/%(sds_tag)s_npp_%(datestr)s*.h5" viirs_str = "rsync://peate02/allData/ingest/viirs/npp/%(yyyy)04d/%(ddd)03d/%(sds_tag)s/%(sds_tag)s_npp_%(datestr)s*.h5" for units in imgr_bands.keys(): for res in imgr_bands[units].keys(): for sds in imgr_bands[units][res].keys(): viirs_loc = make_filename(viirs_str, datetime, sds_tag=sds, datestr=datestr) local = make_filename(vcmc.get('inputs', 'VIIRS'), datetime, sds_tag=sds) remotedir, remotefile = viirs_str.rsplit('/', 1) localdir, localfile = local.rsplit('/', 1) # wrapped_wget(viirs_loc, localdir) rsync(viirs_loc, localdir) # Don't forget GMTCO! sds = "GMTCO" viirs_loc = make_filename(viirs_str, datetime, sds_tag=sds, datestr=datestr) local = make_filename(vcmc.get('inputs', 'VIIRS'), datetime, sds_tag=sds) remotedir, remotefile = viirs_str.rsplit('/', 1) localdir, localfile = local.rsplit('/', 1) # DONT USE LOCALFILE, OUR DATETIME HAS WILDCARDS WHICH DONT MATCH # wrapped_wget(viirs_loc, localdir) rsync(viirs_loc, localdir) # ----------------------------- def _check_args(args): if len(args) != 1: print "Invalid number of arguments." print _usage() exit(-1) if args[0][0] != 'd': print "Invalid argument." print _usage() exit(-2) if len(args[0]) < 9: print "Invalid argument." print _usage() exit(-3) def _usage(): return """Usage: vcm_gatherer geolocation.h5 output.h5""" def _handle_args(): parser = OptionParser(usage=_usage()) # parser.add_option("-g", "--geofile", action="store", type="string", dest="geoFile", help="geolocation file to use") # parser.add_option("-a", "--ancFile", action="store", type="string", dest="ancFile", help="ancilliary h5 file") # parser.add_option("-c", "--cmoFile", action="store", type="string", dest="cmoFile", help="cloudmask output h5 file") return parser.parse_args() # ----------------------------- def main(): print "" # Handle arguments (options, args) = _handle_args() _check_args(args) datestr = args[0] wanted_date = {} wanted_date['year'] = datestr[1:5] wanted_date['month'] = datestr[5:7] wanted_date['day'] = datestr[7:9] wanted_date['hour'] = datestr[11:13] wanted_date['minute']= datestr[13:15] wanted_date['second']= datestr[15:17] for key in wanted_date.keys(): try: wanted_date[key] = int(wanted_date[key]) except: wanted_date[key] = 0 grab_date = datetime(**wanted_date) get_gdas(grab_date) get_viirs(grab_date, datestr) get_nise(grab_date) if __name__ == "__main__": main()