Fixes for the getanc.py and modis_atteph.py login issues
-
- Posts: 74
- Joined: Thu Jun 04, 2015 10:50 am America/New_York
- Has thanked: 3 times
- Been thanked: 2 times
Fixes for the getanc.py and modis_atteph.py login issues
Hi all,I wrote two scripts to work-around the getanc.py and modis_atteph.py login issues. Offered here "as is" under public ___domain license in the hope this helps others. Please post fixes or improvements here for others to benefit.To install them move getanc.py to getanc-real.py and move modis_atteph.py to modis_atteph-real.py and then copy the appropriate script below into getanc.py or modis_atteph.py.the new script will call the realscript with '-d' option to get the filenames, then download those files and move them to where they belong.UPDATED: added support for ozone files in getanc.pyroot@B1B8B6F:/maps/nasa/tmp# cat modis_atteph.py#!/usr/bin/env python3import subprocessimport os.pathimport sysimport osdef fetchAndStore(fname): (fpath, fn) = os.path.split(fname) os.makedirs(fpath, exist_ok=True) url = 'https://oceandata.sci.gsfc.nasa.gov (/cgi/getfile/) ' + fn wget = ['wget', '-q', '--load-cookies', '~/.urs_cookies', '--save-cookies', '~/.urs_cookies', '--auth-no-challenge=on', '--keep-session-cookies', '--content-disposition', url] out = subprocess.run(wget, stdout= subprocess.PIPE, stderr=subprocess.STDOUT) if os.path.exists(fn): mv = ['mv', fn, fname] subprocess.run(mv) elif os.path.exists(fn + '.bz2'): mv = ['mv', fn + '.bz2', fname + '.bz2'] subprocess.run(mv) unzip = ['bunzip2', fname + '.bz2'] subprocess.run(unzip) else: print('ERROR: failed to fetch: ' + url + "\n") print(out.stdout.decode('utf-8'))atteph = '/u/oceandata/scripts/modis_atteph-real.py';cmd = [atteph, '-d'] + sys.argv[1:]out = subprocess.run(cmd, stdout= subprocess.PIPE, stderr=subprocess.STDOUT)lines = out.stdout.decode('utf-8').splitlines()for line in lines: line = line.strip() if "att1=" in line or "att2=" in line or "att3=" in line: attfile = line[5:] print(attfile + "\n") if not os.path.exists(attfile): fetchAndStore(attfile) elif "eph1=" in line or "eph2=" in line or "eph3=" in line: ephfile = line[5:] print(ephfile + "\n") if not os.path.exists(ephfile): fetchAndStore(ephfile)root@B1B8B6F:/u/oceancolor-bin/scripts# cat getanc.py#!/usr/bin/env python3import subprocessimport os.pathimport sysimport osdef fetchAndStore(fname): (fpath, fn) = os.path.split(fname) os.makedirs(fpath, exist_ok=True) url = 'https://oceandata.sci.gsfc.nasa.gov (/cgi/getfile/) ' + fn wget = ['wget', '-q', '--load-cookies', '~/.urs_cookies', '--save-cookies', '~/.urs_cookies', '--auth-no-challenge=on', '--keep-session-cookies', '--content-disposition', url] out = subprocess.run(wget, stdout= subprocess.PIPE, stderr=subprocess.STDOUT) if os.path.exists(fn): mv = ['mv', fn, fname] subprocess.run(mv) elif os.path.exists(fn + '.bz2'): mv = ['mv', fn + '.bz2', fname + '.bz2'] subprocess.run(mv) unzip = ['bunzip2', fname + '.bz2'] subprocess.run(unzip) elif "ozone" in line: ozfile = line[7:] print(ozfile + "\n") if not os.path.exists(ozfile): fetchAndStore(ozfile) else: print('ERROR: failed to fetch: ' + url + "\n") print(out.stdout.decode('utf-8'))getanc = '/u/oceandata/scripts/getanc-real.py';cmd = [getanc, '-d'] + sys.argv[1:]out = subprocess.run(cmd, stdout= subprocess.PIPE, stderr=subprocess.STDOUT)lines = out.stdout.decode('utf-8').splitlines()for line in lines: line = line.strip() if "icefile=" in line: icefile = line[8:] print(icefile + "\n") if not os.path.exists(icefile): fetchAndStore(icefile) elif "met" in line: metfile = line[5:] print(metfile + "\n") if not os.path.exists(metfile): fetchAndStore(metfile) elif "sstfile=" in line: sstfile = line[8:] print(sstfile + "\n") if not os.path.exists(sstfile): fetchAndStore(sstfile)
Filters:
-
- Posts: 12
- Joined: Wed Sep 04, 2019 10:46 am America/New_York
-
- Posts: 12
- Joined: Wed Sep 04, 2019 10:46 am America/New_York
Fixes for the getanc.py and modis_atteph.py login issues
You can make it easier.
Enough to patch ProcUtils.py to work with a .netrc
My solution:
patch
Enough to patch ProcUtils.py to work with a .netrc
My solution:
patch
diff --git a/modules/ProcUtils.py b/modules/ProcUtils.py
index edceb41..547fe7b 100644
--- a/modules/ProcUtils.py
+++ b/modules/ProcUtils.py
@@ -6,7 +6,9 @@ SeaDAS library for commonly used functions within other python scripts
from __future__ import print_function
import sys
+import netrc
+netrc_dict=netrc.netrc()
# ------------------ DANGER -------------------
#
@@ -98,6 +100,7 @@ def _httpdl(url, request, localpath='.', outputfilename=None, ntries=5,
verbose - get chatty about connection issues (boolean, default False)
"""
global ofile
+ global netrc_dict
import os
import re
import socket
@@ -114,6 +117,13 @@ def _httpdl(url, request, localpath='.', outputfilename=None, ntries=5,
os.umask(0o02)
os.makedirs(localpath, mode=0o2775)
+ cred=netrc_dict.authenticators(url)
+ if cred is not None:
+ from base64 import b64encode
+ ( _user, _acc, _pass ) = cred
+ userAndPass = b64encode(bytes(_user + ':' + _pass, "utf-8"))
+ reqHeaders.update({ 'Authorization' : 'Basic %s' % userAndPass })
+
urlConn, proxy = httpinit(url, timeout=timeout, urlConn=urlConn)
try:
-
- Posts: 12
- Joined: Wed Sep 04, 2019 10:46 am America/New_York
Fixes for the getanc.py and modis_atteph.py login issues
Previous variant not working :(
Trying to use requests library, should works:
Trying to use requests library, should works:
diff --git a/modules/ProcUtils.py b/modules/ProcUtils.py
index edceb41..6559339 100644
--- a/modules/ProcUtils.py
+++ b/modules/ProcUtils.py
@@ -6,7 +6,7 @@ SeaDAS library for commonly used functions within other python scripts
from __future__ import print_function
import sys
-
+import requests
# ------------------ DANGER -------------------
#
@@ -251,9 +251,46 @@ def _httpdl(url, request, localpath='.', outputfilename=None, ntries=5,
def httpdl(url, request, localpath='.', outputfilename=None, ntries=5,
uncompress=False, timeout=30., reqHeaders={}, verbose=False,
reuseConn=False, urlConn=None, chunk_size=DEFAULT_CHUNK_SIZE):
- urlConn, status = _httpdl(url, request, localpath, outputfilename, ntries,
- uncompress, timeout, reqHeaders, verbose,
- reuseConn, urlConn, chunk_size)
+
+ import requests
+ import os
+ import re
+
+ r = requests.get("https://%s%s" % (url,request), stream=True)
+
+ if r.status_code == 200 or r.status_code == 206:
+
+ if outputfilename:
+ ofile = os.path.join(localpath, outputfilename)
+ else:
+ if 'content-disposition' in r.headers:
+ ofile = os.path.join(localpath, r.headers.get('content-disposition').split('filename=')[1] )
+ else:
+ ofile = os.path.join(localpath, os.path.basename(request))
+
+ if r.status_code == 200:
+ f = open(ofile, 'wb')
+ else:
+ f = open(ofile, 'ab')
+
+ for chunk in r.iter_content(chunk_size=chunk_size):
+ if chunk: # filter out keep-alive new chunks
+ f.write(chunk)
+
+ f.flush()
+
+ if re.search(".(Z|gz|bz2)$", ofile) and uncompress:
+ compressStatus = uncompressFile(ofile)
+ if compressStatus:
+ status = compressStatus
+ else:
+ status = 0
+ else:
+ status = r.status_code
+
+# urlConn, status = _httpdl(url, request, localpath, outputfilename, ntries,
+# uncompress, timeout, reqHeaders, verbose,
+# reuseConn, urlConn, chunk_size)
if reuseConn:
return (urlConn, status)
else:
-
- Posts: 7
- Joined: Tue Mar 13, 2018 10:20 am America/New_York
Fixes for the getanc.py and modis_atteph.py login issues
Hi Pavel,
I am not an expert in Ubuntu. Could you please briefly describe how do patch ProcUtils.py to work with a .netrc? What step should I follow, more exactly.
Thank you very much!
Best,
Ionut
I am not an expert in Ubuntu. Could you please briefly describe how do patch ProcUtils.py to work with a .netrc? What step should I follow, more exactly.
Thank you very much!
Best,
Ionut
-
- Posts: 12
- Joined: Wed Sep 04, 2019 10:46 am America/New_York
Fixes for the getanc.py and modis_atteph.py login issues
Hi.
Patch in this thread have one bug.
I wrote a separate post with the latest version of the patch and described how to apply it.
Patch in this thread have one bug.
I wrote a separate post with the latest version of the patch and described how to apply it.
Fixes for the getanc.py and modis_atteph.py login issues
using `requests` is a million times better than some subprocess wget hack. Seems like switching to requests is what the maintainers implemented in the Seadas scripts.