| #!/usr/bin/python |
| #pylint: disable-msg=C0111 |
| import BeautifulSoup,optparse |
| |
| try: |
| import pycurl |
| except ImportError: |
| print "Failed to import pycurl. Ignoring." |
| |
| ############################################################### |
| # Digital Loggers Web Power Switch management |
| ############################################################### |
| # Version: 0.01 |
| # Description: This is both a module and a script |
| # |
| # The module provides a python class named |
| # DLIPower that allows managing the web power |
| # switch from python programs. |
| # |
| # When run as a script this acts as a command |
| # line utilty to manage the DLI Power switch. |
| # Author: Dwight Hubbard d@dhub.me |
| # Copyright: This module may be used for any use personal |
| # or commercial as long as the author and copyright |
| # notice are included in full. |
| ############################################################### |
| |
| # Global settings |
| # Timeout in seconds |
| TIMEOUT=5 |
| |
| class powerswitch: |
| """ Manage the DLI Web power switch """ |
| def __init__(self,userid='admin',password='4321',hostname='192.168.0.100'): |
| self.userid=userid |
| self.password=password |
| self.hostname=hostname |
| self.contents='' |
| def verify(self): |
| """ Verify we can reach the switch, returns true if ok """ |
| return self.geturl() |
| def body_callback(self,buf): |
| self.contents=self.contents+buf |
| def geturl(self,url='index.htm') : |
| self.contents='' |
| curl = pycurl.Curl() |
| curl.setopt(curl.TIMEOUT,TIMEOUT) |
| curl.setopt(curl.URL, 'http://%s:%s@%s/%s' % (self.userid,self.password,self.hostname,url)) |
| curl.setopt(curl.WRITEFUNCTION, self.body_callback) |
| try: |
| curl.perform() |
| curl.close() |
| except pycurl.error: |
| return None |
| return self.contents |
| def off(self,outlet=0): |
| """ Turn off a power to an outlet """ |
| self.geturl(url= 'outlet?%d=OFF' % outlet) |
| def on(self,outlet=0): |
| """ Turn on power to an outlet """ |
| self.geturl(url= 'outlet?%d=ON' % outlet) |
| def statuslist(self): |
| """ Return the status of all outlets in a list, |
| each item will contain 3 itmes plugnumber, hostname and state """ |
| outlets=[] |
| url=self.geturl('index.htm') |
| if not url: |
| return None |
| soup=BeautifulSoup.BeautifulSoup(url) |
| try: |
| powertable=soup.findAll('table')[5] |
| except IndexError: |
| return None |
| for temp in powertable.findAll('tr')[2:]: |
| columns=temp.findAll('td') |
| plugnumber=columns[0].string |
| hostname=columns[1].string |
| state=columns[2].find('font').string |
| outlets.append([int(plugnumber),hostname,state]) |
| return outlets |
| def printstatus(self): |
| """ Print the status off all the outlets as a table to stdout """ |
| if not self.statuslist(): |
| print "Unable to communicte to the Web power switch at %s" % self.hostname |
| return None |
| print 'Outlet\t%-15.15s\tState' % 'Hostname' |
| for item in self.statuslist(): |
| print '%d\t%-15.15s\t%s' % (item[0],item[1],item[2]) |
| def status(self,outlet=1): |
| """ Return the status of an outlet, returned value will be one of: On, Off, Unknown """ |
| outlets=self.statuslist() |
| if outlet: |
| for plug in outlets: |
| if plug[0] == outlet: |
| return plug[2] |
| return 'Unknown' |
| |
| if __name__ == "__main__": |
| parser = optparse.OptionParser() |
| parser.add_option('--hostname',dest='hostname',default="192.168.0.100") |
| parser.add_option('--user', dest='user', default="admin") |
| parser.add_option('--password',dest='password',default="4321") |
| (options, args) = parser.parse_args() |
| |
| switch=powerswitch(userid=options.user,password=options.password,hostname=options.hostname) |
| if len(args): |
| if len(args) == 2: |
| if args[0].lower() in ['on','poweron']: |
| switch.on(int(args[1])) |
| if args[0].lower() in ['off','poweroff']: |
| switch.off(int(args[1])) |
| if args[0].lower() in ['status']: |
| print switch.status(int(args[1])) |
| else: |
| switch.printstatus() |