#!/usr/bin/env seiscomp-python # -*- coding: utf-8 -*- ############################################################################ # Copyright (C) GFZ Potsdam # # All rights reserved. # # # # GNU Affero General Public License Usage # # This file may be used under the terms of the GNU Affero # # Public License version 3.0 as published by the Free Software Foundation # # and appearing in the file LICENSE included in the packaging of this # # file. Please review the following information to ensure the GNU Affero # # Public License version 3.0 requirements will be met: # # https://www.gnu.org/licenses/agpl-3.0.html. # ############################################################################ import sys import os import subprocess import glob import seiscomp.client class Importer(seiscomp.client.Application): def __init__(self, argc, argv): seiscomp.client.Application.__init__(self, argc, argv) self.setMessagingEnabled(False) self.setDatabaseEnabled(False, False) self._args = argv[1:] def run(self): if len(self._args) == 0: sys.stderr.write( "Usage: import_inv [{format}|help] [output]\n") return False if self._args[0] == "help": if len(self._args) < 2: sys.stderr.write("'help' can only be used with 'formats'\n") sys.stderr.write("import_inv help formats\n") return False if self._args[1] == "formats": return self.printFormats() sys.stderr.write("unknown topic '%s'\n" % self._args[1]) return False fmt = self._args[0] try: prog = os.path.join( os.environ['SEISCOMP_ROOT'], "bin", "%s2inv" % fmt) except: sys.stderr.write( "Could not get SeisComP root path, SEISCOMP_ROOT not set?\n") return False if not os.path.exists(prog): sys.stderr.write("Format '%s' is not supported\n" % fmt) return False if len(self._args) < 2: sys.stderr.write("Input missing\n") return False input = self._args[1] if len(self._args) < 3: filename = os.path.basename(os.path.abspath(input)) if not filename: filename = fmt # Append .xml if the ending is not already .xml if filename[-4:] != ".xml": filename = filename + ".xml" storage_dir = os.path.join( os.environ['SEISCOMP_ROOT'], "etc", "inventory") output = os.path.join(storage_dir, filename) try: os.makedirs(storage_dir) except: pass sys.stderr.write("Generating output to %s\n" % output) else: output = self._args[2] proc = subprocess.Popen([prog, input, output], stdout=None, stderr=None, shell=False) chans = proc.communicate() if proc.returncode != 0: sys.stderr.write( "Conversion failed, return code: %d\n" % proc.returncode) return False return True def printFormats(self): try: path = os.path.join(os.environ['SEISCOMP_ROOT'], "bin", "*2inv") except: sys.stderr.write( "Could not get SeisComP root path, SEISCOMP_ROOT not set?\n") return False files = glob.glob(path) for f in files: prog = os.path.basename(f) prog = prog[:prog.find("2inv")] sys.stdout.write("%s\n" % prog) return True def printUsage(self): print('''Usage: import_inv [FORMAT] input [output] import_inv help [topic] Import inventory information from various sources.''') seiscomp.client.Application.printUsage(self) print('''Examples: List all supported inventory formats import_inv help formats Convert from FDSN stationXML to SeisComp format import_inv fdsnxml inventory_fdsnws.xml inventory_sc.xml ''') if __name__ == "__main__": app = Importer(len(sys.argv), sys.argv) sys.exit(app())