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
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())
|