Compare commits
	
		
			4 Commits
		
	
	
		
			174a6148bf
			...
			fb4d5c2929
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| fb4d5c2929 | |||
| 1983cc3b1e | |||
| acc8575d70 | |||
| 1b010ecb61 | 
@ -1,17 +1,17 @@
 | 
				
			|||||||
# Parameters file for Surveillance Bot
 | 
					# Parameters file for Surveillance Bot
 | 
				
			||||||
datapath: "/data/SDS/"                    # SC3 Datapath
 | 
					datapath: "/data/SDS/"                    # SC3 Datapath
 | 
				
			||||||
networks: ["1Y", "HA"]                    # select networks, list or str
 | 
					networks: ["1Y", "HA", "MK"]              # select networks, list or str
 | 
				
			||||||
stations: "*"                             # select stations, list or str
 | 
					stations: "*"                             # select stations, list or str
 | 
				
			||||||
locations: "*"                            # select locations, list or str
 | 
					locations: "*"                            # select locations, list or str
 | 
				
			||||||
stations_blacklist: ["TEST", "EREA"]      # exclude these stations
 | 
					stations_blacklist: ["TEST", "EREA", "DOMV"]      # exclude these stations
 | 
				
			||||||
networks_blacklist: []                    # exclude these networks
 | 
					networks_blacklist: []                    # exclude these networks
 | 
				
			||||||
interval: 60               # Perform checks every x seconds
 | 
					interval: 60               # Perform checks every x seconds
 | 
				
			||||||
n_track: 300               # wait n_track * intervals before performing an action (i.e. send mail/end highlight status)
 | 
					n_track: 360               # wait n_track * intervals before performing an action (i.e. send mail/end highlight status)
 | 
				
			||||||
timespan: 3                # Check data of the recent x days
 | 
					timespan: 3                # Check data of the recent x days
 | 
				
			||||||
verbosity: 0               # verbosity flag
 | 
					verbosity: 0               # verbosity flag
 | 
				
			||||||
track_changes: True        # tracks all changes since GUI startup by text highlighting (GUI only)
 | 
					track_changes: True        # tracks all changes since GUI startup by text highlighting (GUI only)
 | 
				
			||||||
warn_count: False          # show number of warnings and errors in table
 | 
					warn_count: False          # show number of warnings and errors in table
 | 
				
			||||||
min_sample: 3              # minimum samples for raising Warn/FAIL
 | 
					min_sample: 5              # minimum samples for raising Warn/FAIL
 | 
				
			||||||
dt_thresh: [300, 1800]     # threshold (s) for timing delay colourisation (yellow/red)
 | 
					dt_thresh: [300, 1800]     # threshold (s) for timing delay colourisation (yellow/red)
 | 
				
			||||||
html_figures: True         # Create html figure directory and links
 | 
					html_figures: True         # Create html figure directory and links
 | 
				
			||||||
reread_parameters: True    # reread parameters file (change parameters on runtime, not for itself/GUI refresh/datapath)
 | 
					reread_parameters: True    # reread parameters file (change parameters on runtime, not for itself/GUI refresh/datapath)
 | 
				
			||||||
@ -72,12 +72,12 @@ CHANNELS:
 | 
				
			|||||||
  EX2:
 | 
					  EX2:
 | 
				
			||||||
    unit: 1e-6
 | 
					    unit: 1e-6
 | 
				
			||||||
    name: "PowBox 230V/12V (V)"
 | 
					    name: "PowBox 230V/12V (V)"
 | 
				
			||||||
    ticks: [1, 5, 1]
 | 
					    ticks: [0, 5, 1]
 | 
				
			||||||
    warn: [2, 3, 4, 4.5, 5]
 | 
					    warn: [2, 3, 4, 4.5, 5]
 | 
				
			||||||
  EX3:
 | 
					  EX3:
 | 
				
			||||||
    unit: 1e-6
 | 
					    unit: 1e-6
 | 
				
			||||||
    name: "PowBox Router/Charger (V)"
 | 
					    name: "PowBox Router/Charger (V)"
 | 
				
			||||||
    ticks: [1, 5, 1]
 | 
					    ticks: [0, 5, 1]
 | 
				
			||||||
    warn: [2, 2.5, 3, 4, 5]
 | 
					    warn: [2, 2.5, 3, 4, 5]
 | 
				
			||||||
  VEI:
 | 
					  VEI:
 | 
				
			||||||
    unit: 1e-3
 | 
					    unit: 1e-3
 | 
				
			||||||
@ -122,6 +122,15 @@ add_links:
 | 
				
			|||||||
  slmon: {"URL": "../slmon/{nw}_{st}.html", "text": "show"}
 | 
					  slmon: {"URL": "../slmon/{nw}_{st}.html", "text": "show"}
 | 
				
			||||||
  24h-plot: {"URL": "../scheli/{nw}/{st}.png", "text": "plot"}
 | 
					  24h-plot: {"URL": "../scheli/{nw}/{st}.png", "text": "plot"}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# add station-independent links below html table (list items separated with -)
 | 
				
			||||||
 | 
					add_global_links:
 | 
				
			||||||
 | 
					  # for example: - {"text": "our homepage", "URL": "https://www.rub.de"}
 | 
				
			||||||
 | 
					  - {"text": "show recent events on map",
 | 
				
			||||||
 | 
					     "URL": "https://fdsnws.geophysik.ruhr-uni-bochum.de/map/?lat=39.5&lon=21&zoom=7&baselayer=mapnik"}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# html logo at page bottom
 | 
				
			||||||
 | 
					html_logo: "figures/Logo_RUB_BLAU_rgb.png"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# E-mail notifications
 | 
					# E-mail notifications
 | 
				
			||||||
EMAIL:
 | 
					EMAIL:
 | 
				
			||||||
  mailserver: "localhost"
 | 
					  mailserver: "localhost"
 | 
				
			||||||
 | 
				
			|||||||
@ -2,11 +2,13 @@ body {
 | 
				
			|||||||
    background-color: #ffffff;
 | 
					    background-color: #ffffff;
 | 
				
			||||||
    place-items: center;
 | 
					    place-items: center;
 | 
				
			||||||
    text-align: center;
 | 
					    text-align: center;
 | 
				
			||||||
 | 
					    padding-bottom: 30px;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
td {
 | 
					td {
 | 
				
			||||||
    border-radius: 4px;
 | 
					    border-radius: 4px;
 | 
				
			||||||
    padding: 0px;
 | 
					    padding: 0px;
 | 
				
			||||||
 | 
					    white-space: nowrap;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
th {
 | 
					th {
 | 
				
			||||||
@ -37,3 +39,12 @@ a:hover {
 | 
				
			|||||||
    50%		{ background-color: #ff3200;}
 | 
					    50%		{ background-color: #ff3200;}
 | 
				
			||||||
    100%	{ background-color: #ffcc00;}
 | 
					    100%	{ background-color: #ffcc00;}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.footer {
 | 
				
			||||||
 | 
					   position: fixed;
 | 
				
			||||||
 | 
					   left: 0;
 | 
				
			||||||
 | 
					   bottom: 0;
 | 
				
			||||||
 | 
					   width: 100%;
 | 
				
			||||||
 | 
					   height: 50px;
 | 
				
			||||||
 | 
					   text-align: center;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -2,11 +2,13 @@ body {
 | 
				
			|||||||
    background-color: #ffffff;
 | 
					    background-color: #ffffff;
 | 
				
			||||||
    place-items: center;
 | 
					    place-items: center;
 | 
				
			||||||
    text-align: center;
 | 
					    text-align: center;
 | 
				
			||||||
 | 
					    padding-bottom: 30px;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
td {
 | 
					td {
 | 
				
			||||||
    border-radius: 4px;
 | 
					    border-radius: 4px;
 | 
				
			||||||
    padding: 10px 2px;
 | 
					    padding: 10px 2px;
 | 
				
			||||||
 | 
					    white-space: nowrap;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
th {
 | 
					th {
 | 
				
			||||||
@ -41,3 +43,12 @@ a:hover {
 | 
				
			|||||||
    50%		{ background-color: #ff3200;}
 | 
					    50%		{ background-color: #ff3200;}
 | 
				
			||||||
    100%	{ background-color: #ffee00;}
 | 
					    100%	{ background-color: #ffee00;}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.footer {
 | 
				
			||||||
 | 
					   position: fixed;
 | 
				
			||||||
 | 
					   left: 0;
 | 
				
			||||||
 | 
					   bottom: 0;
 | 
				
			||||||
 | 
					   width: 100%;
 | 
				
			||||||
 | 
					   height: 50px;
 | 
				
			||||||
 | 
					   text-align: center;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										15
									
								
								survBot.py
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								survBot.py
									
									
									
									
									
								
							@ -20,7 +20,7 @@ import matplotlib.pyplot as plt
 | 
				
			|||||||
from obspy import read, UTCDateTime, Stream
 | 
					from obspy import read, UTCDateTime, Stream
 | 
				
			||||||
from obspy.clients.filesystem.sds import Client
 | 
					from obspy.clients.filesystem.sds import Client
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from write_utils import get_html_text, get_html_row, html_footer, get_html_header, get_print_title_str, \
 | 
					from write_utils import get_html_text, get_html_link, get_html_row, html_footer, get_html_header, get_print_title_str, \
 | 
				
			||||||
    init_html_table, finish_html_table, get_mail_html_header, add_html_image
 | 
					    init_html_table, finish_html_table, get_mail_html_header, add_html_image
 | 
				
			||||||
from utils import get_bg_color, modify_stream_for_plot, set_axis_yticks, set_axis_color, plot_axis_thresholds
 | 
					from utils import get_bg_color, modify_stream_for_plot, set_axis_yticks, set_axis_color, plot_axis_thresholds
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -120,9 +120,16 @@ class SurveillanceBot(object):
 | 
				
			|||||||
        self.networks_blacklist = self.parameters.get('networks_blacklist')
 | 
					        self.networks_blacklist = self.parameters.get('networks_blacklist')
 | 
				
			||||||
        self.refresh_period = self.parameters.get('interval')
 | 
					        self.refresh_period = self.parameters.get('interval')
 | 
				
			||||||
        self.transform_parameters()
 | 
					        self.transform_parameters()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        add_links = self.parameters.get('add_links')
 | 
					        add_links = self.parameters.get('add_links')
 | 
				
			||||||
        self.add_links = add_links if add_links else {}
 | 
					        self.add_links = add_links if add_links else {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        add_global_links = self.parameters.get('add_global_links')
 | 
				
			||||||
 | 
					        # in case user forgets "-" in parameters file
 | 
				
			||||||
 | 
					        if isinstance(add_global_links, dict):
 | 
				
			||||||
 | 
					            add_global_links = [add_global_links]
 | 
				
			||||||
 | 
					        self.add_global_links = add_global_links if add_global_links else []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def transform_parameters(self):
 | 
					    def transform_parameters(self):
 | 
				
			||||||
        for key in ['networks', 'stations', 'locations', 'channels']:
 | 
					        for key in ['networks', 'stations', 'locations', 'channels']:
 | 
				
			||||||
            parameter = self.parameters.get(key)
 | 
					            parameter = self.parameters.get(key)
 | 
				
			||||||
@ -496,8 +503,12 @@ class SurveillanceBot(object):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                outfile.write(finish_html_table())
 | 
					                outfile.write(finish_html_table())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                for dct in self.add_global_links:
 | 
				
			||||||
 | 
					                    link_str = get_html_link(dct.get('text'), dct.get('URL'))
 | 
				
			||||||
 | 
					                    outfile.write(get_html_text(link_str))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                outfile.write(get_html_text(self.status_message))
 | 
					                outfile.write(get_html_text(self.status_message))
 | 
				
			||||||
                outfile.write(html_footer())
 | 
					                outfile.write(html_footer(footer_logo=self.parameters.get('html_logo')))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        except Exception as e:
 | 
					        except Exception as e:
 | 
				
			||||||
            print(f'Could not write HTML table to {fnout}:')
 | 
					            print(f'Could not write HTML table to {fnout}:')
 | 
				
			||||||
 | 
				
			|||||||
@ -47,9 +47,15 @@ def finish_html_table():
 | 
				
			|||||||
    return '</table>\n'
 | 
					    return '</table>\n'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def html_footer():
 | 
					def html_footer(footer_logo=None):
 | 
				
			||||||
    footer = ['</body>',
 | 
					    footer = ['</body>']
 | 
				
			||||||
              '</html>']
 | 
					    if footer_logo:
 | 
				
			||||||
 | 
					        logo_items = [f'<div class="footer">',
 | 
				
			||||||
 | 
					                      f'  <img style="float: right; padding: 10px;" src="{footer_logo}" height=30px>',
 | 
				
			||||||
 | 
					                      f'</div>']
 | 
				
			||||||
 | 
					        footer += logo_items
 | 
				
			||||||
 | 
					    footer.append('</html>\n')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    footer = _convert_to_textstring(footer)
 | 
					    footer = _convert_to_textstring(footer)
 | 
				
			||||||
    return footer
 | 
					    return footer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -58,6 +64,10 @@ def add_html_image(img_data, img_format='png'):
 | 
				
			|||||||
    return f"""<br>\n<img width="100%" src="data:image/{img_format};base64, {b64encode(img_data).decode('ascii')}">"""
 | 
					    return f"""<br>\n<img width="100%" src="data:image/{img_format};base64, {b64encode(img_data).decode('ascii')}">"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def get_html_link(text, link):
 | 
				
			||||||
 | 
					    return f'<a href="{link}"> {text} </a>'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_html_row(items, html_key='td'):
 | 
					def get_html_row(items, html_key='td'):
 | 
				
			||||||
    row_string = ''
 | 
					    row_string = ''
 | 
				
			||||||
    default_space = '  '
 | 
					    default_space = '  '
 | 
				
			||||||
@ -73,11 +83,11 @@ def get_html_row(items, html_key='td'):
 | 
				
			|||||||
        # check for black background of headers (shouldnt happen anymore)
 | 
					        # check for black background of headers (shouldnt happen anymore)
 | 
				
			||||||
        color = '#e6e6e6' if color == '#000000' else color
 | 
					        color = '#e6e6e6' if color == '#000000' else color
 | 
				
			||||||
        hyperlink = item.get('hyperlink')
 | 
					        hyperlink = item.get('hyperlink')
 | 
				
			||||||
        image_str = f'<a href="{hyperlink}">' if hyperlink else ''
 | 
					        text_str = get_html_link(text, hyperlink) if hyperlink else text
 | 
				
			||||||
        html_class = item.get('html_class')
 | 
					        html_class = item.get('html_class')
 | 
				
			||||||
        class_str = f' class="{html_class}"' if html_class else ''
 | 
					        class_str = f' class="{html_class}"' if html_class else ''
 | 
				
			||||||
        row_string += 2 * default_space + f'<{html_key}{class_str} bgcolor="{color}" title="{tooltip}"> {image_str}'\
 | 
					        row_string += 2 * default_space + f'<{html_key}{class_str} bgcolor="{color}" title="{tooltip}"> {text_str}'\
 | 
				
			||||||
                    + text + f'</{html_key}>\n'
 | 
					                    + f'</{html_key}>\n'
 | 
				
			||||||
    row_string += default_space + '</tr>\n'
 | 
					    row_string += default_space + '</tr>\n'
 | 
				
			||||||
    return row_string
 | 
					    return row_string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user