1 from pcucontrol.reboot import *
4 class DRAC(PCUControl):
5 supported_ports = [22,443,5869]
6 def run_drac(self, node_port, dryrun):
7 print "trying racadm_reboot..."
8 return racadm_reboot(self.host, self.username, self.password, node_port, dryrun)
10 def run_ssh(self, node_port, dryrun):
11 ssh_options="-o StrictHostKeyChecking=no "+\
12 "-o PasswordAuthentication=yes "+\
13 "-o PubkeyAuthentication=no"
16 if not s.login(self.host, self.username, self.password, ssh_options,
17 original_prompts="Dell", login_timeout=Transport.TELNET_TIMEOUT):
18 raise ExceptionPassword("Invalid Password")
20 raise ExceptionPrompt("Disconnect before login prompt")
22 print "logging in... %s" % self.host
26 #index = s.expect(["DRAC 5", "[%s]#" % self.username ])
27 # NOTE: be careful to escape any characters used by 're.compile'
28 index = s.expect(["\$", "\[%s\]#" % self.username ])
33 s.sendline("racadm getsysinfo")
35 s.sendline("getsysinfo")
37 print "serveraction powercycle"
39 s.sendline("racadm serveraction powercycle")
41 s.sendline("serveraction powercycle")
43 # TODO: this is really lousy. Without the sleep, the sendlines
44 # don't completely get through. Even the added, expect line
45 # returns right away without waiting for the commands above to
46 # complete... Therefore, this delay is guaranteed to fail in some
50 index = s.expect(["\$", "\[%s\]#" % self.username ])
52 print "INDEX 2:", index
56 raise ExceptionPrompt("EOF before expected Prompt")
57 except pexpect.TIMEOUT:
59 raise ExceptionPrompt("Timeout before expected Prompt")
65 ### rebooting Dell systems via RAC card
66 # Marc E. Fiuczynski - June 01 2005
67 # tested with David Lowenthal's itchy/scratchy nodes at UGA
69 def runcmd(command, args, username, password, timeout = None):
72 result_ready = threading.Condition()
76 result_ready.acquire()
81 result_ready.release()
83 def do_command(command, username, password):
86 # Popen4 is a popen-type class that combines stdout and stderr
87 p = popen2.Popen4(command)
89 # read all output data
90 p.tochild.write("%s\n" % username)
91 p.tochild.write("%s\n" % password)
93 data = p.fromchild.read()
96 # might get interrupted by a signal in poll() or waitpid()
99 set_result((retval, data))
102 if ex.errno == errno.EINTR:
105 except Exception, ex:
109 command = " ".join([command] + args)
111 worker = threading.Thread(target = do_command, args = (command, username, password, ))
112 worker.setDaemon(True)
113 result_ready.acquire()
115 result_ready.wait(timeout)
118 raise Exception, "command timed-out: '%s'" % command
120 result_ready.release()
123 if isinstance(result, Exception):
126 (retval, data) = result
127 if os.WIFEXITED(retval) and os.WEXITSTATUS(retval) == 0:
130 out = "system command ('%s') " % command
131 if os.WIFEXITED(retval):
132 out += "failed, rc = %d" % os.WEXITSTATUS(retval)
134 out += "killed by signal %d" % os.WTERMSIG(retval)
136 out += "; output follows:\n" + data
139 def racadm_reboot(host, username, password, port, dryrun):
142 ip = socket.gethostbyname(host)
144 cmd = "/usr/sbin/racadm"
147 output = runcmd(cmd, ["-r %s -i serveraction powercycle" % ip],
150 output = runcmd(cmd, ["-r %s -i getsysinfo" % ip],
153 print "RUNCMD: %s" % output
158 except Exception, err:
159 print "runcmd raised exception %s" % err