cluster-devel.redhat.com archive mirror
 help / color / mirror / Atom feed
* [Cluster-devel] [PATCH 3/3] fence_amt: option --method and new option --amttool-path
       [not found] <1078693570.3048094.1385742338995.JavaMail.root@redhat.com>
@ 2013-11-29 16:32 ` Ondrej Mular
  2013-11-29 21:37   ` Fabio M. Di Nitto
  0 siblings, 1 reply; 2+ messages in thread
From: Ondrej Mular @ 2013-11-29 16:32 UTC (permalink / raw)
  To: cluster-devel.redhat.com

Add support for option --method and new option --amttool-path

---
 fence/agents/amt/fence_amt.py | 72 ++++++++++++++++++++++++++++++++++---------
 1 file changed, 57 insertions(+), 15 deletions(-)

diff --git a/fence/agents/amt/fence_amt.py b/fence/agents/amt/fence_amt.py
index 8fe2dbc..7077828 100755
--- a/fence/agents/amt/fence_amt.py
+++ b/fence/agents/amt/fence_amt.py
@@ -1,6 +1,6 @@
 #!/usr/bin/python
 
-import sys, subprocess, re
+import sys, subprocess, re, os, stat
 from pipes import quote
 sys.path.append("@FENCEAGENTSLIBDIR@")
 from fencing import *
@@ -21,12 +21,11 @@ def get_power_status(_, options):
     try:
         process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
     except OSError:
-        fail(EC_TOOL_FAIL)
+        fail_usage("Amttool not found or not accessible")
 
     process.wait()
 
     output = process.communicate()
-
     process.stdout.close()
 
     match = re.search('Powerstate:[\\s]*(..)', str(output))
@@ -51,19 +50,44 @@ def set_power_status(_, options):
         process = subprocess.Popen(cmd, stdout=null, stderr=null, shell=True)
     except OSError:
         null.close()
-        fail(EC_TOOL_FAIL)
+        fail_usage("Amttool not found or not accessible")
 
     process.wait()
     null.close()
 
     return
 
+def reboot_cycle(_, options):
+    cmd = create_command(options, "cycle")
+
+    if options["log"] >= LOG_MODE_VERBOSE:
+        options["debug_fh"].write("executing: " + cmd + "\n")
+
+    null = open('/dev/null', 'w')
+    try:
+        process = subprocess.Popen(cmd, stdout=null, stderr=null, shell=True)
+    except OSError:
+        null.close()
+        fail_usage("Amttool not found or not accessible")
+
+    status = process.wait()
+    null.close()
+
+    return not bool(status)
+
+def is_executable(path):
+    if os.path.exists(path):
+        stats = os.stat(path)
+        if stat.S_ISREG(stats.st_mode) and os.access(path, os.X_OK):
+            return True
+    return False
+
 def create_command(options, action):
 
     # --password / -p
     cmd = "AMT_PASSWORD=" + quote(options["--password"])
 
-    cmd += " " + options["amttool_path"]
+    cmd += " " + options["--amttool-path"]
 
     # --ip / -a
     cmd += " " + options["--ip"]
@@ -77,7 +101,10 @@ def create_command(options, action):
     elif action == "off":
         cmd = "echo \"y\"|" + cmd
         cmd += " powerdown"
-    if action in ["on", "off"] and options.has_key("--boot-options"):
+    elif action == "cycle":
+        cmd = "echo \"y\"|" + cmd
+        cmd += " powercycle"
+    if action in ["on", "off", "cycle"] and options.has_key("--boot-options"):
         cmd += options["--boot-options"]
 
     # --use-sudo / -d
@@ -86,25 +113,40 @@ def create_command(options, action):
 
     return cmd
 
-def main():
-
-    atexit.register(atexit_handler)
-
-    device_opt = [ "ipaddr", "no_login", "passwd", "boot_option", "no_port", "sudo"]
-
+def define_new_opts():
     all_opt["boot_option"] = {
         "getopt" : "b:",
         "longopt" : "boot-option",
-        "help":"-b, --boot-option=[option] Change the default boot behavior of the machine. (pxe|hd|hdsafe|cd|diag)",
+        "help":"-b, --boot-option=[option]     Change the default boot behavior of the machine. (pxe|hd|hdsafe|cd|diag)",
         "required" : "0",
         "shortdesc" : "Change the default boot behavior of the machine.",
             "choices" : ["pxe", "hd", "hdsafe", "cd", "diag"],
           "order" : 1
         }
+    all_opt["amttool_path"] = {
+        "getopt" : "i:",
+        "longopt" : "amttool-path",
+        "help" : "--amttool-path=[path]          Path to amttool binary",
+        "required" : "0",
+        "shortdesc" : "Path to amttool binary",
+        "default" : "/usr/bin/amttool",
+        "order": 200
+        }
+
+
+def main():
+
+    atexit.register(atexit_handler)
+
+    device_opt = [ "ipaddr", "no_login", "passwd", "boot_option", "no_port",
+         "sudo", "amttool_path", "method" ]
+
+    define_new_opts()
 
     options = check_input(device_opt, process_input(device_opt))
 
-    options["amttool_path"] = "/usr/bin/amttool"
+    if not is_executable(options["--amttool-path"]):
+        fail_usage("Amttool not found or not accessible")
 
     docs = { }
     docs["shortdesc"] = "Fence agent for AMT"
@@ -112,7 +154,7 @@ def main():
     docs["vendorurl"] = "http://www.intel.com/"
     show_docs(options, docs)
 
-    result = fence_action(None, options, set_power_status, get_power_status, None)
+    result = fence_action(None, options, set_power_status, get_power_status, None, reboot_cycle)
 
     sys.exit(result)
 
-- 
1.8.3.1



^ permalink raw reply related	[flat|nested] 2+ messages in thread

* [Cluster-devel] [PATCH 3/3] fence_amt: option --method and new option --amttool-path
  2013-11-29 16:32 ` [Cluster-devel] [PATCH 3/3] fence_amt: option --method and new option --amttool-path Ondrej Mular
@ 2013-11-29 21:37   ` Fabio M. Di Nitto
  0 siblings, 0 replies; 2+ messages in thread
From: Fabio M. Di Nitto @ 2013-11-29 21:37 UTC (permalink / raw)
  To: cluster-devel.redhat.com

On 11/29/2013 05:32 PM, Ondrej Mular wrote:
> Add support for option --method and new option --amttool-path
> 
> ---
>  fence/agents/amt/fence_amt.py | 72 ++++++++++++++++++++++++++++++++++---------
>  1 file changed, 57 insertions(+), 15 deletions(-)
> 
> diff --git a/fence/agents/amt/fence_amt.py b/fence/agents/amt/fence_amt.py
> index 8fe2dbc..7077828 100755
> --- a/fence/agents/amt/fence_amt.py
> +++ b/fence/agents/amt/fence_amt.py
> @@ -1,6 +1,6 @@
>  #!/usr/bin/python
>  
> -import sys, subprocess, re
> +import sys, subprocess, re, os, stat
>  from pipes import quote
>  sys.path.append("@FENCEAGENTSLIBDIR@")
>  from fencing import *
> @@ -21,12 +21,11 @@ def get_power_status(_, options):
>      try:
>          process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
>      except OSError:
> -        fail(EC_TOOL_FAIL)
> +        fail_usage("Amttool not found or not accessible")
>  
>      process.wait()
>  
>      output = process.communicate()
> -
>      process.stdout.close()
>  
>      match = re.search('Powerstate:[\\s]*(..)', str(output))
> @@ -51,19 +50,44 @@ def set_power_status(_, options):
>          process = subprocess.Popen(cmd, stdout=null, stderr=null, shell=True)
>      except OSError:
>          null.close()
> -        fail(EC_TOOL_FAIL)
> +        fail_usage("Amttool not found or not accessible")
>  
>      process.wait()
>      null.close()
>  
>      return
>  
> +def reboot_cycle(_, options):
> +    cmd = create_command(options, "cycle")
> +
> +    if options["log"] >= LOG_MODE_VERBOSE:
> +        options["debug_fh"].write("executing: " + cmd + "\n")
> +
> +    null = open('/dev/null', 'w')
> +    try:
> +        process = subprocess.Popen(cmd, stdout=null, stderr=null, shell=True)
> +    except OSError:
> +        null.close()
> +        fail_usage("Amttool not found or not accessible")
> +
> +    status = process.wait()
> +    null.close()
> +
> +    return not bool(status)
> +
> +def is_executable(path):
> +    if os.path.exists(path):
> +        stats = os.stat(path)
> +        if stat.S_ISREG(stats.st_mode) and os.access(path, os.X_OK):
> +            return True
> +    return False
> +
>  def create_command(options, action):
>  
>      # --password / -p
>      cmd = "AMT_PASSWORD=" + quote(options["--password"])
>  
> -    cmd += " " + options["amttool_path"]
> +    cmd += " " + options["--amttool-path"]
>  
>      # --ip / -a
>      cmd += " " + options["--ip"]
> @@ -77,7 +101,10 @@ def create_command(options, action):
>      elif action == "off":
>          cmd = "echo \"y\"|" + cmd
>          cmd += " powerdown"
> -    if action in ["on", "off"] and options.has_key("--boot-options"):
> +    elif action == "cycle":
> +        cmd = "echo \"y\"|" + cmd
> +        cmd += " powercycle"
> +    if action in ["on", "off", "cycle"] and options.has_key("--boot-options"):
>          cmd += options["--boot-options"]
>  
>      # --use-sudo / -d
> @@ -86,25 +113,40 @@ def create_command(options, action):
>  
>      return cmd
>  
> -def main():
> -
> -    atexit.register(atexit_handler)
> -
> -    device_opt = [ "ipaddr", "no_login", "passwd", "boot_option", "no_port", "sudo"]
> -
> +def define_new_opts():
>      all_opt["boot_option"] = {
>          "getopt" : "b:",
>          "longopt" : "boot-option",
> -        "help":"-b, --boot-option=[option] Change the default boot behavior of the machine. (pxe|hd|hdsafe|cd|diag)",
> +        "help":"-b, --boot-option=[option]     Change the default boot behavior of the machine. (pxe|hd|hdsafe|cd|diag)",
>          "required" : "0",
>          "shortdesc" : "Change the default boot behavior of the machine.",
>              "choices" : ["pxe", "hd", "hdsafe", "cd", "diag"],
>            "order" : 1
>          }
> +    all_opt["amttool_path"] = {
> +        "getopt" : "i:",
> +        "longopt" : "amttool-path",
> +        "help" : "--amttool-path=[path]          Path to amttool binary",
> +        "required" : "0",
> +        "shortdesc" : "Path to amttool binary",
> +        "default" : "/usr/bin/amttool",

similar here. Hardcoding paths is bad.

Fabio



^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2013-11-29 21:37 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <1078693570.3048094.1385742338995.JavaMail.root@redhat.com>
2013-11-29 16:32 ` [Cluster-devel] [PATCH 3/3] fence_amt: option --method and new option --amttool-path Ondrej Mular
2013-11-29 21:37   ` Fabio M. Di Nitto

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).