From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12252 invoked by alias); 30 Mar 2009 12:44:27 -0000 Received: (qmail 12245 invoked by alias); 30 Mar 2009 12:44:26 -0000 X-SWARE-Spam-Status: No, hits=1.2 required=5.0 tests=AWL,BAYES_50,J_CHICKENPOX_27,J_CHICKENPOX_34,J_CHICKENPOX_35,J_CHICKENPOX_36,J_CHICKENPOX_44,SPF_HELO_PASS X-Spam-Status: No, hits=1.2 required=5.0 tests=AWL,BAYES_50,J_CHICKENPOX_27,J_CHICKENPOX_34,J_CHICKENPOX_35,J_CHICKENPOX_36,J_CHICKENPOX_44,SPF_HELO_PASS X-Spam-Check-By: sourceware.org X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on bastion.fedora.phx.redhat.com Subject: cluster: STABLE2 - fence_cisco: Added fence agent for Cisco MDS 9124/9134 To: cluster-cvs-relay@redhat.com X-Project: Cluster Project X-Git-Module: cluster.git X-Git-Refname: refs/heads/STABLE2 X-Git-Reftype: branch X-Git-Oldrev: c097a807fcc3482ee0b899ef6311ca7cae2a278e X-Git-Newrev: 61a99bda889ccf696495b4095e93b04bfdee88e2 From: Jan Friesse Message-Id: <20090330124400.331531202D3@lists.fedorahosted.org> Date: Mon, 30 Mar 2009 12:44:00 -0000 X-Scanned-By: MIMEDefang 2.58 on 172.16.52.254 Mailing-List: contact cluster-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: cluster-cvs-owner@sourceware.org X-SW-Source: 2009-q1/txt/msg00978.txt.bz2 Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=61a99bda889ccf696495b4095e93b04bfdee88e2 Commit: 61a99bda889ccf696495b4095e93b04bfdee88e2 Parent: c097a807fcc3482ee0b899ef6311ca7cae2a278e Author: Jan Friesse AuthorDate: Mon Mar 30 14:10:40 2009 +0200 Committer: Jan Friesse CommitterDate: Mon Mar 30 14:43:21 2009 +0200 fence_cisco: Added fence agent for Cisco MDS 9124/9134 Agent uses SNMP, so Python fencing_snmp library is included in this patch too. This library uses fencing.py library, and add option to write small agents using SNMP. Library contains class FencingSnmp, designed to be instanciate and passed in agent's call of fence_action. After that, developer has in conn variable this object, and can call functions set/get/walk. RHBZ#480836 --- fence/agents/cisco_mds/Makefile | 5 + fence/agents/cisco_mds/fence_cisco_mds.py | 113 ++++++++++++++++++++++++ fence/agents/lib/Makefile | 2 +- fence/agents/lib/fencing.py.py | 37 ++++++++- fence/agents/lib/fencing_snmp.py.py | 117 +++++++++++++++++++++++++ fence/man/Makefile | 1 + fence/man/fence_cisco_mds.8 | 132 +++++++++++++++++++++++++++++ 7 files changed, 405 insertions(+), 2 deletions(-) diff --git a/fence/agents/cisco_mds/Makefile b/fence/agents/cisco_mds/Makefile new file mode 100644 index 0000000..e4e8c9f --- /dev/null +++ b/fence/agents/cisco_mds/Makefile @@ -0,0 +1,5 @@ +include ../../../make/defines.mk + +TARGET= fence_cisco_mds + +include $(OBJDIR)/make/fencebuild.mk diff --git a/fence/agents/cisco_mds/fence_cisco_mds.py b/fence/agents/cisco_mds/fence_cisco_mds.py new file mode 100644 index 0000000..bda66bb --- /dev/null +++ b/fence/agents/cisco_mds/fence_cisco_mds.py @@ -0,0 +1,113 @@ +#!/usr/bin/python + +# The Following agent has been tested on: +# - Cisco MDS UROS 9134 FC (1 Slot) Chassis ("1/2/4 10 Gbps FC/Supervisor-2") Motorola, e500v2 +# with BIOS 1.0.16, kickstart 4.1(1c), system 4.1(1c) +# - Cisco MDS 9124 (1 Slot) Chassis ("1/2/4 Gbps FC/Supervisor-2") Motorola, e500 +# with BIOS 1.0.16, kickstart 4.1(1c), system 4.1(1c) + +import sys, re, pexpect +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing_snmp import * + +#BEGIN_VERSION_GENERATION +RELEASE_VERSION="" +REDHAT_COPYRIGHT="" +BUILD_DATE="" +#END_VERSION_GENERATION + +### CONSTANTS ### +# Cisco admin status +PORT_ADMIN_STATUS_OID=".1.3.6.1.2.1.75.1.2.2.1.1" + +# IF-MIB trees for alias, status and port +ALIASES_OID=".1.3.6.1.2.1.31.1.1.1.18" +PORTS_OID=".1.3.6.1.2.1.2.2.1.2" + +### GLOBAL VARIABLES ### +# OID converted from fc port name (fc(x)/(y)) +port_oid="" + +### FUNCTIONS ### + +# Convert cisco port name (fc(x)/(y)) to OID +def cisco_port2oid(port): + port=port.lower() + + nums=re.match('^fc(\d+)/(\d+)$',port) + + if ((nums) and (len(nums.groups()))==2): + return "%s.%d.%d"%(PORT_ADMIN_STATUS_OID,int(nums.group(1))+21,int(nums.group(2))-1) + else: + fail_usage("Mangled port number: %s"%(port)) + +def get_power_status(conn,options): + global port_oid + + (oid,status)=conn.get(port_oid) + return (status=="1" and "on" or "off") + +def set_power_status(conn, options): + global port_oid + + conn.set(port_oid,(options["-o"]=="on" and 1 or 2)) + +# 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 +def array_to_dict(ar): + return dict(map(lambda y:[y[0].split('.')[-1],y[1]],ar)) + +def get_outlets_status(conn, options): + result={} + + res_fc=conn.walk(PORTS_OID,30) + res_aliases=array_to_dict(conn.walk(ALIASES_OID,30)) + + fc_re=re.compile('^"fc\d+/\d+"$') + + for x in res_fc: + if fc_re.match(x[1]): + port_num=x[0].split('.')[-1] + + port_name=x[1].strip('"') + port_alias=(res_aliases.has_key(port_num) and res_aliases[port_num].strip('"') or "") + port_status="" + result[port_name]=(port_alias,port_status) + + return result + +# Main agent method +def main(): + global port_oid + + device_opt = [ "help", "version", "agent", "quiet", "verbose", "debug", + "action", "ipaddr", "login", "passwd", "passwd_script", + "test", "port", "no_login", "no_password", + "snmp_version", "community", "snmp_auth_prot", "snmp_sec_level", + "snmp_priv_prot", "snmp_priv_passwd", "snmp_priv_passwd_script", + "udpport"] + + options=process_input(device_opt) + + # Emulate enable/disable functionality + if (options.has_key("-o")): + options["-o"]=options["-o"].lower() + + if (options["-o"]=="enable"): + options["-o"]="on" + if (options["-o"]=="disable"): + options["-o"]="off" + else: + options["-o"]="off" + + options = check_input(device_opt, options) + + if (not (options["-o"] in ["list","monitor"])): + port_oid=cisco_port2oid(options["-n"]) + + # Operate the fencing device + fence_action(FencingSnmp(options), options, set_power_status, get_power_status) + +if __name__ == "__main__": + main() diff --git a/fence/agents/lib/Makefile b/fence/agents/lib/Makefile index 00666fa..049ff6e 100644 --- a/fence/agents/lib/Makefile +++ b/fence/agents/lib/Makefile @@ -1,6 +1,6 @@ include ../../../make/defines.mk -TARGET= fencing.py telnet_ssl +TARGET= fencing.py telnet_ssl fencing_snmp.py FENCEAGENTSLIB= $(TARGET) diff --git a/fence/agents/lib/fencing.py.py b/fence/agents/lib/fencing.py.py index 64a13aa..1cf1220 100644 --- a/fence/agents/lib/fencing.py.py +++ b/fence/agents/lib/fencing.py.py @@ -152,7 +152,39 @@ all_opt = { "vmpasswd_script" : { "getopt" : "B:", "help" : "-B