Source code for paradrop.backend.information_api

'''
Provide information of the router, e.g. board version, CPU information,
memory size, disk size.

Endpoints for these functions can be found under /api/v1/info.
'''
import json
import os
import platform
from psutil import virtual_memory
from klein import Klein

from paradrop.base import constants
from paradrop.core.config.devices import detectSystemDevices
from paradrop.core.system.system_info import getOSVersion, getPackageVersion
from paradrop.core.agent.reporting import TelemetryReportBuilder
from paradrop.lib.utils import pdos
from . import cors


[docs]class InformationApi(object): routes = Klein() def __init__(self): self.vendor = pdos.read_sys_file('/sys/devices/virtual/dmi/id/sys_vendor') self.board = pdos.read_sys_file('/sys/devices/virtual/dmi/id/product_name', default='') \ + ' ' + pdos.read_sys_file('/sys/devices/virtual/dmi/id/product_version', default='') self.cpu = platform.processor() self.memory = virtual_memory().total self.wifi = [] devices = detectSystemDevices() for wifiDev in devices['wifi']: # Skip unusual devices that are missing the id field. if 'id' not in wifiDev: continue self.wifi.append({ 'id': wifiDev['id'], 'macAddr': wifiDev['mac'], 'vendorId': wifiDev['vendor'], 'deviceId': wifiDev['device'], 'slot': wifiDev['slot'] }) self.biosVendor = pdos.read_sys_file('/sys/devices/virtual/dmi/id/bios_vendor') self.biosVersion = pdos.read_sys_file('/sys/devices/virtual/dmi/id/bios_version') self.biosDate = pdos.read_sys_file('/sys/devices/virtual/dmi/id/bios_date') self.osVersion = getOSVersion() self.kernelVersion = platform.system() + '-' + platform.release() self.pdVersion = getPackageVersion('paradrop') self.uptime = int(float(pdos.read_sys_file('/proc/uptime', default='0').split()[0]))
[docs] @routes.route('/hardware', methods=['GET']) def hardware_info(self, request): """ Get information about the hardware platform. **Example request**: .. sourcecode:: http GET /api/v1/info/hardware **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Type: application/json { "wifi": [ { "slot": "pci/0000:04:00.0", "vendorId": "0x168c", "macAddr": "04:f0:21:2f:b7:c1", "id": "pci-wifi-0", "deviceId": "0x003c" }, { "slot": "pci/0000:06:00.0", "vendorId": "0x168c", "macAddr": "04:f0:21:0f:78:28", "id": "pci-wifi-1", "deviceId": "0x002a" } ], "memory": 2065195008, "vendor": "PC Engines", "board": "APU 1.0", "cpu": "x86_64" } """ cors.config_cors(request) request.setHeader('Content-Type', 'application/json') data = dict() data['vendor'] = self.vendor data['board'] = self.board data['cpu'] = self.cpu data['memory'] = self.memory data['wifi'] = self.wifi return json.dumps(data)
[docs] @routes.route('/software', methods=['GET']) def software_info(self, request): """ Get information about the operating system. Returns a dictionary containing information the BIOS version, OS version, kernel version, Paradrop version, and system uptime. **Example request**: .. sourcecode:: http GET /api/v1/info/software **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Type: application/json { "biosVersion": "SageBios_PCEngines_APU-45", "biosDate": "04/05/2014", "uptime": 15351, "kernelVersion": "Linux-4.4.0-101-generic", "pdVersion": "0.9.2", "biosVendor": "coreboot", "osVersion": "Ubuntu 4.4.0-101.124-generic 4.4.95" } """ cors.config_cors(request) request.setHeader('Content-Type', 'application/json') data = dict() data['biosVendor'] = self.biosVendor data['biosVersion'] = self.biosVersion data['biosDate'] = self.biosDate data['kernelVersion'] = self.kernelVersion data['osVersion'] = self.osVersion data['pdVersion'] = self.pdVersion data['uptime'] = self.uptime return json.dumps(data)
[docs] @routes.route('/environment', methods=['GET']) def get_environment(self, request): """ Get environment variables. Returns a dictionary containing the environment variables passed to the Paradrop daemon. This is useful for development and debugging purposes (e.g. see how PATH is set on Paradrop when running in different contexts). **Example request**: .. sourcecode:: http GET /api/v1/info/environment **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Type: application/json { "LANG": "C.UTF-8", "SNAP_REVISION": "x73", "SNAP_COMMON": "/var/snap/paradrop-daemon/common", "XDG_RUNTIME_DIR": "/run/user/0/snap.paradrop-daemon", "SNAP_USER_COMMON": "/root/snap/paradrop-daemon/common", "SNAP_LIBRARY_PATH": "/var/lib/snapd/lib/gl:/var/lib/snapd/void", "SNAP_NAME": "paradrop-daemon", "PWD": "/var/snap/paradrop-daemon/x73", "PATH": "/snap/paradrop-daemon/x73/usr/sbin:/snap/paradrop-daemon/x73/usr/bin:/snap/paradrop-daemon/x73/sbin:/snap/paradrop-daemon/x73/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games", "SNAP": "/snap/paradrop-daemon/x73", "SNAP_DATA": "/var/snap/paradrop-daemon/x73", "SNAP_VERSION": "0.9.2", "SNAP_ARCH": "amd64", "SNAP_USER_DATA": "/root/snap/paradrop-daemon/x73", "TEMPDIR": "/tmp", "HOME": "/root/snap/paradrop-daemon/x73", "SNAP_REEXEC": "", "LD_LIBRARY_PATH": "/var/lib/snapd/lib/gl:/var/lib/snapd/void:/snap/paradrop-daemon/x73/usr/lib/x86_64-linux-gnu::/snap/paradrop-daemon/x73/lib:/snap/paradrop-daemon/x73/usr/lib:/snap/paradrop-daemon/x73/lib/x86_64-linux-gnu:/snap/paradrop-daemon/x73/usr/lib/x86_64-linux-gnu", "TMPDIR": "/tmp" ... } """ cors.config_cors(request) request.setHeader('Content-Type', 'application/json') return json.dumps(os.environ.data)
[docs] @routes.route('/features', methods=['GET']) def get_features(self, request): """ Get features supported by the host. This is a list of strings specifying features supported by the daemon. **Explanation of feature strings**: hostapd-control The daemon supports the hostapd control interface and provides a websocket channel for accessing it. **Example request**: .. sourcecode:: http GET /api/v1/info/features **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Type: application/json [ "hostapd-control" ] """ cors.config_cors(request) request.setHeader('Content-Type', 'application/json') features = constants.DAEMON_FEATURES.split() return json.dumps(features)
[docs] @routes.route('/telemetry', methods=['GET']) def get_telemetry(self, request): """ Get a telemetry report. This contains information about resource utilization by chute and system totals. This endpoint returns the same data that we periodically send to the controller if telemetry is enabled. """ cors.config_cors(request) request.setHeader('Content-Type', 'application/json') builder = TelemetryReportBuilder() report = builder.prepare() return json.dumps(report)