contains default templates for plc host and plc server.
[monitor.git] / zabbix / zabbixsite.py
1 #!/usr/bin/python
2
3 from os import getcwd
4 from os.path import dirname, exists, join
5 import sys
6 import md5
7
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
13
14
15
16 HOSTGROUP_NAME="%s_hostgroup"
17 USERGROUP_NAME="%s_usergroup"
18         
19 DISCOVERY_RULE_NAME="discovery rule for %s"
20 DISCOVERY_ACTION_NAME="Auto-discover %s action"
21 ESCALATION_ACTION_NAME="Escalation Action for %s"
22
23 def delete_site(loginbase):
24
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
32
33         ug = UsrGrp.get_by(name=usergroupname)
34         if ug:
35                 for user in ug.user_list:
36                         # remove user from group, if a member of no other groups, 
37                         # delete user.
38                         #user.delete()
39                         pass
40                 ug.delete()
41
42         hg = HostGroup.get_by(name=hostgroupname)
43         if hg: 
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:
47                         host.delete()
48                 hg.delete()
49
50         # delete dr
51         dr = DiscoveryRule.get_by(name=discovery_rule_name)
52         if dr: dr.delete()
53
54         da = Action.get_by(name=discovery_action_name)
55         if da: da.delete()
56
57         ea = Action.get_by(name=escalation_action_name)
58         if ea: ea.delete()
59
60         return
61
62
63 def setup_global():
64         # GLOBAL:
65         #       update mediatype for email.
66         ############################### MAIL
67         print "checking for MediaType Email"
68         mediatype = MediaType.get_by(description="Email")
69         if not mediatype:
70                 print "ERROR:  There is no defined media type for 'Email'"
71                 raise Exception("No Email Media type in Zabbix db")
72
73         print "checking for correct configuration"
74         mediatype = MediaType.get_by(smtp_email=config.from_email)
75         if not mediatype:
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
82
83         ############################# EMAIL
84         mailtxt.reformat({'hostname' : config.MONITOR_HOSTNAME, 
85                                           'support_email' : config.support_email})
86
87         ############################### CENTRAL SERVER
88         print "checking zabbix server host info"
89         zabbixserver = Host.get_by(host="ZABBIX Server")
90         if zabbixserver:
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
95                 zabbixserver.useip=1
96
97         ############################ DEFAULT TEMPLATES
98         # pltemplate - via web, xml import
99         # TODO: os.system("curl --post default_templates.xml")
100
101         ##################### SCRIPTS 
102         ## TODO: add calls to check/reset the boot states.
103         print "checking scripts"
104         script1 = Script.find_or_create(name="RebootNode",
105                                                                         set_if_new = {
106                                                                                 'command':"/usr/share/monitor-server/reboot.py {HOST.CONN}",
107                                                                                 'host_access':3 # r/w)
108                                                                         })
109         script2 = Script.find_or_create(name="NMap",
110                                                         set_if_new = {
111                                                                 'command':"/usr/bin/nmap -A {HOST.CONN}",
112                                                                 'host_access':2 # r/o)
113                                                 })
114         return
115
116 def setup_site(loginbase, techemail, piemail, iplist):
117
118         # TODO: send a message when host is discovered.
119
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
124
125         BI_WEEKLY_ESC_PERIOD = int(60*60*24)
126         BI_WEEKLY_ESC_PERIOD = int(60) # testing...
127
128         # User Group
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
132                 # USER
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)))
139
140                 if site_user_group not in u.usrgrp_list:
141                         u.append_group(site_user_group)
142
143         # HOST 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
150
151         # ADD hg to ug
152         if site_host_group not in site_user_group.hostgroup_list:
153                 site_user_group.append_hostgroup(site_host_group)
154
155         # DISCOVERY RULE & CHECK
156         dr = DiscoveryRule.find_or_create(name=discovery_rule_name,
157                           delay=3600,
158                           proxy_hostid=0,
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) )
163                         )
164         if dr.iprange != iplist:
165                 if len(iplist) < 255:
166                         dr.iprange = iplist
167                 else:
168                         raise Exception("iplist length is too long!")
169                 
170
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=[
178                                         # Host IP Matches
179                                         ActionCondition(
180                                                 conditiontype=defines.CONDITION_TYPE_DHOST_IP,
181                                                 operator=defines.CONDITION_OPERATOR_EQUAL,
182                                                 value=iplist),
183                                         # AND, Service type is Zabbix agent
184                                         ActionCondition(
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'
189                                         ActionCondition(
190                                                 conditiontype=defines.CONDITION_TYPE_DVALUE,
191                                                 operator=defines.CONDITION_OPERATOR_LIKE,
192                                                 value="Linux"),
193                                         # AND, Discovery status is Discover
194                                         ActionCondition(
195                                                 conditiontype=defines.CONDITION_TYPE_DSTATUS,
196                                                 operator=defines.CONDITION_OPERATOR_EQUAL,
197                                                 value=defines.DOBJECT_STATUS_DISCOVER),
198                                 ]
199                                 # THEN
200                 a.actionoperation_list=[
201                                         # Add Host
202                                         ActionOperation(
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
207                                         ActionOperation(
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
212                                         ActionOperation(
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'
217                                         ActionOperation(
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),
221                                 ]
222         else:
223                 # TODO: verify iplist is up-to-date
224                 pass
225
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
232                         recovery_msg=1,
233                         set_if_new={
234                                 'r_shortdata':"Thank you for maintaining {HOSTNAME}!",
235                                 'r_longdata': mailtxt.thankyou_nodeup, }
236                         )
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),
250                         ]
251                 ea.actionoperation_list=[
252                                 # STAGE 1
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() ] ),
267                                 # STAGE 2
268                                 ActionOperation(operationtype=defines.OPERATION_TYPE_COMMAND, 
269                                         esc_step_from=10, esc_step_to=10, 
270                                         esc_period=0,
271                                         shortdata="",
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, 
278                                         esc_period=0, 
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, 
286                                         esc_period=0, 
287                                         object=defines.OPERATION_OBJECT_GROUP, 
288                                         objectid=site_user_group.usrgrpid, 
289                                         operationcondition_list=[ OperationConditionNotAck() ] ), 
290
291                                 # STAGE 3
292                                 ActionOperation(operationtype=defines.OPERATION_TYPE_COMMAND, 
293                                         esc_step_from=17, esc_step_to=17, 
294                                         esc_period=0, 
295                                         shortdata="",
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, 
303                                         esc_period=0, 
304                                         object=defines.OPERATION_OBJECT_GROUP, 
305                                         objectid=site_user_group.usrgrpid, 
306                                         operationcondition_list=[ OperationConditionNotAck() ] ), 
307                                 # STAGE 4++
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),
311                                         shortdata="",
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() ] ), 
322                         ]
323
324 if __name__ == "__main__":
325         setup_global()
326         session.flush()