--- /dev/null
+# -*- 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