X-Git-Url: http://git.onelab.eu/?p=pcucontrol.git;a=blobdiff_plain;f=pcucontrol%2Fmodels%2FAPCControl.py;fp=pcucontrol%2Fmodels%2FAPCControl.py;h=52dfe18fcb37077c9052e0612a6074039c847a15;hp=ebe43e25565a4faefe399baf961537a869298562;hb=dd516e0f7a0f19fbc20204be8acca09687919db9;hpb=51e66ab7b975799462e6b6c93494f4781fecacf7 diff --git a/pcucontrol/models/APCControl.py b/pcucontrol/models/APCControl.py index ebe43e2..52dfe18 100644 --- a/pcucontrol/models/APCControl.py +++ b/pcucontrol/models/APCControl.py @@ -1,179 +1,172 @@ from pcucontrol.reboot import * import subprocess -class APCControl(PCUControl): - supported_ports = [22,23,80,443] - reboot_sequence = [] - - def run(self, node_port, dryrun): - print "RUNNING!!!!!!!!!!!!" - if self.transport.type == Transport.HTTPS or self.type == Transport.HTTP: - print "APC via http...." - return self.run_http_or_https(node_port, dryrun) - else: - print "APC via telnet/ssh...." - return self.run_telnet_or_ssh(node_port, dryrun) - - def run_ssh(self, node_port, dryrun): - return self.run_telnet_or_ssh(node_port, dryrun) - def run_telnet(self, node_port, dryrun): - return self.run_telnet_or_ssh(node_port, dryrun) - - def run_telnet_or_ssh(self, node_port, dryrun): - self.transport.open(self.host, self.username) - self.transport.sendPassword(self.password) - - first = True - for val in self.reboot_sequence: - if first: - self.transport.ifThenSend("\r\n> ", val, ExceptionPassword) - first = False - else: - self.transport.ifThenSend("\r\n> ", val) - - if not dryrun: - self.transport.ifThenSend("Enter 'YES' to continue or to cancel", - "YES\r\n", - ExceptionSequence) - else: - self.transport.ifThenSend("Enter 'YES' to continue or to cancel", - "", ExceptionSequence) - self.transport.ifThenSend("Press to continue...", "", ExceptionSequence) - - self.transport.close() - return 0 - - def run_http(self, node_port, dryrun): - return self.run_http_or_https(node_port, dryrun) - def run_https(self, node_port, dryrun): - return self.run_http_or_https(node_port, dryrun) - - def run_http_or_https(self, node_port, dryrun): - if not dryrun: - # send reboot signal. - # TODO: send a ManualPCU() reboot request for this PCU. - # NOTE: this model defies automation because, the port numbering - # and the form numbers are not consistent across models. There is - # not direct mapping from port# to form#. - return "Manual Reboot Required" - - else: - # TODO: also send message for https, since that doesn't work this way... - if self.transport.type == Transport.HTTPS: - cmd = self.get_https_cmd() - elif self.transport.type == Transport.HTTP: - cmd = self.get_http_cmd() - else: - raise ExceptionNoTransport("Unsupported transport for http command") - - cmd = cmd % ( self.username, self.password, self.host) - print "CMD: %s" % cmd - - p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE).stdout - - result = p.read() - if len(result.split('\n')) > 2: - self.logout() - return 0 - else: - # NOTE: an error has occurred, so no need to log out. - print "RESULT: ", result - return result - - def get_https_cmd(self): - version = self.get_version() - print "VERSION: %s" % version - if "AP96" in version: - cmd = "curl -s --insecure --user '%s:%s' https://%s/outlets.htm " + \ - " | grep -E '^[^<]+' " + \ - " | grep -v 'Protected Object' " - else: - # NOTE: no other case known right now... - cmd = "curl -s --insecure --user '%s:%s' https://%s/outlets.htm " + \ - " | grep -E '^[^<]+' " + \ - " | grep -v 'Protected Object' " - - return cmd - - def get_http_cmd(self): - version = self.get_version() - print "VERSION: %s" % version - if "AP7900" in version: - cmd = "curl -s --anyauth --user '%s:%s' http://%s/rPDUout.htm | grep -E '^[^<]+'" - elif "AP7920" in version: - cmd = "curl -s --anyauth --user '%s:%s' http://%s/ms3out.htm | grep -E '^[^<]+' " - else: - # default case... - print "USING DEFAULT" - cmd = "curl -s --anyauth --user '%s:%s' http://%s/ms3out.htm | grep -E '^[^<]+' " - - return cmd - - def get_version(self): - # NOTE: this command returns and formats all data. - #cmd = """curl -s --anyauth --user '%s:%s' http://%s/about.htm """ + - # """ | sed -e "s/<[^>]*>//g" -e "s/ //g" -e "/^$/d" """ + - # """ | awk '{line=$0 ; if ( ! /:/ && length(pline) > 0 ) \ - # { print pline, line } else { pline=line} }' """ + - # """ | grep Model """ - - # NOTE: we may need to return software version, no model version to - # know which file to request on the server. - - if self.transport.type == Transport.HTTP: - cmd = """curl -s --anyauth --user '%s:%s' http://%s/about.htm """ + \ - """ | sed -e "s/<[^>]*>//g" -e "s/ //g" -e "/^$/d" """ + \ - """ | grep -E "AP[[:digit:]]+" """ - #""" | grep -E "v[[:digit:]].*" """ - elif self.transport.type == Transport.HTTPS: - cmd = """curl -s --insecure --user '%s:%s' https://%s/about.htm """ + \ - """ | sed -e "s/<[^>]*>//g" -e "s/ //g" -e "/^$/d" """ + \ - """ | grep -E "AP[[:digit:]]+" """ - #""" | grep -E "v[[:digit:]].*" """ - else: - raise ExceptionNoTransport("Unsupported transport to get version") - - cmd = cmd % ( self.username, self.password, self.host) - p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE).stdout - result = p.read() - return result.strip() - - def logout(self): - # NOTE: log out again, to allow other uses to access the machine. - if self.transport.type == Transport.HTTP: - cmd = """curl -s --anyauth --user '%s:%s' http://%s/logout.htm """ + \ - """ | grep -E '^[^<]+' """ - elif self.transport.type == Transport.HTTPS: - cmd = """curl -s --insecure --user '%s:%s' http://%s/logout.htm """ + \ - """ | grep -E '^[^<]+' """ - else: - raise ExceptionNoTransport("Unsupported transport to logout") - - cmd = cmd % ( self.username, self.password, self.host) - p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE).stdout - print p.read() +class APCControl(BasicPCUControl): + supported_ports = [22,23,80,443] +# reboot_sequence = [] + + def run(self, node_port, dryrun): + print "RUNNING!!!!!!!!!!!!" + if self.transport.type == Transport.HTTPS or self.type == Transport.HTTP: + print "APC via http...." + return self.run_http_or_https(node_port, dryrun) + else: + print "APC via telnet/ssh...." + return self.run_telnet_or_ssh(node_port, dryrun) + + def pcu_run(self, node_port, dryrun=False): + return self.run_telnet_or_ssh(node_port, dryrun) + + def pcu_test(self, node_port, dryrun=True): + return self.run_telnet_or_ssh(node_port, dryrun) + + def run_telnet_or_ssh(self, node_port, dryrun): + r = self.run_telnet(node_port, dryrun) + if "No error" in r: + return r + r2 = self.run_ssh(node_port, dryrun) + if "No error" in r2: + return r2 + return r + " :: " +r2 + + def run_ssh(self, node_port, dryrun): + return self.run_expect_script("APC.exp ssh", dryrun=dryrun, model="None", sequence=self.reboot_sequence) + def run_telnet(self, node_port, dryrun): + return self.run_expect_script("APC.exp telnet", dryrun=dryrun, model="None", sequence=self.reboot_sequence) + + + def run_http(self, node_port, dryrun): + return self.run_http_or_https(node_port, dryrun) + def run_https(self, node_port, dryrun): + return self.run_http_or_https(node_port, dryrun) + + def run_http_or_https(self, node_port, dryrun): + if not dryrun: + # send reboot signal. + # TODO: send a ManualPCU() reboot request for this PCU. + # NOTE: this model defies automation because, the port numbering + # and the form numbers are not consistent across models. There is + # not direct mapping from port# to form#. + return "Manual Reboot Required" + + else: + # TODO: also send message for https, since that doesn't work this way... + if self.transport.type == Transport.HTTPS: + cmd = self.get_https_cmd() + elif self.transport.type == Transport.HTTP: + cmd = self.get_http_cmd() + else: + raise ExceptionNoTransport("Unsupported transport for http command") + + cmd = cmd % ( self.username, self.password, self.host) + print "CMD: %s" % cmd + + p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE).stdout + + result = p.read() + if len(result.split('\n')) > 2: + self.logout() + return 0 + else: + # NOTE: an error has occurred, so no need to log out. + print "RESULT: ", result + return result + + def get_https_cmd(self): + version = self.get_version() + print "VERSION: %s" % version + if "AP96" in version: + cmd = "curl -s --insecure --user '%s:%s' https://%s/outlets.htm " + \ + " | grep -E '^[^<]+' " + \ + " | grep -v 'Protected Object' " + else: + # NOTE: no other case known right now... + cmd = "curl -s --insecure --user '%s:%s' https://%s/outlets.htm " + \ + " | grep -E '^[^<]+' " + \ + " | grep -v 'Protected Object' " + + return cmd + + def get_http_cmd(self): + version = self.get_version() + print "VERSION: %s" % version + if "AP7900" in version: + cmd = "curl -s --anyauth --user '%s:%s' http://%s/rPDUout.htm | grep -E '^[^<]+'" + elif "AP7920" in version: + cmd = "curl -s --anyauth --user '%s:%s' http://%s/ms3out.htm | grep -E '^[^<]+' " + else: + # default case... + print "USING DEFAULT" + cmd = "curl -s --anyauth --user '%s:%s' http://%s/ms3out.htm | grep -E '^[^<]+' " + + return cmd + + def get_version(self): + # NOTE: this command returns and formats all data. + #cmd = """curl -s --anyauth --user '%s:%s' http://%s/about.htm """ + + # """ | sed -e "s/<[^>]*>//g" -e "s/ //g" -e "/^$/d" """ + + # """ | awk '{line=$0 ; if ( ! /:/ && length(pline) > 0 ) \ + # { print pline, line } else { pline=line} }' """ + + # """ | grep Model """ + + # NOTE: we may need to return software version, no model version to + # know which file to request on the server. + + if self.transport.type == Transport.HTTP: + cmd = """curl -s --anyauth --user '%s:%s' http://%s/about.htm """ + \ + """ | sed -e "s/<[^>]*>//g" -e "s/ //g" -e "/^$/d" """ + \ + """ | grep -E "AP[[:digit:]]+" """ + #""" | grep -E "v[[:digit:]].*" """ + elif self.transport.type == Transport.HTTPS: + cmd = """curl -s --insecure --user '%s:%s' https://%s/about.htm """ + \ + """ | sed -e "s/<[^>]*>//g" -e "s/ //g" -e "/^$/d" """ + \ + """ | grep -E "AP[[:digit:]]+" """ + #""" | grep -E "v[[:digit:]].*" """ + else: + raise ExceptionNoTransport("Unsupported transport to get version") + + cmd = cmd % ( self.username, self.password, self.host) + p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE).stdout + result = p.read() + return result.strip() + + def logout(self): + # NOTE: log out again, to allow other uses to access the machine. + if self.transport.type == Transport.HTTP: + cmd = """curl -s --anyauth --user '%s:%s' http://%s/logout.htm """ + \ + """ | grep -E '^[^<]+' """ + elif self.transport.type == Transport.HTTPS: + cmd = """curl -s --insecure --user '%s:%s' http://%s/logout.htm """ + \ + """ | grep -E '^[^<]+' """ + else: + raise ExceptionNoTransport("Unsupported transport to logout") + + cmd = cmd % ( self.username, self.password, self.host) + p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE).stdout + print p.read() class APCControl12p3(APCControl): - def run_telnet_or_ssh(self, node_port, dryrun): - self.reboot_sequence = ["1", "2", str(node_port), "3"] - return super(APCControl12p3, self).run_telnet_or_ssh(node_port, dryrun) + def run_telnet_or_ssh(self, node_port, dryrun): + self.reboot_sequence = ["1", "2", str(node_port), "3"] + return super(APCControl12p3, self).run_telnet_or_ssh(node_port, dryrun) class APCControl1p4(APCControl): - def run_telnet_or_ssh(self, node_port, dryrun): - self.reboot_sequence = ["1", str(node_port), "4"] - return super(APCControl1p4, self).run_telnet_or_ssh(node_port, dryrun) + def run_telnet_or_ssh(self, node_port, dryrun): + self.reboot_sequence = ["1", str(node_port), "4"] + return super(APCControl1p4, self).run_telnet_or_ssh(node_port, dryrun) class APCControl121p3(APCControl): - def run_telnet_or_ssh(self, node_port, dryrun): - self.reboot_sequence = ["1", "2", "1", str(node_port), "3"] - return super(APCControl121p3, self).run_telnet_or_ssh(node_port, dryrun) + def run_telnet_or_ssh(self, node_port, dryrun): + print "TEST! " + self.reboot_sequence = ["1", "2", "1", str(node_port), "3"] + return super(APCControl121p3, self).run_telnet_or_ssh(node_port, dryrun) class APCControl121p1(APCControl): - def run_telnet_or_ssh(self, node_port, dryrun): - self.reboot_sequence = ["1", "2", "1", str(node_port), "1", "3"] - return super(APCControl121p1, self).run_telnet_or_ssh(node_port, dryrun) + def run_telnet_or_ssh(self, node_port, dryrun): + self.reboot_sequence = ["1", "2", "1", str(node_port), "1", "3"] + return super(APCControl121p1, self).run_telnet_or_ssh(node_port, dryrun) class APCControl13p13(APCControl): - def run_telnet_or_ssh(self, node_port, dryrun): - self.reboot_sequence = ["1", "3", str(node_port), "1", "3"] - return super(APCControl13p13, self).run_telnet_or_ssh(node_port, dryrun) + def run_telnet_or_ssh(self, node_port, dryrun): + self.reboot_sequence = ["1", "3", str(node_port), "1", "3"] + return super(APCControl13p13, self).run_telnet_or_ssh(node_port, dryrun)