public inbox for cluster-cvs@sourceware.org
help / color / mirror / Atom feed
* fence-agents: master - fence_intelmodular: Rewrite of agent under Python unified library
@ 2009-03-11 11:57 Jan Friesse
0 siblings, 0 replies; only message in thread
From: Jan Friesse @ 2009-03-11 11:57 UTC (permalink / raw)
To: cluster-cvs-relay
Gitweb: http://git.fedorahosted.org/git/fence-agents.git?p=fence-agents.git;a=commitdiff;h=adf955182ce928c67d5479fa5e14920a575881c6
Commit: adf955182ce928c67d5479fa5e14920a575881c6
Parent: 0015b691d70f071c1dc84cdca5e102e36f5e5f60
Author: Jan Friesse <jfriesse@redhat.com>
AuthorDate: Wed Mar 11 12:57:12 2009 +0100
Committer: Jan Friesse <jfriesse@redhat.com>
CommitterDate: Wed Mar 11 12:57:12 2009 +0100
fence_intelmodular: Rewrite of agent under Python unified library
Main functionality should be kept (thanks Matthew for
testing), and has some new features, like list, metadata, ...
---
fence/agents/intelmodular/fence_intelmodular.pl | 282 -----------------------
fence/agents/intelmodular/fence_intelmodular.py | 86 +++++++
fence/man/Makefile | 1 +
fence/man/fence_intelmodular.8 | 131 +++++++++++
4 files changed, 218 insertions(+), 282 deletions(-)
diff --git a/fence/agents/intelmodular/fence_intelmodular.pl b/fence/agents/intelmodular/fence_intelmodular.pl
deleted file mode 100644
index 8561b5c..0000000
--- a/fence/agents/intelmodular/fence_intelmodular.pl
+++ /dev/null
@@ -1,282 +0,0 @@
-#!/usr/bin/perl
-
-# Intel Modular Server fencing based on fence_ibmblade.pl
-#
-# Tested with an Intel MFSYS25 using firmware package 2.6 Should work with an
-# MFSYS35 as well.
-#
-# Requires Net::SNMP
-#
-# Notes:
-#
-# The manual and firmware release notes says SNMP is read only. This is not
-# true, as per the MIBs that ship with the firmware you can write to
-# the bladePowerLed oid to control the servers.
-
-use Getopt::Std;
-use Net::SNMP;
-
-my $ME = $0;
-
-END {
- defined fileno STDOUT or return;
- close STDOUT and return;
- warn "$ME: failed to close standard output: $!\n";
- $? ||= 1;
-}
-
-# Get the program name from $0 and strip directory names
-$_=$0;
-s/.*\///;
-my $pname = $_;
-
-my $sleep_time = 5;
-my $snmp_timeout = 10;
-$opt_o = "reboot";
-$opt_u = 161;
-
-# from INTELCORPORATION-MULTI-FLEX-SERVER-BLADES-MIB.my that ships with
-# firmware updates
-my $oid_power = ".1.3.6.1.4.1.343.2.19.1.2.10.202.1.1.6"; # bladePowerLed
-
-# WARNING!! Do not add code bewteen "#BEGIN_VERSION_GENERATION" and
-# "#END_VERSION_GENERATION" It is generated by the Makefile
-
-#BEGIN_VERSION_GENERATION
-$RELEASE_VERSION="";
-$REDHAT_COPYRIGHT="";
-$BUILD_DATE="";
-#END_VERSION_GENERATION
-
-sub usage
-{
- print "Usage:\n";
- print "\n";
- print "$pname [options]\n";
- print "\n";
- print "Options:\n";
- print " -a <ip> IP address or hostname of Intel Modular Server\n";
- print " -h usage\n";
- print " -c <community> SNMP Community\n";
- print " -n <num> Server number to disable\n";
- print " -o <string> Action: Reboot (default), On or Off\n";
- print " -u <udpport> UDP port to use (default: 161)\n";
- print " -q quiet mode\n";
- print " -t test power state\n";
- print " -V version\n";
-
- exit 0;
-}
-
-sub fail_usage
-{
- ($msg)= _;
- print STDERR $msg."\n" if $msg;
- print STDERR "Please use '-h' for usage.\n";
- exit 1;
-}
-
-sub fail
-{
- ($msg) = @_;
- print $msg."\n" unless defined $opt_q;
- $t->close if defined $t;
- exit 1;
-}
-
-sub version
-{
- print "$pname $RELEASE_VERSION $BUILD_DATE\n";
- print "$REDHAT_COPYRIGHT\n" if ( $REDHAT_COPYRIGHT );
-
- exit 0;
-}
-
-sub get_options_stdin
-{
- my $opt;
- my $line = 0;
- while( defined($in = <>) )
- {
- $_ = $in;
- chomp;
-
- # strip leading and trailing whitespace
- s/^\s*//;
- s/\s*$//;
-
- # skip comments
- next if /^#/;
-
- $line+=1;
- $opt=$_;
- next unless $opt;
-
- ($name,$val)=split /\s*=\s*/, $opt;
-
- if ( $name eq "" )
- {
- print STDERR "parse error: illegal name in option $line\n";
- exit 2;
- }
-
- # DO NOTHING -- this field is used by fenced
- elsif ($name eq "agent" ) { }
-
- elsif ($name eq "ipaddr" )
- {
- $opt_a = $val;
- }
- elsif ($name eq "community" )
- {
- $opt_c = $val;
- }
-
- elsif ($name eq "option" )
- {
- $opt_o = $val;
- }
- elsif ($name eq "port" )
- {
- $opt_n = $val;
- }
- elsif ($name eq "udpport" )
- {
- $opt_u = $val;
- }
-
- # FIXME should we do more error checking?
- # Excess name/vals will be eaten for now
- else
- {
- fail "parse error: unknown option \"$opt\"";
- }
- }
-}
-
-# ---------------------------- MAIN --------------------------------
-
-if (@ARGV > 0) {
- getopts("a:hc:n:o:qu:tV") || fail_usage ;
-
- usage if defined $opt_h;
- version if defined $opt_V;
-
- fail_usage "Unknown parameter." if (@ARGV > 0);
-
- fail_usage "No '-a' flag specified." unless defined $opt_a;
- fail_usage "No '-n' flag specified." unless defined $opt_n;
- fail_usage "No '-c' flag specified." unless defined $opt_c;
- fail_usage "Unrecognised action '$opt_o' for '-o' flag"
- unless $opt_o =~ /^(reboot|on|off)$/i;
-
-} else {
- get_options_stdin();
-
- fail "failed: no IP address" unless defined $opt_a;
- fail "failed: no server number" unless defined $opt_n;
- fail "failed: no SNMP community" unless defined $opt_c;
- fail "failed: unrecognised action: $opt_o"
- unless $opt_o =~ /^(reboot|on|off)$/i;
-}
-
-my ($snmpsess, $error) = Net::SNMP->session (
- -hostname => $opt_a,
- -version => "snmpv1",
- -port => $opt_u,
- -community => $opt_c,
- -timeout => $snmp_timeout);
-
-if (!defined ($snmpsess)) {
- printf("$RELEASE_VERSION ERROR: %s.\n", $error);
- exit 1;
-};
-
-# first check in what state are we now
-my $oid = $oid_power . "." . $opt_n;
-my $oid_val = "";
-my $result = $snmpsess->get_request (
- -varbindlist => [$oid]
-);
-if (!defined($result)) {
- printf("$RELEASE_VERSION ERROR: %s.\n", $snmpsess->error);
- $snmpsess->close;
- exit 1;
-}
-
-if (defined ($opt_t)) {
- printf ("$RELEASE_VERSION STATE: Server %d on %s returned %d\n", $opt_n, $opt_a, $result->{$oid});
- exit 1;
-};
-
-if ($opt_o =~ /^(reboot|off)$/i) {
- if ($result->{$oid} == "0") {
- printf ("$RELEASE_VERSION WARNING: Server %d on %s already down.\n", $opt_n, $opt_a);
- $snmpsess->close;
- exit 0;
- };
-} else {
- if ($result->{$oid} == "2") {
- printf ("$RELEASE_VERSION WARNING: Server %d on %s already up.\n", $opt_n, $opt_a);
- $snmpsess->close;
- exit 0;
- };
-};
-
-# excellent, now change the state
-if ($opt_o =~ /^reboot$/i) {
- # reboot
- $oid_val = "4";
-} elsif ($opt_o =~ /^on$/i) {
- # power on
- $oid_val = "2";
-} else {
- # power down
- $oid_val = "3";
-};
-
-$result = $snmpsess->set_request (
- -varbindlist => [$oid, INTEGER, $oid_val]
-);
-
-if (!defined ($result)) {
- printf("$RELEASE_VERSION ERROR: %s.\n", $snmpsess->error);
- $snmpsess->close;
- exit 1;
-};
-
-# now, wait a bit and see if we have done it
-sleep($sleep_time);
-
-undef $result;
-$result = $snmpsess->get_request (
- -varbindlist => [$oid]
-);
-
-if (!defined($result)) {
- # this is a real error
- printf("$RELEASE_VERSION ERROR: %s.\n", $snmpsess->error);
- $snmpsess->close;
- exit 1;
-};
-
-if ($opt_o =~ /^(off)$/i) {
- if ($result->{$oid} == "2") {
- printf ("$RELEASE_VERSION ERROR: Server %d on %s still up.\n", $opt_n, $opt_a);
- $snmpsess->close;
- exit 1;
- };
-} else {
- if ($result->{$oid} == "0") {
- printf ("$RELEASE_VERSION ERROR: Server %d on %s still down.\n", $opt_n, $opt_a);
- $snmpsess->close;
- exit 1;
- };
-};
-
-# everything's a ok :)
-$snmpsess->close;
-
-printf ("$RELEASE_VERSION SUCCESS: Server %d on %s changed state to %s\n", $opt_n, $opt_a, $opt_o) unless defined $opt_q;
-exit 0;
-
diff --git a/fence/agents/intelmodular/fence_intelmodular.py b/fence/agents/intelmodular/fence_intelmodular.py
new file mode 100644
index 0000000..8cfa0ae
--- /dev/null
+++ b/fence/agents/intelmodular/fence_intelmodular.py
@@ -0,0 +1,86 @@
+#!/usr/bin/python
+
+# Tested with an Intel MFSYS25 using firmware package 2.6 Should work with an
+# MFSYS35 as well.
+#
+# Notes:
+#
+# The manual and firmware release notes says SNMP is read only. This is not
+# true, as per the MIBs that ship with the firmware you can write to
+# the bladePowerLed oid to control the servers.
+#
+# Thanks Matthew Kent for original agent and testing.
+
+import sys, re, pexpect
+from fencing import *
+from fencing_snmp import *
+
+#BEGIN_VERSION_GENERATION
+RELEASE_VERSION="Intel Modular SNMP fence agent"
+REDHAT_COPYRIGHT=""
+BUILD_DATE=""
+#END_VERSION_GENERATION
+
+### CONSTANTS ###
+# From INTELCORPORATION-MULTI-FLEX-SERVER-BLADES-MIB.my that ships with
+# firmware updates
+STATUSES_OID=".1.3.6.1.4.1.343.2.19.1.2.10.202.1.1.6"
+
+# Status constants returned as value from SNMP
+STATUS_UP=2
+STATUS_DOWN=0
+
+# Status constants to set as value to SNMP
+STATUS_SET_ON=2
+STATUS_SET_OFF=3
+
+### FUNCTIONS ###
+
+def get_power_status(conn,options):
+ (oid,status)=conn.get("%s.%s"%(STATUSES_OID,options["-n"]))
+ return (status==str(STATUS_UP) and "on" or "off")
+
+def set_power_status(conn, options):
+ conn.set("%s.%s"%(STATUSES_OID,options["-n"]),(options["-o"]=="on" and STATUS_SET_ON or STATUS_SET_OFF))
+
+def get_outlets_status(conn, options):
+ result={}
+
+ res_blades=conn.walk(STATUSES_OID,30)
+
+ for x in res_blades:
+ port_num=x[0].split('.')[-1]
+
+ port_alias=""
+ port_status=(x[1]==str(STATUS_UP) and "on" or "off")
+
+ result[port_num]=(port_alias,port_status)
+
+ return result
+
+# Define new options
+def intelmodular_define_defaults():
+ all_opt["snmp_version"]["default"]="1"
+
+# Main agent method
+def main():
+ global port_oid
+
+ device_opt = [ "help", "version", "agent", "quiet", "verbose", "debug",
+ "action", "ipaddr", "login", "passwd", "passwd_script",
+ "test", "port", "separator", "no_login", "no_password",
+ "snmp_version", "community", "snmp_auth_prot", "snmp_sec_level",
+ "snmp_priv_prot", "snmp_priv_passwd", "snmp_priv_passwd_script",
+ "udpport"]
+
+ atexit.register(atexit_handler)
+
+ intelmodular_define_defaults()
+
+ options=check_input(device_opt,process_input(device_opt))
+
+ # Operate the fencing device
+ fence_action(FencingSnmp(options), options, set_power_status, get_power_status, get_outlets_status)
+
+if __name__ == "__main__":
+ main()
diff --git a/fence/man/Makefile b/fence/man/Makefile
index b35745f..69cbe7c 100644
--- a/fence/man/Makefile
+++ b/fence/man/Makefile
@@ -13,6 +13,7 @@ TARGET= fence_ack_manual.8 \
fence_ibmblade.8 \
fence_ifmib.8 \
fence_ilo.8 \
+ fence_intelmodular.8 \
fence_ipmilan.8 \
fence_ldom.8 \
fence_manual.8 \
diff --git a/fence/man/fence_intelmodular.8 b/fence/man/fence_intelmodular.8
new file mode 100644
index 0000000..a013a7f
--- /dev/null
+++ b/fence/man/fence_intelmodular.8
@@ -0,0 +1,131 @@
+.TH fence_intelmodular 8
+
+.SH NAME
+fence_intelmodular - I/O Fencing agent for Intel MFSYS SNMP devices
+
+.SH SYNOPSIS
+.B
+fence_intelmodular
+[\fIOPTION\fR]...
+
+.SH DESCRIPTION
+fence_intelmodular is an I/O Fencing agent which can be used with
+Intel Modular device (tested on Intel MFSYS25, should work with
+MFSYS35 as well). Agent internally uses snmpget, snmpset and snmpwalk command.
+
+fence_intelmodular accepts options on the command line as well as from stdin.
+Fenced sends parameters through stdin when it execs the agent. fence_intelmodular can be run by itself with command line options. This is useful for testing.
+
+.SH OPTIONS
+.TP
+\fB-a\fP \fIIPaddress\fR
+IP address or hostname of the SNMP device. Can be used any syntax supported by snmpget.
+.TP
+\fB-h\fP
+Print out a help message describing available options, then exit.
+.TP
+\fB-c\fP \fIcommunity\fR
+The read/write community string to be used in the request.
+.TP
+\fB-n\fP \fIname\fR
+Name of port to fence or ifIndex.
+.TP
+\fB-p\fP \fIpassword\fR
+Password for login for SNMP v3 (authentication protocol pass phrase).
+.TP
+\fB-P\fP \fIpassword\fR
+Password for privacy for SNMP v3 (privacy protocol password).
+.TP
+\fB-S\fP \fIscript\fR
+Script to run to retrieve password for login for SNMP v3 (authentication protocol pass phrase).
+.TP
+\fB-R\fP \fIscript\fR
+Script to run to retrieve privacy for SNMP v3 (privacy protocol password).
+.TP
+\fB-l\fP \fIlogin\fR
+Login name for SNMP v3 (security name).
+.TP
+\fB-d\fP \fIversion\fR
+SNMP version (1,2c,3). Default is 1.
+.TP
+\fB-b\fP \fIauth_protocol\fR
+SNMP authentication protocol (MD5|SHA).
+.TP
+\fB-E\fP \fIsec_level\fR
+SNMP security level (noAuthNoPriv|authNoPriv|authPriv).
+.TP
+\fB-B\fP \fIpriv_protocol\fR
+SNMP privacy protocol (DES|AES).
+.TP
+\fB-u\fP \fIudp_port\fR
+UDP/TCP port to use.
+.TP
+\fB-o\fP \fIaction\fR
+The action required. off (default), on, status, list or monitor. Deprecated
+options (enable -> on and disable -> off) can be used too.
+.TP
+\fB-v\fP
+Verbose. Record session to stdout, or debug file if specified (see -D).
+.TP
+\fB-D\fP
+Specifies file, where will be written debug messages from session.
+.TP
+\fB-V\fP
+Print out a version message, then exit.
+
+.SH STDIN PARAMETERS
+.TP
+\fIagent = < param >\fR
+This option is used by fence_node(8) and is ignored by fence_intelmodular.
+.TP
+\fIipaddr = < param >\fR
+IP address or hostname of the SNMP device. Can be used any syntax supported by snmpget.
+.TP
+\fIcommunity = < param >\fR
+The read/write community string to be used in the request.
+.TP
+\fIport = < param >\fR
+Name of port to fence or ifIndex.
+.TP
+\fIpasswd = < param >\fR
+Password for login for SNMP v3 (authentication protocol pass phrase).
+.TP
+\fIsnmp_priv_passwd\fR
+Password for privacy for SNMP v3 (privacy protocol password).
+.TP
+\fIpasswd_script = < param >\fR
+Script to run to retrieve password for login for SNMP v3 (authentication protocol pass phrase).
+.TP
+\fIsnmp_priv_passwd_script = < param>\fR
+Password for privacy for SNMP v3 (privacy protocol password).
+.TP
+\fIlogin = < param >\fR
+Login name for SNMP v3 (security name).
+.TP
+\fIsnmp_version = < param >\fR
+SNMP version (1,2c,3). Default is 1.
+.TP
+\fIsnmp_auth_prot = < param >\fR
+SNMP authentication protocol (MD5|SHA).
+.TP
+\fIsnmp_sec_level = < param >\fR
+SNMP security level (noAuthNoPriv|authNoPriv|authPriv).
+.TP
+\fIsnmp_priv_prot = < param >\fR
+SNMP privacy protocol (DES|AES).
+.TP
+\fIudpport = < param >\fR
+UDP/TCP port to use.
+.TP
+\fIaction = < param >\fR
+The action required. off (default), on, status, list or monitor. Deprecated
+options (enable -> on and disable -> off) can be used too.
+.TP
+\fIverbose = < param >\fR
+Verbose. Record session to stdout, or debug file if specified (see debug).
+.TP
+\fIdebug = < param >\fR
+Specifies file, where will be written debug messages from session.
+
+.SH SEE ALSO
+fence(8), fence_node(8)
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2009-03-11 11:57 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-03-11 11:57 fence-agents: master - fence_intelmodular: Rewrite of agent under Python unified library Jan Friesse
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 read-only IMAP folder(s) and NNTP newsgroup(s).