local cfg = probe.config("APC_UPS.cfg") local version = "1.20" local probename = "APC_UPS" local copyright = "Copyright of MSN Communications" local logfile = "APC_UPS.log" probe.register(probename,version,copyright) -- Variables ---------------------------------------------------- local rootoid = '.1.3.6.1.4.1.318' --Battery Oids Capacity = '1.1.1.2.2.1.0' --Percent of Battery Capacity Status = '1.1.1.2.1.1.0' --Battery Status Voltage = '1.1.1.2.2.8.0' --Battery Voltage NumPacks = '1.1.1.2.2.6.0' --Number of Battery Packs BadPacks = '1.1.1.2.2.6.0' --Number of Bad Battery Packs CelTemp = '1.1.1.2.2.2.0' --Battery Temp in Celcius TimeRem = '1.1.1.2.2.3.0' --Battery Time Remaining (in timeticks) --Other OutAmps = '1.1.1.4.2.4.0' --Output Amps OutLoad = '1.1.1.4.2.3.0' --Output Load Perc ------------------------------------------------------------------ -- publishQoS (target, value) - Create and publish QoS message function publishQoS (qos,ipadd,samplevalue,upsname) if not sent_qosdf then -- We only want to send the definition ONCE! --probe.log (1,"Sending QoS definition."); --nimbus.qos_definition (qos,"QOS_MACHINE","APC PDU Phase Load","Total","T",false) --sent_qosdf = true end nimbus.qos (qos,upsname,"Total",samplevalue,300) -- or use interval value instead of QOS_ASYNCH. end ---------------------------------------------------------------- --Get accurate time data from timeticks snmp variable function SnmpTimeticks(value) if value == nil then error("missing parameter") end local f = split(value,":.") if #f<5 then error ("illegal format, expecting days:hours:min:sec.centisec") end local t = tonumber(f[1]) * 86400 -- days t = t + tonumber(f[2]) * 3600 -- hours t = t + tonumber(f[3]) * 60 -- minutes t = t + tonumber(f[4]) -- seconds return t end ----------------------------------------------------------------- function batterystatus(status,upsname) if status == "3" then nimbus.alarm(NIML_MAJOR,"Battery Low on: "..upsname..ipadd.."","batterstat:"..upsname.."","3.13.1",upsname) return "Battery Low" elseif status == "1" then return "Unknown" else nimbus.alarm(NIML_CLEAR,"Battery Ok on: "..upsname..ipadd.."","batterystat:"..upsname.."","3.13.1",upsname) return "OK" end end ------------------------------------------------------------------ ----------------------------------------------------------------- function batterytime(status,upsname) if status < 10 then --nimbus.alarm(NIML_MAJOR,"Battery Low on: "..upsname.."-"..ipadd.."- Minutes Left: "..status.."","battertime:"..upsname.."","3.13.1",target) nimbus.alarm(NIML_MAJOR,"Battery Low on: "..upsname.."-"..ipadd.."- Minutes Left: "..status.."","battertime:"..upsname.."","3.13.1",upsname) return "Battery Low" else nimbus.alarm(NIML_CLEAR,"Battery Ok on: "..upsname..ipadd.."","batterytime:"..upsname.."","3.13.1",upsname) return "OK" end end ------------------------------------------------------------------ function badpack(bpacks,upsname) if bpacks > 0 then nimbus.alarm(NIML_MAJOR,"Bad Battery Pack Found on: "..upsname..ipadd.."","badpack:"..upsname.."","3.13.1",upsname) return "Bad Packs Found" else nimbus.alarm(NIML_CLEAR,"Battery Packs Ok on: "..upsname..ipadd.."","badpack:"..upsname.."","3.8.3",upsname) return "OK" end end ------------------------------------------------------------------ ------------------------------------------------------------------ function hload(load,upsname) if load > 80 then nimbus.alarm(NIML_MAJOR,"UPS Load High: "..upsname..ipadd.."","upsload:"..upsname.."","3.13.1",upsname) return "High Load" else nimbus.alarm(NIML_CLEAR,"UPS Load Ok on: "..upsname..ipadd.."","upsload:"..upsname.."","3.8.3",upsname) return "OK" end end ------------------------------------------------------------------ function load_configuration() if cfg ~= nil and cfg["/setup"] then comstr = cfg["/setup"].snmpcommunity qos = cfg["/setup"].qos version = cfg["/setup"].version prf=cfg["/profiles"] end if cfg["/setup"].loglevel ~= nil then loglevel = cfg["/setup"].loglevel end probe.setloglevel (loglevel) end ------------------------------------------------------------------ load_configuration() for host,tget in pairs(prf) do upsname = host ipadd = tget local h = snmp.create (version,ipadd,comstr) local out = snmp.walk(h,rootoid..".1.1.1",rootoid..".1.1.1") if out ~= nil then local btr = (rootoid.."."..TimeRem) local cap = (rootoid.."."..Capacity) local stat = (rootoid.."."..Status) local volts = (rootoid.."."..Voltage) local bnum = (rootoid.."."..NumPacks) local bpack = (rootoid.."."..BadPacks) local temp = (rootoid.."."..CelTemp) local oload = (rootoid.."."..OutLoad) local oamps = (rootoid.."."..OutAmps) local oidlist = {btr,cap,stat,volts,bnum,bpack,temp,oload,oamps} for n,oid in pairs(oidlist) do snmp.addvariable(h,oid) end snmp.query(h) btrem = snmp.getstring(h,btr) btsec = SnmpTimeticks(btrem) btmin = tonumber(btsec)/ 60 capacity = snmp.getnumber(h,cap) status = snmp.getstring(h,stat) bstat = batterystatus(status,upsname) bstime = batterytime(btmin,upsname) vlts = snmp.getnumber(h,volts) npack = snmp.getnumber(h,bnum) bpack = snmp.getnumber(h,bpack) nbpack = badpack(bpack,upsname) btemp = snmp.getnumber(h,temp) ftemp = (btemp * 1.8) + 32 load = snmp.getnumber(h,oload) hoload = hload(load,upsname) amps = snmp.getnumber(h,oamps) nimbus.log(2,"-------------------------------------------------------") nimbus.log(2,"Host Name: %s - Ip: %s - Bat Rem: %s Battery time in Minutes: %s", upsname,ipadd,btrem,btmin) nimbus.log(2,"Capacity: %s - Status: %s - Volts: %s - Number Packs: %s - Bad Packs: %s - Temp F: %s",capacity,bstat,vlts,npack,nbpack,ftemp) nimbus.log(2,"Output Load: %s - Output Amps: %s",load,amps) if qos == '1' then nimbus.log(1,"Publishing QOS Data") nimbus.qos ("QOS_APC_BATTERYTIME",upsname,"Time Remaining",btmin,300) -- or use interval value instead of QOS_ASYNCH. nimbus.qos ("QOS_APC_BATTERYCAPACITY",upsname,"Total Battery Capacity",capacity,300) nimbus.qos ("QOS_APC_BATTERYTEMP",upsname,"Farenheit",btemp,300) publishQoS ("QOS_APC_BATTERYVOLTAGE",upsname,vlts,upsname) publishQoS ("QOS_APC_OUTPUT_LOAD",upsname,load,upsname) publishQoS ("QOS_APC_LOAD_CURRENT",upsname,amps,upsname) end snmp.delete(h) else nimbus.log(0, "Unable to connect to %s - %s",ipadd,upsname) nimbus.alarm(NIML_MINOR,"APC UPS Status: Unable to connect to "..ipadd.." - "..upsname.." ",ipadd,"3.13.1",ipadd) end end probe.unregister()