Hello community,

here is the log from the commit of package fence-agents for openSUSE:Factory 
checked in at 2018-08-15 10:33:09
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/fence-agents (Old)
 and      /work/SRC/openSUSE:Factory/.fence-agents.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "fence-agents"

Wed Aug 15 10:33:09 2018 rev:43 rq:628434 version:4.2.1+git.1532964592.3ae5b58e

Changes:
--------
--- /work/SRC/openSUSE:Factory/fence-agents/fence-agents.changes        
2018-06-28 15:13:23.311596238 +0200
+++ /work/SRC/openSUSE:Factory/.fence-agents.new/fence-agents.changes   
2018-08-15 10:33:14.411729885 +0200
@@ -1,0 +2,14 @@
+Thu Aug 09 13:25:09 UTC 2018 - [email protected]
+
+- Update to version 4.2.1+git.1532964592.3ae5b58e:
+  * fence_aliyun: Add Aliyun fence agent. (fate#326557)
+  * fence_gce: add power cycle as default method
+  * fence_gce: set project and zone as not required
+  * fence_gce: add support for stackdriver logging
+  * fence_ilo3/fence_ipmilan: show correct default method (onoff) in help
+  * fence_mpath: add watchdog support
+  * fence_amt_ws: create metadata without agent specific libs
+- Drop obsolete patch:
+  * Remove 0002-Build-without-openwsman-installed.patch 
+
+-------------------------------------------------------------------

Old:
----
  0002-Build-without-openwsman-installed.patch
  fence-agents-4.2.1+git.1529316875.1a39345b.tar.xz

New:
----
  fence-agents-4.2.1+git.1532964592.3ae5b58e.tar.xz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ fence-agents.spec ++++++
--- /var/tmp/diff_new_pack.WkOY5P/_old  2018-08-15 10:33:15.179731273 +0200
+++ /var/tmp/diff_new_pack.WkOY5P/_new  2018-08-15 10:33:15.179731273 +0200
@@ -29,12 +29,11 @@
 Summary:        Fence Agents for High Availability
 License:        GPL-2.0-only AND LGPL-2.1-only
 Group:          Productivity/Clustering/HA
-Version:        4.2.1+git.1529316875.1a39345b
+Version:        4.2.1+git.1532964592.3ae5b58e
 Release:        0
 Url:            https://github.com/ClusterLabs/fence-agents
 Source0:        %{name}-%{version}.tar.xz
 Patch1:         0001-Use-Python-3-for-all-scripts-bsc-1065966.patch
-Patch2:         0002-Build-without-openwsman-installed.patch
 
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build
 BuildRequires:  %{python_version}
@@ -126,8 +125,6 @@
 %setup -q -n %{name}-%{version}
 %if %{python_version} == "python3"
 %patch1 -p1
-%else
-%patch2 -p1
 %endif
 
 %build

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.WkOY5P/_old  2018-08-15 10:33:15.223731353 +0200
+++ /var/tmp/diff_new_pack.WkOY5P/_new  2018-08-15 10:33:15.223731353 +0200
@@ -1,4 +1,4 @@
 <servicedata>
 <service name="tar_scm">
             <param 
name="url">git://github.com/ClusterLabs/fence-agents.git</param>
-          <param 
name="changesrevision">9b763accb5c4c4a1cf60a19592a4033bcedec500</param></service></servicedata>
\ No newline at end of file
+          <param 
name="changesrevision">790cbaa66f3927a84739af4a1f0e8bba295cdc36</param></service></servicedata>
\ No newline at end of file

++++++ fence-agents-4.2.1+git.1529316875.1a39345b.tar.xz -> 
fence-agents-4.2.1+git.1532964592.3ae5b58e.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fence-agents-4.2.1+git.1529316875.1a39345b/agents/Makefile.am 
new/fence-agents-4.2.1+git.1532964592.3ae5b58e/agents/Makefile.am
--- old/fence-agents-4.2.1+git.1529316875.1a39345b/agents/Makefile.am   
2018-06-18 12:14:35.000000000 +0200
+++ new/fence-agents-4.2.1+git.1532964592.3ae5b58e/agents/Makefile.am   
2018-07-30 17:29:52.000000000 +0200
@@ -50,6 +50,11 @@
 zvm_fence_zvm_CFLAGS           = -D_GNU_SOURCE -Izvm
 endif
 
+if BUILD_FENCE_MPATH
+mpathdatadir                   = $(CLUSTERDATA)
+mpathdata_SCRIPTS              = mpath/fence_mpath_check 
mpath/fence_mpath_check_hardreboot
+endif
+
 if BUILD_FENCE_SCSI
 scsidatadir                    = $(CLUSTERDATA)
 scsidata_SCRIPTS               = scsi/fence_scsi_check 
scsi/fence_scsi_check_hardreboot
@@ -72,6 +77,12 @@
                -e 's#@clustervarrun@#${CLUSTERVARRUN}#g' \
        > $@
 
+mpath/fence_mpath_check: mpath/fence_mpath
+       cp $^ $@
+
+mpath/fence_mpath_check_hardreboot: mpath/fence_mpath
+       cp $^ $@
+
 scsi/fence_scsi_check: scsi/fence_scsi
        cp $^ $@
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fence-agents-4.2.1+git.1529316875.1a39345b/agents/aliyun/fence_aliyun.py 
new/fence-agents-4.2.1+git.1532964592.3ae5b58e/agents/aliyun/fence_aliyun.py
--- 
old/fence-agents-4.2.1+git.1529316875.1a39345b/agents/aliyun/fence_aliyun.py    
    1970-01-01 01:00:00.000000000 +0100
+++ 
new/fence-agents-4.2.1+git.1532964592.3ae5b58e/agents/aliyun/fence_aliyun.py    
    2018-07-30 17:29:52.000000000 +0200
@@ -0,0 +1,157 @@
+#!@PYTHON@ -tt
+
+import sys, re
+import logging
+import atexit
+import json
+sys.path.append("@FENCEAGENTSLIBDIR@")
+from fencing import *
+from fencing import fail, fail_usage, EC_TIMED_OUT, run_delay
+
+try:
+       from aliyunsdkcore import client
+
+       from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import 
DescribeInstancesRequest
+       from aliyunsdkecs.request.v20140526.StartInstanceRequest import 
StartInstanceRequest
+       from aliyunsdkecs.request.v20140526.StopInstanceRequest import 
StopInstanceRequest
+       from aliyunsdkecs.request.v20140526.RebootInstanceRequest import 
RebootInstanceRequest
+except ImportError:
+       pass
+
+def _send_request(conn, request):
+       request.set_accept_format('json')
+       try:
+               response_str = conn.do_action_with_exception(request)
+               response_detail = json.loads(response_str)
+               logging.debug("_send_request reponse: %s" % response_detail)
+               return response_detail
+       except Exception as e:
+               fail_usage("Failed: _send_request failed: %s" % e)
+
+def start_instance(conn, instance_id):
+       request = StartInstanceRequest()
+       request.set_InstanceId(instance_id)
+       _send_request(conn, request)
+
+def stop_instance(conn, instance_id):
+       request = StopInstanceRequest()
+       request.set_InstanceId(instance_id)
+       request.set_ForceStop('true')
+       _send_request(conn, request)
+
+def reboot_instance(conn, instance_id):
+       request = RebootInstanceRequest()
+       request.set_InstanceId(instance_id)
+       request.set_ForceStop('true')
+       _send_request(conn, request)
+
+def get_status(conn, instance_id):
+       request = DescribeInstancesRequest()
+       request.set_InstanceIds(json.dumps([instance_id]))
+       response = _send_request(conn, request)
+       instance_status = None
+       if response is not None:
+               instance_list = response.get('Instances').get('Instance')
+               for item in instance_list:
+                       instance_status = item.get('Status')
+       return instance_status
+
+def get_nodes_list(conn, options):
+       result = {}
+       request = DescribeInstancesRequest()
+       response = _send_request(conn, request)
+       instance_status = None
+       if response is not None:
+               instance_list = response.get('Instances').get('Instance')
+               for item in instance_list:
+                       instance_id = item.get('InstanceId')
+                       result[instance_id] = ("", None)
+       return result
+
+def get_power_status(conn, options):
+       state = get_status(conn, options["--plug"])
+
+       if state == "Running":
+               status = "on"
+       elif state == "Stopped":
+               status = "off"
+       else:
+               status = "unknown"
+
+       logging.info("get_power_status: %s" % status)
+
+       return status
+
+
+def set_power_status(conn, options):
+       logging.info("set_power_status: %s" % options["--action"])
+
+       if (options["--action"]=="off"):
+               stop_instance(conn, options["--plug"])
+       elif (options["--action"]=="on"):
+               start_instance(conn, options["--plug"])
+       elif (options["--action"]=="reboot"):
+               reboot_instance(conn, options["--plug"])
+
+
+def define_new_opts():
+       all_opt["region"] = {
+               "getopt" : "r:",
+               "longopt" : "region",
+               "help" : "-r, --region=[name]            Region, e.g. 
cn-hangzhou",
+               "shortdesc" : "Region.",
+               "required" : "0",
+               "order" : 2
+       }
+       all_opt["access_key"] = {
+               "getopt" : "a:",
+               "longopt" : "access-key",
+               "help" : "-a, --access-key=[name]         Access Key",
+               "shortdesc" : "Access Key.",
+               "required" : "0",
+               "order" : 3
+       }
+       all_opt["secret_key"] = {
+               "getopt" : "s:",
+               "longopt" : "secret-key",
+               "help" : "-s, --secret-key=[name]         Secret Key",
+               "shortdesc" : "Secret Key.",
+               "required" : "0",
+               "order" : 4
+       }
+
+# Main agent method
+def main():
+       conn = None
+
+       device_opt = ["port", "no_password", "region", "access_key", 
"secret_key"]
+
+       atexit.register(atexit_handler)
+
+       define_new_opts()
+
+       all_opt["power_timeout"]["default"] = "60"
+
+       options = check_input(device_opt, process_input(device_opt))
+
+       docs = {}
+       docs["shortdesc"] = "Fence agent for Aliyun (Aliyun Web Services)"
+       docs["longdesc"] = "fence_aliyun is an I/O Fencing agent for Aliyun"
+       docs["vendorurl"] = "http://www.aliyun.com";
+       show_docs(options, docs)
+
+       run_delay(options)
+
+       if "--region" in options and "--access-key" in options and 
"--secret-key" in options:  
+               region = options["--region"]
+               access_key = options["--access-key"]
+               secret_key = options["--secret-key"]
+               conn = client.AcsClient(access_key, secret_key, region)
+
+
+       # Operate the fencing device
+       result = fence_action(conn, options, set_power_status, 
get_power_status, get_nodes_list)
+       sys.exit(result)
+
+if __name__ == "__main__":
+       main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fence-agents-4.2.1+git.1529316875.1a39345b/agents/amt_ws/fence_amt_ws.py 
new/fence-agents-4.2.1+git.1532964592.3ae5b58e/agents/amt_ws/fence_amt_ws.py
--- 
old/fence-agents-4.2.1+git.1529316875.1a39345b/agents/amt_ws/fence_amt_ws.py    
    2018-06-18 12:14:35.000000000 +0200
+++ 
new/fence-agents-4.2.1+git.1532964592.3ae5b58e/agents/amt_ws/fence_amt_ws.py    
    2018-07-30 17:29:52.000000000 +0200
@@ -24,9 +24,13 @@
 from fencing import *
 from fencing import run_delay, fail_usage, fail, EC_STATUS
 
-import pywsman
 from xml.etree import ElementTree
 
+try:
+       import pywsman
+except ImportError:
+       pass
+
 POWER_ON='2'
 POWER_OFF='8'
 POWER_CYCLE='10'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fence-agents-4.2.1+git.1529316875.1a39345b/agents/gce/fence_gce.py 
new/fence-agents-4.2.1+git.1532964592.3ae5b58e/agents/gce/fence_gce.py
--- old/fence-agents-4.2.1+git.1529316875.1a39345b/agents/gce/fence_gce.py      
2018-06-18 12:14:35.000000000 +0200
+++ new/fence-agents-4.2.1+git.1532964592.3ae5b58e/agents/gce/fence_gce.py      
2018-07-30 17:29:52.000000000 +0200
@@ -1,12 +1,28 @@
 #!@PYTHON@ -tt
 
 import atexit
+import logging
+import os
 import sys
+import time
+if sys.version_info >= (3, 0):
+  # Python 3 imports.
+  import urllib.parse as urlparse
+  import urllib.request as urlrequest
+else:
+  # Python 2 imports.
+  import urllib as urlparse
+  import urllib2 as urlrequest
 sys.path.append("@FENCEAGENTSLIBDIR@")
 
 import googleapiclient.discovery
 from fencing import fail_usage, run_delay, all_opt, atexit_handler, 
check_input, process_input, show_docs, fence_action
 
+
+METADATA_SERVER = 'http://metadata.google.internal/computeMetadata/v1/'
+METADATA_HEADERS = {'Metadata-Flavor': 'Google'}
+
+
 def translate_status(instance_status):
        "Returns on | off | unknown."
        if instance_status == "RUNNING":
@@ -27,6 +43,7 @@
 
        return result
 
+
 def get_power_status(conn, options):
        try:
                instance = conn.instances().get(
@@ -38,29 +55,107 @@
                fail_usage("Failed: get_power_status: {}".format(str(err)))
 
 
+def wait_for_operation(conn, project, zone, operation):
+       while True:
+               result = conn.zoneOperations().get(
+                       project=project,
+                       zone=zone,
+                       operation=operation['name']).execute()
+               if result['status'] == 'DONE':
+                       if 'error' in result:
+                               raise Exception(result['error'])
+                       return
+               time.sleep(1)
+
+
 def set_power_status(conn, options):
        try:
                if options["--action"] == "off":
-                       conn.instances().stop(
+                       logging.info("Issuing poweroff of %s in zone %s" % 
(options["--plug"], options["--zone"]))
+                       operation = conn.instances().stop(
                                        project=options["--project"],
                                        zone=options["--zone"],
                                        instance=options["--plug"]).execute()
+                       wait_for_operation(conn, options["--project"], 
options["--zone"], operation)
+                       logging.info("Poweroff of %s in zone %s complete" % 
(options["--plug"], options["--zone"]))
                elif options["--action"] == "on":
-                       conn.instances().start(
+                       logging.info("Issuing poweron of %s in zone %s" % 
(options["--plug"], options["--zone"]))
+                       operation = conn.instances().start(
                                        project=options["--project"],
                                        zone=options["--zone"],
                                        instance=options["--plug"]).execute()
+                       wait_for_operation(conn, options["--project"], 
options["--zone"], operation)
+                       logging.info("Poweron of %s in zone %s complete" % 
(options["--plug"], options["--zone"]))
        except Exception as err:
                fail_usage("Failed: set_power_status: {}".format(str(err)))
 
 
+def power_cycle(conn, options):
+       try:
+               logging.info('Issuing reset of %s in zone %s' % 
(options["--plug"], options["--zone"]))
+               operation = conn.instances().reset(
+                               project=options["--project"],
+                               zone=options["--zone"],
+                               instance=options["--plug"]).execute()
+               wait_for_operation(conn, options["--project"], 
options["--zone"], operation)
+               logging.info('Reset of %s in zone %s complete' % 
(options["--plug"], options["--zone"]))
+               return True
+       except Exception as err:
+               logging.error("Failed: power_cycle: {}".format(str(err)))
+               return False
+
+
+def get_instance(conn, project, zone, instance):
+       request = conn.instances().get(
+                       project=project, zone=zone, instance=instance)
+       return request.execute()
+
+
+def get_zone(conn, project, instance):
+       fl = 'name="%s"' % instance
+       request = conn.instances().aggregatedList(project=project, filter=fl)
+       while request is not None:
+               response = request.execute()
+               zones = response.get('items', {})
+               for zone in zones.values():
+                       for inst in zone.get('instances', []):
+                               if inst['name'] == instance:
+                                       return inst['zone'].split("/")[-1]
+               request = conn.instances().aggregatedList_next(
+                               previous_request=request, 
previous_response=response)
+       raise Exception("Unable to find instance %s" % (instance))
+
+
+def get_metadata(metadata_key, params=None, timeout=None):
+       """Performs a GET request with the metadata headers.
+
+       Args:
+               metadata_key: string, the metadata to perform a GET request on.
+               params: dictionary, the query parameters in the GET request.
+               timeout: int, timeout in seconds for metadata requests.
+
+       Returns:
+               HTTP response from the GET request.
+
+       Raises:
+               urlerror.HTTPError: raises when the GET request fails.
+       """
+       timeout = timeout or 60
+       metadata_url = os.path.join(METADATA_SERVER, metadata_key)
+       params = urlparse.urlencode(params or {})
+       url = '%s?%s' % (metadata_url, params)
+       request = urlrequest.Request(url, headers=METADATA_HEADERS)
+       request_opener = urlrequest.build_opener(urlrequest.ProxyHandler({}))
+       return request_opener.open(request, timeout=timeout * 1.1).read()
+
+
 def define_new_opts():
        all_opt["zone"] = {
                "getopt" : ":",
                "longopt" : "zone",
                "help" : "--zone=[name]                  Zone, e.g. 
us-central1-b",
                "shortdesc" : "Zone.",
-               "required" : "1",
+               "required" : "0",
                "order" : 2
        }
        all_opt["project"] = {
@@ -68,20 +163,32 @@
                "longopt" : "project",
                "help" : "--project=[name]               Project ID",
                "shortdesc" : "Project ID.",
-               "required" : "1",
+               "required" : "0",
                "order" : 3
        }
+       all_opt["stackdriver-logging"] = {
+               "getopt" : "",
+               "longopt" : "stackdriver-logging",
+               "help" : "--stackdriver-logging         Enable Logging to 
Stackdriver",
+               "shortdesc" : "Stackdriver-logging support.",
+               "longdesc" : "If enabled IP failover logs will be posted to 
stackdriver logging.",
+               "required" : "0",
+               "order" : 4
+       }
+
 
 def main():
        conn = None
 
-       device_opt = ["port", "no_password", "zone", "project"]
+       device_opt = ["port", "no_password", "zone", "project", 
"stackdriver-logging", "method"]
 
        atexit.register(atexit_handler)
 
        define_new_opts()
 
        all_opt["power_timeout"]["default"] = "60"
+       all_opt["method"]["default"] = "cycle"
+       all_opt["method"]["help"] = "-m, --method=[method]          Method to 
fence (onoff|cycle) (Default: cycle)"
 
        options = check_input(device_opt, process_input(device_opt))
 
@@ -97,6 +204,27 @@
 
        run_delay(options)
 
+       # Prepare logging
+       if options.get('--verbose') is None:
+               logging.getLogger('googleapiclient').setLevel(logging.ERROR)
+               logging.getLogger('oauth2client').setLevel(logging.ERROR)
+       if options.get('--stackdriver-logging') is not None and 
options.get('--plug'):
+               try:
+                       import google.cloud.logging.handlers
+                       client = google.cloud.logging.Client()
+                       handler = 
google.cloud.logging.handlers.CloudLoggingHandler(client, 
name=options['--plug'])
+                       handler.setLevel(logging.INFO)
+                       formatter = logging.Formatter('gcp:stonith 
"%(message)s"')
+                       handler.setFormatter(formatter)
+                       root_logger = logging.getLogger()
+                       if options.get('--verbose') is None:
+                               root_logger.setLevel(logging.INFO)
+                       root_logger.addHandler(handler)
+               except ImportError:
+                       logging.error('Couldn\'t import google.cloud.logging, '
+                               'disabling Stackdriver-logging support')
+
+       # Prepare cli
        try:
                credentials = None
                if tuple(googleapiclient.__version__) < tuple("1.6.0"):
@@ -106,8 +234,21 @@
        except Exception as err:
                fail_usage("Failed: Create GCE compute v1 connection: 
{}".format(str(err)))
 
+       # Get project and zone
+       if not options.get("--project"):
+               try:
+                       options["--project"] = 
get_metadata('project/project-id')
+               except Exception as err:
+                       fail_usage("Failed retrieving GCE project. Please 
provide --project option: {}".format(str(err)))
+
+       if not options.get("--zone"):
+               try:
+                       options["--zone"] = get_zone(conn, 
options['--project'], options['--plug'])
+               except Exception as err:
+                       fail_usage("Failed retrieving GCE zone. Please provide 
--zone option: {}".format(str(err)))
+
        # Operate the fencing device
-       result = fence_action(conn, options, set_power_status, 
get_power_status, get_nodes_list)
+       result = fence_action(conn, options, set_power_status, 
get_power_status, get_nodes_list, power_cycle)
        sys.exit(result)
 
 if __name__ == "__main__":
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fence-agents-4.2.1+git.1529316875.1a39345b/agents/ipmilan/fence_ipmilan.py 
new/fence-agents-4.2.1+git.1532964592.3ae5b58e/agents/ipmilan/fence_ipmilan.py
--- 
old/fence-agents-4.2.1+git.1529316875.1a39345b/agents/ipmilan/fence_ipmilan.py  
    2018-06-18 12:14:35.000000000 +0200
+++ 
new/fence-agents-4.2.1+git.1532964592.3ae5b58e/agents/ipmilan/fence_ipmilan.py  
    2018-07-30 17:29:52.000000000 +0200
@@ -171,7 +171,7 @@
                all_opt["lanplus"]["default"] = "1"
 
        all_opt["ipport"]["default"] = "623"
-       all_opt["method"]["help"] = "-m, --method=[method]          Method to 
fence (onoff|cycle) (Default: cycle)\n" \
+       all_opt["method"]["help"] = "-m, --method=[method]          Method to 
fence (onoff|cycle) (Default: onoff)\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."
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fence-agents-4.2.1+git.1529316875.1a39345b/agents/mpath/fence_mpath.py 
new/fence-agents-4.2.1+git.1532964592.3ae5b58e/agents/mpath/fence_mpath.py
--- old/fence-agents-4.2.1+git.1529316875.1a39345b/agents/mpath/fence_mpath.py  
2018-06-18 12:14:35.000000000 +0200
+++ new/fence-agents-4.2.1+git.1532964592.3ae5b58e/agents/mpath/fence_mpath.py  
2018-07-30 17:29:52.000000000 +0200
@@ -143,25 +143,63 @@
                store_fh.write(dev + "\t" + options["--key"] + "\n")
        store_fh.close()
 
-def dev_read(options):
+def dev_read(options, fail=True):
        dev_key = {}
        file_path = options["--store-path"] + "/mpath.devices"
        try:
                store_fh = open(file_path, "r")
        except IOError:
-               fail_usage("Failed: Cannot open file \"" + file_path + "\"")
+               if fail:
+                       fail_usage("Failed: Cannot open file \"" + file_path + 
"\"")
+               else:
+                       return None
        # get not empty lines from file
        for (device, key) in [line.strip().split() for line in store_fh if 
line.strip()]:
                dev_key[device] = key
        store_fh.close()
        return dev_key
 
+def mpath_check_get_verbose():
+       try:
+               f = open("/etc/sysconfig/watchdog", "r")
+       except IOError:
+               return False
+       match = re.search(r"^\s*verbose=yes", "".join(f.readlines()), 
re.MULTILINE)
+       f.close()
+       return bool(match)
+
+def mpath_check(hardreboot=False):
+       if len(sys.argv) >= 3 and sys.argv[1] == "repair":
+               return int(sys.argv[2])
+       options = {}
+       options["--mpathpersist-path"] = "/usr/sbin/mpathpersist"
+       options["--store-path"] = "/var/run/cluster"
+       options["--power-timeout"] = "5"
+       if mpath_check_get_verbose():
+               logging.getLogger().setLevel(logging.DEBUG)
+       devs = dev_read(options, fail=False)
+       if not devs:
+               logging.error("No devices found")
+               return 0
+       for dev, key in list(devs.items()):
+               if key in get_registration_keys(options, dev):
+                       logging.debug("key " + key + " registered with device " 
+ dev)
+                       return 0
+               else:
+                       logging.debug("key " + key + " not registered with 
device " + dev)
+       logging.debug("key " + key + " registered with any devices")
+
+       if hardreboot == True:
+               libc = ctypes.cdll['libc.so.6']
+               libc.reboot(0x1234567)
+       return 2
+
 def define_new_opts():
        all_opt["devices"] = {
                "getopt" : "d:",
                "longopt" : "devices",
                "help" : "-d, --devices=[devices]        List of devices to use 
for current operation",
-               "required" : "1",
+               "required" : "0",
                "shortdesc" : "List of devices to use for current operation. 
Devices can \
 be comma-separated list of device-mapper multipath devices (eg. 
/dev/mapper/3600508b400105df70000e00000ac0000 or /dev/mapper/mpath1). \
 Each device must support SCSI-3 persistent reservations.",
@@ -205,6 +243,12 @@
 
        define_new_opts()
 
+       # fence_mpath_check
+       if os.path.basename(sys.argv[0]) == "fence_mpath_check":
+               sys.exit(mpath_check())
+       elif os.path.basename(sys.argv[0]) == "fence_mpath_check_hardreboot":
+               sys.exit(mpath_check(hardreboot=True))
+
        options = check_input(device_opt, process_input(device_opt), 
other_conditions=True)
 
        docs = {}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fence-agents-4.2.1+git.1529316875.1a39345b/configure.ac 
new/fence-agents-4.2.1+git.1532964592.3ae5b58e/configure.ac
--- old/fence-agents-4.2.1+git.1529316875.1a39345b/configure.ac 2018-06-18 
12:14:35.000000000 +0200
+++ new/fence-agents-4.2.1+git.1532964592.3ae5b58e/configure.ac 2018-07-30 
17:29:52.000000000 +0200
@@ -148,6 +148,11 @@
        AGENTS_LIST=$(echo "$AGENTS_LIST" | sed -E "s/manual( |$)//")
 fi
 
+FENCE_MPATH=0
+if echo "$AGENTS_LIST" | grep -q -E "all|mpath"; then
+       FENCE_MPATH=1
+fi
+
 FENCE_SCSI=0
 if echo "$AGENTS_LIST" | grep -q -E "all|scsi"; then
        FENCE_SCSI=1
@@ -312,6 +317,7 @@
 AC_SUBST([AGENTS_LIST])
 AM_CONDITIONAL(BUILD_FENCE_KDUMP, test $FENCE_KDUMP -eq 1)
 AM_CONDITIONAL(BUILD_FENCE_MANUAL, test $FENCE_MANUAL -eq 1)
+AM_CONDITIONAL(BUILD_FENCE_MPATH, test $FENCE_MPATH -eq 1)
 AM_CONDITIONAL(BUILD_FENCE_SCSI, test $FENCE_SCSI -eq 1)
 AM_CONDITIONAL(BUILD_FENCE_ZVM, test $FENCE_ZVM -eq 1)
 AM_CONDITIONAL(BUILD_XENAPILIB, test $XENAPILIB -eq 1)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fence-agents-4.2.1+git.1529316875.1a39345b/make/fencebuild.mk 
new/fence-agents-4.2.1+git.1532964592.3ae5b58e/make/fencebuild.mk
--- old/fence-agents-4.2.1+git.1529316875.1a39345b/make/fencebuild.mk   
2018-06-18 12:14:35.000000000 +0200
+++ new/fence-agents-4.2.1+git.1532964592.3ae5b58e/make/fencebuild.mk   
2018-07-30 17:29:52.000000000 +0200
@@ -51,7 +51,7 @@
        $(call gen_agent_from_py)
 
 clean: clean-man
-       rm -f $(CLEAN_TARGET:%.8=%) $(CLEAN_TARGET_ADDITIONAL) 
$(scsidata_SCRIPTS) */*.pyc *.pyc */*.wiki
+       rm -f $(CLEAN_TARGET:%.8=%) $(CLEAN_TARGET_ADDITIONAL) 
$(mpathdata_SCRIPTS) $(scsidata_SCRIPTS) */*.pyc *.pyc */*.wiki
 
        if [ "$(abs_builddir)" = "$(abs_top_builddir)/lib" ]; then \
                rm -f $(TARGET); \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fence-agents-4.2.1+git.1529316875.1a39345b/tests/data/metadata/fence_aliyun.xml
 
new/fence-agents-4.2.1+git.1532964592.3ae5b58e/tests/data/metadata/fence_aliyun.xml
--- 
old/fence-agents-4.2.1+git.1529316875.1a39345b/tests/data/metadata/fence_aliyun.xml
 1970-01-01 01:00:00.000000000 +0100
+++ 
new/fence-agents-4.2.1+git.1532964592.3ae5b58e/tests/data/metadata/fence_aliyun.xml
 2018-07-30 17:29:52.000000000 +0200
@@ -0,0 +1,114 @@
+<?xml version="1.0" ?>
+<resource-agent name="fence_aliyun" shortdesc="Fence agent for Aliyun (Aliyun 
Web Services)" >
+<longdesc>fence_aliyun is an I/O Fencing agent for Aliyun</longdesc>
+<vendor-url>http://www.aliyun.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="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="region" unique="0" required="0">
+               <getopt mixed="-r, --region=[name]" />
+               <content type="string"  />
+               <shortdesc lang="en">Region.</shortdesc>
+       </parameter>
+       <parameter name="access_key" unique="0" required="0">
+               <getopt mixed="-a, --access-key=[name]" />
+               <content type="string"  />
+               <shortdesc lang="en">Access Key.</shortdesc>
+       </parameter>
+       <parameter name="secret_key" unique="0" required="0">
+               <getopt mixed="-s, --secret-key=[name]" />
+               <content type="string"  />
+               <shortdesc lang="en">Secret Key.</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</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]" />
+               <content type="string"  />
+               <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="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="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="60"  />
+               <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="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.2.1+git.1529316875.1a39345b/tests/data/metadata/fence_gce.xml
 
new/fence-agents-4.2.1+git.1532964592.3ae5b58e/tests/data/metadata/fence_gce.xml
--- 
old/fence-agents-4.2.1+git.1529316875.1a39345b/tests/data/metadata/fence_gce.xml
    2018-06-18 12:14:35.000000000 +0200
+++ 
new/fence-agents-4.2.1+git.1532964592.3ae5b58e/tests/data/metadata/fence_gce.xml
    2018-07-30 17:29:52.000000000 +0200
@@ -10,6 +10,14 @@
                <content type="string" default="reboot"  />
                <shortdesc lang="en">Fencing action</shortdesc>
        </parameter>
+       <parameter name="method" unique="0" required="0">
+               <getopt mixed="-m, --method=[method]" />
+               <content type="select" default="cycle"  >
+                       <option value="onoff" />
+                       <option value="cycle" />
+               </content>
+               <shortdesc lang="en">Method to fence</shortdesc>
+       </parameter>
        <parameter name="plug" unique="0" required="1" obsoletes="port">
                <getopt mixed="-n, --plug=[id]" />
                <content type="string"  />
@@ -20,16 +28,26 @@
                <content type="string"  />
                <shortdesc lang="en">Physical plug number on device, UUID or 
identification of machine</shortdesc>
        </parameter>
-       <parameter name="zone" unique="0" required="1">
+       <parameter name="zone" unique="0" required="0">
                <getopt mixed="--zone=[name]" />
                <content type="string"  />
                <shortdesc lang="en">Zone.</shortdesc>
        </parameter>
-       <parameter name="project" unique="0" required="1">
+       <parameter name="project" unique="0" required="0">
                <getopt mixed="--project=[name]" />
                <content type="string"  />
                <shortdesc lang="en">Project ID.</shortdesc>
        </parameter>
+       <parameter name="stackdriver-logging" unique="0" required="0" 
deprecated="1">
+               <getopt mixed="--stackdriver-logging" />
+               <content type="boolean"  />
+               <shortdesc lang="en">Stackdriver-logging support.</shortdesc>
+       </parameter>
+       <parameter name="stackdriver_logging" unique="0" required="0" 
obsoletes="stackdriver-logging">
+               <getopt mixed="--stackdriver-logging" />
+               <content type="boolean"  />
+               <shortdesc lang="en">Stackdriver-logging support.</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.2.1+git.1529316875.1a39345b/tests/data/metadata/fence_mpath.xml
 
new/fence-agents-4.2.1+git.1532964592.3ae5b58e/tests/data/metadata/fence_mpath.xml
--- 
old/fence-agents-4.2.1+git.1529316875.1a39345b/tests/data/metadata/fence_mpath.xml
  2018-06-18 12:14:35.000000000 +0200
+++ 
new/fence-agents-4.2.1+git.1532964592.3ae5b58e/tests/data/metadata/fence_mpath.xml
  2018-07-30 17:29:52.000000000 +0200
@@ -9,7 +9,7 @@
                <content type="string" default="off"  />
                <shortdesc lang="en">Fencing action</shortdesc>
        </parameter>
-       <parameter name="devices" unique="0" required="1">
+       <parameter name="devices" unique="0" required="0">
                <getopt mixed="-d, --devices=[devices]" />
                <content type="string"  />
                <shortdesc lang="en">List of devices to use for current 
operation. Devices can be comma-separated list of device-mapper multipath 
devices (eg. /dev/mapper/3600508b400105df70000e00000ac0000 or 
/dev/mapper/mpath1). Each device must support SCSI-3 persistent 
reservations.</shortdesc>


Reply via email to