aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPřemysl Janouch <p.janouch@gmail.com>2017-01-29 22:49:34 +0100
committerPřemysl Janouch <p.janouch@gmail.com>2017-01-29 22:49:34 +0100
commitc353117c0c93300cf8277e477f2bc2c3760fc02c (patch)
tree5e1f397035c0ad0cec7c5891fe7d673331751379
parent38a1214af1c2dbe2e57e96451a10f9c058fa3f20 (diff)
downloadponymap-c353117c0c93300cf8277e477f2bc2c3760fc02c.tar.gz
ponymap-c353117c0c93300cf8277e477f2bc2c3760fc02c.tar.xz
ponymap-c353117c0c93300cf8277e477f2bc2c3760fc02c.zip
Add a plugin for Network UPS Tools
-rw-r--r--plugins/nut.lua83
1 files changed, 83 insertions, 0 deletions
diff --git a/plugins/nut.lua b/plugins/nut.lua
new file mode 100644
index 0000000..44f139e
--- /dev/null
+++ b/plugins/nut.lua
@@ -0,0 +1,83 @@
+--
+-- nut.lua: Network UPS Tools service detection plugin
+--
+-- Copyright (c) 2017, Přemysl Janouch <p.janouch@gmail.com>
+--
+-- Permission to use, copy, modify, and/or distribute this software for any
+-- purpose with or without fee is hereby granted, provided that the above
+-- copyright notice and this permission notice appear in all copies.
+--
+-- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+-- WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+-- MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+-- SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+-- WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+-- OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+-- CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+--
+
+ponymap.check_api_version (1)
+
+local NUT = {}
+NUT.__index = NUT
+
+function NUT.new (unit)
+ unit:write ("LIST UPS\n")
+ return setmetatable ({ unit = unit, buf = "", in_list = false }, NUT)
+end
+
+-- Bare words and quoted strings with escape sequences, separated by spaces;
+-- unfortunately Lua patterns are too weak to use them for this trivial task
+function NUT.parse (line)
+ local result, state, field, c = {}, 0, ""
+ for c in (line .. " "):gmatch (".") do
+ if state == 0 then
+ if c == "\"" then state = 2
+ elseif c ~= " " then field = c state = 1 end
+ elseif state == 1 then
+ if c == " " then table.insert (result, field) field = "" state = 0
+ elseif c == "\"" then state = 2
+ else field = field .. c end
+ elseif state == 2 then
+ if c == "\\" then state = 3
+ elseif c == "\"" then state = 1
+ else field = field .. c end
+ elseif state == 3 then field = field .. c state = 2 end
+ end
+ return result
+end
+
+function NUT:process (line)
+ if not self.in_list then
+ if line:match ("^BEGIN LIST UPS$") then
+ self.unit:add_info ("no authentication required")
+ self.unit:set_success (true)
+ self.in_list = true
+ return true
+ elseif line:match ("^ERR ACCESS-DENIED") then
+ self.unit:set_success (true)
+ end
+ else
+ local fields = self.parse (line)
+ if #fields == 3 and fields[1] == "UPS" then
+ self.unit:add_info ("UPS: " .. fields[2] .. " - " .. fields[3])
+ return true
+ end
+ end
+end
+
+function NUT:on_data (data)
+ self.buf = self.buf .. data
+ repeat
+ local line, rest = self.buf:match ("([^\n]*)\n(.*)")
+ if not line then return end
+ self.buf = rest
+ until not self:process (line)
+ self.unit:stop ()
+end
+
+ponymap.register_service {
+ name = "NUT",
+ flags = 0,
+ new_scan = NUT.new
+}