def arc2fdsnws(filein, fileout, config='../ownDC.cfg'): """Read the routing file in XML format and add the Dataselect and Station routes based on the Arclink information. The resulting table is stored in :param filein: Input file with routes (usually from an Arclink server). :type filein: str :param fileout: Output file with all routes from the input file plus new Station and Dataselect routes based on the Arclink route. :type fileout: str """ rc = RoutingCache(filein, config=config) for st, lr in rc.routingTable.iteritems(): toAdd = list() for r in lr: if r.service == 'arclink': stat = Route('station', '%s/fdsnws/station/1/query' % mapArcFDSN(r.address), r.tw, r.priority) toAdd.append(stat) data = Route('dataselect', '%s/fdsnws/dataselect/1/query' % mapArcFDSN(r.address), r.tw, r.priority) toAdd.append(data) lr.extend(toAdd) rc.toXML(fileout)
def __init__(self, logName=None, routesFile='./data/routing.xml', masterFile='./data/masterTable.xml', configFile='routing.cfg'): # Dataselect version self.version = '1.1.0' # set up logging self.logs = logging.getLogger('DataSelectQuery') logging.basicConfig() # Read the verbosity setting configP = configparser.RawConfigParser() configP.read(configFile) verbo = configP.get('Service', 'verbosity') verboNum = getattr(logging, verbo.upper(), 30) self.logs.setLevel(verboNum) # Add routing cache here, to be accessible to all modules self.logs.info('Reading routes from %s' % routesFile) self.logs.info('Reading masterTable from %s' % masterFile) self.logs.info('Reading configuration from %s' % configFile) self.routes = RoutingCache(routesFile, masterFile, configFile) self.ID = str(datetime.datetime.now()) if isinstance(logName, basestring): self.acc = Accounting(logName) elif logName is not None: self.acc = logName else: self.acc = None
def application(environ, start_response): """Main WSGI handler that processes client requests and calls the proper functions. """ global routes fname = environ['PATH_INFO'] # Among others, this will filter wrong function names, # but also the favicon.ico request, for instance. if fname is None: raise WIClientError('Method name not recognized!') # return send_html_response(status, 'Error! ' + status, start_response) try: outForm = 'xml' if environ['REQUEST_METHOD'] == 'GET': form = cgi.FieldStorage(fp=environ['wsgi.input'], environ=environ) if 'format' in form: outForm = form['format'].value.lower() elif environ['REQUEST_METHOD'] == 'POST': form = '' try: length = int(environ.get('CONTENT_LENGTH', '0')) except ValueError: length = 0 # If there is a body to read if length != 0: form = environ['wsgi.input'].read(length) else: form = environ['wsgi.input'].read() for line in form.splitlines(): if not len(line): continue if '=' not in line: break k, v = line.split('=') if k.strip() == 'format': outForm = v.strip() else: raise Exception except ValueError as e: if str(e) == "Maximum content length exceeded": # Add some user-friendliness (this message triggers an alert # box on the client) return send_plain_response("400 Bad Request", "maximum request size exceeded", start_response) return send_plain_response("400 Bad Request", str(e), start_response) # Check whether the function called is implemented implementedFunctions = ['query', 'application.wadl', 'localconfig', 'version', 'info'] config = configparser.RawConfigParser() here = os.path.dirname(__file__) config.read(os.path.join(here, 'routing.cfg')) #verbo = config.getint('Service', 'verbosity') verbo = config.get('Service', 'verbosity') # Warning is the default value verboNum = getattr(logging, verbo.upper(), 30) logging.basicConfig(level=verboNum) if routes is None: # Add routing cache here, to be accessible to all modules routesFile = os.path.join(here, 'data', 'routing.xml') #invFile = os.path.join(here, 'data', 'Arclink-inventory.xml') masterFile = os.path.join(here, 'data', 'masterTable.xml') #routes = RoutingCache(routesFile, masterFile, Logs(verbo)) routes = RoutingCache(routesFile, masterFile) fname = environ['PATH_INFO'].split('/')[-1] if fname not in implementedFunctions: return send_plain_response("400 Bad Request", 'Function "%s" not implemented.' % fname, start_response) if fname == 'application.wadl': iterObj = '' here = os.path.dirname(__file__) appWadl = os.path.join(here, 'application.wadl') with open(appWadl, 'r') \ as appFile: iterObj = appFile.read() status = '200 OK' return send_xml_response(status, iterObj, start_response) elif fname == 'query': makeQuery = globals()['makeQuery%s' % environ['REQUEST_METHOD']] try: iterObj = makeQuery(form) iterObj = applyFormat(iterObj, outForm) status = '200 OK' if outForm == 'xml': return send_xml_response(status, iterObj, start_response) else: return send_plain_response(status, iterObj, start_response) except WIError as w: return send_plain_response(w.status, w.body, start_response) elif fname == 'localconfig': return send_xml_response('200 OK', routes.localConfig(), start_response) elif fname == 'version': text = "1.0.2" return send_plain_response('200 OK', text, start_response) elif fname == 'info': config = configparser.RawConfigParser() here = os.path.dirname(__file__) config.read(os.path.join(here, 'routing.cfg')) text = config.get('Service', 'info') return send_plain_response('200 OK', text, start_response) raise Exception('This point should have never been reached!')
class DataSelectQuery(object): def __init__(self, logName=None, routesFile='./data/routing.xml', masterFile='./data/masterTable.xml', configFile='routing.cfg'): # Dataselect version self.version = '1.1.0' # set up logging self.logs = logging.getLogger('DataSelectQuery') logging.basicConfig() # Read the verbosity setting configP = configparser.RawConfigParser() configP.read(configFile) verbo = configP.get('Service', 'verbosity') verboNum = getattr(logging, verbo.upper(), 30) self.logs.setLevel(verboNum) # Add routing cache here, to be accessible to all modules self.logs.info('Reading routes from %s' % routesFile) self.logs.info('Reading masterTable from %s' % masterFile) self.logs.info('Reading configuration from %s' % configFile) self.routes = RoutingCache(routesFile, masterFile, configFile) self.ID = str(datetime.datetime.now()) if isinstance(logName, basestring): self.acc = Accounting(logName) elif logName is not None: self.acc = logName else: self.acc = None def makeQueryPOST(self, lines): urlList = [] for line in lines.split('\n'): # Skip empty lines if not len(line): continue try: net, sta, loc, cha, start, endt = line.split(' ') except: logging.error('Cannot parse line: %s' % line) continue # Empty location if loc == '--': loc = '' try: startParts = start.replace('-', ' ').replace('T', ' ') startParts = startParts.replace(':', ' ').replace('.', ' ') startParts = startParts.replace('Z', '').split() start = datetime.datetime(*map(int, startParts)) except: logging.error('Cannot convert "starttime" parameter (%s).' % start) continue try: endParts = endt.replace('-', ' ').replace('T', ' ') endParts = endParts.replace(':', ' ').replace('.', ' ') endParts = endParts.replace('Z', '').split() endt = datetime.datetime(*map(int, endParts)) except: logging.error('Cannot convert "endtime" parameter (%s).' % endt) continue try: fdsnws = self.routes.getRoute(net, sta, loc, cha, start, endt, 'dataselect') urlList.extend(applyFormat(fdsnws, 'get').splitlines()) except RoutingException: logging.warning('No route could be found for %s' % line) continue if not len(urlList): raise WIContentError('No routes have been found!') iterObj = ResultFile(urlList, self.acc.log if self.acc is not None else None) return iterObj def makeQueryGET(self, parameters): # List all the accepted parameters allowedParams = ['net', 'network', 'sta', 'station', 'loc', 'location', 'cha', 'channel', 'start', 'starttime', 'end', 'endtime', 'user'] for param in parameters: if param not in allowedParams: #return 'Unknown parameter: %s' % param raise WIClientError('Unknown parameter: %s' % param) try: if 'network' in parameters: net = parameters['network'].value.upper() elif 'net' in parameters: net = parameters['net'].value.upper() else: net = '*' net = net.split(',') except: net = ['*'] try: if 'station' in parameters: sta = parameters['station'].value.upper() elif 'sta' in parameters: sta = parameters['sta'].value.upper() else: sta = '*' sta = sta.split(',') except: sta = ['*'] try: if 'location' in parameters: loc = parameters['location'].value.upper() elif 'loc' in parameters: loc = parameters['loc'].value.upper() else: loc = '*' loc = loc.split(',') except: loc = ['*'] try: if 'channel' in parameters: cha = parameters['channel'].value.upper() elif 'cha' in parameters: cha = parameters['cha'].value.upper() else: cha = '*' cha = cha.split(',') except: cha = ['*'] try: if 'starttime' in parameters: start = datetime.datetime.strptime( parameters['starttime'].value.upper(), '%Y-%m-%dT%H:%M:%S') elif 'start' in parameters: start = datetime.datetime.strptime( parameters['start'].value.upper(), '%Y-%m-%dT%H:%M:%S') else: raise Exception except: raise WIClientError('Error while converting starttime parameter.') try: if 'endtime' in parameters: endt = datetime.datetime.strptime( parameters['endtime'].value.upper(), '%Y-%m-%dT%H:%M:%S') elif 'end' in parameters: endt = datetime.datetime.strptime( parameters['end'].value.upper(), '%Y-%m-%dT%H:%M:%S') else: raise Exception except: raise WIClientError('Error while converting endtime parameter.') try: if 'user' in parameters: user = parameters['user'].value else: user = None except: raise Exception('Error while checking the user parameter') urlList = [] for (n, s, l, c) in lsNSLC(net, sta, loc, cha): try: fdsnws = self.routes.getRoute(n, s, l, c, start, endt, 'dataselect') urlList.extend(applyFormat(fdsnws, 'get').splitlines()) except RoutingException: pass if not len(urlList): raise WIContentError('No routes have been found!') iterObj = ResultFile(urlList, self.acc.log if self.acc is not None else None, user) return iterObj