Integrate the zabbix Elixir model into the monitor module.
[monitor.git] / monitor / database / zabbixapi / site.py
diff --git a/monitor/database/zabbixapi/site.py b/monitor/database/zabbixapi/site.py
new file mode 100644 (file)
index 0000000..94f01e1
--- /dev/null
@@ -0,0 +1,280 @@
+# -*- coding: utf-8 -*-\r
+"""This module contains functions called from console script entry points."""\r
+\r
+from os import getcwd\r
+from os.path import dirname, exists, join\r
+import sys\r
+\r
+from model import *\r
+from emailZabbix import *\r
+from monitor import config\r
+\r
+import defines\r
+import md5\r
+\r
+HOSTGROUP_NAME="%s_hostgroup"\r
+USERGROUP_NAME="%s_usergroup"\r
+       \r
+DISCOVERY_RULE_NAME="discovery rule for %s"\r
+DISCOVERY_ACTION_NAME="Auto-discover %s action"\r
+ESCALATION_ACTION_NAME="Escalation Action for %s"\r
+\r
+def delete_site(loginbase):\r
+\r
+       # get host group, usrgrp\r
+       # get all users in usrgrp, delete each\r
+       usergroupname = USERGROUP_NAME % loginbase\r
+       hostgroupname = HOSTGROUP_NAME % loginbase\r
+       discovery_action_name = DISCOVERY_ACTION_NAME % loginbase\r
+       discovery_rule_name = DISCOVERY_RULE_NAME % loginbase\r
+       escalation_action_name = ESCALATION_ACTION_NAME % loginbase\r
+\r
+       ug = UsrGrp.get_by(name=usergroupname)\r
+       if ug:\r
+               for user in ug.user_list:\r
+                       # remove user from group, if a member of no other groups, \r
+                       # delete user.\r
+                       #user.delete()\r
+                       pass\r
+               ug.delete()\r
+\r
+       hg = HostGroup.get_by(name=hostgroupname)\r
+       if hg: \r
+               # figure out how to delete all the hosts...\r
+               # NOTE: hosts are listed in hg.host_list\r
+               for host in hg.host_list:\r
+                       host.delete()\r
+               hg.delete()\r
+\r
+       # delete dr\r
+       dr = DiscoveryRule.get_by(name=discovery_rule_name)\r
+       if dr: dr.delete()\r
+\r
+       da = Action.get_by(name=discovery_action_name)\r
+       if da: da.delete()\r
+\r
+       ea = Action.get_by(name=escalation_action_name)\r
+       if ea: ea.delete()\r
+\r
+       return\r
+\r
+\r
+def setup_global():\r
+       # GLOBAL:\r
+       #       update mediatype for email.\r
+       mediatype = MediaType.get_by(description="Email")\r
+       if not mediatype:\r
+               print "ERROR:  There is no defined media type for 'Email'"\r
+               raise Exception("No Email Media type in Zabbix db")\r
+\r
+       # NOTE: assumes smtp server is local to this machine.\r
+       mediatype.smtp_server='localhost'\r
+       mediatype.smtp_helo=".".join(config.MONITOR_HOSTNAME.split('.')[1:])\r
+       mediatype.smtp_email=config.from_email\r
+\r
+       # GLOBAL: \r
+       #       update email messages with local url references.\r
+       mailtxt.reformat({'hostname' : config.MONITOR_HOSTNAME, \r
+                                         'support_email' : config.support_email})\r
+\r
+       # pltemplate - via web, xml import\r
+       # TODO: os.system("curl --post default_templates.xml")\r
+\r
+\r
+def setup_site(loginbase, techemail, piemail, iplist):\r
+\r
+       # TODO: Initially adding this info is ok. what about updates to users,\r
+       # additional hosts, removed users from plc, \r
+       # TODO: send a message when host is discovered.\r
+       # TODO: update 'discovered' hosts with dns name.\r
+       # TODO: remove old nodes that are no longer in the plcdb.\r
+\r
+       BI_WEEKLY_ESC_PERIOD = int(60*60*24)\r
+       BI_WEEKLY_ESC_PERIOD = int(60) # testing...\r
+\r
+       # User Group\r
+       site_user_group = UsrGrp.find_or_create(name="%s_usergroup" % loginbase)\r
+       for user in set(techemail + piemail):\r
+               # USER\r
+               u = User.find_or_create(alias=user, type=1,\r
+                                                               set_if_new={'passwd' : md5.md5(user).hexdigest()},\r
+                                                               exec_if_new=lambda obj: \\r
+                                                               obj.media_list.append( Media(mediatypeid=1, sendto=user)))\r
+\r
+               if site_user_group not in u.usrgrp_list:\r
+                       u.append_group(site_user_group)\r
+\r
+       # HOST GROUP\r
+       plc_host_group = HostGroup.find_or_create(name="MyPLC Hosts")\r
+       site_host_group = HostGroup.find_or_create(name="%s_hostgroup" % loginbase)\r
+       plctemplate = Host.get_by(host="Template_Linux_PLHost")\r
+       escalation_action_name = ESCALATION_ACTION_NAME % loginbase\r
+       discovery_action_name = DISCOVERY_ACTION_NAME % loginbase\r
+       discovery_rule_name = DISCOVERY_RULE_NAME % loginbase\r
+\r
+       # ADD hg to ug\r
+       if site_host_group not in site_user_group.hostgroup_list:\r
+               site_user_group.append_hostgroup(site_host_group)\r
+\r
+       # DISCOVERY RULE & CHECK\r
+       dr = DiscoveryRule.find_or_create(name=discovery_rule_name,\r
+                         iprange=iplist,\r
+                         delay=3600,\r
+                         proxy_hostid=0,\r
+                         exec_if_new=lambda obj: \\r
+                               obj.discoverycheck_list.append( DiscoveryCheck(type=9, \r
+                                                                               key_="system.uname", ports=10050) )\r
+                       )\r
+\r
+       # DISCOVERY ACTION for these servers\r
+       a = Action.find_or_create(name=discovery_action_name,\r
+                       eventsource=defines.EVENT_SOURCE_DISCOVERY,\r
+                       status=defines.DRULE_STATUS_ACTIVE,\r
+                       evaltype=defines.ACTION_EVAL_TYPE_AND_OR)\r
+       if len(a.actioncondition_list) == 0:\r
+               a.actioncondition_list=[\r
+                                       # Host IP Matches\r
+                                       ActionCondition(\r
+                                               conditiontype=defines.CONDITION_TYPE_DHOST_IP,\r
+                                               operator=defines.CONDITION_OPERATOR_EQUAL,\r
+                                               value=iplist),\r
+                                       # AND, Service type is Zabbix agent\r
+                                       ActionCondition(\r
+                                               conditiontype=defines.CONDITION_TYPE_DSERVICE_TYPE,\r
+                                               operator=defines.CONDITION_OPERATOR_EQUAL,\r
+                                               value=defines.SVC_AGENT),\r
+                                       # AND, Received system.uname value like 'Linux'\r
+                                       ActionCondition(\r
+                                               conditiontype=defines.CONDITION_TYPE_DVALUE,\r
+                                               operator=defines.CONDITION_OPERATOR_LIKE,\r
+                                               value="Linux"),\r
+                                       # AND, Discovery status is Discover\r
+                                       ActionCondition(\r
+                                               conditiontype=defines.CONDITION_TYPE_DSTATUS,\r
+                                               operator=defines.CONDITION_OPERATOR_EQUAL,\r
+                                               value=defines.DOBJECT_STATUS_DISCOVER),\r
+                               ]\r
+                               # THEN\r
+               a.actionoperation_list=[\r
+                                       # Add Host\r
+                                       ActionOperation(\r
+                                               operationtype=defines.OPERATION_TYPE_HOST_ADD,\r
+                                               object=0, objectid=0,\r
+                                               esc_period=0, esc_step_from=1, esc_step_to=1),\r
+                                       # Add To Group PLC Hosts\r
+                                       ActionOperation(\r
+                                               operationtype=defines.OPERATION_TYPE_GROUP_ADD,\r
+                                               object=0, objectid=plc_host_group.groupid,\r
+                                               esc_period=0, esc_step_from=1, esc_step_to=1),\r
+                                       # Add To Group LoginbaseSiteGroup\r
+                                       ActionOperation(\r
+                                               operationtype=defines.OPERATION_TYPE_GROUP_ADD,\r
+                                               object=0, objectid=site_host_group.groupid,\r
+                                               esc_period=0, esc_step_from=1, esc_step_to=1),\r
+                                       # Link to Template 'Template_Linux_Minimal'\r
+                                       ActionOperation(\r
+                                               operationtype=defines.OPERATION_TYPE_TEMPLATE_ADD,\r
+                                               object=0, objectid=plctemplate.hostid,\r
+                                               esc_period=0, esc_step_from=1, esc_step_to=1),\r
+                               ]\r
+       else:\r
+               # TODO: verify iplist is up-to-date\r
+               pass\r
+\r
+       # ESCALATION ACTION for these servers\r
+       ea = Action.find_or_create(name=escalation_action_name,\r
+                       eventsource=defines.EVENT_SOURCE_TRIGGERS,\r
+                       status=defines.ACTION_STATUS_ENABLED,\r
+                       evaltype=defines.ACTION_EVAL_TYPE_AND_OR,\r
+                       esc_period=BI_WEEKLY_ESC_PERIOD,        # three days\r
+                       recovery_msg=1,\r
+                       set_if_new={\r
+                               'r_shortdata':"Thank you for maintaining {HOSTNAME}!",\r
+                               'r_longdata': mailtxt.thankyou_nodeup, }\r
+                       )\r
+       if len(ea.actioncondition_list) == 0:\r
+                       # THEN this is a new entry\r
+               print "SETTING UP ESCALATION ACTION"\r
+               ea.actioncondition_list=[\r
+                               ActionCondition(conditiontype=defines.CONDITION_TYPE_TRIGGER_VALUE, \r
+                                                               operator=defines.CONDITION_OPERATOR_EQUAL, \r
+                                                               value=defines.TRIGGER_VALUE_TRUE),\r
+                               ActionCondition(conditiontype=defines.CONDITION_TYPE_TRIGGER_NAME, \r
+                                                               operator=defines.CONDITION_OPERATOR_LIKE, \r
+                                                               value="is unreachable"),\r
+                               ActionCondition(conditiontype=defines.CONDITION_TYPE_HOST_GROUP, \r
+                                                               operator=defines.CONDITION_OPERATOR_EQUAL, \r
+                                                               value=site_host_group.groupid),\r
+                       ]\r
+               ea.actionoperation_list=[\r
+                               # STAGE 1\r
+                               ActionOperation(operationtype=defines.OPERATION_TYPE_MESSAGE,\r
+                                       shortdata=mailtxt.nodedown_one_subject,\r
+                                       longdata=mailtxt.nodedown_one,\r
+                                       object=defines.OPERATION_OBJECT_GROUP, \r
+                                       objectid=site_user_group.usrgrpid, \r
+                                       esc_period=0, esc_step_to=3, esc_step_from=3, \r
+                                       operationcondition_list=[ OperationConditionNotAck() ] ),\r
+                               ActionOperation(operationtype=defines.OPERATION_TYPE_MESSAGE,\r
+                                       shortdata=mailtxt.nodedown_one_subject,\r
+                                       longdata=mailtxt.nodedown_one,\r
+                                       object=defines.OPERATION_OBJECT_GROUP, \r
+                                       objectid=site_user_group.usrgrpid, \r
+                                       esc_period=0, esc_step_to=7, esc_step_from=7, \r
+                                       operationcondition_list=[ OperationConditionNotAck() ] ),\r
+                               # STAGE 2\r
+                               ActionOperation(operationtype=defines.OPERATION_TYPE_COMMAND, \r
+                                       esc_step_from=10, esc_step_to=10, \r
+                                       esc_period=0,\r
+                                       shortdata="",\r
+                                       longdata="zabbixserver:/usr/share/monitor-server/checkslices.py {HOSTNAME} disablesite", \r
+                                       operationcondition_list=[ OperationConditionNotAck() ]),\r
+                               ActionOperation(operationtype=defines.OPERATION_TYPE_MESSAGE, \r
+                                       shortdata=mailtxt.nodedown_two_subject,\r
+                                       longdata=mailtxt.nodedown_two,\r
+                                       esc_step_from=10, esc_step_to=10, \r
+                                       esc_period=0, \r
+                                       object=defines.OPERATION_OBJECT_GROUP, \r
+                                       objectid=site_user_group.usrgrpid, \r
+                                       operationcondition_list=[ OperationConditionNotAck() ] ), \r
+                               ActionOperation(operationtype=defines.OPERATION_TYPE_MESSAGE, \r
+                                       shortdata=mailtxt.nodedown_two_subject,\r
+                                       longdata=mailtxt.nodedown_two,\r
+                                       esc_step_from=14, esc_step_to=14, \r
+                                       esc_period=0, \r
+                                       object=defines.OPERATION_OBJECT_GROUP, \r
+                                       objectid=site_user_group.usrgrpid, \r
+                                       operationcondition_list=[ OperationConditionNotAck() ] ), \r
+\r
+                               # STAGE 3\r
+                               ActionOperation(operationtype=defines.OPERATION_TYPE_COMMAND, \r
+                                       esc_step_from=17, esc_step_to=17, \r
+                                       esc_period=0, \r
+                                       shortdata="",\r
+                                       longdata="zabbixserver:/usr/share/monitor-server/checkslices.py {HOSTNAME} disableslices", \r
+                                       # TODO: send notice to users of slices\r
+                                       operationcondition_list=[ OperationConditionNotAck() ]),\r
+                               ActionOperation(operationtype=defines.OPERATION_TYPE_MESSAGE, \r
+                                       shortdata=mailtxt.nodedown_three_subject,\r
+                                       longdata=mailtxt.nodedown_three,\r
+                                       esc_step_from=17, esc_step_to=17, \r
+                                       esc_period=0, \r
+                                       object=defines.OPERATION_OBJECT_GROUP, \r
+                                       objectid=site_user_group.usrgrpid, \r
+                                       operationcondition_list=[ OperationConditionNotAck() ] ), \r
+                               # STAGE 4++\r
+                               ActionOperation(operationtype=defines.OPERATION_TYPE_COMMAND, \r
+                                       esc_step_from=21, esc_step_to=0, \r
+                                       esc_period=int(BI_WEEKLY_ESC_PERIOD*3.5),\r
+                                       shortdata="",\r
+                                       longdata="zabbixserver:/usr/share/monitor-server/checkslices.py {HOSTNAME} forever", \r
+                                       operationcondition_list=[ OperationConditionNotAck() ]),\r
+                               ActionOperation(operationtype=defines.OPERATION_TYPE_MESSAGE, \r
+                                       shortdata=mailtxt.nodedown_four_subject,\r
+                                       longdata=mailtxt.nodedown_four,\r
+                                       esc_step_from=21, esc_step_to=0, \r
+                                       esc_period=int(BI_WEEKLY_ESC_PERIOD*3.5),\r
+                                       object=defines.OPERATION_OBJECT_GROUP, \r
+                                       objectid=site_user_group.usrgrpid, \r
+                                       operationcondition_list=[ OperationConditionNotAck() ] ), \r
+                       ]\r