This file is indexed.

/usr/share/fence/fencing_snmp.py is in fence-agents 3.1.5-2ubuntu2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#!/usr/bin/python

# For example of use please see fence_cisco_mds

import re,pexpect
from fencing import *

## do not add code here.
#BEGIN_VERSION_GENERATION
RELEASE_VERSION="3.1.5"
BUILD_DATE="(built Mon Feb 6 23:36:21 UTC 2012)"
REDHAT_COPYRIGHT="Copyright (C) Red Hat, Inc. 2004-2010 All rights reserved."
#END_VERSION_GENERATION

# Fix for RHBZ#527844
def snmp_define_defaults ():
	all_opt["udpport"]["default"]="161"
	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):
		if self.options["log"] >= LOG_MODE_VERBOSE:
			self.options["debug_fh"].write(message+"\n")

	def quote_for_run(self,str):
		return ''.join(map(lambda x:x==r"'" and "'\\''" or x,str))

	def complete_missed_params(self):
		mapping=[
			[['P','p','!E'],'self.options["-E"]="authPriv"'],
			[['!d','c','!l','!P','!p'],'self.options["-d"]="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="/usr/bin/%s -m '' -Oeqn "%(command)

		self.complete_missed_params()

		#mapping from our option to snmpcmd option
		mapping=(('d','v'),('c','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("-d")) and (self.options["-d"] == "3"):
			# Mapping from our options to snmpcmd options for v3
			mapping_v3=(('b','a'),('E','l'),('B','x'),('P','X'),('p','A'),('l','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("-6")):
			force_ipvx="udp6:"

		if (self.options.has_key("-4")):
			force_ipvx="udp:"

		cmd+=" '%s%s%s'"%(force_ipvx, self.quote_for_run(self.options["-a"]),
				self.options.has_key("-u") and self.quote_for_run(":" + str (self.options["-u"])) 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["-Y"])+int(self.options["-y"])+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=''

		for item in mapping:
			if (isinstance(value,item[0])):
				type=item[1]
				break

		cmd="%s '%s' %s '%s'"%(self.prepare_cmd("snmpset"),self.quote_for_run(oid),type,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))