commit 0b92cea4cb27f248834d77a72266ba5bf69c1d95 Author: Marek 'marx' Grac Date: Mon Oct 21 13:50:06 2013 +0200 fence_wti: Add support for named groups On some WTI devices it is possible to name a group of devices by single names (e.g. 1,2 -> server). These groups can be used to operate all these plugs by single command. Patch by: Thibat Pouzet diff --git a/fence/agents/wti/fence_wti.py b/fence/agents/wti/fence_wti.py index b315061..34967e1 100644 --- a/fence/agents/wti/fence_wti.py +++ b/fence/agents/wti/fence_wti.py @@ -21,10 +21,10 @@ REDHAT_COPYRIGHT="" BUILD_DATE="March, 2008" #END_VERSION_GENERATION -def get_power_status(conn, options): +def get_listing(conn, options, listing_command): listing = "" - conn.send("/S"+"\r\n") + conn.send(listing_command + "\r\n") if isinstance(options["--command-prompt"], list): re_all = list(options["--command-prompt"]) @@ -39,7 +39,12 @@ def get_power_status(conn, options): conn.send("\r\n") conn.log_expect(options, options["--command-prompt"], int(options["--shell-timeout"])) listing += conn.before - + + return listing + +def get_plug_status(conn, options): + listing = get_listing(conn, options, "/S") + plug_section = 0 plug_index = -1 name_index = -1 @@ -72,6 +77,82 @@ def get_power_status(conn, options): else: return "PROBLEM" +def get_plug_group_status_from_list(status_list): + for status in status_list: + if status == "on": + return status + return "off" + +def get_plug_group_status(conn, options): + listing = get_listing(conn, options, "/SG") + + plug_section = 0 + outlets = {} + current_outlet = "" + line_index = 0 + lines = listing.splitlines() + while line_index < len(lines) and line_index >= 0: + line = lines[line_index] + if (line.find("|") >= 0 and line.lstrip().startswith("GROUP NAME") == False): + plug_line = [x.strip().lower() for x in line.split("|")] + if ["list", "monitor"].count(options["--action"]) == 0 and options["--plug"].lower() == plug_line[name_index]: + line_index += 1 + plug_status = [] + while line_index < len(lines) and line_index >= 0: + plug_line = [x.strip().lower() for x in lines[line_index].split("|")] + if len(plug_line[plug_index]) > 0 and len(plug_line[name_index]) == 0: + plug_status.append(plug_line[status_index]) + line_index += 1 + else: + line_index = -1 + + return get_plug_group_status_from_list(plug_status) + + else: + ## We already believe that first column contains plug number + if len(plug_line[0]) != 0: + group_name = plug_line[0] + plug_line_index = line_index + 1 + plug_status = [] + while plug_line_index < len(lines) and plug_line_index >= 0: + plug_line = [x.strip().lower() for x in lines[plug_line_index].split("|")] + if len(plug_line[name_index]) > 0: + plug_line_index = -1 + break + if len(plug_line[plug_index]) > 0: + plug_status.append(plug_line[status_index]) + plug_line_index += 1 + else: + plug_line_index = -1 + outlets[group_name] = (group_name, get_plug_group_status_from_list(plug_status)) + line_index += 1 + + elif (line.upper().lstrip().startswith("GROUP NAME")): + plug_header = [x.strip().lower() for x in line.split("|")] + name_index = plug_header.index("group name") + plug_index = plug_header.index("plug") + status_index = plug_header.index("status") + line_index += 2 + else: + line_index += 1 + + + if ["list", "monitor"].count(options["--action"]) == 1: + for group, status in outlet_groups: + outlets[group] = (group, status[0]) + + return outlets + else: + return "PROBLEM" + +def get_power_status(conn, options): + ret = get_plug_status(conn, options) + + if ret == "PROBLEM": + ret = get_plug_group_status(conn, options) + + return ret + def set_power_status(conn, options): action = { 'on' : "/on",