diff options
author | Christian Pointner <equinox@helsinki.at> | 2014-03-25 22:04:32 (GMT) |
---|---|---|
committer | Christian Pointner <equinox@helsinki.at> | 2014-03-25 22:04:32 (GMT) |
commit | b98afc20e6788df9a6f8ebd2c143cebfd4baf5bc (patch) | |
tree | b3202de2cf9ed68820ff59bd8a05cdc79e034734 /health-watch.lua | |
parent | c4989d4bd8821e3ff853a41b3ff235adcc4fe925 (diff) |
added health watch client
Diffstat (limited to 'health-watch.lua')
-rw-r--r-- | health-watch.lua | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/health-watch.lua b/health-watch.lua new file mode 100644 index 0000000..082c19d --- /dev/null +++ b/health-watch.lua @@ -0,0 +1,107 @@ +-- +-- rhctl +-- +-- Copyright (C) 2009-2014 Christian Pointner <equinox@helsinki.at> +-- +-- This file is part of rhctl. +-- +-- rhctl is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- any later version. +-- +-- rhctl is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with rhctl. If not, see <http://www.gnu.org/licenses/>. +-- + +package.path = package.path .. ';/usr/share/rhctl/?.lua' + +socket = require("socket") +utils = require("utils") + +old_state = {} +current_state = {} + +function state_changed() + for k,v in pairs(old_state) do + if v ~= current_state[k] then + return true + end + end + for k,v in pairs(current_state) do + if old_state[k] == nil then + return true + end + end + return false +end + +function process_cmd(message) + local exps = { hs = "^Health: (%a+)$", mc = "^Master: (%a+)$", sc = "^Standby: (%a+)$", hbm = "^Hearbeat Master: (%a+, %a+)$", hbs = "^Hearbeat Standby: (%a+, %a+)$" } + for key, exp in pairs(exps) do + local state = string.match(message, exp) + if(state) then + if(key == 'hs') then + current_state = {} + end + current_state[key] = state + end + end + + if(current_state['hbs'] ~= nil) then + if(state_changed()) then + body = "RHCTL Health Output:\n\n" + body = body .. "Health: " .. current_state['hs'] .. "\n" + body = body .. "Master: " .. current_state['mc'] .. "\n" + body = body .. "Standby: " .. current_state['sc'] .. "\n" + body = body .. "Master Hearbeat: " .. current_state['hbm'] .. "\n" + body = body .. "Standby Hearbeat: " .. current_state['hbs'] .. "\n" + utils.send_mail("logs@helsinki.at", "[RHCTL] health: " .. current_state['hs'], body) + old_state = current_state + end + end + + return 0 +end + +function main_loop(opt) + log.printf(log.NOTICE, "main_loop started") + local sig = signal.init() + local cmdfd = cmd.init() + + cmd.send_string("listen health"); + cmd.send_string("health"); + + local return_value = 0 + while return_value == 0 do + local readable, _, err = socket.select({ sig , cmdfd }, nil) + if(err) then + log.printf(log.ERROR, "select returned with error: %s", err) + return_value = -1 + else + for _, input in ipairs(readable) do + if(input == sig) then + return_value = signal.handle() + if(return_value == 1) then break end + else + if(input == cmdfd) then + return_value = cmd.recv_data(process_cmd) + if(return_value ~= 0) then break end + else + log.printf(log.ERROR, "select returned invalid handle??") + return_value = -1 + break; + end + end + end + end + end + + signal.stop() + return return_value +end |