|
@@ -22,6 +22,7 @@ import threading
|
|
msgserver = None
|
|
msgserver = None
|
|
peers_repo = None
|
|
peers_repo = None
|
|
stats = None
|
|
stats = None
|
|
|
|
+monitored_nodes = None
|
|
highscores = None
|
|
highscores = None
|
|
|
|
|
|
alfred_method = None
|
|
alfred_method = None
|
|
@@ -67,7 +68,7 @@ class ThreadingTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
|
|
pass
|
|
pass
|
|
|
|
|
|
def setup(bot):
|
|
def setup(bot):
|
|
- global msgserver, peers_repo, alfred_method, highscores
|
|
|
|
|
|
+ global msgserver, peers_repo, alfred_method, highscores, monitored_nodes
|
|
|
|
|
|
highscores = shelve.open('highscoredata', writeback=True)
|
|
highscores = shelve.open('highscoredata', writeback=True)
|
|
if not 'nodes' in highscores:
|
|
if not 'nodes' in highscores:
|
|
@@ -77,6 +78,8 @@ def setup(bot):
|
|
highscores['clients'] = 0
|
|
highscores['clients'] = 0
|
|
highscores['clients_ts'] = time.time()
|
|
highscores['clients_ts'] = time.time()
|
|
|
|
|
|
|
|
+ monitored_nodes = shelve.open('monitorednodes', writeback=True)
|
|
|
|
+
|
|
if not bot.config.has_section('ffpb'):
|
|
if not bot.config.has_section('ffpb'):
|
|
return
|
|
return
|
|
|
|
|
|
@@ -103,13 +106,18 @@ def setup(bot):
|
|
ffpb_updatealfred(bot)
|
|
ffpb_updatealfred(bot)
|
|
|
|
|
|
def shutdown(bot):
|
|
def shutdown(bot):
|
|
- global msgserver, highscores
|
|
|
|
|
|
+ global msgserver, highscores, monitored_nodes
|
|
|
|
|
|
if not highscores is None:
|
|
if not highscores is None:
|
|
highscores.sync()
|
|
highscores.sync()
|
|
highscores.close()
|
|
highscores.close()
|
|
highscores = None
|
|
highscores = None
|
|
|
|
|
|
|
|
+ if not monitored_nodes is None:
|
|
|
|
+ monitored_nodes.sync()
|
|
|
|
+ monitored_nodes.close()
|
|
|
|
+ monitored_nodes = None
|
|
|
|
+
|
|
if not msgserver is None:
|
|
if not msgserver is None:
|
|
msgserver.shutdown()
|
|
msgserver.shutdown()
|
|
print("Closed messaging server.")
|
|
print("Closed messaging server.")
|
|
@@ -553,6 +561,81 @@ def ffpb_ping(bot, trigger=None, target_name=None):
|
|
if not bot is None: bot.say('Uh oh, irgendwas ist kaputt. Chef, ping result = ' + str(result) + ' - darf ich das essen?')
|
|
if not bot is None: bot.say('Uh oh, irgendwas ist kaputt. Chef, ping result = ' + str(result) + ' - darf ich das essen?')
|
|
return None
|
|
return None
|
|
|
|
|
|
|
|
+@willie.module.interval(3*60)
|
|
|
|
+def ffpb_monitor_ping(bot):
|
|
|
|
+ notify_target = bot.config.core.owner
|
|
|
|
+ if (not bot.config.ffpb.msg_target is None):
|
|
|
|
+ notify_target = bot.config.ffpb.msg_target
|
|
|
|
+
|
|
|
|
+ for node in monitored_nodes:
|
|
|
|
+ added = monitored_nodes[node][0]
|
|
|
|
+ last_status = monitored_nodes[node][1]
|
|
|
|
+ last_check = monitored_nodes[node][2]
|
|
|
|
+
|
|
|
|
+ current_status = ffpb_ping(bot=None, target_name=node)
|
|
|
|
+ monitored_nodes[node] = ( added, current_status, time.time() )
|
|
|
|
+ print("Monitoring ({0}) {1} (last: {2} at {3})".format(node, current_status, last_status, time.strftime('%Y-%m-%d %H:%M', time.localtime(last_check))))
|
|
|
|
+ if last_status != current_status and (last_status or current_status):
|
|
|
|
+ if last_check is None:
|
|
|
|
+ # erster Check, keine Ausgabe
|
|
|
|
+ continue
|
|
|
|
+
|
|
|
|
+ if current_status == True:
|
|
|
|
+ bot.msg(notify_target, 'Monitoring: Knoten \'{0}\' pingt wieder (zuletzt {1})'.format(node, pretty_date(last_check)))
|
|
|
|
+ else:
|
|
|
|
+ bot.msg(notify_target, 'Monitoring: Knoten \'{0}\' DOWN'.format(node))
|
|
|
|
+
|
|
|
|
+@willie.module.commands('monitor')
|
|
|
|
+def ffpb_monitor(bot, trigger):
|
|
|
|
+ if not trigger.admin:
|
|
|
|
+ bot.say('Ich ping hier nicht für jeden durch die Weltgeschichte.')
|
|
|
|
+ return
|
|
|
|
+
|
|
|
|
+ if trigger.group(2) is None or len(trigger.group(2)) == 0:
|
|
|
|
+ bot.say('Das Monitoring sagt du hast doofe Ohren.')
|
|
|
|
+ return
|
|
|
|
+
|
|
|
|
+ cmd = trigger.group(3)
|
|
|
|
+ node = trigger.group(4)
|
|
|
|
+ if not node is None: node = str(node)
|
|
|
|
+
|
|
|
|
+ if cmd == "add":
|
|
|
|
+ if node in monitored_nodes:
|
|
|
|
+ bot.say('Knoten \'{0}\' wird bereits gemonitored.'.format(node))
|
|
|
|
+ return
|
|
|
|
+ monitored_nodes[node] = ( trigger.sender, None, None )
|
|
|
|
+ bot.say('Knoten \'{0}\' wird jetzt ganz genau beobachtet.'.format(node))
|
|
|
|
+ return
|
|
|
|
+
|
|
|
|
+ if cmd == "del":
|
|
|
|
+ if not node in monitored_nodes:
|
|
|
|
+ bot.say('Knoten \'{0}\' war gar nicht im Monitoring?!?'.format(node))
|
|
|
|
+ return
|
|
|
|
+ del monitored_nodes[node]
|
|
|
|
+ bot.say('Okidoki, \'{0}\' war mir sowieso egal.'.format(node))
|
|
|
|
+ return
|
|
|
|
+
|
|
|
|
+ if cmd == "info":
|
|
|
|
+ if node in monitored_nodes:
|
|
|
|
+ info = monitored_nodes[node]
|
|
|
|
+ bot.say('Knoten \'{0}\' wurde zuletzt {1} gepingt (Ergebnis: {2}) - der Auftrag kam von {3}'.format(node, pretty_date(info[2]) if not info[2] is None else "^W noch nie", info[1], info[0]))
|
|
|
|
+ else:
|
|
|
|
+ bot.say('Knoten \'{0}\' ist nicht im Monitoring.'.format(node))
|
|
|
|
+ return
|
|
|
|
+
|
|
|
|
+ if cmd == "list":
|
|
|
|
+ nodes = ""
|
|
|
|
+ for node in monitored_nodes:
|
|
|
|
+ nodes = nodes + " " + node
|
|
|
|
+ bot.say('Monitoring aktiv für:' + nodes)
|
|
|
|
+ return
|
|
|
|
+
|
|
|
|
+ if cmd == "help":
|
|
|
|
+ bot.say('Entweder "!monitor list" oder "!monitor {add|del|info} <node>"')
|
|
|
|
+ return
|
|
|
|
+
|
|
|
|
+ bot.say('Mit "' + str(cmd) + '" kann ich nix anfangen, probier doch mal "!monitor help".')
|
|
|
|
+
|
|
@willie.module.commands('exec-on-peer')
|
|
@willie.module.commands('exec-on-peer')
|
|
def ffpb_remoteexec(bot, trigger):
|
|
def ffpb_remoteexec(bot, trigger):
|
|
"""Remote Execution fuer FFPB_Knoten"""
|
|
"""Remote Execution fuer FFPB_Knoten"""
|