* [Cluster-devel] [PATCH][fence-agents] fence_eaton_snmp: add support for Eaton Switched ePDU
@ 2011-07-04 18:59 Arnaud Quette
2011-07-05 7:38 ` Fabio M. Di Nitto
2011-07-08 8:39 ` Marek Grac
0 siblings, 2 replies; 5+ messages in thread
From: Arnaud Quette @ 2011-07-04 18:59 UTC (permalink / raw)
To: cluster-devel.redhat.com
Hi,
you will find attached a patch that adds support for Eaton Switched ePDU to
fence_eaton_snmp.
please consider applying it.
cheers,
Arnaud
--
Linux / Unix Expert R&D - Eaton - http://powerquality.eaton.com
Network UPS Tools (NUT) Project Leader - http://www.networkupstools.org/
Debian Developer - http://www.debian.org
Free Software Developer - http://arnaud.quette.free.fr/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/cluster-devel/attachments/20110704/0b3cbd01/attachment.htm>
-------------- next part --------------
diff --git a/fence/agents/eaton_snmp/fence_eaton_snmp.py b/fence/agents/eaton_snmp/fence_eaton_snmp.py
index 81d9810..e24cc13 100644
--- a/fence/agents/eaton_snmp/fence_eaton_snmp.py
+++ b/fence/agents/eaton_snmp/fence_eaton_snmp.py
@@ -1,7 +1,8 @@
#!/usr/bin/python
# The Following agent has been tested on:
-# - Eaton ePDU managed - SNMP v1
+# - Eaton ePDU Managed - SNMP v1
+# - Eaton ePDU Switched - SNMP v1
import sys, re, pexpect
sys.path.append("@FENCEAGENTSLIBDIR@")
@@ -19,7 +20,7 @@ BUILD_DATE=""
OID_SYS_OBJECT_ID='.1.3.6.1.2.1.1.2.0'
### GLOBAL VARIABLES ###
-# Device - see EatonManagedePDU
+# Device - see EatonManagedePDU, EatonSwitchedePDU
device=None
# Port ID
@@ -27,7 +28,11 @@ port_id=None
# Switch ID
switch_id=None
+# Did we issue a set before get (to adjust OID with Switched ePDU)
+after_set=False
+
# Classes describing Device params
+# Managed ePDU
class EatonManagedePDU:
status_oid= '.1.3.6.1.4.1.534.6.6.6.1.2.2.1.3.%d'
control_oid= '.1.3.6.1.4.1.534.6.6.6.1.2.2.1.3.%d'
@@ -35,18 +40,34 @@ class EatonManagedePDU:
ident_str="Eaton Managed ePDU"
state_off=0
state_on=1
- state_cycling=2
+ state_cycling=2 # FIXME: not usable with fence-agents
turn_off=0
turn_on=1
- turn_cycle=2
- # FIXME: what's this?
+ turn_cycle=2 # FIXME: not usable with fence-agents
+ has_switches=False
+
+# Switched ePDU (Pulizzi 2)
+# NOTE: sysOID reports "20677.1", while data are actually at "20677.2"
+class EatonSwitchedePDU:
+ status_oid= '.1.3.6.1.4.1.20677.2.6.3.%d.0'
+ control_oid= '.1.3.6.1.4.1.20677.2.6.2.%d.0'
+ outlet_table_oid='.1.3.6.1.4.1.20677.2.6.3'
+ ident_str="Eaton Switched ePDU"
+ state_off=2
+ state_on=1
+ state_cycling=0 # Note: this status doesn't exist on this device
+ turn_off=2
+ turn_on=1
+ turn_cycle=3 # FIXME: not usable with fence-agents
has_switches=False
### FUNCTIONS ###
def eaton_set_device(conn,options):
global device
- agents_dir={'.1.3.6.1.4.1.534.6.6.6':EatonManagedePDU}
+ agents_dir={'.1.3.6.1.4.1.534.6.6.6':EatonManagedePDU,
+ '.1.3.6.1.4.1.20677.1':EatonSwitchedePDU,
+ '.1.3.6.1.4.1.20677.2':EatonSwitchedePDU }
# First resolve type of Eaton
eaton_type=conn.walk(OID_SYS_OBJECT_ID)
@@ -64,6 +85,10 @@ def eaton_resolv_port_id(conn,options):
if (device==None):
eaton_set_device(conn,options)
+ # Restore the increment, that was removed in main for ePDU Managed
+ if (device.ident_str == "Eaton Switched ePDU"):
+ options["-n"] = str(int(options["-n"]) + 1)
+
# Now we resolv port_id/switch_id
if ((options["-n"].isdigit()) and ((not device.has_switches) or (options["-s"].isdigit()))):
port_id=int(options["-n"])
@@ -80,28 +105,53 @@ def eaton_resolv_port_id(conn,options):
port_id=int(t[len(t)-1])
switch_id=int(t[len(t)-3])
else:
- port_id=int(t[len(t)-1])
+ if (device.ident_str == "Eaton Switched ePDU"):
+ port_id=int(t[len(t)-3])
+ else:
+ port_id=int(t[len(t)-1])
if (port_id==None):
+ # Restore index offset, to provide a valid error output on Managed ePDU
+ if (device.ident_str != "Eaton Switched ePDU"):
+ options["-n"] = str(int(options["-n"]) + 1)
fail_usage("Can't find port with name %s!"%(options["-n"]))
def get_power_status(conn,options):
- global port_id,switch_id,device
+ global port_id,switch_id,device,after_set
if (port_id==None):
eaton_resolv_port_id(conn,options)
+ # Ajust OID for Switched ePDU when the get is after a set
+ if ((after_set == True) and (device.ident_str == "Eaton Switched ePDU")):
+ port_id-=1
+ after_set=False
+
oid=((device.has_switches) and device.status_oid%(switch_id,port_id) or device.status_oid%(port_id))
- (oid,status)=conn.get(oid)
- return (status==str(device.state_on) and "on" or "off")
+ try:
+ (oid,status)=conn.get(oid)
+ if (status==str(device.state_on)):
+ return "on"
+ elif (status==str(device.state_off)):
+ return "off"
+ else:
+ return None
+ except:
+ return None
def set_power_status(conn, options):
- global port_id,switch_id,device
+ global port_id,switch_id,device,after_set
+
+ after_set = True
if (port_id==None):
eaton_resolv_port_id(conn,options)
+ # Controls start at #2 on Switched ePDU, since #1 is the global command
+ if (device.ident_str == "Eaton Switched ePDU"):
+ port_id=int(port_id)+1
+
oid=((device.has_switches) and device.control_oid%(switch_id,port_id) or device.control_oid%(port_id))
conn.set(oid,(options["-o"]=="on" and device.turn_on or device.turn_off))
@@ -110,6 +160,7 @@ def set_power_status(conn, options):
def get_outlets_status(conn, options):
global device
+ outletCount = 0
result={}
if (device==None):
@@ -118,19 +169,31 @@ def get_outlets_status(conn, options):
res_ports=conn.walk(device.outlet_table_oid,30)
for x in res_ports:
+ outletCount+=1
+ status=x[1]
t=x[0].split('.')
# Plug indexing start from zero, so we substract '1' from the
# user's given plug number
- port_num=str(int(((device.has_switches) and "%s:%s"%(t[len(t)-3],t[len(t)-1]) or "%s"%(t[len(t)-1]))) + 1)
-
- # Plug indexing start from zero, so we add '1'
- # for the user's exposed plug number
- port_name=str(int(x[1].strip('"')) + 1)
- port_status=""
- result[port_num]=(port_name,port_status)
-
- return result
+ if (device.ident_str == "Eaton Managed ePDU"):
+ port_num=str(int(((device.has_switches) and "%s:%s"%(t[len(t)-3],t[len(t)-1]) or "%s"%(t[len(t)-1]))) + 1)
+
+ # Plug indexing start from zero, so we add '1'
+ # for the user's exposed plug number
+ port_name=str(int(x[1].strip('"')) + 1)
+ port_status=""
+ result[port_num]=(port_name,port_status)
+ else:
+ # Switched ePDU do not propose an outletCount OID!
+ # Invalid status (ie value == '0'), retrieved via the walk,
+ # means the outlet is absent
+ port_num=str(outletCount)
+ port_name=str(outletCount)
+ port_status=""
+ if (status != '0'):
+ result[port_num]=(port_name,port_status)
+
+ return result
# Define new options
def eaton_snmp_define_defaults():
@@ -154,7 +217,7 @@ def main():
options=check_input(device_opt,process_input(device_opt))
- ## Support for -n [switch]:[plug] notation that was used before
+ ## Support for -n [switch]:[plug] notation that was used before
if ((options.has_key("-n")) and (-1 != options["-n"].find(":"))):
(switch, plug) = options["-n"].split(":", 1)
if ((switch.isdigit()) and (plug.isdigit())):
@@ -164,8 +227,9 @@ def main():
if (not (options.has_key("-s"))):
options["-s"]="1"
- # Plug indexing start from zero, so we substract '1' from the
- # user's given plug number
+ # Plug indexing start from zero on ePDU Managed, so we substract '1' from
+ # the user's given plug number.
+ # For Switched ePDU, we will add this back again later.
if ((options.has_key("-n")) and (options["-n"].isdigit())):
options["-n"] = str(int(options["-n"]) - 1)
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [Cluster-devel] [PATCH][fence-agents] fence_eaton_snmp: add support for Eaton Switched ePDU
2011-07-04 18:59 [Cluster-devel] [PATCH][fence-agents] fence_eaton_snmp: add support for Eaton Switched ePDU Arnaud Quette
@ 2011-07-05 7:38 ` Fabio M. Di Nitto
2011-07-05 8:15 ` Arnaud Quette
2011-07-08 8:39 ` Marek Grac
1 sibling, 1 reply; 5+ messages in thread
From: Fabio M. Di Nitto @ 2011-07-05 7:38 UTC (permalink / raw)
To: cluster-devel.redhat.com
On 7/4/2011 8:59 PM, Arnaud Quette wrote:
> Hi,
>
> you will find attached a patch that adds support for Eaton Switched
> ePDU to fence_eaton_snmp.
> please consider applying it.
Applied, thanks.
I tested the changes against the managed ePDU I have here and I don?t
see regressions.
Fabio
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Cluster-devel] [PATCH][fence-agents] fence_eaton_snmp: add support for Eaton Switched ePDU
2011-07-04 18:59 [Cluster-devel] [PATCH][fence-agents] fence_eaton_snmp: add support for Eaton Switched ePDU Arnaud Quette
2011-07-05 7:38 ` Fabio M. Di Nitto
@ 2011-07-08 8:39 ` Marek Grac
2011-07-10 20:10 ` Arnaud Quette
1 sibling, 1 reply; 5+ messages in thread
From: Marek Grac @ 2011-07-08 8:39 UTC (permalink / raw)
To: cluster-devel.redhat.com
Hi Arnaud,
On 07/04/2011 08:59 PM, Arnaud Quette wrote:
> Hi,
>
> you will find attached a patch that adds support for Eaton Switched
> ePDU to fence_eaton_snmp.
> please consider applying it.
What do you think about replacing magic numbers (+1, -1, -3) with some
constants with names?
m,
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2011-07-10 20:10 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-07-04 18:59 [Cluster-devel] [PATCH][fence-agents] fence_eaton_snmp: add support for Eaton Switched ePDU Arnaud Quette
2011-07-05 7:38 ` Fabio M. Di Nitto
2011-07-05 8:15 ` Arnaud Quette
2011-07-08 8:39 ` Marek Grac
2011-07-10 20:10 ` Arnaud Quette
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).