X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=zabbix%2Fzabbixsite.py;h=e3ddc21d7c51922a8b18a2f17cc60b43655e719b;hb=8e90984231a680415cc3f6a60f008b3029ad4548;hp=9c0267f47c94f49315160a60ff694452217525fd;hpb=ac841d414d7b09f8a0b7883bcdba0eeb6aede69f;p=monitor.git diff --git a/zabbix/zabbixsite.py b/zabbix/zabbixsite.py index 9c0267f..e3ddc21 100755 --- a/zabbix/zabbixsite.py +++ b/zabbix/zabbixsite.py @@ -4,11 +4,14 @@ from os import getcwd from os.path import dirname, exists, join import sys import md5 +import glob from monitor import config -from monitor.database.dborm import * +from monitor.database.dborm import zab_session as session +from monitor.database.zabbixapi.model import * from monitor.database.zabbixapi.emailZabbix import * from monitor.database.zabbixapi import defines +from monitor.util.file import * @@ -72,6 +75,7 @@ def setup_global(): print "checking for correct configuration" mediatype = MediaType.get_by(smtp_email=config.from_email) if not mediatype: + mediatype = MediaType.get_by(description="Email") # NOTE: assumes smtp server is local to this machine. print "updating email server configuration" mediatype.smtp_server='localhost' @@ -86,22 +90,29 @@ def setup_global(): print "checking zabbix server host info" zabbixserver = Host.get_by(host="ZABBIX Server") if zabbixserver: - print "UPDATING Primary Zabbix server entry" - zabbixserver.host="MyPLC Server" - zabbixserver.ip=config.MONITOR_IP - zabbixserver.dns=config.MONITOR_HOSTNAME - zabbixserver.useip=1 + # TODO: verify that this works. it has failed once on fresh + # install... not sure why. + print "Removing default Zabbix server entry" + zabbixserver.delete() + + # NOTE: creating a host and assigning a template cannot work + # due to the crazy item, trigger, action + # copying that the php code does during a host add. + # NOTE: Instead, reformat any *xml.in templates and import those + # during /etc/plc.d/monitor sync + for file in glob.glob("%s/zabbix/templates/*.xml.in" config.MONITOR_SCRIPT_ROOT): + if 'zabbix_server' in file: + buf = loadFile(file) + args = {'hostname' : config.MONITOR_HOSTNAME, 'ip' : config.MONITOR_IP} + dumpFile(file[:-3], buf % args) - ############################ DEFAULT TEMPLATES - # pltemplate - via web, xml import - # TODO: os.system("curl --post default_templates.xml") ##################### SCRIPTS ## TODO: add calls to check/reset the boot states. print "checking scripts" script1 = Script.find_or_create(name="RebootNode", set_if_new = { - 'command':"/usr/share/monitor-server/reboot.py {HOST.CONN}", + 'command':"%s/reboot.py {HOST.CONN}" % config.MONITOR_SCRIPT_ROOT, 'host_access':3 # r/w) }) script2 = Script.find_or_create(name="NMap", @@ -111,23 +122,52 @@ def setup_global(): }) return +def merge_iplist(iplist): + # TODO: rewrite addresses as x.x.x.y-z rather than x.x.x.y,x.x.x.z if y-z==1 + ips = iplist.split(',') + ips.sort() + prev=None + newlist="" + for ip in ips: + fields = ip.split('.') + first = ".".join(fields[:2]) + last = int(fields[3]) + if prev: + if last - prev == 1: + pass + prev=last + newlist += "%s," + return newlist[:-1] + def setup_site(loginbase, techemail, piemail, iplist): - # TODO: Initially adding this info is ok. what about updates to users, - # additional hosts, removed users from plc, # TODO: send a message when host is discovered. + # TODO: update 'discovered' hosts with dns name. # TODO: remove old nodes that are no longer in the plcdb. + # TODO: remove old users that are no longer in the plcdb. + # TODO: consider creating two user groups for Tech & PI emails + + # NOTE: setup default valus for EMAIL + mailtxt.reformat({'hostname' : config.MONITOR_HOSTNAME, + 'support_email' : config.support_email}) + + # NOTE: verify arguments + if len(iplist) > 255: + raise Exception("iplist length is too long!") BI_WEEKLY_ESC_PERIOD = int(60*60*24) - BI_WEEKLY_ESC_PERIOD = int(60) # testing... + #BI_WEEKLY_ESC_PERIOD = int(60) # testing... # User Group - site_user_group = UsrGrp.find_or_create(name="%s_usergroup" % loginbase) - for user in set(techemail + piemail): + site_user_group = UsrGrp.find_or_create(name=USERGROUP_NAME % loginbase) + for user in set(techemail + piemail + [config.cc_email]): + if not user: continue # USER u = User.find_or_create(alias=user, type=1, set_if_new={'passwd' : md5.md5(user).hexdigest()}, + # exec_if_new avoids creating a Media object that + # will not actually be used, if the user already exists exec_if_new=lambda obj: \ obj.media_list.append( Media(mediatypeid=1, sendto=user))) @@ -136,8 +176,8 @@ def setup_site(loginbase, techemail, piemail, iplist): # HOST GROUP plc_host_group = HostGroup.find_or_create(name="MyPLC Hosts") - site_host_group = HostGroup.find_or_create(name="%s_hostgroup" % loginbase) - plctemplate = Host.get_by(host="Template_Linux_PLHost") + site_host_group = HostGroup.find_or_create(name=HOSTGROUP_NAME % loginbase) + plctemplate = Host.get_by(host="Template_Linux_PLC_Host") escalation_action_name = ESCALATION_ACTION_NAME % loginbase discovery_action_name = DISCOVERY_ACTION_NAME % loginbase discovery_rule_name = DISCOVERY_RULE_NAME % loginbase @@ -156,10 +196,7 @@ def setup_site(loginbase, techemail, piemail, iplist): key_="system.uname", ports=10050) ) ) if dr.iprange != iplist: - if len(iplist) < 255: - dr.iprange = iplist - else: - raise Exception("iplist length is too long!") + dr.iprange = iplist # DISCOVERY ACTION for these servers @@ -215,7 +252,11 @@ def setup_site(loginbase, techemail, piemail, iplist): ] else: # TODO: verify iplist is up-to-date - pass + # NOTE: len(a.actioncondition_list) > 0 + ip_condition = a.actioncondition_list[0] + assert ip_condition.conditiontype == defines.CONDITION_TYPE_DHOST_IP + if ip_condition.value != iplist: + ip_condition.value = iplist # ESCALATION ACTION for these servers ea = Action.find_or_create(name=escalation_action_name, @@ -263,7 +304,7 @@ def setup_site(loginbase, techemail, piemail, iplist): esc_step_from=10, esc_step_to=10, esc_period=0, shortdata="", - longdata="zabbixserver:/usr/share/monitor-server/checkslices.py {HOSTNAME} disablesite", + longdata="%s:%s/checkslices.py {HOSTNAME} disablesite" % ( config.MONITOR_HOSTNAME, config.MONITOR_SCRIPT_ROOT ), operationcondition_list=[ OperationConditionNotAck() ]), ActionOperation(operationtype=defines.OPERATION_TYPE_MESSAGE, shortdata=mailtxt.nodedown_two_subject, @@ -287,7 +328,7 @@ def setup_site(loginbase, techemail, piemail, iplist): esc_step_from=17, esc_step_to=17, esc_period=0, shortdata="", - longdata="zabbixserver:/usr/share/monitor-server/checkslices.py {HOSTNAME} disableslices", + longdata="%s:%s/checkslices.py {HOSTNAME} disableslices" % ( config.MONITOR_HOSTNAME, config.MONITOR_SCRIPT_ROOT ), # TODO: send notice to users of slices operationcondition_list=[ OperationConditionNotAck() ]), ActionOperation(operationtype=defines.OPERATION_TYPE_MESSAGE, @@ -303,7 +344,7 @@ def setup_site(loginbase, techemail, piemail, iplist): esc_step_from=21, esc_step_to=0, esc_period=int(BI_WEEKLY_ESC_PERIOD*3.5), shortdata="", - longdata="zabbixserver:/usr/share/monitor-server/checkslices.py {HOSTNAME} forever", + longdata="%s:%s/checkslices.py {HOSTNAME} forever" % ( config.MONITOR_HOSTNAME, config.MONITOR_SCRIPT_ROOT), operationcondition_list=[ OperationConditionNotAck() ]), ActionOperation(operationtype=defines.OPERATION_TYPE_MESSAGE, shortdata=mailtxt.nodedown_four_subject,