diff options
Diffstat (limited to 'src/mode-watch.lua')
-rw-r--r-- | src/mode-watch.lua | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/src/mode-watch.lua b/src/mode-watch.lua new file mode 100644 index 0000000..cf716cb --- /dev/null +++ b/src/mode-watch.lua @@ -0,0 +1,119 @@ +-- +-- 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") + +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 + +current_mode = nil + +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) + if(current_mode == nil) then + utils.send_mail("logs@helsinki.at", "[RHCTL] (re)started mode is now " .. new_mode, + "RHCTL just (re)started current mode is " .. new_mode) + else + utils.send_mail("logs@helsinki.at", "[RHCTL] mode changed to " .. new_mode, + "RHCTL just switched from " .. current_mode .. " to " .. new_mode) + end + 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 ~= 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 |