-- -- rhctl -- -- Copyright (C) 2009-2014 Christian Pointner -- -- 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 . -- 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