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 s.sendline("racadm getsysinfo")
39 print "serveraction powercycle"
41 s.sendline("racadm serveraction powercycle")
43 s.sendline("serveraction powercycle")
45 s.sendline("racadm serveraction powercycle")
47 # TODO: this is really lousy. Without the sleep, the sendlines
48 # don't completely get through. Even the added, expect line
49 # returns right away without waiting for the commands above to
50 # complete... Therefore, this delay is guaranteed to fail in some
54 index = s.expect(["\$", "\[%s\]#" % self.username, "/.*>" ])
56 print "INDEX 2:", index
60 raise ExceptionPrompt("EOF before expected Prompt")
61 except pexpect.TIMEOUT:
63 raise ExceptionPrompt("Timeout before expected Prompt")
69 ### rebooting Dell systems via RAC card
70 # Marc E. Fiuczynski - June 01 2005
71 # tested with David Lowenthal's itchy/scratchy nodes at UGA
73 def runcmd(command, args, username, password, timeout = None):
76 result_ready = threading.Condition()
80 result_ready.acquire()
85 result_ready.release()
87 def do_command(command, username, password):
90 # Popen4 is a popen-type class that combines stdout and stderr
91 p = popen2.Popen4(command)
93 # read all output data
94 p.tochild.write("%s\n" % username)
95 p.tochild.write("%s\n" % password)
97 data = p.fromchild.read()
100 # might get interrupted by a signal in poll() or waitpid()
103 set_result((retval, data))
106 if ex.errno == errno.EINTR:
109 except Exception, ex:
113 command = " ".join([command] + args)
115 worker = threading.Thread(target = do_command, args = (command, username, password, ))
116 worker.setDaemon(True)
117 result_ready.acquire()
119 result_ready.wait(timeout)
122 raise Exception, "command timed-out: '%s'" % command
124 result_ready.release()
127 if isinstance(result, Exception):
130 (retval, data) = result
131 if os.WIFEXITED(retval) and os.WEXITSTATUS(retval) == 0:
134 out = "system command ('%s') " % command
135 if os.WIFEXITED(retval):
136 out += "failed, rc = %d" % os.WEXITSTATUS(retval)
138 out += "killed by signal %d" % os.WTERMSIG(retval)
140 out += "; output follows:\n" + data
143 def racadm_reboot(host, username, password, port, dryrun):
146 ip = socket.gethostbyname(host)
148 cmd = "/usr/sbin/racadm"
151 output = runcmd(cmd, ["-r %s -i serveraction powercycle" % ip],
154 output = runcmd(cmd, ["-r %s -i getsysinfo" % ip],
157 print "RUNCMD: %s" % output
162 except Exception, err:
163 print "runcmd raised exception %s" % err