4 from os.path import dirname, exists, join
8 from monitor import config
9 from monitor.database.dborm import zab_session as session
10 from monitor.database.zabbixapi.model import *
11 from monitor.database.zabbixapi.emailZabbix import *
12 from monitor.database.zabbixapi import defines
16 HOSTGROUP_NAME="%s_hostgroup"
17 USERGROUP_NAME="%s_usergroup"
19 DISCOVERY_RULE_NAME="discovery rule for %s"
20 DISCOVERY_ACTION_NAME="Auto-discover %s action"
21 ESCALATION_ACTION_NAME="Escalation Action for %s"
23 def delete_site(loginbase):
25 # get host group, usrgrp
26 # get all users in usrgrp, delete each
27 usergroupname = USERGROUP_NAME % loginbase
28 hostgroupname = HOSTGROUP_NAME % loginbase
29 discovery_action_name = DISCOVERY_ACTION_NAME % loginbase
30 discovery_rule_name = DISCOVERY_RULE_NAME % loginbase
31 escalation_action_name = ESCALATION_ACTION_NAME % loginbase
33 ug = UsrGrp.get_by(name=usergroupname)
35 for user in ug.user_list:
36 # remove user from group, if a member of no other groups,
42 hg = HostGroup.get_by(name=hostgroupname)
44 # figure out how to delete all the hosts...
45 # NOTE: hosts are listed in hg.host_list
46 for host in hg.host_list:
51 dr = DiscoveryRule.get_by(name=discovery_rule_name)
54 da = Action.get_by(name=discovery_action_name)
57 ea = Action.get_by(name=escalation_action_name)
65 # update mediatype for email.
66 ############################### MAIL
67 print "checking for MediaType Email"
68 mediatype = MediaType.get_by(description="Email")
70 print "ERROR: There is no defined media type for 'Email'"
71 raise Exception("No Email Media type in Zabbix db")
73 print "checking for correct configuration"
74 mediatype = MediaType.get_by(smtp_email=config.from_email)
76 mediatype = MediaType.get_by(description="Email")
77 # NOTE: assumes smtp server is local to this machine.
78 print "updating email server configuration"
79 mediatype.smtp_server='localhost'
80 mediatype.smtp_helo=".".join(config.MONITOR_HOSTNAME.split('.')[1:])
81 mediatype.smtp_email=config.from_email
83 ############################# EMAIL
84 mailtxt.reformat({'hostname' : config.MONITOR_HOSTNAME,
85 'support_email' : config.support_email})
87 ############################### CENTRAL SERVER
88 print "checking zabbix server host info"
89 zabbixserver = Host.get_by(host="ZABBIX Server")
91 print "UPDATING Primary Zabbix server entry"
92 zabbixserver.host=config.MONITOR_HOSTNAME
93 zabbixserver.ip=config.MONITOR_IP
94 zabbixserver.dns=config.MONITOR_HOSTNAME
97 ############################ DEFAULT TEMPLATES
98 # pltemplate - via web, xml import
99 # TODO: os.system("curl --post default_templates.xml")
101 ##################### SCRIPTS
102 ## TODO: add calls to check/reset the boot states.
103 print "checking scripts"
104 script1 = Script.find_or_create(name="RebootNode",
106 'command':"/usr/share/monitor-server/reboot.py {HOST.CONN}",
107 'host_access':3 # r/w)
109 script2 = Script.find_or_create(name="NMap",
111 'command':"/usr/bin/nmap -A {HOST.CONN}",
112 'host_access':2 # r/o)
116 def setup_site(loginbase, techemail, piemail, iplist):
118 # TODO: send a message when host is discovered.
120 # TODO: update 'discovered' hosts with dns name.
121 # TODO: remove old nodes that are no longer in the plcdb.
122 # TODO: remove old users that are no longer in the plcdb.
123 # TODO: consider creating two user groups for Tech & PI emails
125 BI_WEEKLY_ESC_PERIOD = int(60*60*24)
126 BI_WEEKLY_ESC_PERIOD = int(60) # testing...
129 site_user_group = UsrGrp.find_or_create(name=USERGROUP_NAME % loginbase)
130 for user in set(techemail + piemail + [config.cc_email]):
131 if not user: continue
133 u = User.find_or_create(alias=user, type=1,
134 set_if_new={'passwd' : md5.md5(user).hexdigest()},
135 # exec_if_new avoids creating a Media object that
136 # will not actually be used, if the user already exists
137 exec_if_new=lambda obj: \
138 obj.media_list.append( Media(mediatypeid=1, sendto=user)))
140 if site_user_group not in u.usrgrp_list:
141 u.append_group(site_user_group)
144 plc_host_group = HostGroup.find_or_create(name="MyPLC Hosts")
145 site_host_group = HostGroup.find_or_create(name=HOSTGROUP_NAME % loginbase)
146 plctemplate = Host.get_by(host="Template_Linux_PLHost")
147 escalation_action_name = ESCALATION_ACTION_NAME % loginbase
148 discovery_action_name = DISCOVERY_ACTION_NAME % loginbase
149 discovery_rule_name = DISCOVERY_RULE_NAME % loginbase
152 if site_host_group not in site_user_group.hostgroup_list:
153 site_user_group.append_hostgroup(site_host_group)
155 # DISCOVERY RULE & CHECK
156 dr = DiscoveryRule.find_or_create(name=discovery_rule_name,
159 set_if_new = {'iprange':iplist},
160 exec_if_new=lambda obj: \
161 obj.discoverycheck_list.append( DiscoveryCheck(type=9,
162 key_="system.uname", ports=10050) )
164 if dr.iprange != iplist:
165 if len(iplist) < 255:
168 raise Exception("iplist length is too long!")
171 # DISCOVERY ACTION for these servers
172 a = Action.find_or_create(name=discovery_action_name,
173 eventsource=defines.EVENT_SOURCE_DISCOVERY,
174 status=defines.DRULE_STATUS_ACTIVE,
175 evaltype=defines.ACTION_EVAL_TYPE_AND_OR)
176 if len(a.actioncondition_list) == 0:
177 a.actioncondition_list=[
180 conditiontype=defines.CONDITION_TYPE_DHOST_IP,
181 operator=defines.CONDITION_OPERATOR_EQUAL,
183 # AND, Service type is Zabbix agent
185 conditiontype=defines.CONDITION_TYPE_DSERVICE_TYPE,
186 operator=defines.CONDITION_OPERATOR_EQUAL,
187 value=defines.SVC_AGENT),
188 # AND, Received system.uname value like 'Linux'
190 conditiontype=defines.CONDITION_TYPE_DVALUE,
191 operator=defines.CONDITION_OPERATOR_LIKE,
193 # AND, Discovery status is Discover
195 conditiontype=defines.CONDITION_TYPE_DSTATUS,
196 operator=defines.CONDITION_OPERATOR_EQUAL,
197 value=defines.DOBJECT_STATUS_DISCOVER),
200 a.actionoperation_list=[
203 operationtype=defines.OPERATION_TYPE_HOST_ADD,
204 object=0, objectid=0,
205 esc_period=0, esc_step_from=1, esc_step_to=1),
206 # Add To Group PLC Hosts
208 operationtype=defines.OPERATION_TYPE_GROUP_ADD,
209 object=0, objectid=plc_host_group.groupid,
210 esc_period=0, esc_step_from=1, esc_step_to=1),
211 # Add To Group LoginbaseSiteGroup
213 operationtype=defines.OPERATION_TYPE_GROUP_ADD,
214 object=0, objectid=site_host_group.groupid,
215 esc_period=0, esc_step_from=1, esc_step_to=1),
216 # Link to Template 'Template_Linux_Minimal'
218 operationtype=defines.OPERATION_TYPE_TEMPLATE_ADD,
219 object=0, objectid=plctemplate.hostid,
220 esc_period=0, esc_step_from=1, esc_step_to=1),
223 # TODO: verify iplist is up-to-date
226 # ESCALATION ACTION for these servers
227 ea = Action.find_or_create(name=escalation_action_name,
228 eventsource=defines.EVENT_SOURCE_TRIGGERS,
229 status=defines.ACTION_STATUS_ENABLED,
230 evaltype=defines.ACTION_EVAL_TYPE_AND_OR,
231 esc_period=BI_WEEKLY_ESC_PERIOD, # three days
234 'r_shortdata':"Thank you for maintaining {HOSTNAME}!",
235 'r_longdata': mailtxt.thankyou_nodeup, }
237 if len(ea.actioncondition_list) == 0:
238 # THEN this is a new entry
239 print "SETTING UP ESCALATION ACTION"
240 ea.actioncondition_list=[
241 ActionCondition(conditiontype=defines.CONDITION_TYPE_TRIGGER_VALUE,
242 operator=defines.CONDITION_OPERATOR_EQUAL,
243 value=defines.TRIGGER_VALUE_TRUE),
244 ActionCondition(conditiontype=defines.CONDITION_TYPE_TRIGGER_NAME,
245 operator=defines.CONDITION_OPERATOR_LIKE,
246 value="is unreachable"),
247 ActionCondition(conditiontype=defines.CONDITION_TYPE_HOST_GROUP,
248 operator=defines.CONDITION_OPERATOR_EQUAL,
249 value=site_host_group.groupid),
251 ea.actionoperation_list=[
253 ActionOperation(operationtype=defines.OPERATION_TYPE_MESSAGE,
254 shortdata=mailtxt.nodedown_one_subject,
255 longdata=mailtxt.nodedown_one,
256 object=defines.OPERATION_OBJECT_GROUP,
257 objectid=site_user_group.usrgrpid,
258 esc_period=0, esc_step_to=3, esc_step_from=3,
259 operationcondition_list=[ OperationConditionNotAck() ] ),
260 ActionOperation(operationtype=defines.OPERATION_TYPE_MESSAGE,
261 shortdata=mailtxt.nodedown_one_subject,
262 longdata=mailtxt.nodedown_one,
263 object=defines.OPERATION_OBJECT_GROUP,
264 objectid=site_user_group.usrgrpid,
265 esc_period=0, esc_step_to=7, esc_step_from=7,
266 operationcondition_list=[ OperationConditionNotAck() ] ),
268 ActionOperation(operationtype=defines.OPERATION_TYPE_COMMAND,
269 esc_step_from=10, esc_step_to=10,
272 longdata="%s:/usr/share/monitor-server/checkslices.py {HOSTNAME} disablesite" % config.MONITOR_HOSTNAME,
273 operationcondition_list=[ OperationConditionNotAck() ]),
274 ActionOperation(operationtype=defines.OPERATION_TYPE_MESSAGE,
275 shortdata=mailtxt.nodedown_two_subject,
276 longdata=mailtxt.nodedown_two,
277 esc_step_from=10, esc_step_to=10,
279 object=defines.OPERATION_OBJECT_GROUP,
280 objectid=site_user_group.usrgrpid,
281 operationcondition_list=[ OperationConditionNotAck() ] ),
282 ActionOperation(operationtype=defines.OPERATION_TYPE_MESSAGE,
283 shortdata=mailtxt.nodedown_two_subject,
284 longdata=mailtxt.nodedown_two,
285 esc_step_from=14, esc_step_to=14,
287 object=defines.OPERATION_OBJECT_GROUP,
288 objectid=site_user_group.usrgrpid,
289 operationcondition_list=[ OperationConditionNotAck() ] ),
292 ActionOperation(operationtype=defines.OPERATION_TYPE_COMMAND,
293 esc_step_from=17, esc_step_to=17,
296 longdata="%s:/usr/share/monitor-server/checkslices.py {HOSTNAME} disableslices" % config.MONITOR_HOSTNAME,
297 # TODO: send notice to users of slices
298 operationcondition_list=[ OperationConditionNotAck() ]),
299 ActionOperation(operationtype=defines.OPERATION_TYPE_MESSAGE,
300 shortdata=mailtxt.nodedown_three_subject,
301 longdata=mailtxt.nodedown_three,
302 esc_step_from=17, esc_step_to=17,
304 object=defines.OPERATION_OBJECT_GROUP,
305 objectid=site_user_group.usrgrpid,
306 operationcondition_list=[ OperationConditionNotAck() ] ),
308 ActionOperation(operationtype=defines.OPERATION_TYPE_COMMAND,
309 esc_step_from=21, esc_step_to=0,
310 esc_period=int(BI_WEEKLY_ESC_PERIOD*3.5),
312 longdata="%s:/usr/share/monitor-server/checkslices.py {HOSTNAME} forever" % config.MONITOR_HOSTNAME,
313 operationcondition_list=[ OperationConditionNotAck() ]),
314 ActionOperation(operationtype=defines.OPERATION_TYPE_MESSAGE,
315 shortdata=mailtxt.nodedown_four_subject,
316 longdata=mailtxt.nodedown_four,
317 esc_step_from=21, esc_step_to=0,
318 esc_period=int(BI_WEEKLY_ESC_PERIOD*3.5),
319 object=defines.OPERATION_OBJECT_GROUP,
320 objectid=site_user_group.usrgrpid,
321 operationcondition_list=[ OperationConditionNotAck() ] ),
324 if __name__ == "__main__":