This file is indexed.

/usr/sbin/fence_drac5 is in fence-agents 3.1.5-2ubuntu2.

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

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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#!/usr/bin/python

#####
##
## The Following Agent Has Been Tested On:
##
##  DRAC Version       Firmware
## +-----------------+---------------------------+
##  DRAC 5             1.0  (Build 06.05.12)
##  DRAC 5             1.21 (Build 07.05.04)
##
## @note: drac_version was removed
#####

import sys, re, pexpect, exceptions
sys.path.append("/usr/share/fence")
from fencing import *

#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

def get_power_status(conn, options):
	try:
		if options["model"] == "DRAC CMC":
			conn.sendline("racadm serveraction powerstatus -m " + options["-m"])
		elif options["model"] == "DRAC 5":
			conn.sendline("racadm serveraction powerstatus")
		
		conn.log_expect(options, options["-c"], int(options["-Y"]))
	except pexpect.EOF:
		fail(EC_CONNECTION_LOST)
	except pexpect.TIMEOUT:
		fail(EC_TIMED_OUT)
				
	status = re.compile("(^|: )(ON|OFF|Powering ON|Powering OFF)\s*$", re.IGNORECASE | re.MULTILINE).search(conn.before).group(2)
	if status.lower().strip() in ["on", "powering on", "powering off"]:
		return "on"
	else:
		return "off"

def set_power_status(conn, options):
	action = {
		'on' : "powerup",
		'off': "powerdown"
	}[options["-o"]]

	try:
		if options["model"] == "DRAC CMC":
			conn.sendline("racadm serveraction " + action + " -m " + options["-m"])
		elif options["model"] == "DRAC 5":
			conn.sendline("racadm serveraction " + action)
		conn.log_expect(options, options["-c"], int(options["-g"]))
	except pexpect.EOF:
		fail(EC_CONNECTION_LOST)
	except pexpect.TIMEOUT:
		fail(EC_TIMED_OUT)

def get_list_devices(conn, options):
	outlets = { }

	try:
		if options["model"] == "DRAC CMC":
			conn.sendline("getmodinfo")

			list_re = re.compile("^([^\s]*?)\s+Present\s*(ON|OFF)\s*.*$")
			conn.log_expect(options, options["-c"], int(options["-g"]))
			for line in conn.before.splitlines():
				if (list_re.search(line)):
					outlets[list_re.search(line).group(1)] = ("", list_re.search(line).group(2))
		elif options["model"] == "DRAC 5":
			## DRAC 5 can be used only for one computer
			## standard fence library can't handle correctly situation
			## when some fence devices supported by fence agent
			## works with 'list' and other should returns 'N/A'
			print "N/A"
			pass
	except pexpect.EOF:
		fail(EC_CONNECTION_LOST)
	except pexpect.TIMEOUT:
		fail(EC_TIMED_OUT)

	return outlets
	
def main():
	device_opt = [  "help", "version", "agent", "quiet", "verbose", "debug",
			"action", "ipaddr", "login", "passwd", "passwd_script",
			"cmd_prompt", "secure", "identity_file", "drac_version", "module_name",
			"separator", "inet4_only", "inet6_only", "ipport",
			"power_timeout", "shell_timeout", "login_timeout", "power_wait" ]

	atexit.register(atexit_handler)

	options = check_input(device_opt, process_input(device_opt))

	## 
	## Fence agent specific defaults
	#####
	if 0 == options.has_key("-c"):
		options["-c"] = "\$"

	docs = { }           
	docs["shortdesc"] = "Fence agent for Dell DRAC CMC/5" 
	docs["longdesc"] = "fence_drac5 is an I/O Fencing agent \
which can be used with the Dell Remote Access Card v5 or CMC (DRAC). \
This device provides remote access to controlling  power to a server. \
It logs into the DRAC through the telnet/ssh interface of the card. \
By default, the telnet interface is not  enabled."
	docs["vendorurl"] = "http://www.dell.com"
	show_docs(options, docs)

	##
	## Operate the fencing device
	######
	conn = fence_login(options)

	if conn.before.find("CMC") >= 0:
		if 0 == options.has_key("-m") and 0 == ["monitor", "list"].count(options["-o"].lower()):
			fail_usage("Failed: You have to enter module name (-m)")
			
		options["model"]="DRAC CMC"		
	elif conn.before.find("DRAC 5") >= 0:
		options["model"]="DRAC 5"
	else:
		## Assume this is DRAC 5 by default as we don't want to break anything
		options["model"]="DRAC 5"

	result = fence_action(conn, options, set_power_status, get_power_status, get_list_devices)

	##
	## Logout from system
	######
	try:
		conn.sendline("exit")
		conn.close()
	except exceptions.OSError:
		pass
	except pexpect.ExceptionPexpect:
		pass
	
	sys.exit(result)

if __name__ == "__main__":
	main()