move clean_policy.py into monitor package
[monitor.git] / monitor / database / zabbixapi / site.py
1 # -*- coding: utf-8 -*-\r
2 """This module contains functions called from console script entry points."""\r
3 \r
4 from os import getcwd\r
5 from os.path import dirname, exists, join\r
6 import sys\r
7 \r
8 from monitor.model import *\r
9 from emailZabbix import *\r
10 from monitor import config\r
11 \r
12 import defines\r
13 import md5\r
14 \r
15 HOSTGROUP_NAME="%s_hostgroup"\r
16 USERGROUP_NAME="%s_usergroup"\r
17         \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
21 \r
22 def delete_site(loginbase):\r
23 \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
31 \r
32         ug = UsrGrp.get_by(name=usergroupname)\r
33         if ug:\r
34                 for user in ug.user_list:\r
35                         # remove user from group, if a member of no other groups, \r
36                         # delete user.\r
37                         #user.delete()\r
38                         pass\r
39                 ug.delete()\r
40 \r
41         hg = HostGroup.get_by(name=hostgroupname)\r
42         if hg: \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
46                         host.delete()\r
47                 hg.delete()\r
48 \r
49         # delete dr\r
50         dr = DiscoveryRule.get_by(name=discovery_rule_name)\r
51         if dr: dr.delete()\r
52 \r
53         da = Action.get_by(name=discovery_action_name)\r
54         if da: da.delete()\r
55 \r
56         ea = Action.get_by(name=escalation_action_name)\r
57         if ea: ea.delete()\r
58 \r
59         return\r
60 \r
61 \r
62 def setup_global():\r
63         # GLOBAL:\r
64         #       update mediatype for email.\r
65         mediatype = MediaType.get_by(description="Email")\r
66         if not mediatype:\r
67                 print "ERROR:  There is no defined media type for 'Email'"\r
68                 raise Exception("No Email Media type in Zabbix db")\r
69 \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
74 \r
75         # GLOBAL: \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
79 \r
80         # pltemplate - via web, xml import\r
81         # TODO: os.system("curl --post default_templates.xml")\r
82 \r
83 \r
84 def setup_site(loginbase, techemail, piemail, iplist):\r
85 \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
91 \r
92         BI_WEEKLY_ESC_PERIOD = int(60*60*24)\r
93         BI_WEEKLY_ESC_PERIOD = int(60) # testing...\r
94 \r
95         # User Group\r
96         site_user_group = UsrGrp.find_or_create(name="%s_usergroup" % loginbase)\r
97         for user in set(techemail + piemail):\r
98                 # USER\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
103 \r
104                 if site_user_group not in u.usrgrp_list:\r
105                         u.append_group(site_user_group)\r
106 \r
107         # HOST 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
114 \r
115         # ADD hg to ug\r
116         if site_host_group not in site_user_group.hostgroup_list:\r
117                 site_user_group.append_hostgroup(site_host_group)\r
118 \r
119         # DISCOVERY RULE & CHECK\r
120         dr = DiscoveryRule.find_or_create(name=discovery_rule_name,\r
121                           iprange=iplist,\r
122                           delay=3600,\r
123                           proxy_hostid=0,\r
124                           exec_if_new=lambda obj: \\r
125                                 obj.discoverycheck_list.append( DiscoveryCheck(type=9, \r
126                                                                                 key_="system.uname", ports=10050) )\r
127                         )\r
128 \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
136                                         # Host IP Matches\r
137                                         ActionCondition(\r
138                                                 conditiontype=defines.CONDITION_TYPE_DHOST_IP,\r
139                                                 operator=defines.CONDITION_OPERATOR_EQUAL,\r
140                                                 value=iplist),\r
141                                         # AND, Service type is Zabbix agent\r
142                                         ActionCondition(\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
147                                         ActionCondition(\r
148                                                 conditiontype=defines.CONDITION_TYPE_DVALUE,\r
149                                                 operator=defines.CONDITION_OPERATOR_LIKE,\r
150                                                 value="Linux"),\r
151                                         # AND, Discovery status is Discover\r
152                                         ActionCondition(\r
153                                                 conditiontype=defines.CONDITION_TYPE_DSTATUS,\r
154                                                 operator=defines.CONDITION_OPERATOR_EQUAL,\r
155                                                 value=defines.DOBJECT_STATUS_DISCOVER),\r
156                                 ]\r
157                                 # THEN\r
158                 a.actionoperation_list=[\r
159                                         # Add Host\r
160                                         ActionOperation(\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
165                                         ActionOperation(\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
170                                         ActionOperation(\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
175                                         ActionOperation(\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
179                                 ]\r
180         else:\r
181                 # TODO: verify iplist is up-to-date\r
182                 pass\r
183 \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
190                         recovery_msg=1,\r
191                         set_if_new={\r
192                                 'r_shortdata':"Thank you for maintaining {HOSTNAME}!",\r
193                                 'r_longdata': mailtxt.thankyou_nodeup, }\r
194                         )\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
208                         ]\r
209                 ea.actionoperation_list=[\r
210                                 # STAGE 1\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
225                                 # STAGE 2\r
226                                 ActionOperation(operationtype=defines.OPERATION_TYPE_COMMAND, \r
227                                         esc_step_from=10, esc_step_to=10, \r
228                                         esc_period=0,\r
229                                         shortdata="",\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
236                                         esc_period=0, \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
244                                         esc_period=0, \r
245                                         object=defines.OPERATION_OBJECT_GROUP, \r
246                                         objectid=site_user_group.usrgrpid, \r
247                                         operationcondition_list=[ OperationConditionNotAck() ] ), \r
248 \r
249                                 # STAGE 3\r
250                                 ActionOperation(operationtype=defines.OPERATION_TYPE_COMMAND, \r
251                                         esc_step_from=17, esc_step_to=17, \r
252                                         esc_period=0, \r
253                                         shortdata="",\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
261                                         esc_period=0, \r
262                                         object=defines.OPERATION_OBJECT_GROUP, \r
263                                         objectid=site_user_group.usrgrpid, \r
264                                         operationcondition_list=[ OperationConditionNotAck() ] ), \r
265                                 # STAGE 4++\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
269                                         shortdata="",\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
280                         ]\r