86 lines
2.3 KiB
Python
Executable File
86 lines
2.3 KiB
Python
Executable File
"""
|
|
Support for ClearPass Policy Manager.
|
|
|
|
Allows tracking devices with CPPM.
|
|
"""
|
|
import logging
|
|
from datetime import timedelta
|
|
|
|
import voluptuous as vol
|
|
import homeassistant.helpers.config_validation as cv
|
|
from homeassistant.components.device_tracker import (
|
|
PLATFORM_SCHEMA, DeviceScanner, DOMAIN
|
|
)
|
|
from homeassistant.const import (
|
|
CONF_HOST, CONF_API_KEY
|
|
)
|
|
|
|
REQUIREMENTS = ['clearpasspy==1.0.2']
|
|
|
|
SCAN_INTERVAL = timedelta(seconds=120)
|
|
|
|
CLIENT_ID = 'client_id'
|
|
|
|
GRANT_TYPE = 'client_credentials'
|
|
|
|
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
|
vol.Required(CONF_HOST): cv.string,
|
|
vol.Required(CLIENT_ID): cv.string,
|
|
vol.Required(CONF_API_KEY): cv.string,
|
|
})
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
|
|
def get_scanner(hass, config):
|
|
"""Initialize Scanner."""
|
|
from clearpasspy import ClearPass
|
|
data = {
|
|
'server': config[DOMAIN][CONF_HOST],
|
|
'grant_type': GRANT_TYPE,
|
|
'secret': config[DOMAIN][CONF_API_KEY],
|
|
'client': config[DOMAIN][CLIENT_ID]
|
|
}
|
|
cppm = ClearPass(data)
|
|
if cppm.access_token is None:
|
|
return None
|
|
_LOGGER.debug("Successfully received Access Token")
|
|
return CPPMDeviceScanner(cppm)
|
|
|
|
|
|
class CPPMDeviceScanner(DeviceScanner):
|
|
"""Initialize class."""
|
|
|
|
def __init__(self, cppm):
|
|
"""Initialize class."""
|
|
self._cppm = cppm
|
|
self.results = None
|
|
|
|
def scan_devices(self):
|
|
"""Initialize scanner."""
|
|
self.get_cppm_data()
|
|
return [device['mac'] for device in self.results]
|
|
|
|
def get_device_name(self, device):
|
|
"""Retrieve device name."""
|
|
name = next((
|
|
result['name'] for result in self.results
|
|
if result['mac'] == device), None)
|
|
return name
|
|
|
|
def get_cppm_data(self):
|
|
"""Retrieve data from Aruba Clearpass and return parsed result."""
|
|
endpoints = self._cppm.get_endpoints(100)['_embedded']['items']
|
|
devices = []
|
|
for item in endpoints:
|
|
if self._cppm.online_status(item['mac_address']):
|
|
device = {
|
|
'mac': item['mac_address'],
|
|
'name': item['mac_address']
|
|
}
|
|
devices.append(device)
|
|
else:
|
|
continue
|
|
_LOGGER.debug("Devices: %s", devices)
|
|
self.results = devices
|