1 # -*- coding: utf-8 -*-
\r
2 """This module contains functions called from console script entry points."""
\r
4 from os import getcwd
\r
5 from os.path import dirname, exists, join
\r
8 from monitor.model import *
\r
9 from emailZabbix import *
\r
10 from monitor import config
\r
15 HOSTGROUP_NAME="%s_hostgroup"
\r
16 USERGROUP_NAME="%s_usergroup"
\r
18 DISCOVERY_RULE_NAME="discovery rule for %s"
\r
19 DISCOVERY_ACTION_NAME="Auto-discover %s action"
\r
20 ESCALATION_ACTION_NAME="Escalation Action for %s"
\r
22 def delete_site(loginbase):
\r
24 # get host group, usrgrp
\r
25 # get all users in usrgrp, delete each
\r
26 usergroupname = USERGROUP_NAME % loginbase
\r
27 hostgroupname = HOSTGROUP_NAME % loginbase
\r
28 discovery_action_name = DISCOVERY_ACTION_NAME % loginbase
\r
29 discovery_rule_name = DISCOVERY_RULE_NAME % loginbase
\r
30 escalation_action_name = ESCALATION_ACTION_NAME % loginbase
\r
32 ug = UsrGrp.get_by(name=usergroupname)
\r
34 for user in ug.user_list:
\r
35 # remove user from group, if a member of no other groups,
\r
41 hg = HostGroup.get_by(name=hostgroupname)
\r
43 # figure out how to delete all the hosts...
\r
44 # NOTE: hosts are listed in hg.host_list
\r
45 for host in hg.host_list:
\r
50 dr = DiscoveryRule.get_by(name=discovery_rule_name)
\r
53 da = Action.get_by(name=discovery_action_name)
\r
56 ea = Action.get_by(name=escalation_action_name)
\r
64 # update mediatype for email.
\r
65 mediatype = MediaType.get_by(description="Email")
\r
67 print "ERROR: There is no defined media type for 'Email'"
\r
68 raise Exception("No Email Media type in Zabbix db")
\r
70 # NOTE: assumes smtp server is local to this machine.
\r
71 mediatype.smtp_server='localhost'
\r
72 mediatype.smtp_helo=".".join(config.MONITOR_HOSTNAME.split('.')[1:])
\r
73 mediatype.smtp_email=config.from_email
\r
76 # update email messages with local url references.
\r
77 mailtxt.reformat({'hostname' : config.MONITOR_HOSTNAME,
\r
78 'support_email' : config.support_email})
\r
80 # pltemplate - via web, xml import
\r
81 # TODO: os.system("curl --post default_templates.xml")
\r
84 def setup_site(loginbase, techemail, piemail, iplist):
\r
86 # TODO: Initially adding this info is ok. what about updates to users,
\r
87 # additional hosts, removed users from plc,
\r
88 # TODO: send a message when host is discovered.
\r
89 # TODO: update 'discovered' hosts with dns name.
\r
90 # TODO: remove old nodes that are no longer in the plcdb.
\r
92 BI_WEEKLY_ESC_PERIOD = int(60*60*24)
\r
93 BI_WEEKLY_ESC_PERIOD = int(60) # testing...
\r
96 site_user_group = UsrGrp.find_or_create(name="%s_usergroup" % loginbase)
\r
97 for user in set(techemail + piemail):
\r
99 u = User.find_or_create(alias=user, type=1,
\r
100 set_if_new={'passwd' : md5.md5(user).hexdigest()},
\r
101 exec_if_new=lambda obj: \
\r
102 obj.media_list.append( Media(mediatypeid=1, sendto=user)))
\r
104 if site_user_group not in u.usrgrp_list:
\r
105 u.append_group(site_user_group)
\r
108 plc_host_group = HostGroup.find_or_create(name="MyPLC Hosts")
\r
109 site_host_group = HostGroup.find_or_create(name="%s_hostgroup" % loginbase)
\r
110 plctemplate = Host.get_by(host="Template_Linux_PLHost")
\r
111 escalation_action_name = ESCALATION_ACTION_NAME % loginbase
\r
112 discovery_action_name = DISCOVERY_ACTION_NAME % loginbase
\r
113 discovery_rule_name = DISCOVERY_RULE_NAME % loginbase
\r
116 if site_host_group not in site_user_group.hostgroup_list:
\r
117 site_user_group.append_hostgroup(site_host_group)
\r
119 # DISCOVERY RULE & CHECK
\r
120 dr = DiscoveryRule.find_or_create(name=discovery_rule_name,
\r
124 exec_if_new=lambda obj: \
\r
125 obj.discoverycheck_list.append( DiscoveryCheck(type=9,
\r
126 key_="system.uname", ports=10050) )
\r
129 # DISCOVERY ACTION for these servers
\r
130 a = Action.find_or_create(name=discovery_action_name,
\r
131 eventsource=defines.EVENT_SOURCE_DISCOVERY,
\r
132 status=defines.DRULE_STATUS_ACTIVE,
\r
133 evaltype=defines.ACTION_EVAL_TYPE_AND_OR)
\r
134 if len(a.actioncondition_list) == 0:
\r
135 a.actioncondition_list=[
\r
138 conditiontype=defines.CONDITION_TYPE_DHOST_IP,
\r
139 operator=defines.CONDITION_OPERATOR_EQUAL,
\r
141 # AND, Service type is Zabbix agent
\r
143 conditiontype=defines.CONDITION_TYPE_DSERVICE_TYPE,
\r
144 operator=defines.CONDITION_OPERATOR_EQUAL,
\r
145 value=defines.SVC_AGENT),
\r
146 # AND, Received system.uname value like 'Linux'
\r
148 conditiontype=defines.CONDITION_TYPE_DVALUE,
\r
149 operator=defines.CONDITION_OPERATOR_LIKE,
\r
151 # AND, Discovery status is Discover
\r
153 conditiontype=defines.CONDITION_TYPE_DSTATUS,
\r
154 operator=defines.CONDITION_OPERATOR_EQUAL,
\r
155 value=defines.DOBJECT_STATUS_DISCOVER),
\r
158 a.actionoperation_list=[
\r
161 operationtype=defines.OPERATION_TYPE_HOST_ADD,
\r
162 object=0, objectid=0,
\r
163 esc_period=0, esc_step_from=1, esc_step_to=1),
\r
164 # Add To Group PLC Hosts
\r
166 operationtype=defines.OPERATION_TYPE_GROUP_ADD,
\r
167 object=0, objectid=plc_host_group.groupid,
\r
168 esc_period=0, esc_step_from=1, esc_step_to=1),
\r
169 # Add To Group LoginbaseSiteGroup
\r
171 operationtype=defines.OPERATION_TYPE_GROUP_ADD,
\r
172 object=0, objectid=site_host_group.groupid,
\r
173 esc_period=0, esc_step_from=1, esc_step_to=1),
\r
174 # Link to Template 'Template_Linux_Minimal'
\r
176 operationtype=defines.OPERATION_TYPE_TEMPLATE_ADD,
\r
177 object=0, objectid=plctemplate.hostid,
\r
178 esc_period=0, esc_step_from=1, esc_step_to=1),
\r
181 # TODO: verify iplist is up-to-date
\r
184 # ESCALATION ACTION for these servers
\r
185 ea = Action.find_or_create(name=escalation_action_name,
\r
186 eventsource=defines.EVENT_SOURCE_TRIGGERS,
\r
187 status=defines.ACTION_STATUS_ENABLED,
\r
188 evaltype=defines.ACTION_EVAL_TYPE_AND_OR,
\r
189 esc_period=BI_WEEKLY_ESC_PERIOD, # three days
\r
192 'r_shortdata':"Thank you for maintaining {HOSTNAME}!",
\r
193 'r_longdata': mailtxt.thankyou_nodeup, }
\r
195 if len(ea.actioncondition_list) == 0:
\r
196 # THEN this is a new entry
\r
197 print "SETTING UP ESCALATION ACTION"
\r
198 ea.actioncondition_list=[
\r
199 ActionCondition(conditiontype=defines.CONDITION_TYPE_TRIGGER_VALUE,
\r
200 operator=defines.CONDITION_OPERATOR_EQUAL,
\r
201 value=defines.TRIGGER_VALUE_TRUE),
\r
202 ActionCondition(conditiontype=defines.CONDITION_TYPE_TRIGGER_NAME,
\r
203 operator=defines.CONDITION_OPERATOR_LIKE,
\r
204 value="is unreachable"),
\r
205 ActionCondition(conditiontype=defines.CONDITION_TYPE_HOST_GROUP,
\r
206 operator=defines.CONDITION_OPERATOR_EQUAL,
\r
207 value=site_host_group.groupid),
\r
209 ea.actionoperation_list=[
\r
211 ActionOperation(operationtype=defines.OPERATION_TYPE_MESSAGE,
\r
212 shortdata=mailtxt.nodedown_one_subject,
\r
213 longdata=mailtxt.nodedown_one,
\r
214 object=defines.OPERATION_OBJECT_GROUP,
\r
215 objectid=site_user_group.usrgrpid,
\r
216 esc_period=0, esc_step_to=3, esc_step_from=3,
\r
217 operationcondition_list=[ OperationConditionNotAck() ] ),
\r
218 ActionOperation(operationtype=defines.OPERATION_TYPE_MESSAGE,
\r
219 shortdata=mailtxt.nodedown_one_subject,
\r
220 longdata=mailtxt.nodedown_one,
\r
221 object=defines.OPERATION_OBJECT_GROUP,
\r
222 objectid=site_user_group.usrgrpid,
\r
223 esc_period=0, esc_step_to=7, esc_step_from=7,
\r
224 operationcondition_list=[ OperationConditionNotAck() ] ),
\r
226 ActionOperation(operationtype=defines.OPERATION_TYPE_COMMAND,
\r
227 esc_step_from=10, esc_step_to=10,
\r
230 longdata="zabbixserver:/usr/share/monitor-server/checkslices.py {HOSTNAME} disablesite",
\r
231 operationcondition_list=[ OperationConditionNotAck() ]),
\r
232 ActionOperation(operationtype=defines.OPERATION_TYPE_MESSAGE,
\r
233 shortdata=mailtxt.nodedown_two_subject,
\r
234 longdata=mailtxt.nodedown_two,
\r
235 esc_step_from=10, esc_step_to=10,
\r
237 object=defines.OPERATION_OBJECT_GROUP,
\r
238 objectid=site_user_group.usrgrpid,
\r
239 operationcondition_list=[ OperationConditionNotAck() ] ),
\r
240 ActionOperation(operationtype=defines.OPERATION_TYPE_MESSAGE,
\r
241 shortdata=mailtxt.nodedown_two_subject,
\r
242 longdata=mailtxt.nodedown_two,
\r
243 esc_step_from=14, esc_step_to=14,
\r
245 object=defines.OPERATION_OBJECT_GROUP,
\r
246 objectid=site_user_group.usrgrpid,
\r
247 operationcondition_list=[ OperationConditionNotAck() ] ),
\r
250 ActionOperation(operationtype=defines.OPERATION_TYPE_COMMAND,
\r
251 esc_step_from=17, esc_step_to=17,
\r
254 longdata="zabbixserver:/usr/share/monitor-server/checkslices.py {HOSTNAME} disableslices",
\r
255 # TODO: send notice to users of slices
\r
256 operationcondition_list=[ OperationConditionNotAck() ]),
\r
257 ActionOperation(operationtype=defines.OPERATION_TYPE_MESSAGE,
\r
258 shortdata=mailtxt.nodedown_three_subject,
\r
259 longdata=mailtxt.nodedown_three,
\r
260 esc_step_from=17, esc_step_to=17,
\r
262 object=defines.OPERATION_OBJECT_GROUP,
\r
263 objectid=site_user_group.usrgrpid,
\r
264 operationcondition_list=[ OperationConditionNotAck() ] ),
\r
266 ActionOperation(operationtype=defines.OPERATION_TYPE_COMMAND,
\r
267 esc_step_from=21, esc_step_to=0,
\r
268 esc_period=int(BI_WEEKLY_ESC_PERIOD*3.5),
\r
270 longdata="zabbixserver:/usr/share/monitor-server/checkslices.py {HOSTNAME} forever",
\r
271 operationcondition_list=[ OperationConditionNotAck() ]),
\r
272 ActionOperation(operationtype=defines.OPERATION_TYPE_MESSAGE,
\r
273 shortdata=mailtxt.nodedown_four_subject,
\r
274 longdata=mailtxt.nodedown_four,
\r
275 esc_step_from=21, esc_step_to=0,
\r
276 esc_period=int(BI_WEEKLY_ESC_PERIOD*3.5),
\r
277 object=defines.OPERATION_OBJECT_GROUP,
\r
278 objectid=site_user_group.usrgrpid,
\r
279 operationcondition_list=[ OperationConditionNotAck() ] ),
\r