You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

135 lines
4.4 KiB
Plaintext

#!/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] <input> [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())