Files
seiscomp-training/etc/init/gdi2caps.py

226 lines
6.8 KiB
Python

from __future__ import absolute_import, division, print_function
import os
import glob
import re
import seiscomp.kernel
import seiscomp.config
import seiscomp.system
class Module(seiscomp.kernel.Module):
def __init__(self, env):
seiscomp.kernel.Module.__init__(self, env, env.moduleName(__file__))
self.config_dir = os.path.join(self.env.SEISCOMP_ROOT, "var", "lib")
self.log_dir = os.path.join(self.env.SEISCOMP_ROOT, "var", "log")
def _run(self):
if self.env.syslog:
daemon_opt = "-s"
else:
daemon_opt = "--log-file " + os.path.join(
self.log_dir, self.name + ".log"
)
daemon_opt += " -f " + os.path.join(
self.config_dir, self.name + ".cfg"
)
prog = "run_with_lock"
params = self.env.lockFile(self.name)
return self.env.start(
self.name,
prog,
f"{params} {self.env.binaryFile(self.name)} {daemon_opt}",
True,
)
def supportsAliases(self):
return True
def updateConfig(self):
bindings_dir = os.path.join(self.env.SEISCOMP_ROOT, "etc", "key")
key_dir = os.path.join(bindings_dir, self.name)
cfg_file = os.path.join(self.config_dir, self.name + ".cfg")
rx_binding = re.compile(
r"(?P<module>[A-Za-z0-9_\.-]+)(:(?P<profile>[A-Za-z0-9_-]+))?$"
)
files = glob.glob(os.path.join(bindings_dir, "station_*"))
files.sort()
try:
fb = open(cfg_file, "w", encoding="utf-8")
except BaseException:
print(f"error: unable to generate configuration file '{cfg_file}'")
return 1
cfg = seiscomp.config.Config()
try:
# Defaults Global + App Cfg
cfg.readConfig(
os.path.join(
self.env.SEISCOMP_ROOT, "etc", "defaults", "global.cfg"
)
)
cfg.readConfig(
os.path.join(
self.env.SEISCOMP_ROOT,
"etc",
"defaults",
self.name + ".cfg",
)
)
# Config Global + App Cfg
cfg.readConfig(
os.path.join(self.env.SEISCOMP_ROOT, "etc", "global.cfg")
)
cfg.readConfig(
os.path.join(self.env.SEISCOMP_ROOT, "etc", self.name + ".cfg")
)
# User Global + App Cfg
cfg.readConfig(
os.path.join(os.environ["HOME"], ".seiscomp", "global.cfg")
)
cfg.readConfig(
os.path.join(
os.environ["HOME"], ".seiscomp", self.name + ".cfg"
)
)
except BaseException:
pass
try:
print(f"queue_size = {cfg.getInt('queueSize')}", file=fb)
except BaseException:
pass
try:
print(
f"backfilling_buffer_size = {cfg.getInt('backFillingBufferSize')}",
file=fb,
)
except BaseException:
pass
# has_channel_mappings = False
try:
print(
f"channels = {', '.join(cfg.getStrings('channels'))}",
file=fb,
)
# has_channel_mappings = True
except BaseException:
pass
try:
default_address = cfg.getString("address")
except BaseException:
default_address = None
try:
default_sink = cfg.getString("sink")
except BaseException:
default_sink = None
# units = {}
for f in files:
try:
(path, net, sta) = os.path.basename(f).split("_")
if not path.endswith("station"):
print("invalid path", f)
except ValueError:
print("invalid path", f)
continue
fd = open(f, encoding="utf-8")
line = fd.readline()
while line:
line = line.strip()
if not line or line[0] == "#":
line = fd.readline()
continue
m = rx_binding.match(line)
if not m:
# print("invalid binding in %s: %s" % (f, line))
line = fd.readline()
continue
if m.group("module") != self.name:
line = fd.readline()
continue
profile = m.group("profile")
# Setup station net, sta, profile
if profile:
binding_file = f"profile_{profile}"
else:
binding_file = f"station_{net}_{sta}"
cfg = seiscomp.config.Config()
cfg.readConfig(os.path.join(key_dir, binding_file))
# try:
# unit = cfg.getString("unit")
# except:
# print("warning: unit is not defined in %s" % (binding_file))
# break
# try:
# channels = cfg.getStrings("channels")
# except:
# if not has_channel_mappings:
# print("warning: channel mappings are not defined in %s" % (
# binding_file))
# break
# channels = None
try:
address = cfg.getString("address")
except BaseException:
if default_address is None:
print(
f"warning: address not defined in {binding_file}"
)
break
address = default_address
try:
sink = cfg.getString("sink")
except BaseException:
if default_sink is None:
print(f"warning: sink not defined in {binding_file}")
break
sink = default_sink
# if units.has_key(unit):
# print("error: unit %s is bound to multiple stations "
# "(%s.%s, %s.%s, ...)" % (
# unit, units[unit][0], units[unit][1], net, sta))
# return 1
# units[unit] = (net,sta)
print(f"address {address}", file=fb)
print(f' network = "{net}"', file=fb)
print(f' station = "{sta}"', file=fb)
# if not channels is None:
# print(" channels = %s" % ", ".join(channels), file=fb)
print(f" sink = {sink}", file=fb)
break
fd.close()
fb.close()
return 0