142 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			142 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
		
			Executable File
		
	
	
	
	
#!/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(f"unknown topic '{self._args[1]}'\n")
 | 
						|
            return False
 | 
						|
 | 
						|
        fmt = self._args[0]
 | 
						|
        try:
 | 
						|
            prog = os.path.join(os.environ["SEISCOMP_ROOT"], "bin", f"{fmt}2inv")
 | 
						|
        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(f"Format '{fmt}' is not supported\n")
 | 
						|
            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(f"Generating output to {output}\n")
 | 
						|
        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)
 | 
						|
        formats = []
 | 
						|
        for f in files:
 | 
						|
            prog = os.path.basename(f)
 | 
						|
            formats.append(prog[: prog.find("2inv")])
 | 
						|
 | 
						|
        formats.sort()
 | 
						|
        sys.stdout.write("%s\n" % "\n".join(formats))
 | 
						|
 | 
						|
        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())
 |