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
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()
|