Home | History | Annotate | Download | only in rpm_control_system
      1 #!/usr/bin/python
      2 #pylint: disable-msg=C0111
      3 import BeautifulSoup,optparse
      4 
      5 try:
      6     import pycurl
      7 except ImportError:
      8     print "Failed to import pycurl. Ignoring."
      9 
     10 ###############################################################
     11 # Digital Loggers Web Power Switch management
     12 ###############################################################
     13 # Version: 0.01
     14 # Description: This is both a module and a script
     15 #              
     16 #              The module provides a python class named
     17 #              DLIPower that allows managing the web power
     18 #              switch from python programs.
     19 # 
     20 #              When run as a script this acts as a command
     21 #              line utilty to manage the DLI Power switch.
     22 # Author: Dwight Hubbard d (at] dhub.me
     23 # Copyright: This module may be used for any use personal
     24 #            or commercial as long as the author and copyright
     25 #            notice are included in full.
     26 ###############################################################
     27 
     28 # Global settings
     29 # Timeout in seconds
     30 TIMEOUT=5
     31 
     32 class powerswitch:
     33     """ Manage the DLI Web power switch """
     34     def __init__(self,userid='admin',password='4321',hostname='192.168.0.100'):
     35         self.userid=userid
     36         self.password=password
     37         self.hostname=hostname
     38         self.contents=''
     39     def verify(self):
     40         """ Verify we can reach the switch, returns true if ok """
     41         return self.geturl()
     42     def body_callback(self,buf):
     43         self.contents=self.contents+buf
     44     def geturl(self,url='index.htm') :
     45         self.contents=''
     46         curl = pycurl.Curl()
     47         curl.setopt(curl.TIMEOUT,TIMEOUT)
     48         curl.setopt(curl.URL, 'http://%s:%s@%s/%s' % (self.userid,self.password,self.hostname,url))
     49         curl.setopt(curl.WRITEFUNCTION, self.body_callback)
     50         try:
     51             curl.perform()
     52             curl.close()
     53         except pycurl.error:
     54             return None
     55         return self.contents
     56     def off(self,outlet=0):
     57         """ Turn off a power to an outlet """
     58         self.geturl(url= 'outlet?%d=OFF' % outlet)
     59     def on(self,outlet=0):
     60         """ Turn on power to an outlet """
     61         self.geturl(url= 'outlet?%d=ON' % outlet)
     62     def statuslist(self):
     63         """ Return the status of all outlets in a list, 
     64         each item will contain 3 itmes plugnumber, hostname and state  """
     65         outlets=[]
     66         url=self.geturl('index.htm')
     67         if not url:
     68             return None
     69         soup=BeautifulSoup.BeautifulSoup(url)
     70         try:
     71             powertable=soup.findAll('table')[5]
     72         except IndexError:
     73             return None
     74         for temp in powertable.findAll('tr')[2:]:
     75             columns=temp.findAll('td')
     76             plugnumber=columns[0].string
     77             hostname=columns[1].string
     78             state=columns[2].find('font').string
     79             outlets.append([int(plugnumber),hostname,state])
     80         return outlets
     81     def printstatus(self):
     82         """ Print the status off all the outlets as a table to stdout """
     83         if not self.statuslist():
     84             print "Unable to communicte to the Web power switch at %s" % self.hostname
     85             return None
     86         print 'Outlet\t%-15.15s\tState' % 'Hostname'
     87         for item in self.statuslist():
     88             print '%d\t%-15.15s\t%s' % (item[0],item[1],item[2])
     89     def status(self,outlet=1):
     90         """ Return the status of an outlet, returned value will be one of: On, Off, Unknown """
     91         outlets=self.statuslist()
     92         if outlet:
     93             for plug in outlets:
     94                 if plug[0] == outlet:
     95                     return plug[2]
     96         return 'Unknown'
     97 
     98 if __name__ == "__main__":
     99     parser = optparse.OptionParser()
    100     parser.add_option('--hostname',dest='hostname',default="192.168.0.100")
    101     parser.add_option('--user',    dest='user',    default="admin")
    102     parser.add_option('--password',dest='password',default="4321")
    103     (options, args) = parser.parse_args()
    104 
    105     switch=powerswitch(userid=options.user,password=options.password,hostname=options.hostname)
    106     if len(args):
    107         if len(args) == 2:
    108             if args[0].lower() in ['on','poweron']:
    109                 switch.on(int(args[1]))
    110             if args[0].lower() in ['off','poweroff']:
    111                 switch.off(int(args[1]))
    112             if args[0].lower() in ['status']:
    113                 print switch.status(int(args[1]))
    114     else:
    115         switch.printstatus()
    116