ffpb_monitoring.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. # -*- coding: utf-8 -*-
  2. from __future__ import print_function
  3. import willie
  4. monitored_nodes = None
  5. def setup(bot):
  6. global monitored_nodes
  7. # load list of monitored nodes from disk
  8. monitored_nodes = shelve.open('monitorednodes', writeback=True)
  9. def shutdown(bot):
  10. global monitored_nodes
  11. # store list of monitored nodes to disk
  12. if not monitored_nodes is None:
  13. monitored_nodes.sync()
  14. monitored_nodes.close()
  15. monitored_nodes = None
  16. @willie.module.interval(3*60)
  17. def ffpb_monitor_ping(bot):
  18. """Ping jeden Knoten der gemonitort wird."""
  19. notify_target = bot.config.core.owner
  20. if (not bot.config.ffpb.msg_target is None):
  21. notify_target = bot.config.ffpb.msg_target
  22. for node in monitored_nodes:
  23. added = monitored_nodes[node][0]
  24. last_status = monitored_nodes[node][1]
  25. last_check = monitored_nodes[node][2]
  26. current_status = ffpb_ping(bot=None, target_name=node)
  27. monitored_nodes[node] = ( added, current_status, time.time() )
  28. 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))))
  29. if last_status != current_status and (last_status or current_status):
  30. if last_check is None:
  31. # erster Check, keine Ausgabe
  32. continue
  33. if current_status == True:
  34. bot.msg(notify_target, 'Monitoring: Knoten \'{0}\' pingt wieder (zuletzt {1})'.format(node, pretty_date(last_check)))
  35. else:
  36. bot.msg(notify_target, 'Monitoring: Knoten \'{0}\' DOWN'.format(node))
  37. @willie.module.commands('monitor')
  38. def ffpb_monitor(bot, trigger):
  39. """Monitoring-Funktion des Bots,
  40. Subkommandos add, del, info und list"""
  41. # command is for bot admins only
  42. if not trigger.admin:
  43. bot.say('Ich ping hier nicht für jeden durch die Weltgeschichte.')
  44. return
  45. # ensure the user gave arguments (group 2 is the concatenation of all following groups)
  46. if trigger.group(2) is None or len(trigger.group(2)) == 0:
  47. bot.say('Da s Monitoring sagt du hast doofe Ohren.')
  48. return
  49. # read additional arguments
  50. cmd = trigger.group(3)
  51. node = trigger.group(4)
  52. if not node is None: node = str(node)
  53. if cmd == "add":
  54. if node in monitored_nodes:
  55. bot.say('Knoten \'{0}\' wird bereits gemonitored.'.format(node))
  56. return
  57. monitored_nodes[node] = ( trigger.sender, None, None )
  58. bot.say('Knoten \'{0}\' wird jetzt ganz genau beobachtet.'.format(node))
  59. return
  60. if cmd == "del":
  61. if not node in monitored_nodes:
  62. bot.say('Knoten \'{0}\' war gar nicht im Monitoring?!?'.format(node))
  63. return
  64. del monitored_nodes[node]
  65. bot.say('Okidoki, \'{0}\' war mir sowieso egal.'.format(node))
  66. return
  67. if cmd == "info":
  68. if node in monitored_nodes:
  69. info = monitored_nodes[node]
  70. 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]))
  71. else:
  72. bot.say('Knoten \'{0}\' ist nicht im Monitoring.'.format(node))
  73. return
  74. if cmd == "list":
  75. nodes = ""
  76. for node in monitored_nodes:
  77. nodes = nodes + " " + node
  78. bot.say('Monitoring aktiv für:' + nodes)
  79. return
  80. if cmd == "help":
  81. bot.say('Entweder "!monitor list" oder "!monitor {add|del|info} <node>"')
  82. return
  83. bot.say('Mit "' + str(cmd) + '" kann ich nix anfangen, probier doch mal "!monitor help".')