123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- #!/usr/bin/env python3
- import socket
- import netifaces as netif
- import subprocess
- import re
- from lib.respondd import Respondd
- import lib.helper
- class Nodeinfo(Respondd):
- def __init__(self, config):
- Respondd.__init__(self, config)
- def getDevice_Addresses(self, dev):
- l = []
- try:
- for ip6 in netif.ifaddresses(dev)[netif.AF_INET6]:
- raw6 = ip6['addr'].split('%')
- l.append(raw6[0])
- for ip in netif.ifaddresses(dev)[netif.AF_INET]:
- raw = ip['addr'].split('%')
- l.append(raw[0])
- except:
- pass
- return l
- def getBat0_Interfaces(self):
- j = {}
- output = subprocess.check_output(["batctl", "-m", self._config['batman'], "if"])
- output_utf8 = output.decode("utf-8")
- lines = output_utf8.splitlines()
- for line in lines:
- dev_line = re.match(r"^([^:]*)", line)
- nif = dev_line.group(0)
- if_group = ""
- if "fastd" in self._config and nif == self._config["fastd"]: # keep for compatibility
- if_group = "tunnel"
- elif nif.find("l2tp") != -1:
- if_group = "l2tp"
- elif "mesh-vpn" in self._config and nif in self._config["mesh-vpn"]:
- if_group = "tunnel"
- elif "mesh-wlan" in self._config and nif in self._config["mesh-wlan"]:
- if_group = "wireless"
- else:
- if_group = "other"
- if not if_group in j:
- j[if_group] = []
- j[if_group].append(lib.helper.getDevice_MAC(nif))
- if "l2tp" in j:
- if "tunnel" in j:
- j["tunnel"] = j["tunnel"] + j["l2tp"]
- else:
- j["tunnel"] = j["l2tp"]
- return j
- def getCPUInfo(self):
- j = {}
- with open("/proc/cpuinfo", 'r') as fh:
- for line in fh:
- ml = re.match(r"^(.+?)[\t ]+:[\t ]+(.*)$", line, re.I)
- if ml:
- j[ml.group(1)] = ml.group(2)
- return j
- def _get(self):
- j = {
- "hostname": socket.gethostname(),
- "network": {
- "addresses": self.getDevice_Addresses(self._config['bridge']),
- "mesh": {
- "bat0": {
- "interfaces": self.getBat0_Interfaces()
- }
- },
- "mac": lib.helper.getDevice_MAC(self._config["batman"])
- },
- "software": {
- "firmware": {
- "base": lib.helper.call(['lsb_release', '-is'])[0],
- "release": lib.helper.call(['lsb_release', '-ds'])[0]
- },
- "batman-adv": {
- "version": open('/sys/module/batman_adv/version').read().strip(),
- # "compat": # /lib/gluon/mesh-batman-adv-core/compat
- },
- "status-page": {
- "api": 0
- },
- "autoupdater": {
- "enabled": False
- }
- },
- "hardware": {
- "model": self.getCPUInfo()["model name"],
- "nproc": int(lib.helper.call(['nproc'])[0])
- },
- "owner": {},
- "system": {},
- "location": {}
- }
- if 'mesh-vpn' in self._config and len(self._config["mesh-vpn"]) > 0:
- try:
- j["software"]["fastd"] = {
- "version": lib.helper.call(['fastd', '-v'])[0].split(' ')[1],
- "enabled": True
- }
- except:
- pass
- return lib.helper.merge(j, self._aliases["nodeinfo"])
|