diff --git a/fence/agents/lib/fencing_snmp.py.py b/fence/agents/lib/fencing_snmp.py.py index 9285703f..3709ec84 100644 --- a/fence/agents/lib/fencing_snmp.py.py +++ b/fence/agents/lib/fencing_snmp.py.py @@ -1,139 +1,141 @@ #!/usr/bin/python # For example of use please see fence_cisco_mds import re, pexpect import logging from fencing import * from fencing import fail, fail_usage, EC_TIMED_OUT, LOG_MODE_VERBOSE +__all__ = [ 'FencingSnmp', 'snmp_define_defaults' ] + ## do not add code here. #BEGIN_VERSION_GENERATION RELEASE_VERSION = "" REDHAT_COPYRIGHT = "" BUILD_DATE = "" #END_VERSION_GENERATION # Fix for RHBZ#527844 def snmp_define_defaults (): all_opt["ipport"]["default"] = "161" class FencingSnmp: def __init__(self, options): self.options = options # Log message if user set verbose option def log_command(self, message): logging.debug("%s\n" % message) def quote_for_run(self, string): return ''.join(map(lambda x:x==r"'" and "'\\''" or x, string)) def complete_missed_params(self): mapping = [[ ['snmp-priv-passwd','password','!snmp-sec-level'], 'self.options["--snmp-sec-level"]="authPriv"' ],[ ['!snmp-version','community','!username','!snmp-priv-passwd','!password'], 'self.options["--snmp-version"]="2c"' ]] for val in mapping: e = val[0] res = True for item in e: if ((item[0]=='!') and (self.options.has_key("--"+item[1:]))): res = False break if ((item[0]!='!') and (not self.options.has_key("--"+item[0:]))): res = False break if res: exec(val[1]) def prepare_cmd(self, command): cmd = "@SNMPBIN@/%s -m '' -Oeqn "% (command) self.complete_missed_params() #mapping from our option to snmpcmd option mapping = (('snmp-version', 'v'),('community', 'c')) for item in mapping: if (self.options.has_key("--" + item[0])): cmd += " -%s '%s'"% (item[1], self.quote_for_run(self.options["--" + item[0]])) # Some options make sense only for v3 (and for v1/2c can cause "problems") if (self.options.has_key("--snmp-version")) and (self.options["--snmp-version"] == "3"): # Mapping from our options to snmpcmd options for v3 mapping_v3 = (('snmp-auth-prot','a'), ('snmp-sec-level','l'), ('snmp-priv-prot','x'), \ ('snmp-priv-passwd','X'),('password','A'),('username','u')) for item in mapping_v3: if (self.options.has_key("--"+item[0])): cmd += " -%s '%s'"% (item[1], self.quote_for_run(self.options["--" + item[0]])) force_ipvx = "" if (self.options.has_key("--inet6-only")): force_ipvx = "udp6:" if (self.options.has_key("--inet4-only")): force_ipvx = "udp:" cmd += " '%s%s%s'"% (force_ipvx, self.quote_for_run(self.options["--ip"]), self.options.has_key("--ipport") and self.quote_for_run(":" + str (self.options["--ipport"])) or "") return cmd def run_command(self, command, additional_timemout=0): try: self.log_command(command) (res_output, res_code) = pexpect.run(command, int(self.options["--shell-timeout"]) + int(self.options["--login-timeout"]) + additional_timemout, True) if (res_code==None): fail(EC_TIMED_OUT) self.log_command(res_output) if (res_code!=0) or (re.search("^Error ", res_output, re.MULTILINE) != None): fail_usage("Returned %d: %s"% (res_code, res_output)) except pexpect.ExceptionPexpect: fail_usage("Cannot run command %s"%(command)) return res_output def get(self, oid, additional_timemout=0): cmd = "%s '%s'"% (self.prepare_cmd("snmpget"), self.quote_for_run(oid)) output = self.run_command(cmd, additional_timemout).splitlines() return output[len(output)-1].split(None, 1) def set(self, oid, value, additional_timemout=0): mapping = ((int, 'i'), (str, 's')) type_of_value = '' for item in mapping: if (isinstance(value, item[0])): type_of_value = item[1] break cmd = "%s '%s' %s '%s'" % (self.prepare_cmd("snmpset"), self.quote_for_run(oid), type_of_value, self.quote_for_run(str(value))) self.run_command(cmd, additional_timemout) def walk(self, oid, additional_timemout=0): cmd = "%s '%s'"% (self.prepare_cmd("snmpwalk"), self.quote_for_run(oid)) output = self.run_command(cmd, additional_timemout).splitlines() return map(lambda x:x.split(None, 1), filter(lambda y:len(y)>0 and y[0]=='.', output))