# http://pyrocko.org - GPLv3 # # The Pyrocko Developers, 21st Century # ---|P------/S----------~Lg----------
urlencode, Request, build_opener, HTTPDigestAuthHandler, urlopen, HTTPError
'geofon': 'https://geofon.gfz-potsdam.de', 'iris': 'http://service.iris.edu', 'orfeus': 'http://www.orfeus-eu.org', 'bgr': 'http://eida.bgr.de', 'geonet': 'http://service.geonet.org.nz', 'knmi': 'http://rdsa.knmi.nl', 'ncedc': 'http://service.ncedc.org', 'scedc': 'http://service.scedc.caltech.edu', 'usgs': 'http://earthquake.usgs.gov', 'koeri': 'http://eida-service.koeri.boun.edu.tr', 'ethz': 'http://eida.ethz.ch', 'icgc': 'http://ws.icgc.cat', 'ipgp': 'http://eida.ipgp.fr', 'ingv': 'http://webservices.ingv.it', 'isc': 'http://www.isc.ac.uk', 'lmu': 'http://erde.geophysik.uni-muenchen.de', 'noa': 'http://eida.gein.noa.gr', 'resif': 'http://ws.resif.fr', 'usp': 'http://seisrequest.iag.usp.br', 'niep': 'http://eida-sc3.infp.ro' }
'station': { 'starttime', 'endtime', 'startbefore', 'startafter', 'endbefore', 'endafter', 'network', 'station', 'location', 'channel', 'minlatitude', 'maxlatitude', 'minlongitude', 'maxlongitude', 'latitude', 'longitude', 'minradius', 'maxradius', 'level', 'includerestricted', 'includeavailability', 'updatedafter', 'matchtimeseries', 'format', 'nodata'}, 'dataselect': { 'starttime', 'endtime', 'network', 'station', 'location', 'channel', 'quality', 'minimumlength', 'longestonly', 'format', 'nodata'}, 'event': { 'starttime', 'endtime', 'minlatitude', 'maxlatitude', 'minlongitude', 'maxlongitude', 'latitude', 'longitude', 'minradius', 'maxradius', 'mindepth', 'maxdepth', 'minmagnitude', 'maxmagnitude', 'eventtype', 'includeallorigins', 'includeallmagnitudes', 'includearrivals', 'eventid', 'limit', 'offset', 'orderby', 'catalog', 'contributor', 'updatedafter', 'format', 'nodata'}, 'availability': { 'starttime', 'endtime', 'network', 'station', 'location', 'channel', 'quality', 'merge', 'orderby', 'limit', 'includerestricted', 'format', 'nodata', 'mergegaps', 'show'}}
''' Get sorted list of registered site names. ''' return sorted(g_site_abbr.keys())
else: g_timeout = config.config().fdsn_timeout
realm = dict(re_realm_from_auth_header.findall( headers['WWW-Authenticate'])).get('realm', None)
if realm is None: raise CannotGetRealmFromAuthHeader('headers=%s' % str(headers))
return realm
DownloadError.__init__(self) self._url = url
def __str__(self): return 'No results for request %s' % self._url
DownloadError.__init__(self) self._url = url
def __str__(self): return 'Request entity too large: %s' % self._url
url, post=False, user=None, passwd=None, allow_TLSv1=False, timeout=g_timeout, **kwargs):
'timeout': timeout }
url_args['context'] = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
post = post.encode('utf8')
del url_args['context'] # context not avail before 3.4.3
raise EmptyResult(url)
raise RequestEntityTooLarge(url)
headers = getattr(e, 'headers', e.hdrs)
realm = get_realm_from_auth_header(headers)
if itry == 1 and user is not None: auth_handler = HTTPDigestAuthHandler() auth_handler.add_password( realm=realm, uri=url, user=user, passwd=passwd or '')
opener = build_opener(auth_handler) continue else: raise DownloadError( 'Authentication failed for realm "%s" when accessing ' 'url "%s". Original error was: %s' % ( realm, url, str(e)))
else: raise DownloadError( 'Error content returned by server (HTML stripped):\n%s\n' ' Original error was: %s' % ( indent( strip_html(e.read()), ' ! '), str(e)))
except socket.timeout: raise Timeout( 'Timeout error. No response received within %i s. You ' 'may want to retry with a longer timeout setting.' % timeout)
break
site=g_site_abbr.get(site, site), service=service, majorversion=majorversion, method=method)
endafter'''.split():
params['location'] = '--'
stations, tmin, tmax, channel_prio=[['BHZ', 'HHZ'], ['BH1', 'BHN', 'HH1', 'HHN'], ['BH2', 'BHE', 'HH2', 'HHE']]):
selection = [] for station in stations: wanted = [] for group in channel_prio: gchannels = [] for channel in station.get_channels(): if channel.name in group: gchannels.append(channel) if gchannels: gchannels.sort(key=lambda a: group.index(a.name)) wanted.append(gchannels[0])
if wanted: for channel in wanted: selection.append((station.network, station.station, station.location, channel.name, tmin, tmax))
return selection
site=g_default_site, url=g_url, majorversion=1, parsed=True, selection=None, timeout=g_timeout, check=True, **kwargs):
location = '--'
sdatetime(tmin), sdatetime(tmax))))
stream=_request(url, timeout=timeout, **params)) else: raise InvalidRequest('if format="text" shall be parsed, ' 'level="channel" is required')
stream=_request(url, timeout=timeout, **params)) else: raise InvalidRequest('format must be "xml" or "text"') else: return _request(url, timeout=timeout, **params)
url = fillurl(service, site, url, majorversion, 'auth')
f = _request(url, timeout=timeout, post=token) s = f.read().decode() try: user, passwd = s.strip().split(':') except ValueError: raise CannotGetCredentialsFromAuthRequest('data="%s"' % s)
return user, passwd
site=g_default_site, url=g_url, majorversion=1, selection=None, user=None, passwd=None, token=None, timeout=g_timeout, check=True, **kwargs):
method = 'queryauth' else:
user, passwd = get_auth_credentials( service, site, url, majorversion, token, timeout)
lst.append('%s=%s' % (k, v))
location = '--'
sdatetime(tmin), sdatetime(tmax))))
url, user=user, passwd=passwd, post=post.encode(), timeout=timeout) else: url, user=user, passwd=passwd, timeout=timeout, **params)
site=g_default_site, url=g_url, majorversion=1, user=None, passwd=None, token=None, timeout=g_timeout, check=True, **kwargs):
'''Query FDSN web service for events.
On success, will return a list of events in QuakeML format.
Check the documentation of FDSN for allowed arguments: https://www.fdsn.org/webservices '''
method = 'queryauth' else:
user, passwd = get_auth_credentials( service, site, url, majorversion, token, timeout)
method='query', site=g_default_site, url=g_url, majorversion=1, user=None, passwd=None, token=None, timeout=g_timeout, check=True, **kwargs):
service = 'availability'
assert method in ('query', 'extent')
if user or token: method += 'auth'
if token is not None: user, passwd = get_auth_credentials( service, site, url, majorversion, token, timeout)
if check: check_params(service, site, url, majorversion, timeout, **kwargs)
params = fix_params(kwargs)
url = fillurl(service, site, url, majorversion, method) return _request(url, user=user, passwd=passwd, timeout=timeout, **params)
service, site=g_default_site, url=g_url, majorversion=1, timeout=g_timeout, method='query', **kwargs):
service, site, url, majorversion, timeout, method)
raise ValueError( 'Unsupported parameter%s for service "%s" at site "%s": %s' % ( '' if len(unavail) == 1 else 's', service, site, ', '.join(unavail)))
service, site=g_default_site, url=g_url, majorversion=1, timeout=g_timeout, method='query'):
else: return g_default_query_args[service]
service, site=g_default_site, url=g_url, majorversion=1, timeout=g_timeout):
except Timeout: raise
except DownloadError: logger.info( 'No service description (WADL) found for "%s" at site "%s".' % (service, site))
g_wadls[k] = None
service, site=g_default_site, url=g_url, majorversion=1, timeout=g_timeout):
if __name__ == '__main__': import sys
util.setup_logging('pyrocko.client.fdsn', 'info')
if len(sys.argv) == 1: sites = get_sites() else: sites = sys.argv[1:]
for site in sites: print('=== %s (%s) ===' % (site, g_site_abbr[site]))
for service in ['station', 'dataselect', 'event']: try: app = wadl(service, site=site, timeout=2.0) print(indent(str(app)))
except Timeout as e: logger.error(str(e)) print('%s: timeout' % (service,))
except util.DownloadError as e: logger.error(str(e)) print('%s: no wadl' % (service,)) |