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:
24 #raise Exception(e[1])
25 raise ExceptionNotFound(e[1])
26 elif e[0] == errno.ETIMEDOUT:
27 raise ExceptionTimeout(e[1])
29 # TODO: not other exceptions.
33 #def run(self, node_port, dryrun):
34 # if self.type == Transport.IPAL:
35 # ret = self.run_ipal(node_port, dryrun)
37 # ret2 = self.run_telnet(node_port, dryrun)
42 # elif self.type == Transport.TELNET:
43 # return self.run_telnet(node_port, dryrun)
45 # raise ExceptionNoTransport("Unimplemented Transport for IPAL")
47 def run_telnet(self, node_port, dryrun):
48 # TELNET version of protocol...
49 self.transport.open(self.host)
50 ## XXX Some iPals require you to hit Enter a few times first
51 self.transport.ifThenSend("Password >", "\r\n\r\n", ExceptionNotFound)
52 self.transport.ifThenSend("Password >", "\r\n\r\n", ExceptionNotFound)
54 self.transport.ifThenSend("Password >", self.password, ExceptionPassword)
55 self.transport.write("\r\n\r\n")
56 if not dryrun: # P# - Pulse relay
57 print "node_port %s" % node_port
58 self.transport.ifThenSend("Enter >",
62 self.transport.write("\r\n\r\n")
63 print "after new lines"
65 print "wait for enter"
66 self.transport.ifElse("Enter >", ExceptionTimeout)
68 self.transport.close()
71 def run_ipal(self, node_port, dryrun):
77 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
80 s.connect((self.host, 9100))
81 except socket.error, e:
83 if e[0] == errno.ECONNREFUSED:
84 # cannot connect to remote host
85 raise ExceptionNotFound(e[1])
86 elif e[0] == errno.ETIMEDOUT:
87 raise ExceptionTimeout(e[1])
89 # TODO: what other conditions are there?
93 print "Checking status"
94 s.send(self.format_msg("", 'O'))
95 ret = self.recv_noblock(s, 8)
96 print "Current status is '%s'" % ret
99 raise Exception("Status returned 'another session already open' on %s %s : %s" % (self.host, node_port, ret))
101 if node_port < len(ret):
102 status = ret[node_port]
110 raise ExceptionPort("IPAL reported 'Cable Error' on %s socket %s : %s" % (self.host, node_port, ret))
112 raise Exception("Unknown status for PCU %s socket %s : %s" % (self.host, node_port, ret))
114 raise Exception("Mismatch between configured port and PCU %s status: %s %s" % (self.host, node_port, ret))
119 print "Pulsing %s" % node_port
120 s.send(self.format_msg("%s" % node_port, 'P'))
122 # NOTE: turn power on ; do not pulse the port.
123 print "Power was off, so turning on ..."
124 s.send(self.format_msg("%s" % node_port, 'E'))
125 #s.send(self.format_msg("%s" % node_port, 'P'))
127 print "Receiving response."
128 ret = self.recv_noblock(s, 8)
129 print "Current status is '%s'" % ret
131 if node_port < len(ret):
132 status = ret[node_port]
140 raise ExceptionPort("IPAL reported 'Cable Error' on %s socket %s : %s" % (self.host, node_port, ret))
142 raise Exception("Unknown status for PCU %s socket %s : %s" % (self.host, node_port, ret))
144 raise Exception("Mismatch between configured port and PCU %s status: %s %s" % (self.host, node_port, ret))
149 return "Failed Power On"