1 from pcucontrol.reboot import *
3 class IPAL(PCUControl):
5 This now uses a proprietary format for communicating with the PCU. I
6 prefer it to Telnet, and Web access, since it's much lighter weight
7 and, more importantly, IT WORKS!! HHAHHHAHAHAHAHAHA!
9 supported_ports = [9100,23,80]
11 def format_msg(self, data, cmd):
12 esc = chr(int('1b',16))
13 return "%c%s%c%s%c" % (esc, self.password, esc, data, cmd) # esc, 'q', chr(4))
15 def recv_noblock(self, s, count):
19 # TODO: make sleep backoff, before stopping.
21 ret = s.recv(count, socket.MSG_DONTWAIT)
22 except socket.error, e:
23 if e[0] == errno.EAGAIN:
26 # TODO: not other exceptions.
30 #def run(self, node_port, dryrun):
31 # if self.type == Transport.IPAL:
32 # ret = self.run_ipal(node_port, dryrun)
34 # ret2 = self.run_telnet(node_port, dryrun)
39 # elif self.type == Transport.TELNET:
40 # return self.run_telnet(node_port, dryrun)
42 # raise ExceptionNoTransport("Unimplemented Transport for IPAL")
44 def run_telnet(self, node_port, dryrun):
45 # TELNET version of protocol...
46 self.transport.open(self.host)
47 ## XXX Some iPals require you to hit Enter a few times first
48 self.transport.ifThenSend("Password >", "\r\n\r\n", ExceptionNotFound)
50 self.transport.ifThenSend("Password >", self.password, ExceptionPassword)
51 self.transport.write("\r\n\r\n")
52 if not dryrun: # P# - Pulse relay
53 print "node_port %s" % node_port
54 self.transport.ifThenSend("Enter >",
58 self.transport.write("\r\n\r\n")
59 print "after new lines"
61 print "wait for enter"
62 self.transport.ifElse("Enter >", ExceptionTimeout)
64 self.transport.close()
67 def run_ipal(self, node_port, dryrun):
73 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
76 s.connect((self.host, 9100))
77 except socket.error, e:
79 if e[0] == errno.ECONNREFUSED:
80 # cannot connect to remote host
83 # TODO: what other conditions are there?
87 print "Checking status"
88 s.send(self.format_msg("", 'O'))
89 ret = self.recv_noblock(s, 8)
90 print "Current status is '%s'" % ret
93 raise Exception("Status returned 'another session already open' %s : %s" % (node_port, ret))
95 if node_port < len(ret):
96 status = ret[node_port]
104 raise Exception("Unknown status for PCU socket %s : %s" % (node_port, ret))
106 raise Exception("Mismatch between configured port and PCU status: %s %s" % (node_port, ret))
111 print "Pulsing %s" % node_port
112 s.send(self.format_msg("%s" % node_port, 'P'))
114 # NOTE: turn power on ; do not pulse the port.
115 print "Power was off, so turning on ..."
116 s.send(self.format_msg("%s" % node_port, 'E'))
117 #s.send(self.format_msg("%s" % node_port, 'P'))
119 print "Receiving response."
120 ret = self.recv_noblock(s, 8)
121 print "Current status is '%s'" % ret
123 if node_port < len(ret):
124 status = ret[node_port]
132 raise Exception("Unknown status for PCU socket %s : %s" % (node_port, ret))
134 raise Exception("Mismatch between configured port and PCU status: %s %s" % (node_port, ret))
139 return "Failed Power On"