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.
182 lines
5.7 KiB
Python
182 lines
5.7 KiB
Python
from __future__ import print_function
|
|
import os, string, time, re, glob
|
|
import seiscomp.kernel, seiscomp.config
|
|
|
|
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.name)
|
|
self.rc_dir = os.path.join(self.env.SEISCOMP_ROOT, "var", "lib", "rc")
|
|
|
|
|
|
def _readConfig(self):
|
|
self.rc = {}
|
|
|
|
cfg = seiscomp.config.Config()
|
|
cfg.readConfig(os.path.join(self.env.SEISCOMP_ROOT, "etc", "defaults", self.name + ".cfg"))
|
|
try: cfg.readConfig(os.path.join(self.env.SEISCOMP_ROOT, "etc", self.name + ".cfg"))
|
|
except: pass
|
|
try: cfg.readConfig(os.path.join(os.environ['HOME'], ".seiscomp", self.name + ".cfg"))
|
|
except: pass
|
|
|
|
self.params = dict([(x, ",".join(cfg.getStrings(x))) for x in cfg.names()])
|
|
|
|
try: self.params['title']
|
|
except: self.params['title'] = "SeedLink Monitor"
|
|
|
|
try: self.params['refresh']
|
|
except: self.params['refresh'] = "180"
|
|
|
|
try: self.params['address']
|
|
except: self.params['address'] = "127.0.0.1"
|
|
|
|
try: int(self.params['port'])
|
|
except: self.params['port'] = 18000
|
|
|
|
try: self.params['email']
|
|
except: self.params['email'] = ""
|
|
|
|
try: self.params['wwwdir'] = self.params['wwwdir'].replace("@ROOTDIR@", self.env.SEISCOMP_ROOT).replace("@NAME@", self.name)
|
|
except: self.params['wwwdir'] = os.path.join(self.env.SEISCOMP_ROOT, "var", "run", "slmon")
|
|
|
|
# yet to be implemente correctly:
|
|
# live seismograms, lin in footer:
|
|
try: self.params['liveurl']
|
|
except: self.params['liveurl'] = "http://geofon.gfz-potsdam.de/waveform/liveseis.php?station=%s"
|
|
|
|
# favicon:
|
|
try: self.params['icon']
|
|
except: self.params['icon'] = "http://www.gfz-potsdam.de/favicon.ico"
|
|
|
|
# link name to external site in footer
|
|
try: self.params['linkname']
|
|
except: self.params['linkname'] = "GEOFON"
|
|
|
|
# link to external site in footer
|
|
try: self.params['linkurl']
|
|
except: self.params['linkurl'] = "http://www.gfz-potsdam.de/geofon/"
|
|
|
|
return cfg
|
|
|
|
|
|
def _run(self):
|
|
station_file = os.path.join(self.env.SEISCOMP_ROOT, "var", "lib", self.name, "stations.ini")
|
|
config_file = os.path.join(self.env.SEISCOMP_ROOT, "var", "lib", self.name, "config.ini")
|
|
|
|
prog = "run_with_lock"
|
|
params = self.env.lockFile(self.name)
|
|
params += " " + self.name + ' -s "' + station_file + '" -c "' + config_file + '"'
|
|
return self.env.start(self.name, prog, params, True)
|
|
|
|
|
|
def _processStation(self, key_dir, profile):
|
|
if profile:
|
|
station_config_file = "profile_%s" % (profile,)
|
|
else:
|
|
station_config_file = "station_%s_%s" % (self.net, self.sta)
|
|
|
|
cfg = seiscomp.config.Config()
|
|
cfg.readConfig(os.path.join(key_dir, station_config_file))
|
|
try: group = cfg.getString("group")
|
|
except: group = "local"
|
|
|
|
description = ""
|
|
|
|
try:
|
|
rc = seiscomp.config.Config()
|
|
rc.readConfig(os.path.join(self.rc_dir, "station_%s_%s" % (self.net, self.sta)))
|
|
description = rc.getString("description")
|
|
except Exception as e:
|
|
# Maybe the rc file doesn't exist, maybe there's no readable description.
|
|
pass
|
|
|
|
if len(description) == 0:
|
|
description = self.sta
|
|
|
|
content = "[" + self.net + "_" + self.sta + "]\n"
|
|
content += "net = %s\n" % self.net
|
|
content += "sta = %s\n" % self.sta
|
|
content += "info = %s\n" % description
|
|
content += "group = %s\n" % group
|
|
content += "type = real\n"
|
|
|
|
return content
|
|
|
|
|
|
def updateConfig(self):
|
|
self._readConfig()
|
|
template_dir = os.path.join(self.env.SEISCOMP_ROOT, "share", "templates", self.name)
|
|
|
|
# Create purge_datafiles script
|
|
tpl_paths = [template_dir]
|
|
config_file = self.env.processTemplate('config.tpl', tpl_paths, self.params, True)
|
|
if config_file:
|
|
try: os.makedirs(self.config_dir)
|
|
except: pass
|
|
fd = open(os.path.join(self.config_dir, "config.ini"), "w")
|
|
fd.write(config_file)
|
|
fd.close()
|
|
os.chmod(os.path.join(self.config_dir, "config.ini"), 0o755)
|
|
else:
|
|
try: os.remove(os.path.join(self.config_dir, "config.ini"))
|
|
except: pass
|
|
|
|
rx_binding = re.compile(r'(?P<module>[A-Za-z0-9_\.-]+)(:(?P<profile>[A-Za-z0-9_-]+))?$')
|
|
|
|
bindings_dir = os.path.join(self.env.SEISCOMP_ROOT, "etc", "key")
|
|
key_dir = os.path.join(bindings_dir, self.name)
|
|
config_file = os.path.join(self.config_dir, "stations.ini")
|
|
|
|
# Remove config file
|
|
try: os.remove(config_file)
|
|
except: pass
|
|
|
|
config_fd = None
|
|
files = glob.glob(os.path.join(bindings_dir, "station_*"))
|
|
for f in files:
|
|
try:
|
|
(path, net, sta) = f.split('_')[-3:]
|
|
if not path.endswith("station"):
|
|
print("invalid path", f)
|
|
|
|
except ValueError:
|
|
print("invalid path", f)
|
|
continue
|
|
|
|
self.net = net
|
|
self.sta = sta
|
|
|
|
fd = open(f)
|
|
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')
|
|
content = self._processStation(key_dir, profile)
|
|
if content:
|
|
if not config_fd:
|
|
try: os.makedirs(self.config_dir)
|
|
except: pass
|
|
try: config_fd = open(config_file, "w")
|
|
except:
|
|
raise Exception("Error: unable to create slarchive config file '%s'" % config_file)
|
|
config_fd.write("%s\n" % content)
|
|
break
|
|
|
|
fd.close()
|
|
|
|
return 0
|