From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 4042 invoked by alias); 30 Mar 2009 12:11:31 -0000 Received: (qmail 4033 invoked by alias); 30 Mar 2009 12:11:30 -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: RHEL5 - 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/RHEL5 X-Git-Reftype: branch X-Git-Oldrev: 35f2b0df8c8acc5371a6d45c398bd7cb12937ab5 X-Git-Newrev: 321445dff2be4d808eaf6dbc4c2fef70a6b0f53d From: Jan Friesse Message-Id: <20090330121107.147251202D3@lists.fedorahosted.org> Date: Mon, 30 Mar 2009 12:11: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/msg00975.txt.bz2 Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=321445dff2be4d808eaf6dbc4c2fef70a6b0f53d Commit: 321445dff2be4d808eaf6dbc4c2fef70a6b0f53d Parent: 35f2b0df8c8acc5371a6d45c398bd7cb12937ab5 Author: Jan Friesse AuthorDate: Mon Mar 30 14:10:40 2009 +0200 Committer: Jan Friesse CommitterDate: Mon Mar 30 14:10:40 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/Makefile | 3 + fence/agents/cisco_mds/Makefile | 38 ++++++++ fence/agents/cisco_mds/fence_cisco_mds.py | 113 ++++++++++++++++++++++++ fence/agents/lib/Makefile | 18 +++- 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 +++++++++++++++++++++++++++++ 8 files changed, 455 insertions(+), 4 deletions(-) diff --git a/fence/agents/Makefile b/fence/agents/Makefile index 4ac3039..80655fb 100644 --- a/fence/agents/Makefile +++ b/fence/agents/Makefile @@ -21,6 +21,7 @@ all: ${MAKE} -C bladecenter all ${MAKE} -C brocade all ${MAKE} -C bullpap all + ${MAKE} -C cisco_mds all # ${MAKE} -C cpint all ${MAKE} -C drac all ${MAKE} -C egenera all @@ -50,6 +51,7 @@ install: all ${MAKE} -C bladecenter install ${MAKE} -C brocade install ${MAKE} -C bullpap install + ${MAKE} -C cisco_mds install # ${MAKE} -C cpint install ${MAKE} -C drac install ${MAKE} -C egenera install @@ -79,6 +81,7 @@ clean: ${MAKE} -C bladecenter clean ${MAKE} -C brocade clean ${MAKE} -C bullpap clean + ${MAKE} -C cisco_mds clean # ${MAKE} -C cpint clean ${MAKE} -C drac clean ${MAKE} -C egenera clean diff --git a/fence/agents/cisco_mds/Makefile b/fence/agents/cisco_mds/Makefile new file mode 100644 index 0000000..f61b83b --- /dev/null +++ b/fence/agents/cisco_mds/Makefile @@ -0,0 +1,38 @@ +############################################################################### +############################################################################### +## +## Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. +## Copyright (C) 2004 Red Hat, Inc. All rights reserved. +## +## This copyrighted material is made available to anyone wishing to use, +## modify, copy, or redistribute it subject to the terms and conditions +## of the GNU General Public License v.2. +## +############################################################################### +############################################################################### + +SOURCE= fence_cisco_mds.py +TARGET= fence_cisco_mds + +top_srcdir=../.. +include ${top_srcdir}/make/defines.mk + +all: $(TARGET) + +fence_cisco_mds: fence_cisco_mds.py + : > $(TARGET) + awk "{print}(\$$1 ~ /#BEGIN_VERSION_GENERATION/){exit 0}" $(SOURCE) >> $(TARGET) + echo "FENCE_RELEASE_NAME=\"${RELEASE}\";" >> $(TARGET) + ${top_srcdir}/scripts/define2var ${top_srcdir}/config/copyright.cf sh REDHAT_COPYRIGHT >> $(TARGET) + echo "BUILD_DATE=\"(built `date`)\";" >> $(TARGET) + awk -v p=0 "(\$$1 ~ /#END_VERSION_GENERATION/){p = 1} {if(p==1)print}" $(SOURCE) >> $(TARGET) + chmod +x $(TARGET) + +install: all + if [ ! -d ${sbindir} ]; then \ + install -d ${sbindir}; \ + fi + install -m755 ${TARGET} ${sbindir} + +clean: + rm -f $(TARGET) 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..40faf94 --- /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("/usr/lib/fence") +from fencing import * +from fencing_snmp import * + +#BEGIN_VERSION_GENERATION +FENCE_RELEASE_NAME="" +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 0f6063d..b4cf466 100644 --- a/fence/agents/lib/Makefile +++ b/fence/agents/lib/Makefile @@ -17,10 +17,13 @@ TARGET1= fencing.py SOURCE2= telnet_ssl.py TARGET2= telnet_ssl +SOURCE3= fencing_snmp.py.py +TARGET3= fencing_snmp.py + top_srcdir=../.. include ${top_srcdir}/make/defines.mk -all: $(TARGET1) $(TARGET2) +all: $(TARGET1) $(TARGET2) $(TARGET3) $(TARGET1): $(SOURCE1) : > $(TARGET1) @@ -40,11 +43,20 @@ $(TARGET2): $(SOURCE2) awk -v p=0 "(\$$1 ~ /#END_VERSION_GENERATION/){p = 1} {if(p==1)print}" $(SOURCE2) >> $(TARGET2) chmod +x $(TARGET2) +$(TARGET3): $(SOURCE3) + : > $(TARGET3) + awk "{print}(\$$1 ~ /#BEGIN_VERSION_GENERATION/){exit 0}" $(SOURCE3) >> $(TARGET3) + echo "FENCE_RELEASE_NAME=\"${RELEASE}\";" >> $(TARGET3) + ${top_srcdir}/scripts/define2var ${top_srcdir}/config/copyright.cf sh REDHAT_COPYRIGHT >> $(TARGET3) + echo "BUILD_DATE=\"(built `date`)\";" >> $(TARGET3) + awk -v p=0 "(\$$1 ~ /#END_VERSION_GENERATION/){p = 1} {if(p==1)print}" $(SOURCE3) >> $(TARGET3) + chmod +x $(TARGET3) + install: all if [ ! -d ${DESTDIR}/usr/lib/fence ]; then \ install -d ${DESTDIR}/usr/lib/fence; \ fi - install -m755 ${TARGET1} ${TARGET2} ${DESTDIR}/usr/lib/fence + install -m755 ${TARGET1} ${TARGET2} ${TARGET3} ${DESTDIR}/usr/lib/fence clean: - rm -f $(TARGET1) $(TARGET2) + rm -f $(TARGET1) $(TARGET2) $(TARGET3) diff --git a/fence/agents/lib/fencing.py.py b/fence/agents/lib/fencing.py.py index 6eacf6c..12e162c 100644 --- a/fence/agents/lib/fencing.py.py +++ b/fence/agents/lib/fencing.py.py @@ -157,7 +157,39 @@ all_opt = { "vmpasswd_script" : { "getopt" : "B:", "help" : "-B