+++ /dev/null
-from pcucontrol.reboot import *
-
-class ePowerSwitchNew(PCUControl):
- supported_ports = [80]
- # NOTE:
- # The old code used Python's HTTPPasswordMgrWithDefaultRealm()
- # For some reason this both doesn't work and in some cases, actually
- # hangs the PCU. Definitely not what we want.
- #
- # The code below is much simpler. Just letting things fail first,
- # and then, trying again with authentication string in the header.
- #
- def run_http(self, node_port, dryrun):
- self.transport = None
- self.url = "http://%s:%d/" % (self.host,80)
- uri = "%s:%d" % (self.host,80)
-
- req = urllib2.Request(self.url)
- try:
- handle = urllib2.urlopen(req)
- except IOError, e:
- # NOTE: this is expected to fail initially
- pass
- else:
- print self.url
- print "-----------"
- print handle.read()
- print "-----------"
- return "ERROR: not protected by HTTP authentication"
-
- if not hasattr(e, 'code') or e.code != 401:
- return "ERROR: failed for: %s" % str(e)
-
- base64data = base64.encodestring("%s:%s" % (self.username, self.password))[:-1]
- # NOTE: assuming basic realm authentication.
- authheader = "Basic %s" % base64data
- req.add_header("Authorization", authheader)
-
- try:
- f = urllib2.urlopen(req)
- except IOError, e:
- # failing here means the User/passwd is wrong (hopefully)
- raise ExceptionPassword("Incorrect username/password")
-
- # NOTE: after verifying that the user/password is correct,
- # actually reboot the given node.
- if not dryrun:
- try:
- data = urllib.urlencode({'P%d' % node_port : "r"})
- req = urllib2.Request(self.url + "cmd.html")
- req.add_header("Authorization", authheader)
- # add data to handler,
- f = urllib2.urlopen(req, data)
- #if self.transport.verbose: print f.read()
- except:
- import traceback; traceback.print_exc()
-
- # fetch url one more time on cmd.html, econtrol.html or whatever.
- # pass
- else:
- #if self.transport.verbose: print f.read()
- pass
-
- return 0
-
-class ePowerSwitchOld(PCUControl):
- def run_http(self, node_port, dryrun):
- self.url = "http://%s:%d/" % (self.host,80)
- uri = "%s:%d" % (self.host,80)
-
- # create authinfo
- authinfo = urllib2.HTTPPasswordMgrWithDefaultRealm()
- authinfo.add_password (None, uri, self.username, self.password)
- authhandler = urllib2.HTTPBasicAuthHandler( authinfo )
-
- # NOTE: it doesn't seem to matter whether this authinfo is here or not.
- transport = urllib2.build_opener(authinfo)
- f = transport.open(self.url)
- if self.transport.verbose: print f.read()
-
- if not dryrun:
- transport = urllib2.build_opener(authhandler)
- f = transport.open(self.url + "cmd.html", "P%d=r" % node_port)
- if self.transport.verbose: print f.read()
-
- self.transport.close()
- return 0
-
-class ePowerSwitchOld(PCUControl):
- supported_ports = [80]
- def run_http(self, node_port, dryrun):
- self.url = "http://%s:%d/" % (self.host,80)
- uri = "%s:%d" % (self.host,80)
-
- # TODO: I'm still not sure what the deal is here.
- # two independent calls appear to need to be made before the
- # reboot will succeed. It doesn't seem to be possible to do
- # this with a single call. I have no idea why.
-
- # create authinfo
- authinfo = urllib2.HTTPPasswordMgrWithDefaultRealm()
- authinfo.add_password (None, uri, self.username, self.password)
- authhandler = urllib2.HTTPBasicAuthHandler( authinfo )
-
- # NOTE: it doesn't seem to matter whether this authinfo is here or not.
- transport = urllib2.build_opener()
- f = transport.open(self.url + "elogin.html", "pwd=%s" % self.password)
- if self.transport.verbose: print f.read()
-
- if not dryrun:
- transport = urllib2.build_opener(authhandler)
- f = transport.open(self.url + "econtrol.html", "P%d=r" % node_port)
- if self.transport.verbose: print f.read()
-
- # data= "P%d=r" % node_port
- #self.open(self.host, self.username, self.password)
- #self.sendHTTP("elogin.html", "pwd=%s" % self.password)
- #self.sendHTTP("econtrol.html", data)
- #self.sendHTTP("cmd.html", data)
-
- #self.close()
- return 0