commit fence-agents for openSUSE:Factory
Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package fence-agents for openSUSE:Factory checked in at 2024-07-04 16:25:12 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/fence-agents (Old) and /work/SRC/openSUSE:Factory/.fence-agents.new.2080 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Package is "fence-agents" Thu Jul 4 16:25:12 2024 rev:74 rq:1185211 version:4.15.0+git.1719822011.7a2c0a7f Changes: -------- --- /work/SRC/openSUSE:Factory/fence-agents/fence-agents.changes 2024-02-29 21:52:19.798315735 +0100 +++ /work/SRC/openSUSE:Factory/.fence-agents.new.2080/fence-agents.changes 2024-07-04 16:26:38.146875943 +0200 @@ -1,0 +2,24 @@ +Wed Jul 03 18:27:35 UTC 2024 - varkoly@suse.com + +- Update to version 4.15.0+git.1719822011.7a2c0a7f: + * all agents: dont use Deprecated logging.warn() + * symlinked agents: set agent_name to use when generating manpages + * fence2man.xsl: improve text for symlinked agents + * fence_sbd: --sbd-path defaults to /usr/sbin/sbd + * configure: check additional paths for programs + * fence_aws: log error if unknown state returned + * fence_aws: improve list, list-status and status actions + * fencing: use formatted strings to avoid failing when plug is int + * fence_azure: fix pinning client api versions for compatibility across different azure sdk versions + * fence_docker: Connect to Docker via a UNIX socket + * fence_hpblade/fence_mpath/fence_scsi: use r"" for all regular expressions to avoid SyntaxWarning errors + * fence_aws: fixes to not fail CI, and dont use boto3 buildreq on CI nodes where it's not installed + * fence_eps: add fence_epsr2 for ePowerSwitch R2 and newer + * fencing: add support for docs["agent_name"] to use the main agent name when generating manpages + * spec: only require python3-azure-sdk for RHEL < 9 + * spec: remove old python3-azure-sdk dependency + * fence_aliyun: update order for new parameters + * fence_aliyun: add credentials file support + * lib/all agents: use r"" for all regular expressions to avoid SyntaxWarning errors + +------------------------------------------------------------------- Old: ---- fence-agents-4.13.1+git.1707822268.4229d52f.tar.xz New: ---- fence-agents-4.15.0+git.1719822011.7a2c0a7f.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ fence-agents.spec ++++++ --- /var/tmp/diff_new_pack.8mezEh/_old 2024-07-04 16:26:38.854901789 +0200 +++ /var/tmp/diff_new_pack.8mezEh/_new 2024-07-04 16:26:38.854901789 +0200 @@ -25,7 +25,7 @@ Summary: Fence Agents for High Availability License: GPL-2.0-only AND LGPL-2.1-only Group: Productivity/Clustering/HA -Version: 4.13.1+git.1707822268.4229d52f +Version: 4.15.0+git.1719822011.7a2c0a7f Release: 0 URL: https://github.com/ClusterLabs/fence-agents Source0: %{name}-%{version}.tar.xz ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.8mezEh/_old 2024-07-04 16:26:38.894903249 +0200 +++ /var/tmp/diff_new_pack.8mezEh/_new 2024-07-04 16:26:38.898903395 +0200 @@ -3,6 +3,6 @@ <param name="url">git://github.com/ClusterLabs/fence-agents.git</param> <param name="changesrevision">8d746be92f191aa289f13a3703031c122a5e6cf3</param></service><service name="tar_scm"> <param name="url">https://github.com/ClusterLabs/fence-agents</param> - <param name="changesrevision">fc7d7c4baef64f510bd3332c9f008d3e1128dc7b</param></service></servicedata> + <param name="changesrevision">74e56b9ea5465ee0b703eb145a286b6a2458ba1d</param></service></servicedata> (No newline at EOF) ++++++ fence-agents-4.13.1+git.1707822268.4229d52f.tar.xz -> fence-agents-4.15.0+git.1719822011.7a2c0a7f.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/Makefile.am new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/Makefile.am --- old/fence-agents-4.13.1+git.1707822268.4229d52f/Makefile.am 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/Makefile.am 2024-07-01 10:20:11.000000000 +0200 @@ -25,6 +25,12 @@ SUBDIRS = lib agents doc systemd +if HAVE_BOTO3 +HAVE_BOTO3 = 1 +else +HAVE_BOTO3 = 0 +endif + .PHONY: $(SUBDIRS) agents: lib @@ -77,6 +83,7 @@ alphatag="" && \ numcomm="" && \ ver="$(VERSION)" && \ + boto3_br="$(HAVE_BOTO3)" && \ if echo $$ver | grep -q -- "-dirty$$"; then \ dirty="dirty" && \ echo VERSION IS DIRTY && \ @@ -113,6 +120,7 @@ -e "s#@rgmanager@#$(RGMANAGER)#g" \ -e "s#@linux-ha@#$(LINUX_HA)#g" \ -e "s#@compat-habindir@#$(COMPAT_HABINDIR)#g" \ + -e "s#@boto3_br@#$$boto3_br#g" \ $< > $@-t; \ if [ -z "$$dirty" ]; then sed -i -e "s#%glo.*dirty.*##g" $@-t; fi; \ if [ -z "$$alphatag" ]; then sed -i -e "s#%glo.*alphatag.*##g" $@-t; fi; \ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/aliyun/fence_aliyun.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/aliyun/fence_aliyun.py --- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/aliyun/fence_aliyun.py 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/aliyun/fence_aliyun.py 2024-07-01 10:20:11.000000000 +0200 @@ -15,7 +15,7 @@ from aliyunsdkcore.auth.credentials import EcsRamRoleCredential from aliyunsdkcore.profile import region_provider except ImportError as e: - logging.warn("The 'aliyunsdkcore' module has been not installed or is unavailable, try to execute the command 'pip install aliyun-python-sdk-core --upgrade' to solve. error: %s" % e) + logging.warning("The 'aliyunsdkcore' module has been not installed or is unavailable, try to execute the command 'pip install aliyun-python-sdk-core --upgrade' to solve. error: %s" % e) try: @@ -24,7 +24,7 @@ from aliyunsdkecs.request.v20140526.StopInstanceRequest import StopInstanceRequest from aliyunsdkecs.request.v20140526.RebootInstanceRequest import RebootInstanceRequest except ImportError as e: - logging.warn("The 'aliyunsdkecs' module has been not installed or is unavailable, try to execute the command 'pip install aliyun-python-sdk-ecs --upgrade' to solve. error: %s" % e) + logging.warning("The 'aliyunsdkecs' module has been not installed or is unavailable, try to execute the command 'pip install aliyun-python-sdk-ecs --upgrade' to solve. error: %s" % e) def _send_request(conn, request): @@ -150,20 +150,37 @@ "required": "0", "order": 5 } + all_opt["credentials_file"] = { + "getopt": ":", + "longopt": "credentials-file", + "help": "--credentials-file=[path] Path to aliyun-cli credentials file", + "shortdesc": "Path to credentials file", + "required": "0", + "order": 6 + } + all_opt["credentials_file_profile"] = { + "getopt": ":", + "longopt": "credentials-file-profile", + "help": "--credentials-file-profile=[profile] Credentials file profile", + "shortdesc": "Credentials file profile", + "required": "0", + "default": "default", + "order": 7 + } all_opt["filter"] = { "getopt": ":", "longopt": "filter", "help": "--filter=[key=value] Filter (e.g. InstanceIds=[\"i-XXYYZZAA1\",\"i-XXYYZZAA2\"]", "shortdesc": "Filter for list-action.", "required": "0", - "order": 6 + "order": 8 } # Main agent method def main(): conn = None - device_opt = ["port", "no_password", "region", "access_key", "secret_key", "ram_role", "filter"] + device_opt = ["port", "no_password", "region", "access_key", "secret_key", "ram_role", "credentials_file", "credentials_file_profile", "filter"] atexit.register(atexit_handler) @@ -191,6 +208,16 @@ ram_role = options["--ram-role"] role = EcsRamRoleCredential(ram_role) conn = client.AcsClient(region_id=region, credential=role) + elif "--credentials-file" in options and "--credentials-file-profile" in options: + import os, configparser + try: + config = configparser.ConfigParser() + config.read(os.path.expanduser(options["--credentials-file"])) + access_key = config.get(options["--credentials-file-profile"], "aliyun_access_key_id") + secret_key = config.get(options["--credentials-file-profile"], "aliyun_access_key_secret") + conn = client.AcsClient(access_key, secret_key, region) + except Exception as e: + fail_usage("Failed: failed to read credentials file: %s" % e) else: fail_usage("Failed: User credentials are not set. Please set the Access Key and the Secret Key, or configure the RAM role.") @@ -198,7 +225,7 @@ try: region_provider.modify_point('Ecs', region, 'ecs.%s.aliyuncs.com' % region) except Exception as e: - logging.warn("Failed: failed to modify endpoint to 'ecs.%s.aliyuncs.com': %s" % (region, e)) + logging.warning("Failed: failed to modify endpoint to 'ecs.%s.aliyuncs.com': %s" % (region, e)) # Operate the fencing device result = fence_action(conn, options, set_power_status, get_power_status, get_nodes_list) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/alom/fence_alom.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/alom/fence_alom.py --- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/alom/fence_alom.py 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/alom/fence_alom.py 2024-07-01 10:20:11.000000000 +0200 @@ -13,7 +13,7 @@ def get_power_status(conn, options): conn.send_eol("showplatform") conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) - status = re.search("standby", conn.before.lower()) + status = re.search(r"standby", conn.before.lower()) result = (status != None and "off" or "on") return result diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/amt/fence_amt.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/amt/fence_amt.py --- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/amt/fence_amt.py 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/amt/fence_amt.py 2024-07-01 10:20:11.000000000 +0200 @@ -13,7 +13,7 @@ def get_power_status(_, options): output = amt_run_command(options, create_command(options, "status")) - match = re.search('Powerstate:[\\s]*(..)', str(output)) + match = re.search(r'Powerstate:[\s]*(..)', str(output)) status = match.group(1) if match else None if status == None: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/apc/fence_apc.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/apc/fence_apc.py --- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/apc/fence_apc.py 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/apc/fence_apc.py 2024-07-01 10:20:11.000000000 +0200 @@ -36,21 +36,21 @@ admin = 0 switch = 0 - if None != re.compile('.* MasterSwitch plus.*', re.IGNORECASE | re.S).match(conn.before): + if None != re.compile(r'.* MasterSwitch plus.*', re.IGNORECASE | re.S).match(conn.before): switch = 1 - if None != re.compile('.* MasterSwitch plus 2', re.IGNORECASE | re.S).match(conn.before): + if None != re.compile(r'.* MasterSwitch plus 2', re.IGNORECASE | re.S).match(conn.before): if "--switch" not in options: fail_usage("Failed: You have to enter physical switch number") else: if "--switch" not in options: options["--switch"] = "1" - if None == re.compile('.*Outlet Management.*', re.IGNORECASE | re.S).match(conn.before): + if None == re.compile(r'.*Outlet Management.*', re.IGNORECASE | re.S).match(conn.before): version = 2 else: version = 3 - if None == re.compile('.*Outlet Control/Configuration.*', re.IGNORECASE | re.S).match(conn.before): + if None == re.compile(r'.*Outlet Control/Configuration.*', re.IGNORECASE | re.S).match(conn.before): admin = 0 else: admin = 1 @@ -109,26 +109,26 @@ admin3 = 0 switch = 0 - if None != re.compile('.* MasterSwitch plus.*', re.IGNORECASE | re.S).match(conn.before): + if None != re.compile(r'.* MasterSwitch plus.*', re.IGNORECASE | re.S).match(conn.before): switch = 1 ## MasterSwitch has different schema for on/off actions action = { 'on' : "1", 'off': "3" }[options["--action"]] - if None != re.compile('.* MasterSwitch plus 2', re.IGNORECASE | re.S).match(conn.before): + if None != re.compile(r'.* MasterSwitch plus 2', re.IGNORECASE | re.S).match(conn.before): if "--switch" not in options: fail_usage("Failed: You have to enter physical switch number") else: if "--switch" not in options: options["--switch"] = 1 - if None == re.compile('.*Outlet Management.*', re.IGNORECASE | re.S).match(conn.before): + if None == re.compile(r'.*Outlet Management.*', re.IGNORECASE | re.S).match(conn.before): version = 2 else: version = 3 - if None == re.compile('.*Outlet Control/Configuration.*', re.IGNORECASE | re.S).match(conn.before): + if None == re.compile(r'.*Outlet Control/Configuration.*', re.IGNORECASE | re.S).match(conn.before): admin2 = 0 else: admin2 = 1 @@ -142,7 +142,7 @@ else: conn.send_eol("2") conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) - if None == re.compile('.*2- Outlet Restriction.*', re.IGNORECASE | re.S).match(conn.before): + if None == re.compile(r'.*2- Outlet Restriction.*', re.IGNORECASE | re.S).match(conn.before): admin3 = 0 else: admin3 = 1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/apc_snmp/fence_apc_snmp.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/apc_snmp/fence_apc_snmp.py --- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/apc_snmp/fence_apc_snmp.py 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/apc_snmp/fence_apc_snmp.py 2024-07-01 10:20:11.000000000 +0200 @@ -215,6 +215,7 @@ options["--switch"] = "1" docs = {} + docs["agent_name"] = "fence_apc_snmp" docs["shortdesc"] = "Fence agent for APC, Tripplite PDU over SNMP" docs["longdesc"] = "{} is a Power Fencing agent \ which can be used with the APC network power switch or Tripplite PDU devices.\ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/aws/fence_aws.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/aws/fence_aws.py --- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/aws/fence_aws.py 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/aws/fence_aws.py 2024-07-01 10:20:11.000000000 +0200 @@ -22,6 +22,15 @@ logger.addHandler(SyslogLibHandler()) logging.getLogger('botocore.vendored').propagate = False +status = { + "running": "on", + "stopped": "off", + "pending": "unknown", + "stopping": "unknown", + "shutting-down": "unknown", + "terminated": "unknown" +} + def get_instance_id(options): try: token = requests.put('http://169.254.169.254/latest/api/token', headers={"X-aws-ec2-metadata-token-ttl-seconds" : "21600"}).content.decode("UTF-8") @@ -45,11 +54,19 @@ filter_key = options["--filter"].split("=")[0].strip() filter_value = options["--filter"].split("=")[1].strip() filter = [{ "Name": filter_key, "Values": [filter_value] }] - for instance in conn.instances.filter(Filters=filter): - result[instance.id] = ("", None) - else: - for instance in conn.instances.all(): - result[instance.id] = ("", None) + logging.debug("Filter: {}".format(filter)) + + for instance in conn.instances.filter(Filters=filter if 'filter' in vars() else []): + instance_name = "" + for tag in instance.tags or []: + if tag.get("Key") == "Name": + instance_name = tag["Value"] + try: + result[instance.id] = (instance_name, status[instance.state["Name"]]) + except KeyError as e: + if options.get("--original-action") == "list-status": + logger.error("Unknown status \"{}\" returned for {} ({})".format(instance.state["Name"], instance.id, instance_name)) + result[instance.id] = (instance_name, "unknown") except ClientError: fail_usage("Failed: Incorrect Access Key or Secret Key.") except EndpointConnectionError: @@ -67,13 +84,11 @@ instance = conn.instances.filter(Filters=[{"Name": "instance-id", "Values": [options["--plug"]]}]) state = list(instance)[0].state["Name"] logger.debug("Status operation for EC2 instance %s returned state: %s",options["--plug"],state.upper()) - if state == "running": - return "on" - elif state == "stopped": - return "off" - else: + try: + return status[state] + except KeyError as e: + logger.error("Unknown status \"{}\" returned".format(state)) return "unknown" - except ClientError: fail_usage("Failed: Incorrect Access Key or Secret Key.") except EndpointConnectionError: @@ -146,7 +161,7 @@ all_opt["filter"] = { "getopt" : ":", "longopt" : "filter", - "help" : "--filter=[key=value] Filter (e.g. vpc-id=[vpc-XXYYZZAA]", + "help" : "--filter=[key=value] Filter (e.g. vpc-id=[vpc-XXYYZZAA])", "shortdesc": "Filter for list-action", "required": "0", "order": 5 @@ -228,7 +243,10 @@ aws_access_key_id=access_key, aws_secret_access_key=secret_key) except Exception as e: - fail_usage("Failed: Unable to connect to AWS: " + str(e)) + if not options.get("--action", "") in ["metadata", "manpage", "validate-all"]: + fail_usage("Failed: Unable to connect to AWS: " + str(e)) + else: + pass # Operate the fencing device result = fence_action(conn, options, set_power_status, get_power_status, get_nodes_list) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/azure_arm/fence_azure_arm.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/azure_arm/fence_azure_arm.py --- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/azure_arm/fence_azure_arm.py 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/azure_arm/fence_azure_arm.py 2024-07-01 10:20:11.000000000 +0200 @@ -251,7 +251,7 @@ except ImportError: fail_usage("Azure Resource Manager Python SDK not found or not accessible") except Exception as e: - fail_usage("Failed: %s" % re.sub("^, ", "", str(e))) + fail_usage("Failed: %s" % re.sub(r"^, ", r"", str(e))) if "--network-fencing" in options: # use off-action to quickly return off once network is fenced instead of diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/cdu/fence_cdu.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/cdu/fence_cdu.py --- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/cdu/fence_cdu.py 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/cdu/fence_cdu.py 2024-07-01 10:20:11.000000000 +0200 @@ -51,11 +51,11 @@ if options["api-version"] == "8": # AA13 Arm-Console3 Wake On On Normal # AA14 Master_Outlet_14 Wake On On Normal - show_re = re.compile('(\w+)\s+(\S+)\s+(On|Idle On|Off|Wake On)\s+(On|Off)') + show_re = re.compile(r'(\w+)\s+(\S+)\s+(On|Idle On|Off|Wake On)\s+(On|Off)') else: # .A12 TowerA_Outlet12 On Idle On # .A12 test-01 On Idle On - show_re = re.compile('(\.\w+)\s+(\w+|\w+\W\w+)\s+(On|Off)\s+(On|Idle On|Off|Wake On)') + show_re = re.compile(r'(\.\w+)\s+(\w+|\w+\W\w+)\s+(On|Off)\s+(On|Idle On|Off|Wake On)') for line in lines: res = show_re.search(line) if res != None: @@ -89,7 +89,7 @@ # else: # .A12 TowerA_Outlet12 # .A12 test-01 - show_re = re.compile('(\S+)\s+(\w+|\w+\W\w+)\s+') + show_re = re.compile(r'(\S+)\s+(\w+|\w+\W\w+)\s+') for line in lines: res = show_re.search(line) if res != None: @@ -112,7 +112,7 @@ conn.send("VERSION\r\n") conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) lines = conn.before.split("\n") - show_re = re.compile('Sentry Switched [PC]DU Version (\d)(.\d|)(\w)\r') + show_re = re.compile(r'Sentry Switched [PC]DU Version (\d)(.\d|)(\w)\r') for line in lines: res = show_re.search(line) if res != None: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/cisco_ucs/fence_cisco_ucs.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/cisco_ucs/fence_cisco_ucs.py --- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/cisco_ucs/fence_cisco_ucs.py 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/cisco_ucs/fence_cisco_ucs.py 2024-07-01 10:20:11.000000000 +0200 @@ -8,13 +8,13 @@ from fencing import * from fencing import fail, EC_STATUS, EC_LOGIN_DENIED, run_delay -RE_COOKIE = re.compile("<aaaLogin .* outCookie=\"(.*?)\"", re.IGNORECASE) -RE_STATUS = re.compile("<lsPower .*? state=\"(.*?)\"", re.IGNORECASE) -RE_GET_DN = re.compile(" dn=\"(.*?)\"", re.IGNORECASE) -RE_GET_PNDN = re.compile(" pndn=\"(.*?)\"", re.IGNORECASE) -RE_GET_DESC = re.compile(" descr=\"(.*?)\"", re.IGNORECASE) -RE_GET_OPERPOWER = re.compile(" operPower=\"(.*?)\"", re.IGNORECASE) -RE_GET_PRESENCE = re.compile(" presence=\"(.*?)\"", re.IGNORECASE) +RE_COOKIE = re.compile(r"<aaaLogin .* outCookie=\"(.*?)\"", re.IGNORECASE) +RE_STATUS = re.compile(r"<lsPower .*? state=\"(.*?)\"", re.IGNORECASE) +RE_GET_DN = re.compile(r" dn=\"(.*?)\"", re.IGNORECASE) +RE_GET_PNDN = re.compile(r" pndn=\"(.*?)\"", re.IGNORECASE) +RE_GET_DESC = re.compile(r" descr=\"(.*?)\"", re.IGNORECASE) +RE_GET_OPERPOWER = re.compile(r" operPower=\"(.*?)\"", re.IGNORECASE) +RE_GET_PRESENCE = re.compile(r" presence=\"(.*?)\"", re.IGNORECASE) options_global = None diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/compute/fence_compute.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/compute/fence_compute.py --- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/compute/fence_compute.py 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/compute/fence_compute.py 2024-07-01 10:20:11.000000000 +0200 @@ -98,7 +98,7 @@ # Since it's about forcing back to a default value, there is # no real worries to just consider it's still okay even if the # command failed - logging.warn("Exception from attempt to force " + logging.warning("Exception from attempt to force " "host back up via nova API: " "%s: %s" % (e.__class__.__name__, e)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/docker/fence_docker.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/docker/fence_docker.py --- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/docker/fence_docker.py 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/docker/fence_docker.py 2024-07-01 10:20:11.000000000 +0200 @@ -48,6 +48,8 @@ output_buffer = io.BytesIO() if logging.getLogger().getEffectiveLevel() < logging.WARNING: conn.setopt(pycurl.VERBOSE, True) + if "--unix-socket" in options: + conn.setopt(pycurl.UNIX_SOCKET_PATH, options["--unix-socket"]) conn.setopt(pycurl.HTTPGET, 1) conn.setopt(pycurl.URL, url.encode("ascii")) if post: @@ -135,12 +137,35 @@ "default" : "1.11", } - device_opt = ["ipaddr", "no_password", "no_login", "port", "method", "web", "tlscert", "tlskey", "tlscacert", "ssl", "api_version"] + all_opt["unix_socket"] = { + "getopt" : ":", + "longopt" : "unix-socket", + "help" : "--unix-socket " + "Path to Docker's unix socket. Use this with --disable-ssl.", + "required" : "0", + "order" : 2, + } - all_opt["ssl"]["default"] = "1" + all_opt["disable_ssl"] = { + "getopt" : "", + "longopt" : "disable-ssl", + "help" : "--disable-ssl Don't use SSL connection", + "required" : "0", + "shortdesc" : "Don't use SSL", + "order": 2, + } + device_opt = ["ipaddr", "no_password", "no_login", "port", "method", "web", + "tlscert", "tlskey", "tlscacert", "ssl", "api_version", "unix_socket", + "disable_ssl"] + all_opt["ssl"]["default"] = "1" options = check_input(device_opt, process_input(device_opt)) + if "--disable-ssl" in options or options["--ssl"] == "0": + for k in ["--ssl", "--ssl-secure", "--ssl-insecure"]: + if k in options: + del options[k] + docs = { } docs["shortdesc"] = "Fence agent for Docker" docs["longdesc"] = "fence_docker is a Power Fencing agent which \ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/eps/fence_eps.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/eps/fence_eps.py --- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/eps/fence_eps.py 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/eps/fence_eps.py 2024-07-01 10:20:11.000000000 +0200 @@ -3,8 +3,8 @@ # The Following Agent Has Been Tested On: # ePowerSwitch 8M+ version 1.0.0.4 -import sys, re -import base64, string, socket +import sys, os, re +import base64, socket import logging import atexit sys.path.append("@FENCEAGENTSLIBDIR@") @@ -37,7 +37,7 @@ options["--password"] = "" # Default is empty password # String for Authorization header - auth_str = 'Basic ' + string.strip(base64.encodestring(options["--username"]+':'+options["--password"])) + auth_str = 'Basic ' + str(base64.encodebytes(bytes(options["--username"]+':'+options["--password"], "utf-8")).decode("utf-8").strip()) logging.debug("Authorization: %s\n", auth_str) conn.putheader('Authorization', auth_str) @@ -60,16 +60,22 @@ logging.error("Failed: {}".format(str(e))) fail(EC_LOGIN_DENIED) - return result + return result.decode("utf-8", "ignore") def get_power_status(conn, options): del conn ret_val = eps_run_command(options, "") result = {} - status = re.findall(r"p(\d{2})=(0|1)\s*\<br\>", ret_val.lower()) + if os.path.basename(sys.argv[0]) == "fence_eps": + status = re.findall(r"p(\d{2})=(0|1)\s*\<br\>", ret_val.lower()) + elif os.path.basename(sys.argv[0]) == "fence_epsr2": + status = re.findall(r"m0:o(\d)=(on|off)\s*", ret_val.lower()) for out_num, out_stat in status: - result[out_num] = ("", (out_stat == "1" and "on" or "off")) + if os.path.basename(sys.argv[0]) == "fence_eps": + result[out_num] = ("", (out_stat == "1" and "on" or "off")) + elif os.path.basename(sys.argv[0]) == "fence_epsr2": + result[out_num] = ("", out_stat) if not options["--action"] in ['monitor', 'list']: if not options["--plug"] in result: @@ -81,7 +87,12 @@ def set_power_status(conn, options): del conn - eps_run_command(options, "P%s=%s"%(options["--plug"], (options["--action"] == "on" and "1" or "0"))) + if os.path.basename(sys.argv[0]) == "fence_eps": + eps_run_command(options, "P%s=%s"%(options["--plug"], (options["--action"] == "on" and "1" or "0"))) + elif os.path.basename(sys.argv[0]) == "fence_epsr2": + if options["--action"] == "reboot": + options["--action"] = "off" + eps_run_command(options, "M0:O%s=%s"%(options["--plug"], options["--action"])) # Define new option def eps_define_new_opts(): @@ -107,20 +118,25 @@ options = check_input(device_opt, process_input(device_opt)) docs = {} + docs["agent_name"] = "fence_eps" docs["shortdesc"] = "Fence agent for ePowerSwitch" - docs["longdesc"] = "fence_eps is a Power Fencing agent \ + docs["longdesc"] = os.path.basename(sys.argv[0]) + " is a Power Fencing agent \ which can be used with the ePowerSwitch 8M+ power switch to fence \ -connected machines. Fence agent works ONLY on 8M+ device, because \ -this is only one, which has support for hidden page feature. \ +connected machines. It ONLY works on 8M+ devices, as \ +they support the hidden page feature. \ \n.TP\n\ -Agent basically works by connecting to hidden page and pass \ -appropriate arguments to GET request. This means, that hidden \ -page feature must be enabled and properly configured." - docs["vendorurl"] = "http://www.epowerswitch.com" +The agent works by connecting to the hidden page and pass \ +the appropriate arguments to GET request. This means, that the hidden \ +page feature must be enabled and properly configured. \ +\n.TP\n\ +NOTE: In most cases you want to use fence_epsr2, as fence_eps \ +only works with older hardware." + docs["vendorurl"] = "https://www.neol.com" + docs["symlink"] = [("fence_epsr2", "Fence agent for ePowerSwitch R2 and newer")] show_docs(options, docs) run_delay(options) - #Run fence action. Conn is None, beacause we always need open new http connection + #Run fence action. Conn is None, because we always need open new http connection result = fence_action(None, options, set_power_status, get_power_status, get_power_status) sys.exit(result) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/gce/fence_gce.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/gce/fence_gce.py --- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/gce/fence_gce.py 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/gce/fence_gce.py 2024-07-01 10:20:11.000000000 +0200 @@ -85,8 +85,8 @@ uri_replacements.append( { "matchlength": 4, - "match": "https://compute.googleapis.com/compute/v1/projects/(.*)/zones/(.*)/instances...)", - "replace": "https://baremetalsolution.googleapis.com/v1/projects/\\1/locations/\\2/instances/\\3:resetInstance\\4" + "match": r"https://compute.googleapis.com/compute/v1/projects/(.*)/zones/(.*)/instances...)", + "replace": r"https://baremetalsolution.googleapis.com/v1/projects/\1/locations/\2/instances/\3:resetInstance\4" }) for uri_replacement in uri_replacements: # each uri_replacement should have matchlength, match, and replace @@ -97,7 +97,7 @@ if match is None or len(match.groups()) != uri_replacement["matchlength"]: continue replaced_uri = re.sub(uri_replacement["match"], uri_replacement["replace"], http_request.uri) - match = re.match("https:\/\/.*.googleapis.com", replaced_uri) + match = re.match(r"https:\/\/.*.googleapis.com", replaced_uri) if match is None or match.start() != 0: logging.warning("FENCE_GCE_URI_REPLACEMENTS replace is not " "targeting googleapis.com, ignoring it: %s" % replaced_uri) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/hpblade/fence_hpblade.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/hpblade/fence_hpblade.py --- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/hpblade/fence_hpblade.py 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/hpblade/fence_hpblade.py 2024-07-01 10:20:11.000000000 +0200 @@ -33,10 +33,10 @@ def get_power_status(conn, options): if options["enc_type"] == "superdome": cmd_send = "parstatus -M -p " + options["--plug"] - powrestr = "^partition:\\d\\s+:\\w+\\s+/(\\w+)\\s.*$" + powrestr = r"^partition:\d\s+:\w+\s+/(\w+)\s.*$" else: cmd_send = "show server status " + options["--plug"] - powrestr = "^\\s*Power: (.*?)\\s*$" + powrestr = r"^\s*Power: (.*?)\s*$" conn.send_eol(cmd_send) conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) @@ -78,10 +78,10 @@ outlets = {} if options["enc_type"] == "superdome": cmd_send = "parstatus -P -M" - listrestr = "^partition:(\\d+)\\s+:\\w+\\s+/(\\w+)\\s+:OK.*?:(\\w+)\\s*$" + listrestr = r"^partition:(\d+)\s+:\w+\s+/(\w+)\s+:OK.*?:(\w+)\s*$" else: cmd_send = "show server list" - listrestr = "^\\s*(\\d+)\\s+(.*?)\\s+(.*?)\\s+OK\\s+(.*?)\\s+(.*?)\\s*$" + listrestr = r"^\s*(\d+)\s+(.*?)\s+(.*?)\s+OK\s+(.*?)\s+(.*?)\s*$" conn.send_eol(cmd_send) conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/ilo/fence_ilo.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/ilo/fence_ilo.py --- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/ilo/fence_ilo.py 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/ilo/fence_ilo.py 2024-07-01 10:20:11.000000000 +0200 @@ -72,6 +72,7 @@ options = check_input(device_opt, process_input(device_opt)) docs = {} + docs["agent_name"] = "fence_ilo" docs["shortdesc"] = "Fence agent for HP iLO" docs["longdesc"] = "{} is a Power Fencing agent \ used for HP servers with the Integrated Light Out (iLO) PCI card.\ @@ -106,7 +107,7 @@ fail(EC_LOGIN_DENIED) try: - version = re.compile("<RIBCL VERSION=\"(.*?)\"", re.IGNORECASE).search(conn.before).group(1) + version = re.compile(r"<RIBCL VERSION=\"(.*?)\"", re.IGNORECASE).search(conn.before).group(1) if "--ribcl-version" not in options: options["--ribcl-version"] = float(version) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/ilo_mp/fence_ilo_mp.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/ilo_mp/fence_ilo_mp.py --- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/ilo_mp/fence_ilo_mp.py 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/ilo_mp/fence_ilo_mp.py 2024-07-01 10:20:11.000000000 +0200 @@ -8,7 +8,7 @@ def get_power_status(conn, options): conn.send_eol("show /system1") - re_state = re.compile('EnabledState=(.*)', re.IGNORECASE) + re_state = re.compile(r'EnabledState=(.*)', re.IGNORECASE) conn.log_expect(re_state, int(options["--shell-timeout"])) status = conn.match.group(1).lower() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/ilo_ssh/fence_ilo_ssh.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/ilo_ssh/fence_ilo_ssh.py --- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/ilo_ssh/fence_ilo_ssh.py 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/ilo_ssh/fence_ilo_ssh.py 2024-07-01 10:20:11.000000000 +0200 @@ -9,7 +9,7 @@ def get_power_status(conn, options): conn.send_eol("show /system1") - re_state = re.compile('EnabledState=(.*)', re.IGNORECASE) + re_state = re.compile(r'EnabledState=(.*)', re.IGNORECASE) conn.log_expect(re_state, int(options["--shell-timeout"])) status = conn.match.group(1).lower() @@ -49,6 +49,7 @@ options = check_input(device_opt, process_input(device_opt)) docs = {} + docs["agent_name"] = "fence_ilo_ssh" docs["shortdesc"] = "Fence agent for HP iLO over SSH" docs["longdesc"] = "{} is a Power Fencing agent that connects to iLO device. It logs into \ device via ssh and reboot a specified outlet.\ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/ipmilan/fence_ipmilan.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/ipmilan/fence_ipmilan.py --- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/ipmilan/fence_ipmilan.py 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/ipmilan/fence_ipmilan.py 2024-07-01 10:20:11.000000000 +0200 @@ -13,7 +13,7 @@ def get_power_status(_, options): output = _run_command(options, "status") - match = re.search('[Cc]hassis [Pp]ower is [\\s]*([a-zA-Z]{2,3})', str(output)) + match = re.search(r'[Cc]hassis [Pp]ower is [\s]*([a-zA-Z]{2,3})', str(output)) status = match.group(1) if match else None return status @@ -23,11 +23,11 @@ def reboot_cycle(_, options): output = _run_command(options, "cycle") - return bool(re.search('chassis power control: cycle', str(output).lower())) + return bool(re.search(r'chassis power control: cycle', str(output).lower())) def reboot_diag(_, options): output = _run_command(options, "diag") - return bool(re.search('chassis power control: diag', str(output).lower())) + return bool(re.search(r'chassis power control: diag', str(output).lower())) def _run_command(options, action): cmd, log_cmd = create_command(options, action) @@ -202,10 +202,12 @@ options = check_input(device_opt, process_input(device_opt)) docs = {} + docs["agent_name"] = "fence_ipmilan" docs["shortdesc"] = "Fence agent for IPMI" docs["longdesc"] = "{} is a Power Fencing agent \ which can be used with machines controlled by IPMI. \ -This agent calls support software ipmitool (http://ipmitool.sf.net/). \ +This agent calls support software ipmitool (http://ipmitool.sf.net/).\ +\n.P\n\ WARNING! This fence agent might report success before the node is powered off. \ You should use -m/method onoff if your fence device works correctly with that option.".format(os.path.basename(__file__)) docs["vendorurl"] = "" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/ironic/fence_ironic.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/ironic/fence_ironic.py --- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/ironic/fence_ironic.py 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/ironic/fence_ironic.py 2024-07-01 10:20:11.000000000 +0200 @@ -20,7 +20,7 @@ def get_power_status(_, options): output = ironic_run_command(options, "status") stdout = output[1] - match = re.search('power[\\s]*([a-zA-Z]{2,3})', str(stdout)) + match = re.search(r'power[\s]*([a-zA-Z]{2,3})', str(stdout)) status = match.group(1) if match else None return status @@ -40,7 +40,7 @@ pass if "UUID" in uuid: continue # skip line header - match = re.search('power[\\s]*([a-zA-Z]{2,3})', state) + match = re.search(r'power[\s]*([a-zA-Z]{2,3})', state) status = match.group(1) if match else None nodes[uuid] = (name, status) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/lpar/fence_lpar.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/lpar/fence_lpar.py --- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/lpar/fence_lpar.py 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/lpar/fence_lpar.py 2024-07-01 10:20:11.000000000 +0200 @@ -44,10 +44,10 @@ try: if options["--hmc-version"] == "3": - status = re.compile("^" + options["--plug"] + ",(.*?),.*$", + status = re.compile(r"^" + options["--plug"] + r",(.*?),.*$", re.IGNORECASE | re.MULTILINE).search(conn.before).group(1) elif options["--hmc-version"] in ["4", "IVM"]: - status = re.compile(",state=(.*?),", re.IGNORECASE).search(conn.before).group(1) + status = re.compile(r",state=(.*?),", re.IGNORECASE).search(conn.before).group(1) except AttributeError as e: logging.debug("Command on HMC failed: {}\n{}".format(command, str(e))) fail(EC_STATUS_HMC) @@ -60,7 +60,7 @@ conn.log_expect(options["--command-prompt"], int(options["--power-timeout"])) try: - cm = re.compile(",curr_master_mtms=(.*?),", re.IGNORECASE).search(conn.before).group(1) + cm = re.compile(r",curr_master_mtms=(.*?),", re.IGNORECASE).search(conn.before).group(1) except AttributeError as e: cm = False @@ -106,7 +106,7 @@ ## We have to remove next 2 lines (header) and last line (part of new prompt) #### - res = re.search("^(.+?\n){2}(.*)\n.*$", conn.before, re.S) + res = re.search(r"^(.+?\n){2}(.*)\n.*$", conn.before, re.S) if res == None: fail_usage("Unable to parse output of list command") @@ -126,7 +126,7 @@ ## We have to remove last line (part of new prompt) #### - res = re.search("^(.*)\n.*$", conn.before, re.S) + res = re.search(r"^(.*)\n.*$", conn.before, re.S) if res == None: fail_usage("Unable to parse output of list command") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/mpath/fence_mpath.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/mpath/fence_mpath.py --- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/mpath/fence_mpath.py 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/mpath/fence_mpath.py 2024-07-01 10:20:11.000000000 +0200 @@ -331,7 +331,7 @@ if not ("--devices" in options and options["--devices"]): fail_usage("Failed: No devices found") - options["devices"] = [d for d in re.split("\s*,\s*|\s+", options["--devices"].strip()) if d] + options["devices"] = [d for d in re.split(r"\s*,\s*|\s+", options["--devices"].strip()) if d] # Input control END result = fence_action(None, options, set_status, get_status) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/netio/fence_netio.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/netio/fence_netio.py --- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/netio/fence_netio.py 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/netio/fence_netio.py 2024-07-01 10:20:11.000000000 +0200 @@ -8,7 +8,7 @@ def get_power_status(conn, options): conn.send_eol("port %s" % options["--plug"]) - re_status = re.compile("250 [01imt]") + re_status = re.compile(r"250 [01imt]") conn.log_expect(re_status, int(options["--shell-timeout"])) status = { "0" : "off", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/raritan/fence_raritan.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/raritan/fence_raritan.py --- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/raritan/fence_raritan.py 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/raritan/fence_raritan.py 2024-07-01 10:20:11.000000000 +0200 @@ -8,7 +8,7 @@ def get_power_status(conn, options): conn.send_eol("show -d properties=powerState %s" % options["--plug"]) - re_status = re.compile(".*powerState is [12].*") + re_status = re.compile(r".*powerState is [12].*") conn.log_expect(re_status, int(options["--shell-timeout"])) status = { #"0" : "off", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/rhevm/fence_rhevm.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/rhevm/fence_rhevm.py --- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/rhevm/fence_rhevm.py 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/rhevm/fence_rhevm.py 2024-07-01 10:20:11.000000000 +0200 @@ -9,10 +9,10 @@ from fencing import * from fencing import fail, EC_FETCH_VM_UUID, run_delay -RE_GET_ID = re.compile("<vm( .*)? id=\"(.*?)\"", re.IGNORECASE) -RE_STATUS = re.compile("<status>(.*?)</status>", re.IGNORECASE) -RE_STATE = re.compile("<state>(.*?)</state>", re.IGNORECASE) -RE_GET_NAME = re.compile("<name>(.*?)</name>", re.IGNORECASE) +RE_GET_ID = re.compile(r"<vm( .*)? id=\"(.*?)\"", re.IGNORECASE) +RE_STATUS = re.compile(r"<status>(.*?)</status>", re.IGNORECASE) +RE_STATE = re.compile(r"<state>(.*?)</state>", re.IGNORECASE) +RE_GET_NAME = re.compile(r"<name>(.*?)</name>", re.IGNORECASE) def get_power_status(conn, options): del conn @@ -80,7 +80,7 @@ if opt["--api-version"] == "auto": opt["--api-version"] = "4" res = send_command(opt, "") - if re.search("<title>Error</title>", res): + if re.search(r"<title>Error</title>", res): opt["--api-version"] = "3" logging.debug("auto-detected API version: " + opt["--api-version"]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/rsa/fence_rsa.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/rsa/fence_rsa.py --- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/rsa/fence_rsa.py 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/rsa/fence_rsa.py 2024-07-01 10:20:11.000000000 +0200 @@ -16,7 +16,7 @@ conn.send_eol("power state") conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) - match = re.compile("Power: (.*)", re.IGNORECASE).search(conn.before) + match = re.compile(r"Power: (.*)", re.IGNORECASE).search(conn.before) if match != None: status = match.group(1) else: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/sbd/fence_sbd.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/sbd/fence_sbd.py --- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/sbd/fence_sbd.py 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/sbd/fence_sbd.py 2024-07-01 10:20:11.000000000 +0200 @@ -170,7 +170,7 @@ if "msgwait" in line: tmp_msg_timeout = int(line.split(':')[1]) if -1 != msg_timeout and tmp_msg_timeout != msg_timeout: - logging.warn(\ + logging.warning(\ "sbd message timeouts differ in different devices") # we only save the highest timeout if tmp_msg_timeout > msg_timeout: @@ -418,7 +418,7 @@ power_timeout = int(options["--power-timeout"]) sbd_msg_timeout = get_msg_timeout(options) if 0 < power_timeout <= sbd_msg_timeout: - logging.warn("power timeout needs to be \ + logging.warning("power timeout needs to be \ greater then sbd message timeout") result = fence_action(\ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/scsi/fence_scsi.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/scsi/fence_scsi.py --- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/scsi/fence_scsi.py 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/scsi/fence_scsi.py 2024-07-01 10:20:11.000000000 +0200 @@ -236,11 +236,11 @@ cmd = options["--corosync-cmap-path"] + " nodelist" out = run_cmd(options, cmd)["out"] - match = re.search(r".(\d+).name \(str\) = " + options["--plug"] + "\n", out) + match = re.search(r".(\d+).name \(str\) = " + options["--plug"] + r"\n", out) # try old format before failing if not match: - match = re.search(r".(\d+).ring._addr \(str\) = " + options["--plug"] + "\n", out) + match = re.search(r".(\d+).ring._addr \(str\) = " + options["--plug"] + r"\n", out) return match.group(1) if match else fail_usage("Failed: unable to parse output of corosync-cmapctl or node does not exist") @@ -295,7 +295,7 @@ fail_usage("Failed: Cannot open file \""+ file_path + "\"") f.seek(0) out = f.read() - if not re.search(r"^" + dev + "\s+", out, flags=re.MULTILINE): + if not re.search(r"^" + dev + r"\s+", out, flags=re.MULTILINE): f.write(dev + "\n") f.close() @@ -613,10 +613,10 @@ options["--key"] = options["--key"].lstrip('0') - if not ("--devices" in options and [d for d in re.split("\s*,\s*|\s+", options["--devices"].strip()) if d]): + if not ("--devices" in options and [d for d in re.split(r"\s*,\s*|\s+", options["--devices"].strip()) if d]): options["devices"] = get_shared_devices(options) else: - options["devices"] = [d for d in re.split("\s*,\s*|\s+", options["--devices"].strip()) if d] + options["devices"] = [d for d in re.split(r"\s*,\s*|\s+", options["--devices"].strip()) if d] if not options["devices"]: fail_usage("Failed: No devices found") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/wti/fence_wti.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/wti/fence_wti.py --- old/fence-agents-4.13.1+git.1707822268.4229d52f/agents/wti/fence_wti.py 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/agents/wti/fence_wti.py 2024-07-01 10:20:11.000000000 +0200 @@ -27,7 +27,7 @@ re_all = list(options["--command-prompt"]) else: re_all = [options["--command-prompt"]] - re_next = re.compile("Enter: ", re.IGNORECASE) + re_next = re.compile(r"Enter: ", re.IGNORECASE) re_all.append(re_next) result = conn.log_expect(re_all, int(options["--shell-timeout"])) @@ -208,8 +208,8 @@ conn.send("set binary\n") conn.send("open %s -%s\n"%(options["--ip"], options["--ipport"])) - re_login = re.compile("(login: )|(Login Name: )|(username: )|(User Name :)", re.IGNORECASE) - re_prompt = re.compile("|".join(["(" + x + ")" for x in options["--command-prompt"]]), re.IGNORECASE) + re_login = re.compile(r"(login: )|(Login Name: )|(username: )|(User Name :)", re.IGNORECASE) + re_prompt = re.compile(r"|".join(["(" + x + ")" for x in options["--command-prompt"]]), re.IGNORECASE) result = conn.log_expect([re_login, "Password: ", re_prompt], int(options["--shell-timeout"])) if result == 0: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/configure.ac new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/configure.ac --- old/fence-agents-4.13.1+git.1707822268.4229d52f/configure.ac 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/configure.ac 2024-07-01 10:20:11.000000000 +0200 @@ -262,6 +262,10 @@ CLUSTERVARRUN=${localstatedir}/run/cluster CLUSTERDATA=${datadir}/cluster +## Program Paths +PATH="$PATH:/sbin:/usr/sbin:/usr/local/sbin:/usr/local/bin" +export PATH + AC_PATH_PROGS(XMLLINT, xmllint) AM_CONDITIONAL(BUILD_DOC, test "x$XMLLINT" != "x" ) if test "x$XMLLINT" = "x"; then @@ -291,6 +295,9 @@ AC_PYTHON_MODULE(pycurl, 1) AC_PYTHON_MODULE(requests, 1) +AC_PYTHON_MODULE(boto3) +AM_CONDITIONAL(HAVE_BOTO3, [test "x$HAVE_PYMOD_BOTO3" == xyes ]) + if echo "$AGENTS_LIST" | grep -q amt_ws; then AC_PYTHON_MODULE(pywsman) if test "x${HAVE_PYMOD_PYWSMAN}" != xyes; then @@ -322,7 +329,7 @@ AC_PATH_PROG([SSH_PATH], [ssh], [/usr/bin/ssh]) AC_PATH_PROG([TELNET_PATH], [telnet], [/usr/bin/telnet]) AC_PATH_PROG([MPATH_PATH], [mpathpersist], [/usr/sbin/mpathpersist]) -AC_PATH_PROG([SBD_PATH], [sbd], [/sbin/sbd]) +AC_PATH_PROG([SBD_PATH], [sbd], [/usr/sbin/sbd]) AC_PATH_PROG([SUDO_PATH], [sudo], [/usr/bin/sudo]) AC_PATH_PROG([SNMPWALK_PATH], [snmpwalk], [/usr/bin/snmpwalk]) AC_PATH_PROG([SNMPSET_PATH], [snmpset], [/usr/bin/snmpset]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/fence-agents.spec.in new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/fence-agents.spec.in --- old/fence-agents-4.13.1+git.1707822268.4229d52f/fence-agents.spec.in 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/fence-agents.spec.in 2024-07-01 10:20:11.000000000 +0200 @@ -24,11 +24,7 @@ URL: https://github.com/ClusterLabs/fence-agents Source0: %{name}-%{version}%{?rcver:%{rcver}}%{?numcomm:.%{numcomm}}%{?alphatag:-%{alphatag}}%{?dirty:-%{dirty}}.tar.bz2 -%if 0%{?rhel} == 9 -%ifarch ppc64le s390x -%define rhel9_ppc64le_s390x 1 -%endif -%endif +%define boto3_br @boto3_br@ # skipped: pve, raritan, rcd-serial, virsh %global allfenceagents %(cat <<EOF @@ -124,11 +120,14 @@ %endif %if 0%{?fedora} || 0%{?centos} || 0%{?rhel} BuildRequires: openwsman-python3 -%if ! %{defined rhel9_ppc64le_s390x} +%if %{boto3_br} BuildRequires: python3-boto3 %endif %else -BuildRequires: python3-openwsman python3-boto3 +BuildRequires: python3-openwsman +%if %{boto3_br} +BuildRequires: python3-boto3 +%endif %endif # fence-virt @@ -381,14 +380,14 @@ License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for Azure Resource Manager Requires: fence-agents-common = %{version}-%{release} -%if 0%{?fedora} > 34 +%if 0%{?rhel} && 0%{?rhel} < 9 +Requires: python3-azure-sdk +%else Requires: python3-azure-common Requires: python3-azure-identity Requires: python3-azure-mgmt-compute Requires: python3-azure-mgmt-network Requires: python3-msrestazure -%else -Requires: python3-azure-sdk %endif BuildArch: noarch Obsoletes: fence-agents < 3.1.13 @@ -597,8 +596,8 @@ Fence agent for ePowerSwitch 8M+ power switches that are accessed via the HTTP(s) protocol. %files eps -%{_sbindir}/fence_eps -%{_mandir}/man8/fence_eps.8* +%{_sbindir}/fence_eps* +%{_mandir}/man8/fence_eps*.8* %package gce License: GPL-2.0-or-later AND LGPL-2.0-or-later diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/lib/azure_fence.py.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/lib/azure_fence.py.py --- old/fence-agents-4.13.1+git.1707822268.4229d52f/lib/azure_fence.py.py 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/lib/azure_fence.py.py 2024-07-01 10:20:11.000000000 +0200 @@ -14,6 +14,8 @@ IP_TYPE_DYNAMIC = "Dynamic" MAX_RETRY = 10 RETRY_WAIT = 5 +COMPUTE_CLIENT_API_VERSION = "2021-11-01" +NETWORK_MGMT_CLIENT_API_VERSION = "2021-05-01" class AzureSubResource: Type = None @@ -49,7 +51,7 @@ return None def get_azure_resource(id): - match = re.match('(/subscriptions/([^/]*)/resourceGroups/([^/]*))(/providers/([^/]*/[^/]*)/([^/]*))?((/([^/]*)/([^/]*))*)', id) + match = re.match(r'(/subscriptions/([^/]*)/resourceGroups/([^/]*))(/providers/([^/]*/[^/]*)/([^/]*))?((/([^/]*)/([^/]*))*)', id) if not match: fail_usage("{get_azure_resource} cannot parse resource id %s" % id) @@ -366,17 +368,20 @@ base_url=cloud_environment.endpoints.resource_manager, profile=client_profile, credential_scopes=[credential_scope], + api_version=COMPUTE_CLIENT_API_VERSION ) except TypeError: compute_client = ComputeManagementClient( credentials, config.SubscriptionId, - base_url=cloud_environment.endpoints.resource_manager + base_url=cloud_environment.endpoints.resource_manager, + api_version=COMPUTE_CLIENT_API_VERSION ) else: compute_client = ComputeManagementClient( credentials, - config.SubscriptionId + config.SubscriptionId, + api_version=COMPUTE_CLIENT_API_VERSION ) return compute_client @@ -404,16 +409,19 @@ base_url=cloud_environment.endpoints.resource_manager, profile=client_profile, credential_scopes=[credential_scope], + api_version=NETWORK_MGMT_CLIENT_API_VERSION ) except TypeError: network_client = NetworkManagementClient( credentials, config.SubscriptionId, - base_url=cloud_environment.endpoints.resource_manager + base_url=cloud_environment.endpoints.resource_manager, + api_version=NETWORK_MGMT_CLIENT_API_VERSION ) else: network_client = NetworkManagementClient( credentials, - config.SubscriptionId + config.SubscriptionId, + api_version=NETWORK_MGMT_CLIENT_API_VERSION ) return network_client diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/lib/fence2man.xsl new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/lib/fence2man.xsl --- old/fence-agents-4.13.1+git.1707822268.4229d52f/lib/fence2man.xsl 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/lib/fence2man.xsl 2024-07-01 10:20:11.000000000 +0200 @@ -60,9 +60,9 @@ .P <xsl:value-of select="longdesc"/> .P -<xsl:value-of select="@name" /> accepts options on the command line as well +The fence agent accepts options on the command line as well as from stdin. Fenced sends parameters through stdin when it execs the -agent. <xsl:value-of select="@name" /> can be run by itself with command +agent. The agent can be run by itself with command line options. This is useful for testing and for turning outlets on or off from scripts. <xsl:if test="vendor-url"> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/lib/fencing.py.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/lib/fencing.py.py --- old/fence-agents-4.13.1+git.1707822268.4229d52f/lib/fencing.py.py 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/lib/fencing.py.py 2024-07-01 10:20:11.000000000 +0200 @@ -603,7 +603,7 @@ if len(value["help"]) != 0: print(" " + _join_wrap([value["help"]], first_indent=3)) -def metadata(options, avail_opt, docs): +def metadata(options, avail_opt, docs, agent_name=os.path.basename(sys.argv[0])): # avail_opt has to be unique, if there are duplicities then they should be removed sorted_list = [(key, all_opt[key]) for key in list(set(avail_opt)) if "longopt" in all_opt[key]] # Find keys that are going to replace inconsistent names @@ -614,10 +614,10 @@ sorted_list.sort(key=lambda x: (x[1]["order"], x[0])) if options["--action"] == "metadata": - docs["longdesc"] = re.sub("\\\\f[BPIR]|\.P|\.TP|\.br\n", "", docs["longdesc"]) + docs["longdesc"] = re.sub(r"\\f[BPIR]|\.P|\.TP|\.br\n", r"", docs["longdesc"]) print("<?xml version=\"1.0\" ?>") - print("<resource-agent name=\"" + os.path.basename(sys.argv[0]) + \ + print("<resource-agent name=\"" + agent_name + \ "\" shortdesc=\"" + docs["shortdesc"] + "\" >") for (symlink, desc) in docs.get("symlink", []): print("<symlink name=\"" + symlink + "\" shortdesc=\"" + desc + "\"/>") @@ -649,7 +649,7 @@ mixed = _encode_html_entities(mixed) if not "shortdesc" in opt: - shortdesc = re.sub(".*\s\s+", "", opt["help"][31:]) + shortdesc = re.sub(r".*\s\s+", r"", opt["help"][31:]) else: shortdesc = opt["shortdesc"] @@ -928,9 +928,15 @@ sys.exit(0) if options.get("--action", "") in ["metadata", "manpage"]: + if options["--action"] == "metadata" or "agent_name" not in docs: + agent_name=os.path.basename(sys.argv[0]) + else: + agent_name=docs["agent_name"] + + if "port_as_ip" in device_opt: device_opt.remove("separator") - metadata(options, device_opt, docs) + metadata(options, device_opt, docs, agent_name) sys.exit(0) if "--version" in options: @@ -973,14 +979,14 @@ if options["--action"] == "list": try: - print(outlet_id + options["--separator"] + alias) + print("{}{}{}".format(outlet_id, options["--separator"], alias)) except UnicodeEncodeError as e: - print((outlet_id + options["--separator"] + alias).encode("utf-8")) + print("{}{}{}".format(outlet_id, options["--separator"], alias).encode("utf-8")) elif options["--action"] == "list-status": try: - print(outlet_id + options["--separator"] + alias + options["--separator"] + status) + print("{}{}{}{}{}".format(outlet_id, options["--separator"], alias, options["--separator"], status)) except UnicodeEncodeError as e: - print((outlet_id + options["--separator"] + alias).encode("utf-8") + options["--separator"] + status) + print("{}{}{}{}{}".format(outlet_id, options["--separator"], alias, options["--separator"], status).encode("utf-8")) return result @@ -1272,7 +1278,7 @@ executable="/bin/sh") # replace env os.environ.clear() - os.environ.update(line.partition('=')[::2] for line in output.decode("utf-8").split('\0') if not re.match("^\s*$", line)) + os.environ.update(line.partition('=')[::2] for line in output.decode("utf-8").split('\0') if not re.match(r"^\s*$", line)) # Convert array of format [[key1, value1], [key2, value2], ... [keyN, valueN]] to dict, where key is # in format a.b.c.d...z and returned dict has key only z @@ -1359,7 +1365,7 @@ def _login_telnet(options, re_login_string): re_login = re.compile(re_login_string, re.IGNORECASE) - re_pass = re.compile("(password)|(pass phrase)", re.IGNORECASE) + re_pass = re.compile(r"(password)|(pass phrase)", re.IGNORECASE) conn = fspawn(options, options["--telnet-path"]) conn.send("set binary\n") @@ -1400,7 +1406,7 @@ def _login_ssh_with_password(options, re_login_string): re_login = re.compile(re_login_string, re.IGNORECASE) - re_pass = re.compile("(password)|(pass phrase)", re.IGNORECASE) + re_pass = re.compile(r"(password)|(pass phrase)", re.IGNORECASE) if "--inet6-only" in options: force_ipvx = "-6 " @@ -1608,7 +1614,7 @@ (name, value) = (line + "=").split("=", 1) value = value[:-1] - value = re.sub("^\"(.*)\"$", "\\1", value) + value = re.sub(r"^\"(.*)\"$", r"\1", value) if name.replace("-", "_") in mapping_longopt_names: name = mapping_longopt_names[name.replace("-", "_")] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/lib/fencing_snmp.py.py new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/lib/fencing_snmp.py.py --- old/fence-agents-4.13.1+git.1707822268.4229d52f/lib/fencing_snmp.py.py 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/lib/fencing_snmp.py.py 2024-07-01 10:20:11.000000000 +0200 @@ -91,7 +91,7 @@ logging.debug("%s\n", res_output) - if (res_code != 0) or (re.search("^Error ", res_output, re.MULTILINE) != None): + if (res_code != 0) or (re.search(r"^Error ", res_output, re.MULTILINE) != None): fail_usage("Returned %d: %s"% (res_code, res_output)) except pexpect.ExceptionPexpect: fail_usage("Cannot run command %s"%(command)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_aliyun.xml new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_aliyun.xml --- old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_aliyun.xml 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_aliyun.xml 2024-07-01 10:20:11.000000000 +0200 @@ -38,6 +38,15 @@ <content type="string" /> <shortdesc lang="en">Ram Role.</shortdesc> </parameter> + <parameter name="credentials_file" unique="0" required="0"> + <getopt mixed="--credentials-file=[path]" /> + <shortdesc lang="en">Path to credentials file</shortdesc> + </parameter> + <parameter name="credentials_file_profile" unique="0" required="0"> + <getopt mixed="--credentials-file-profile=[profile]" /> + <content type="string" default="default" /> + <shortdesc lang="en">Credentials file profile</shortdesc> + </parameter> <parameter name="filter" unique="0" required="0"> <getopt mixed="--filter=[key=value]" /> <content type="string" /> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_docker.xml new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_docker.xml --- old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_docker.xml 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_docker.xml 2024-07-01 10:20:11.000000000 +0200 @@ -61,6 +61,11 @@ <content type="string" default="1.11" /> <shortdesc lang="en">Version of Docker Remote API (default: 1.11)</shortdesc> </parameter> + <parameter name="disable_ssl" unique="0" required="0"> + <getopt mixed="--disable-ssl" /> + <content type="boolean" /> + <shortdesc lang="en">Don't use SSL</shortdesc> + </parameter> <parameter name="tlscacert" unique="0" required="0"> <getopt mixed="--tlscacert" /> <content type="string" /> @@ -76,6 +81,11 @@ <content type="string" /> <shortdesc lang="en">Path to client key (PEM format) for TLS authentication. Required if --ssl option is used.</shortdesc> </parameter> + <parameter name="unix_socket" unique="0" required="0"> + <getopt mixed="--unix-socket" /> + <content type="string" /> + <shortdesc lang="en">Path to Docker's unix socket. Use this with --disable-ssl.</shortdesc> + </parameter> <parameter name="quiet" unique="0" required="0"> <getopt mixed="-q, --quiet" /> <content type="boolean" /> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_eps.xml new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_eps.xml --- old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_eps.xml 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_eps.xml 2024-07-01 10:20:11.000000000 +0200 @@ -1,9 +1,12 @@ <?xml version="1.0" ?> <resource-agent name="fence_eps" shortdesc="Fence agent for ePowerSwitch" > -<longdesc>fence_eps is a Power Fencing agent which can be used with the ePowerSwitch 8M+ power switch to fence connected machines. Fence agent works ONLY on 8M+ device, because this is only one, which has support for hidden page feature. +<symlink name="fence_epsr2" shortdesc="Fence agent for ePowerSwitch R2 and newer"/> +<longdesc>fence_eps is a Power Fencing agent which can be used with the ePowerSwitch 8M+ power switch to fence connected machines. It ONLY works on 8M+ devices, as they support the hidden page feature. -Agent basically works by connecting to hidden page and pass appropriate arguments to GET request. This means, that hidden page feature must be enabled and properly configured.</longdesc> -<vendor-url>http://www.epowerswitch.com</vendor-url> +The agent works by connecting to the hidden page and pass the appropriate arguments to GET request. This means, that the hidden page feature must be enabled and properly configured. + +NOTE: In most cases you want to use fence_epsr2, as fence_eps only works with older hardware.</longdesc> +<vendor-url>https://www.neol.com</vendor-url> <parameters> <parameter name="action" unique="0" required="1"> <getopt mixed="-o, --action=[action]" /> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_epsr2.xml new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_epsr2.xml --- old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_epsr2.xml 1970-01-01 01:00:00.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_epsr2.xml 2024-07-01 10:20:11.000000000 +0200 @@ -0,0 +1,178 @@ +<?xml version="1.0" ?> +<resource-agent name="fence_epsr2" shortdesc="Fence agent for ePowerSwitch" > +<symlink name="fence_epsr2" shortdesc="Fence agent for ePowerSwitch R2 and newer"/> +<longdesc>fence_epsr2 is a Power Fencing agent which can be used with the ePowerSwitch 8M+ power switch to fence connected machines. It ONLY works on 8M+ devices, as they support the hidden page feature. + +The agent works by connecting to the hidden page and pass the appropriate arguments to GET request. This means, that the hidden page feature must be enabled and properly configured. + +NOTE: In most cases you want to use fence_epsr2, as fence_eps only works with older hardware.</longdesc> +<vendor-url>https://www.neol.com</vendor-url> +<parameters> + <parameter name="action" unique="0" required="1"> + <getopt mixed="-o, --action=[action]" /> + <content type="string" default="reboot" /> + <shortdesc lang="en">Fencing action</shortdesc> + </parameter> + <parameter name="hidden_page" unique="0" required="0" deprecated="1"> + <getopt mixed="-c, --page=[page]" /> + <content type="string" default="hidden.htm" /> + <shortdesc lang="en">Name of hidden page</shortdesc> + </parameter> + <parameter name="ip" unique="0" required="1" obsoletes="ipaddr"> + <getopt mixed="-a, --ip=[ip]" /> + <content type="string" /> + <shortdesc lang="en">IP address or hostname of fencing device</shortdesc> + </parameter> + <parameter name="ipaddr" unique="0" required="1" deprecated="1"> + <getopt mixed="-a, --ip=[ip]" /> + <content type="string" /> + <shortdesc lang="en">IP address or hostname of fencing device</shortdesc> + </parameter> + <parameter name="ipport" unique="0" required="0"> + <getopt mixed="-u, --ipport=[port]" /> + <content type="integer" default="80" /> + <shortdesc lang="en">TCP/UDP port to use for connection with device</shortdesc> + </parameter> + <parameter name="login" unique="0" required="0" deprecated="1"> + <getopt mixed="-l, --username=[name]" /> + <content type="string" /> + <shortdesc lang="en">Login name</shortdesc> + </parameter> + <parameter name="page" unique="0" required="0" obsoletes="hidden_page"> + <getopt mixed="-c, --page=[page]" /> + <content type="string" default="hidden.htm" /> + <shortdesc lang="en">Name of hidden page</shortdesc> + </parameter> + <parameter name="passwd" unique="0" required="0" deprecated="1"> + <getopt mixed="-p, --password=[password]" /> + <content type="string" /> + <shortdesc lang="en">Login password or passphrase</shortdesc> + </parameter> + <parameter name="passwd_script" unique="0" required="0" deprecated="1"> + <getopt mixed="-S, --password-script=[script]" /> + <content type="string" /> + <shortdesc lang="en">Script to run to retrieve password</shortdesc> + </parameter> + <parameter name="password" unique="0" required="0" obsoletes="passwd"> + <getopt mixed="-p, --password=[password]" /> + <content type="string" /> + <shortdesc lang="en">Login password or passphrase</shortdesc> + </parameter> + <parameter name="password_script" unique="0" required="0" obsoletes="passwd_script"> + <getopt mixed="-S, --password-script=[script]" /> + <content type="string" /> + <shortdesc lang="en">Script to run to retrieve password</shortdesc> + </parameter> + <parameter name="plug" unique="0" required="1" obsoletes="port"> + <getopt mixed="-n, --plug=[id]" /> + <content type="string" /> + <shortdesc lang="en">Physical plug number on device, UUID or identification of machine</shortdesc> + </parameter> + <parameter name="port" unique="0" required="1" deprecated="1"> + <getopt mixed="-n, --plug=[id]" /> + <content type="string" /> + <shortdesc lang="en">Physical plug number on device, UUID or identification of machine</shortdesc> + </parameter> + <parameter name="username" unique="0" required="0" obsoletes="login"> + <getopt mixed="-l, --username=[name]" /> + <content type="string" /> + <shortdesc lang="en">Login name</shortdesc> + </parameter> + <parameter name="quiet" unique="0" required="0"> + <getopt mixed="-q, --quiet" /> + <content type="boolean" /> + <shortdesc lang="en">Disable logging to stderr. Does not affect --verbose or --debug-file or logging to syslog.</shortdesc> + </parameter> + <parameter name="verbose" unique="0" required="0"> + <getopt mixed="-v, --verbose" /> + <content type="boolean" /> + <shortdesc lang="en">Verbose mode. Multiple -v flags can be stacked on the command line (e.g., -vvv) to increase verbosity.</shortdesc> + </parameter> + <parameter name="verbose_level" unique="0" required="0"> + <getopt mixed="--verbose-level" /> + <content type="integer" /> + <shortdesc lang="en">Level of debugging detail in output. Defaults to the number of --verbose flags specified on the command line, or to 1 if verbose=1 in a stonith device configuration (i.e., on stdin).</shortdesc> + </parameter> + <parameter name="debug" unique="0" required="0" deprecated="1"> + <getopt mixed="-D, --debug-file=[debugfile]" /> + <content type="string" /> + <shortdesc lang="en">Write debug information to given file</shortdesc> + </parameter> + <parameter name="debug_file" unique="0" required="0" obsoletes="debug"> + <getopt mixed="-D, --debug-file=[debugfile]" /> + <shortdesc lang="en">Write debug information to given file</shortdesc> + </parameter> + <parameter name="version" unique="0" required="0"> + <getopt mixed="-V, --version" /> + <content type="boolean" /> + <shortdesc lang="en">Display version information and exit</shortdesc> + </parameter> + <parameter name="help" unique="0" required="0"> + <getopt mixed="-h, --help" /> + <content type="boolean" /> + <shortdesc lang="en">Display help and exit</shortdesc> + </parameter> + <parameter name="plug_separator" unique="0" required="0"> + <getopt mixed="--plug-separator=[char]" /> + <content type="string" default="," /> + <shortdesc lang="en">Separator for plug parameter when specifying more than 1 plug</shortdesc> + </parameter> + <parameter name="separator" unique="0" required="0"> + <getopt mixed="-C, --separator=[char]" /> + <content type="string" default="," /> + <shortdesc lang="en">Separator for CSV created by 'list' operation</shortdesc> + </parameter> + <parameter name="delay" unique="0" required="0"> + <getopt mixed="--delay=[seconds]" /> + <content type="second" default="0" /> + <shortdesc lang="en">Wait X seconds before fencing is started</shortdesc> + </parameter> + <parameter name="disable_timeout" unique="0" required="0"> + <getopt mixed="--disable-timeout=[true/false]" /> + <content type="string" /> + <shortdesc lang="en">Disable timeout (true/false) (default: true when run from Pacemaker 2.0+)</shortdesc> + </parameter> + <parameter name="login_timeout" unique="0" required="0"> + <getopt mixed="--login-timeout=[seconds]" /> + <content type="second" default="5" /> + <shortdesc lang="en">Wait X seconds for cmd prompt after login</shortdesc> + </parameter> + <parameter name="power_timeout" unique="0" required="0"> + <getopt mixed="--power-timeout=[seconds]" /> + <content type="second" default="20" /> + <shortdesc lang="en">Test X seconds for status change after ON/OFF</shortdesc> + </parameter> + <parameter name="power_wait" unique="0" required="0"> + <getopt mixed="--power-wait=[seconds]" /> + <content type="second" default="0" /> + <shortdesc lang="en">Wait X seconds after issuing ON/OFF</shortdesc> + </parameter> + <parameter name="shell_timeout" unique="0" required="0"> + <getopt mixed="--shell-timeout=[seconds]" /> + <content type="second" default="3" /> + <shortdesc lang="en">Wait X seconds for cmd prompt after issuing command</shortdesc> + </parameter> + <parameter name="stonith_status_sleep" unique="0" required="0"> + <getopt mixed="--stonith-status-sleep=[seconds]" /> + <content type="second" default="1" /> + <shortdesc lang="en">Sleep X seconds between status calls during a STONITH action</shortdesc> + </parameter> + <parameter name="retry_on" unique="0" required="0"> + <getopt mixed="--retry-on=[attempts]" /> + <content type="integer" default="1" /> + <shortdesc lang="en">Count of attempts to retry power on</shortdesc> + </parameter> +</parameters> +<actions> + <action name="on" automatic="0"/> + <action name="off" /> + <action name="reboot" /> + <action name="status" /> + <action name="list" /> + <action name="list-status" /> + <action name="monitor" /> + <action name="metadata" /> + <action name="manpage" /> + <action name="validate-all" /> +</actions> +</resource-agent> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_idrac.xml new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_idrac.xml --- old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_idrac.xml 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_idrac.xml 2024-07-01 10:20:11.000000000 +0200 @@ -6,7 +6,9 @@ <symlink name="fence_ipmilanplus" shortdesc="Fence agent for IPMIv2 lanplus"/> <symlink name="fence_imm" shortdesc="Fence agent for IBM Integrated Management Module"/> <symlink name="fence_idrac" shortdesc="Fence agent for Dell iDRAC"/> -<longdesc>fence_idrac is a Power Fencing agent which can be used with machines controlled by IPMI. This agent calls support software ipmitool (http://ipmitool.sf.net/). WARNING! This fence agent might report success before the node is powered off. You should use -m/method onoff if your fence device works correctly with that option.</longdesc> +<longdesc>fence_idrac is a Power Fencing agent which can be used with machines controlled by IPMI. This agent calls support software ipmitool (http://ipmitool.sf.net/). + +WARNING! This fence agent might report success before the node is powered off. You should use -m/method onoff if your fence device works correctly with that option.</longdesc> <vendor-url></vendor-url> <parameters> <parameter name="action" unique="0" required="1"> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_ilo3.xml new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_ilo3.xml --- old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_ilo3.xml 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_ilo3.xml 2024-07-01 10:20:11.000000000 +0200 @@ -6,7 +6,9 @@ <symlink name="fence_ipmilanplus" shortdesc="Fence agent for IPMIv2 lanplus"/> <symlink name="fence_imm" shortdesc="Fence agent for IBM Integrated Management Module"/> <symlink name="fence_idrac" shortdesc="Fence agent for Dell iDRAC"/> -<longdesc>fence_ilo3 is a Power Fencing agent which can be used with machines controlled by IPMI. This agent calls support software ipmitool (http://ipmitool.sf.net/). WARNING! This fence agent might report success before the node is powered off. You should use -m/method onoff if your fence device works correctly with that option.</longdesc> +<longdesc>fence_ilo3 is a Power Fencing agent which can be used with machines controlled by IPMI. This agent calls support software ipmitool (http://ipmitool.sf.net/). + +WARNING! This fence agent might report success before the node is powered off. You should use -m/method onoff if your fence device works correctly with that option.</longdesc> <vendor-url></vendor-url> <parameters> <parameter name="action" unique="0" required="1"> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_ilo4.xml new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_ilo4.xml --- old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_ilo4.xml 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_ilo4.xml 2024-07-01 10:20:11.000000000 +0200 @@ -6,7 +6,9 @@ <symlink name="fence_ipmilanplus" shortdesc="Fence agent for IPMIv2 lanplus"/> <symlink name="fence_imm" shortdesc="Fence agent for IBM Integrated Management Module"/> <symlink name="fence_idrac" shortdesc="Fence agent for Dell iDRAC"/> -<longdesc>fence_ilo4 is a Power Fencing agent which can be used with machines controlled by IPMI. This agent calls support software ipmitool (http://ipmitool.sf.net/). WARNING! This fence agent might report success before the node is powered off. You should use -m/method onoff if your fence device works correctly with that option.</longdesc> +<longdesc>fence_ilo4 is a Power Fencing agent which can be used with machines controlled by IPMI. This agent calls support software ipmitool (http://ipmitool.sf.net/). + +WARNING! This fence agent might report success before the node is powered off. You should use -m/method onoff if your fence device works correctly with that option.</longdesc> <vendor-url></vendor-url> <parameters> <parameter name="action" unique="0" required="1"> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_ilo5.xml new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_ilo5.xml --- old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_ilo5.xml 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_ilo5.xml 2024-07-01 10:20:11.000000000 +0200 @@ -6,7 +6,9 @@ <symlink name="fence_ipmilanplus" shortdesc="Fence agent for IPMIv2 lanplus"/> <symlink name="fence_imm" shortdesc="Fence agent for IBM Integrated Management Module"/> <symlink name="fence_idrac" shortdesc="Fence agent for Dell iDRAC"/> -<longdesc>fence_ilo5 is a Power Fencing agent which can be used with machines controlled by IPMI. This agent calls support software ipmitool (http://ipmitool.sf.net/). WARNING! This fence agent might report success before the node is powered off. You should use -m/method onoff if your fence device works correctly with that option.</longdesc> +<longdesc>fence_ilo5 is a Power Fencing agent which can be used with machines controlled by IPMI. This agent calls support software ipmitool (http://ipmitool.sf.net/). + +WARNING! This fence agent might report success before the node is powered off. You should use -m/method onoff if your fence device works correctly with that option.</longdesc> <vendor-url></vendor-url> <parameters> <parameter name="action" unique="0" required="1"> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_imm.xml new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_imm.xml --- old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_imm.xml 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_imm.xml 2024-07-01 10:20:11.000000000 +0200 @@ -6,7 +6,9 @@ <symlink name="fence_ipmilanplus" shortdesc="Fence agent for IPMIv2 lanplus"/> <symlink name="fence_imm" shortdesc="Fence agent for IBM Integrated Management Module"/> <symlink name="fence_idrac" shortdesc="Fence agent for Dell iDRAC"/> -<longdesc>fence_imm is a Power Fencing agent which can be used with machines controlled by IPMI. This agent calls support software ipmitool (http://ipmitool.sf.net/). WARNING! This fence agent might report success before the node is powered off. You should use -m/method onoff if your fence device works correctly with that option.</longdesc> +<longdesc>fence_imm is a Power Fencing agent which can be used with machines controlled by IPMI. This agent calls support software ipmitool (http://ipmitool.sf.net/). + +WARNING! This fence agent might report success before the node is powered off. You should use -m/method onoff if your fence device works correctly with that option.</longdesc> <vendor-url></vendor-url> <parameters> <parameter name="action" unique="0" required="1"> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_ipmilan.xml new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_ipmilan.xml --- old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_ipmilan.xml 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_ipmilan.xml 2024-07-01 10:20:11.000000000 +0200 @@ -6,7 +6,9 @@ <symlink name="fence_ipmilanplus" shortdesc="Fence agent for IPMIv2 lanplus"/> <symlink name="fence_imm" shortdesc="Fence agent for IBM Integrated Management Module"/> <symlink name="fence_idrac" shortdesc="Fence agent for Dell iDRAC"/> -<longdesc>fence_ipmilan is a Power Fencing agent which can be used with machines controlled by IPMI. This agent calls support software ipmitool (http://ipmitool.sf.net/). WARNING! This fence agent might report success before the node is powered off. You should use -m/method onoff if your fence device works correctly with that option.</longdesc> +<longdesc>fence_ipmilan is a Power Fencing agent which can be used with machines controlled by IPMI. This agent calls support software ipmitool (http://ipmitool.sf.net/). + +WARNING! This fence agent might report success before the node is powered off. You should use -m/method onoff if your fence device works correctly with that option.</longdesc> <vendor-url></vendor-url> <parameters> <parameter name="action" unique="0" required="1"> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_ipmilanplus.xml new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_ipmilanplus.xml --- old/fence-agents-4.13.1+git.1707822268.4229d52f/tests/data/metadata/fence_ipmilanplus.xml 2024-02-13 12:04:28.000000000 +0100 +++ new/fence-agents-4.15.0+git.1719822011.7a2c0a7f/tests/data/metadata/fence_ipmilanplus.xml 2024-07-01 10:20:11.000000000 +0200 @@ -6,7 +6,9 @@ <symlink name="fence_ipmilanplus" shortdesc="Fence agent for IPMIv2 lanplus"/> <symlink name="fence_imm" shortdesc="Fence agent for IBM Integrated Management Module"/> <symlink name="fence_idrac" shortdesc="Fence agent for Dell iDRAC"/> -<longdesc>fence_ipmilanplus is a Power Fencing agent which can be used with machines controlled by IPMI. This agent calls support software ipmitool (http://ipmitool.sf.net/). WARNING! This fence agent might report success before the node is powered off. You should use -m/method onoff if your fence device works correctly with that option.</longdesc> +<longdesc>fence_ipmilanplus is a Power Fencing agent which can be used with machines controlled by IPMI. This agent calls support software ipmitool (http://ipmitool.sf.net/). + +WARNING! This fence agent might report success before the node is powered off. You should use -m/method onoff if your fence device works correctly with that option.</longdesc> <vendor-url></vendor-url> <parameters> <parameter name="action" unique="0" required="1">
participants (1)
-
Source-Sync