From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12328 invoked by alias); 11 Mar 2009 15:28:52 -0000 Received: (qmail 12322 invoked by alias); 11 Mar 2009 15:28:51 -0000 X-SWARE-Spam-Status: No, hits=1.1 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_26,J_CHICKENPOX_33,J_CHICKENPOX_34,J_CHICKENPOX_36,J_CHICKENPOX_44,J_CHICKENPOX_46,J_CHICKENPOX_47,J_CHICKENPOX_48,J_CHICKENPOX_64,SPF_HELO_PASS X-Spam-Status: No, hits=1.1 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_26,J_CHICKENPOX_33,J_CHICKENPOX_34,J_CHICKENPOX_36,J_CHICKENPOX_44,J_CHICKENPOX_46,J_CHICKENPOX_47,J_CHICKENPOX_48,J_CHICKENPOX_64,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: fence-agents: master - fence_apc_snmp: Rewrite of agent under Python unified library To: cluster-cvs-relay@redhat.com X-Project: Cluster Project X-Git-Module: fence-agents.git X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: f9ced2a62b7d6006471438532be1237bd03cd3ef X-Git-Newrev: 525aa2eca9455abcd9fe02323fc8f42243f26fbf From: Jan Friesse Message-Id: <20090311152831.58EE91201EB@lists.fedorahosted.org> Date: Wed, 11 Mar 2009 15:28: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/msg00741.txt.bz2 Gitweb: http://git.fedorahosted.org/git/fence-agents.git?p=fence-agents.git;a=commitdiff;h=525aa2eca9455abcd9fe02323fc8f42243f26fbf Commit: 525aa2eca9455abcd9fe02323fc8f42243f26fbf Parent: f9ced2a62b7d6006471438532be1237bd03cd3ef Author: Jan Friesse AuthorDate: Wed Mar 11 16:26:29 2009 +0100 Committer: Jan Friesse CommitterDate: Wed Mar 11 16:26:29 2009 +0100 fence_apc_snmp: Rewrite of agent under Python unified library Main functionality should be kept and has some new features, like list, metadata, and specially support for SNMP v3 with all authentification/privacy methods. --- fence/agents/apc_snmp/Makefile | 1 - fence/agents/apc_snmp/fence_apc_snmp.py | 624 +++++++++---------------------- fence/man/Makefile | 1 + fence/man/fence_apc_snmp.8 | 139 +++++++ 4 files changed, 316 insertions(+), 449 deletions(-) diff --git a/fence/agents/apc_snmp/Makefile b/fence/agents/apc_snmp/Makefile index d5da610..9d2e498 100644 --- a/fence/agents/apc_snmp/Makefile +++ b/fence/agents/apc_snmp/Makefile @@ -1,5 +1,4 @@ TARGET= fence_apc_snmp -MIBRESOURCE= powernet369.mib include ../../../make/defines.mk include $(OBJDIR)/make/fencebuild.mk diff --git a/fence/agents/apc_snmp/fence_apc_snmp.py b/fence/agents/apc_snmp/fence_apc_snmp.py index d2530da..8ffd7fc 100644 --- a/fence/agents/apc_snmp/fence_apc_snmp.py +++ b/fence/agents/apc_snmp/fence_apc_snmp.py @@ -1,465 +1,193 @@ #!/usr/bin/python -############################################################################# -## This APC Fence script uses snmp to control the APC power -## switch. This script requires that net-snmp-utils be installed -## on all nodes in the cluster, and that the powernet369.mib file be -## located in @MIBDIR@ -############################################################################# - -import getopt, sys -import os -import datetime -import time -import select -import signal -import atexit -from glob import glob +# The Following agent has been tested on: +# - APC Switched Rack PDU (MB:v3.7.0 PF:v2.7.0 PN:apc_hw02_aos_270.bin AF1:v2.7.3 AN1:apc_hw02_aos_270.bin +# AF1:v2.7.3 AN1:apc_hw02_rpdu_273.bin MN:AP7930 HR:B2) - SNMP v1 +# - APC Web/SNMP Management Card (MB:v3.8.6 PF:v3.5.8 PN:apc_hw02_aos_358.bin AF1:v3.5.7 AN1:apc_hw02_aos_358.bin +# AF1:v3.5.7 AN1:apc_hw02_rpdu_357.bin MN:AP7900 HR:B2) - SNMP v1 and v3 (noAuthNoPrivacy,authNoPrivacy, authPrivacy) +# - APC Switched Rack PDU (MB:v3.7.0 PF:v2.7.0 PN:apc_hw02_aos_270.bin AF1:v2.7.3 AN1:apc_hw02_rpdu_273.bin +# MN:AP7951 HR:B2) - SNMP v1 + +import sys, re, pexpect +from fencing import * +from fencing_snmp import * #BEGIN_VERSION_GENERATION -RELEASE_VERSION="" +RELEASE_VERSION="APC SNMP fence agent" REDHAT_COPYRIGHT="" BUILD_DATE="" #END_VERSION_GENERATION -POWER_ON="outletOn" -POWER_OFF="outletOff" -POWER_REBOOT="outletReboot" - - -# oid defining fence device -oid_sysObjectID = '.1.3.6.1.2.1.1.2.0' - - - -class SNMP: - def __init__(self, params): - self.hostname = params['ipaddr'] - self.udpport = params['udpport'] - self.community = params['community'] - - def get(self, oid): - args = ['@SNMPBIN@/snmpget'] - args.append('-Oqn') - args.append('-v') - args.append('1') - args.append('-c') - args.append(self.community) - args.append('-m') - args.append('ALL') - args.append(self.hostname + ':' + self.udpport) - args.append(oid) - strr, code = execWithCaptureStatus("@SNMPBIN@/snmpget", args) - if code: - raise Exception, 'snmpget failed' - l = strr.strip().split() - return l[0], ' '.join(l[1:]) - - def set_int(self, oid, value): - args = ['@SNMPBIN@/snmpset'] - args.append('-Oqn') - args.append('-v') - args.append('1') - args.append('-c') - args.append(self.community) - args.append('-m') - args.append('ALL') - args.append(self.hostname + ':' + self.udpport) - args.append(oid) - args.append('i') - args.append(str(value)) - strr,code = execWithCaptureStatus("@SNMPBIN@/snmpset", args) - if code: - raise Exception, 'snmpset failed' - - def walk(self, oid): - args = ['@SNMPBIN@/snmpwalk'] - args.append('-Oqn') - args.append('-v') - args.append('1') - args.append('-c') - args.append(self.community) - args.append('-m') - args.append('ALL') - args.append(self.hostname + ':' + self.udpport) - args.append(oid) - strr,code = execWithCaptureStatus("@SNMPBIN@/snmpwalk", args) - if code: - raise Exception, 'snmpwalk failed' - lines = strr.strip().splitlines() - ret = [] - for line in lines: - l = line.strip().split() - ret.append((l[0], ' '.join(l[1:]).strip('"'))) - return ret - - - -class FenceAgent: - - def __init__(self, params): - self.snmp = SNMP(params) - - def resolve_outlet(self): - raise Exception, 'resolve_outlet() not implemented' - - def status(self): - oid = self.status_oid % self.resolve_outlet() - dummy, stat = self.snmp.get(oid) - if stat == self.state_on or stat == "outletStatusOn": - return 'on' - elif stat == self.state_off or stat == "outletStatusOff": - return 'off' - else: - raise Exception, 'invalid status ' + stat - - def power_off(self): - oid = self.control_oid % self.resolve_outlet() - self.snmp.set_int(oid, self.turn_off) - - def power_on(self): - oid = self.control_oid % self.resolve_outlet() - self.snmp.set_int(oid, self.turn_on) - - - - - - - - -class MasterSwitch(FenceAgent): - - def __init__(self, params): - FenceAgent.__init__(self, params) - - self.status_oid = '.1.3.6.1.4.1.318.1.1.12.3.5.1.1.4.%s' - self.control_oid = '.1.3.6.1.4.1.318.1.1.12.3.3.1.1.4.%s' - self.outlet_table_oid = '.1.3.6.1.4.1.318.1.1.12.3.5.1.1.2' - - self.state_on = '1' - self.state_off = '2' - - self.turn_on = '1' - self.turn_off = '2' - - self.port = params['port'] - - def resolve_outlet(self): - outlet = None - try: - outlet = str(int(self.port)) - except: - table = self.snmp.walk(self.outlet_table_oid) - for row in table: - if row[1] == self.port: - t = row[0].strip().split('.') - outlet = t[len(t)-1] - if outlet == None: - raise Exception, 'unable to resolve ' + self.port - else: - self.port = outlet - return outlet - - -class MasterSwitchPlus(FenceAgent): - def __init__(self, params): - FenceAgent.__init__(self, params) - - self.status_oid = '.1.3.6.1.4.1.318.1.1.6.7.1.1.5.%s.1.%s' - self.control_oid = '.1.3.6.1.4.1.318.1.1.6.5.1.1.5.%s.1.%s' - self.outlet_table_oid = '.1.3.6.1.4.1.318.1.1.6.7.1.1.4' - - self.state_on = '1' - self.state_off = '2' - - self.turn_on = '1' - self.turn_off = '3' - - try: - self.switch = params['switch'] - except: - self.switch = '' - self.port = params['port'] - - def resolve_outlet(self): - switch = None - outlet = None - try: - switch = str(int(self.switch)) - outlet = str(int(self.port)) - except: - table = self.snmp.walk(self.outlet_table_oid) - for row in table: - if row[1] == self.port: - t = row[0].strip().split('.') - outlet = t[len(t)-1] - switch = t[len(t)-3] - if outlet == None: - raise Exception, 'unable to resolve ' + self.port - else: - self.switch = switch - self.port = outlet - return (switch, outlet) - - - - - - -def usage(): - print "Usage:" - print "" - print "Options:" - print " -h Usage" - print " -a IP address or hostname of fence device" - print " -u UDP port to use (default 161)" - print " -c SNMP community (default 'private')" - print " -n Outlet name/number to act on" - print " -o Action: reboot (default), on, off or status" - print " -v Verbose mode - write to @LOGDIR@/fence_apc_snmp.log" - print " -V Version" - - sys.exit(0) - - - -file_log = None -def set_logging(verbose): - global file_log - if verbose: - file_log = open('@LOGDIR@/fence_apc_snmp.log', 'a') - file_log.write('\n----------- ') - file_log.write(datetime.datetime.today().ctime()) - file_log.write(' -----------\n') -def log(msg, error=False): - global file_log - if msg.rfind('\n') != len(msg)-1: - msg += '\n' - if file_log != None: - file_log.write(msg) - if error: - o = sys.stderr +### CONSTANTS ### +# oid defining fence device +OID_SYS_OBJECT_ID='.1.3.6.1.2.1.1.2.0' + +### GLOBAL VARIABLES ### +# Device - see ApcRPDU, ApcMSP, ApcMS +device=None + +# Port ID +port_id=None +# Switch ID +switch_id=None + +# Classes describing Device params +class ApcRPDU: + # Rack PDU + status_oid= '.1.3.6.1.4.1.318.1.1.12.3.5.1.1.4.%d' + control_oid= '.1.3.6.1.4.1.318.1.1.12.3.3.1.1.4.%d' + outlet_table_oid='.1.3.6.1.4.1.318.1.1.12.3.5.1.1.2' + ident_str="APC rPDU" + state_on=1 + state_off=2 + turn_on=1 + turn_off=2 + has_switches=False + +class ApcMSP: + # Master Switch+ + status_oid= '.1.3.6.1.4.1.318.1.1.6.7.1.1.5.%d.1.%d' + control_oid= '.1.3.6.1.4.1.318.1.1.6.5.1.1.5.%d.1.%d' + outlet_table_oid='.1.3.6.1.4.1.318.1.1.6.7.1.1.4' + ident_str="APC Master Switch+" + state_on=1 + state_off=2 + turn_on=1 + turn_off=3 + has_switches=True + +class ApcMS: + # Master Switch - seems oldest, but supported on every APC PDU + status_oid= '.1.3.6.1.4.1.318.1.1.4.4.2.1.3.%d' + control_oid= '.1.3.6.1.4.1.318.1.1.4.4.2.1.3.%d' + outlet_table_oid='.1.3.6.1.4.1.318.1.1.4.4.2.1.4' + ident_str="APC Master Switch (fallback)" + state_on=1 + state_off=2 + turn_on=1 + turn_off=2 + has_switches=False + +### FUNCTIONS ### +def apc_set_device(conn,options): + global device + + agents_dir={'.1.3.6.1.4.1.318.1.3.4.5':ApcRPDU, + '.1.3.6.1.4.1.318.1.3.4.4':ApcMSP, + None:ApcMS} + + # First resolve type of APC + apc_type=conn.walk(OID_SYS_OBJECT_ID) + + if (not ((len(apc_type)==1) and (agents_dir.has_key(apc_type[0][1])))): + apc_type=[[None,None]] + + device=agents_dir[apc_type[0][1]] + + conn.log_command("Trying %s"%(device.ident_str)) + +def apc_resolv_port_id(conn,options): + global port_id,switch_id,device + + if (device==None): + apc_set_device(conn,options) + + # 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"]) + + if (device.has_switches): + switch_id=int(options["-s"]) else: - o = sys.stdout - o.write(msg) + table=conn.walk(device.outlet_table_oid,30) -def atexit_handler(): - try: - sys.stdout.close() - os.close(1) - except IOError: - sys.stderr.write("%s failed to close standard output\n"%(sys.argv[0])) - sys.exit(1) + for x in table: + if (x[1].strip('"')==options["-n"]): + t=x[0].split('.') + if (device.has_switches): + port_id=int(t[len(t)-1]) + switch_id=int(t[len(t)-3]) + else: + port_id=int(t[len(t)-1]) + if (port_id==None): + fail_usage("Can't find port with name %s!"%(options["-n"])) +def get_power_status(conn,options): + global port_id,switch_id,device + + if (port_id==None): + apc_resolv_port_id(conn,options) + + 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") + +def set_power_status(conn, options): + global port_id,switch_id,device + + if (port_id==None): + apc_resolv_port_id(conn,options) + + 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)) + + +def get_outlets_status(conn, options): + global device + + result={} + + if (device==None): + apc_set_device(conn,options) + + res_ports=conn.walk(device.outlet_table_oid,30) + + for x in res_ports: + t=x[0].split('.') + + port_num=((device.has_switches) and "%s:%s"%(t[len(t)-3],t[len(t)-1]) or "%s"%(t[len(t)-1])) + + port_name=x[1].strip('"') + port_status="" + result[port_num]=(port_name,port_status) + + return result + +# Define new options +def apc_snmp_define_defaults(): + all_opt["snmp_version"]["default"]="1" + all_opt["community"]["default"]="private" + +# Main agent method def main(): + 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) - try: - main2() - return 0 - except Exception, e: - log(str(e), True) - sys.exit(1) -def main2(): - - agents_dir = {'.1.3.6.1.4.1.318.1.3.4.5' : MasterSwitch, - '.1.3.6.1.4.1.318.1.3.4.4' : MasterSwitchPlus} - - verbose = False - params = {} - - if len(sys.argv) > 1: - try: - opts, args = getopt.getopt(sys.argv[1:], "ha:u:c:n:o:vV", ["help", "output="]) - except getopt.GetoptError: - usage() - sys.exit(2) - - for o, a in opts: - o = o.strip() - a = a.strip() - if o == "-v": - verbose = True - if o == "-V": - print "%s\n" % RELEASE_VERSION - print "%s\n" % REDHAT_COPYRIGHT - print "%s\n" % BUILD_DATE - sys.exit(0) - if o in ("-h", "--help"): - usage() - sys.exit(0) - if o == "-a": - params['ipaddr'] = a - if o == "-u": - params['udpport'] = a - if o == "-c": - params['community'] = a - if o == "-n": - switch = '' - port = a - if ':' in port: - idx = port.find(':') - switch = port[:idx] - port = port[idx+1:] - params['switch'] = switch - params['port'] = port - if o == "-o": - params['option'] = a.lower() - - else: #Get opts from stdin - for line in sys.stdin: - val = line.strip().split("=") - if len(val) == 2: - o = val[0].strip().lower() - a = val[1].strip() - if o == 'verbose': - if a.lower() == 'on' or a.lower() == 'true' or a == '1': - verbose = True - else: - params[o] = a - - - set_logging(verbose) - - - ### validation ### - - try: - if params['ipaddr'] == '': - raise Exception, 'missing ipadddr' - except: - log("FENCE: Missing ipaddr param for fence_apc_snmp...exiting", True) - sys.exit(1) - if 'udpport' not in params: - params['udpport'] = '161' - try: - t = int(params['udpport']) - if t >= 65536 or t < 0: - raise Exception, 'invalid udpport' - except: - log("FENCE: Invalid udpport for fence_apc_snmp...exiting", True) - sys.exit(1) - if 'community' not in params: - params['community'] = 'private' - try: - port = params['port'] - if len(port) == 0: - raise Exception, 'missing port' - except: - log("FENCE: Missing port param for fence_apc_snmp...exiting", True) - sys.exit(1) - if 'switch' not in params: - params['switch'] = '' - - if 'option' not in params: - params['option'] = 'reboot' - try: - act = params['option'].lower() - if act in ['on', 'off', 'reboot', 'status']: - params['option'] = act - else: - raise Exception - except: - usage() - sys.exit(3) - - ### End of validation ### - - if verbose: - log('called with ' + str(params)) - - agent = None - dummy, sys_id = SNMP(params).get(oid_sysObjectID) - if sys_id not in agents_dir: - log('Fence device with \'oid_sysObjectID=' + sys_id + '\' is not supported', True) - sys.exit(1) - agent = agents_dir[sys_id](params) - - if params['option'] == 'status': - log('Outlet "%s" - %s is %s' % (params['port'], - str(agent.resolve_outlet()), - agent.status())) - elif params['option'] == 'on': - agent.power_on() - if agent.status() != 'on': - raise Exception, 'Error turning outlet on' - elif params['option'] == 'off': - agent.power_off() - if agent.status() != 'off': - raise Exception, 'Error turning outlet off' - elif params['option'] == 'reboot': - agent.power_off() - time.sleep(3) - if agent.status() != 'off': - raise Exception, 'Error turning outlet off' - agent.power_on() - if agent.status() != 'on': - raise Exception, 'Error turning outlet on' - else: - print 'nothing to do' - sys.exit(1) - pass - - - -def execWithCaptureStatus(command, argv, searchPath = 0, root = '/', stdin = 0, - catchfd = 1, closefd = -1): - - if not os.access (root + command, os.X_OK): - raise Exception, command + " cannot be run" - - (read, write) = os.pipe() - - childpid = os.fork() - if (not childpid): - if (root and root != '/'): os.chroot (root) - if isinstance(catchfd, tuple): - for fd in catchfd: - os.dup2(write, fd) - else: - os.dup2(write, catchfd) - os.close(write) - os.close(read) - - if closefd != -1: - os.close(closefd) - - if stdin: - os.dup2(stdin, 0) - os.close(stdin) - - if (searchPath): - os.execvp(command, argv) - else: - os.execv(command, argv) - - sys.exit(1) - - os.close(write) - - rc = "" - s = "1" - while (s): - select.select([read], [], []) - s = os.read(read, 1000) - rc = rc + s - - os.close(read) - - try: - (pid, status) = os.waitpid(childpid, 0) - except OSError, (errno, msg): - print __name__, "waitpid:", msg - - if os.WIFEXITED(status) and (os.WEXITSTATUS(status) == 0): - status = os.WEXITSTATUS(status) - else: - status = -1 - - return (rc, status) + apc_snmp_define_defaults() + + options=check_input(device_opt,process_input(device_opt)) + + ## 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())): + options["-s"] = switch + options["-n"] = plug + + if (not (options.has_key("-s"))): + options["-s"]="1" + + # Operate the fencing device + fence_action(FencingSnmp(options), options, set_power_status, get_power_status, get_outlets_status) if __name__ == "__main__": - ret = main() - sys.exit(ret) + main() diff --git a/fence/man/Makefile b/fence/man/Makefile index 69cbe7c..a2f1dec 100644 --- a/fence/man/Makefile +++ b/fence/man/Makefile @@ -1,6 +1,7 @@ TARGET= fence_ack_manual.8 \ fence_alom.8 \ fence_apc.8 \ + fence_apc_snmp.8 \ fence_baytech.8 \ fence_bladecenter.8 \ fence_brocade.8 \ diff --git a/fence/man/fence_apc_snmp.8 b/fence/man/fence_apc_snmp.8 new file mode 100644 index 0000000..0e4805e --- /dev/null +++ b/fence/man/fence_apc_snmp.8 @@ -0,0 +1,139 @@ +.TH fence_apc_snmp 8 + +.SH NAME +fence_apc_snmp - I/O Fencing agent for APC PDU SNMP devices + +.SH SYNOPSIS +.B +fence_apc_snmp +[\fIOPTION\fR]... + +.SH DESCRIPTION +fence_apc is an I/O Fencing agent which can be used with the APC rPDU, +MasterSwitch and MasterSwitch+ network power switch. It logs into a device via +SNMP and reboots a specified outlet. It supports SNMP v1 and v3 with all combinations +of authenticity/privacy settings. + +fence_apc_snmp accepts options on the command line as well as from stdin. +Fenced sends parameters through stdin when it execs the agent. fence_apc_snmp +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. Default private. +.TP +\fB-n\fP \fIname\fR +Name of port to fence or port index. Port can use syntax switch:port. +.TP +\fB-s\fP \fInumber\fR +The switch to operate on. Defaults to "1" if not specified. +.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 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_apc_snmp. +.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. Default private. +.TP +\fIport = < param >\fR +Name of port to fence or port index. Port can use syntax switch:port. +.TP +\fIswitch = < param >\fR +The switch to operate on. Defaults to "1" if not specified. +.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 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)