Skip to content

Commit

Permalink
Merge pull request #1512 from moto-timo/digitalloggers_restapi
Browse files Browse the repository at this point in the history
driver: digitalloggers_restapi: enable REST API
  • Loading branch information
Emantor authored Dec 2, 2024
2 parents d4d8370 + 71e3604 commit b67bfc1
Show file tree
Hide file tree
Showing 3 changed files with 80 additions and 0 deletions.
8 changes: 8 additions & 0 deletions doc/configuration.rst
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,14 @@ Currently available are:
host argument must include the protocol, such as
``http://192.168.0.3`` or ``http://admin:[email protected]``.

``digitalloggers_restapi``
Controls *Digital Loggers PDUs* that use the REST API. Note that
host argument must include the protocol, such as
``http://192.168.0.3`` or ``https://admin:[email protected]``.
By default, only authenticated users may access the REST API.
HTTPS queries intentially ignore ssl certificate validation, since
the as-shipped certificate is self-signed.

``eaton``
Controls *Eaton ePDUs* via SNMP.

Expand Down
71 changes: 71 additions & 0 deletions labgrid/driver/power/digitalloggers_restapi.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
'''
Driver for Digital Loggers PDU that use the REST API.
Tested with Ethernet Power Controller 7.
Based on https://www.digital-loggers.com/restapi.pdf
By default, only an authenticated user is allowed by REST API.
NetworkPowerPort:
model: 'digitalloggers_restapi'
host: 'http://admin:[email protected]'
index: 0
'''
from urllib.parse import urlparse

import requests
from requests.auth import HTTPDigestAuth
from requests.packages import urllib3


def extract_user_password_from_host(host):
url = urlparse(host)
if '@' in url.netloc:
user=url.username
password=url.password
_host= f'{url.scheme}://{url.netloc.split("@")[1]}'
else:
user = None
password = None
_host= f'{url.scheme}://{url.netloc}'
return user, password, _host

def power_set(host, port, index, value):
# curl -u admin:1234 -v -X PUT -H "X-CSRF: x" --data 'value=true' --digest http://192.168.0.100/restapi/relay/outlets/=0/state/
# curl -u admin:1234 -v -X PUT -H "X-CSRF: x" --data 'value=false' --digest http://192.168.0.100/restapi/relay/outlets/=0/state/
# curl --insecure -u admin:1234 -v -X PUT -H "X-CSRF: x" --data 'value=true' --digest https://192.168.0.100/restapi/relay/outlets/=0/state/
# curl --insecure -u admin:1234 -v -X PUT -H "X-CSRF: x" --data 'value=false' --digest https://192.168.0.100/restapi/relay/outlets/=0/state/
assert port is None

index = int(index)
value = 'true' if value else 'false'
payload = {'value' : value }
headers = {'X-CSRF': 'x', 'Accept': 'application/json'}
user, password, url = extract_user_password_from_host(host)
host = f'{url}/restapi/relay/outlets/={index}/state/'
with urllib3.warnings.catch_warnings():
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
if user and password:
r = requests.put(host, data=payload, auth=HTTPDigestAuth(user, password), headers=headers, verify=False)
else:
r = requests.put(host, data=payload, headers=headers, verify=False)
r.raise_for_status()

def power_get(host, port, index):
# curl -u admin:1234 -v -X GET -H "X-CSRF: x" --digest http://192.168.0.100/restapi/relay/outlets/=0/state/
# curl --insecure -u admin:1234 -v -X GET -H "X-CSRF: x" --digest https://192.168.0.100/restapi/relay/outlets/=0/state/
assert port is None

index = int(index)
user, password, url = extract_user_password_from_host(host)
headers = {'X-CSRF': 'x', 'Accept': 'application/json'}
host = f'{url}/restapi/relay/outlets/={index}/state/'
with urllib3.warnings.catch_warnings():
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
if user and password:
r = requests.get(host, auth=HTTPDigestAuth(user, password), headers=headers, verify=False)
else:
r = requests.get(host, headers=headers, verify=False)
r.raise_for_status()
statuses = r.json()
return statuses[0]
1 change: 1 addition & 0 deletions tests/test_powerdriver.py
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,7 @@ def test_import_backends(self):
import labgrid.driver.power.apc
import labgrid.driver.power.digipower
import labgrid.driver.power.digitalloggers_http
import labgrid.driver.power.digitalloggers_restapi
import labgrid.driver.power.eth008
import labgrid.driver.power.gude
import labgrid.driver.power.gude24
Expand Down

0 comments on commit b67bfc1

Please sign in to comment.