You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

116 lines
4.3 KiB

#!/usr/bin/python2
#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()