-- -- rhctl -- -- Copyright (C) 2009 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 . -- socket = require("socket") function set_master_led() os.execute("/sbin/led.sh set master") os.execute("/sbin/led.sh clear standby") end function set_standby_led() os.execute("/sbin/led.sh clear master") os.execute("/sbin/led.sh set standby") end function clear_leds() os.execute("/sbin/led.sh clear master") os.execute("/sbin/led.sh clear standby") end function send_mail(address, subject, bodytext) local fp = assert(io.popen("/usr/sbin/mini_sendmail -smailrelay -fnoreply@helsinki.at " .. address, "w")) fp:write("Subject: " .. subject .. "\n") fp:write("To: " .. address .. "\n") fp:write("\n") fp:write(bodytext) fp:write("\n") fp:close() end current_mode = "master" function process_cmd(message) log.printf(log.DEBUG, "received message: '%s'", message) local new_mode = nil local exps = { "Current Mode: (%a+)", "new Mode: (%a+)" } for _, exp in ipairs(exps) do new_mode = string.match(message, exp) if(new_mode) then new_mode = string.lower(new_mode) if(new_mode == "master") then set_master_led() break else if(new_mode == "standby") then set_standby_led() break end end end end if(new_mode and new_mode ~= current_mode) then log.printf(log.NOTICE, "mode is now " .. new_mode) send_mail("logs@helsinki.at", "RHCTL mode changed to " .. new_mode, "RHCTL just switched from " .. current_mode .. " to " .. new_mode) current_mode = new_mode 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 mode"); cmd.send_string("status"); clear_leds() 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 == 2) then log.printf(log.ERROR, "connection to server lost, exitting") return_value = -1 end 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 clear_leds() signal.stop() return return_value end