#!/usr/bin/env python3 """ galmonmonmon Monitor galmon ground station status Copyright (C) 2022, Jeff Moe This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . """ # Usage: # galmonmonmon --id=[Ground Station ID] --sec=[Alert max in seconds] # Example: # Alert if station ID 192 is down for more than 1 hour (3600 seconds). # ./galmonmonmon --id=192 --sec=3600 import argparse import os import pandas as pd from datetime import datetime # Live URL observer_url=('https://galmon.eu/observers.json') # Cached file #observer_url=('data/observers.json') def get_observer(observer_id): observers = pd.read_json(observer_url, orient='records') for x in range(len(observers.id)): if observers['id'][x] == observer_id: observer_owner=(observers['owner'][x]) observer_last_seen=(observers['last-seen'][x]) return observer_owner, observer_last_seen def get_status(observer_last_seen): timestamp = datetime.fromtimestamp(observer_last_seen) unix_time = get_unix_time() diff_time = ( unix_time - timestamp ).total_seconds() return(diff_time) def get_unix_time(): now = datetime.now() ts = now.timestamp() unix_time=datetime.fromtimestamp(ts) return unix_time def parse_cli(): parser = argparse.ArgumentParser(description='Monitor galmon observation ground station.') parser.add_argument('--id', type=int, required=True, help='Galmon observation ground station ID') parser.add_argument('--sec', type=int, required=True, help='Alert max in seconds') args = parser.parse_args() observer_id = args.id alert_sec = args.sec return observer_id, alert_sec def show_status(observer_id, observer_owner, observer_sec, alert_sec): float_time=float(alert_sec) if observer_sec > float_time: observer_alert(observer_id, observer_owner, observer_sec) else: observer_ok(observer_id, observer_owner, observer_sec) def observer_alert(observer_id, observer_owner, observer_sec): print('ALERT: ', end='') print('Station ', observer_id, ', ', observer_owner, end='', sep='') print(', last seen', '{:.0f}'.format(observer_sec), 'seconds ago.') # Put a shell command you want to run here, perhaps. #os.system('echo OMG down | mail -s"Galmon alert" foo@barmail') #os.system('/usr/local/bin/my-chat-alert-script.sh') def observer_ok(observer_id, observer_owner, observer_sec): print('OK: ', end='') print('Station ', observer_id, ', ', observer_owner, end='', sep='') print(', last seen', '{:.0f}'.format(observer_sec), 'seconds ago.') def main(): observer_id, alert_sec=parse_cli() observer_owner, observer_last_seen=get_observer(observer_id); observer_sec=get_status(observer_last_seen) show_status(observer_id, observer_owner, observer_sec, alert_sec) if __name__ == "__main__": main();