reorga code
This commit is contained in:
@@ -8,7 +8,7 @@ or
|
|||||||
- pip3 install git+https://git.ao-it.net/python/CO2Meter
|
- pip3 install git+https://git.ao-it.net/python/CO2Meter
|
||||||
"""
|
"""
|
||||||
|
|
||||||
__version__ = '0.3.3'
|
__version__ = '0.4.0'
|
||||||
__author__ = 'anima'
|
__author__ = 'anima'
|
||||||
|
|
||||||
# imports
|
# imports
|
||||||
@@ -27,64 +27,19 @@ import nagiosplugin
|
|||||||
logging.basicConfig(format='[%(asctime)s] %(levelname)s %(message)s', level=logging.INFO)
|
logging.basicConfig(format='[%(asctime)s] %(levelname)s %(message)s', level=logging.INFO)
|
||||||
|
|
||||||
|
|
||||||
class AirQ:
|
class AirQBase:
|
||||||
def __init__(self, run_mode: str = 'local', server: str = '127.0.0.1', port: int = 4554, device: str = None):
|
def __init__(self):
|
||||||
self.temp = None
|
self.temp = None
|
||||||
self.co2 = None
|
self.co2 = None
|
||||||
self.device = device
|
|
||||||
self.server = server
|
|
||||||
self.port = port
|
|
||||||
self.threads = list()
|
|
||||||
|
|
||||||
match run_mode:
|
|
||||||
case 'local':
|
class AirQLocal(AirQBase):
|
||||||
logging.debug(f'start AirQ in {run_mode} mode')
|
def __init__(self, device: str = None):
|
||||||
|
super().__init__()
|
||||||
|
self.device = device
|
||||||
|
logging.debug(f'start AirQ in local mode')
|
||||||
if self.get_usb_dev():
|
if self.get_usb_dev():
|
||||||
self.get_local_data()
|
self.get_local_data()
|
||||||
case 'server':
|
|
||||||
logging.debug(f'start AirQ in {run_mode} mode')
|
|
||||||
thread_data = threading.Thread(target=self.get_local_data_loop, group=None)
|
|
||||||
thread_server = threading.Thread(target=self.run_server, group=None)
|
|
||||||
if self.get_usb_dev():
|
|
||||||
thread_data.start()
|
|
||||||
thread_server.start()
|
|
||||||
self.threads.append(thread_server)
|
|
||||||
case 'client':
|
|
||||||
logging.debug(f'start AirQ in {run_mode} mode')
|
|
||||||
self.run_client()
|
|
||||||
|
|
||||||
def stop_treads(self):
|
|
||||||
for thread in self.threads:
|
|
||||||
logging.debug(f'stop threads')
|
|
||||||
thread.join()
|
|
||||||
|
|
||||||
def run_server(self):
|
|
||||||
s = socket.socket()
|
|
||||||
s.bind(('', self.port))
|
|
||||||
s.listen(1)
|
|
||||||
logging.debug(f'run AirQ server on port {self.port}')
|
|
||||||
try:
|
|
||||||
while True:
|
|
||||||
conn, addr = s.accept()
|
|
||||||
data = {"co2": self.co2, "temp": self.temp}
|
|
||||||
logging.debug(f'connection from {addr}, send {data=}')
|
|
||||||
conn.send(str(json.dumps(data)).encode())
|
|
||||||
conn.close()
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
logging.debug(f'stop AirQ server')
|
|
||||||
s.close()
|
|
||||||
|
|
||||||
def run_client(self):
|
|
||||||
s = socket.socket()
|
|
||||||
s.connect((self.server, self.port))
|
|
||||||
logging.debug(f'connected to {self.server=} on {self.port=}')
|
|
||||||
data = json.loads(s.recv(1024).decode())
|
|
||||||
logging.debug(f'server response: {data=}')
|
|
||||||
s.close()
|
|
||||||
if 'co2' in data.keys():
|
|
||||||
self.co2 = data['co2']
|
|
||||||
if 'temp' in data.keys():
|
|
||||||
self.temp = data['temp']
|
|
||||||
|
|
||||||
def get_usb_dev(self) -> bool:
|
def get_usb_dev(self) -> bool:
|
||||||
"""search the airq usb device
|
"""search the airq usb device
|
||||||
@@ -98,10 +53,8 @@ class AirQ:
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
search_string = '04D9:A052'
|
search_string = '04D9:A052'
|
||||||
# search_string = '04d9:a052' # maybe lowercase on some systems ?
|
|
||||||
# search_string = '[Holtek USB-zyTemp]' # alt but unknown if all systems print this in log
|
# search_string = '[Holtek USB-zyTemp]' # alt but unknown if all systems print this in log
|
||||||
matches = list()
|
matches = list()
|
||||||
# log has con is the log entry rolls out
|
|
||||||
command = ["journalctl", "-k", "--no-pager"] # alternative: dmesg # maybe usefull lsusb
|
command = ["journalctl", "-k", "--no-pager"] # alternative: dmesg # maybe usefull lsusb
|
||||||
pattern = re.compile(r'hidraw\d{1,2}')
|
pattern = re.compile(r'hidraw\d{1,2}')
|
||||||
## get kernel logs
|
## get kernel logs
|
||||||
@@ -128,10 +81,6 @@ class AirQ:
|
|||||||
logging.error(f'usb device not found!')
|
logging.error(f'usb device not found!')
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def get_local_data_loop(self):
|
|
||||||
while True:
|
|
||||||
self.get_local_data()
|
|
||||||
|
|
||||||
def get_local_data(self) -> bool:
|
def get_local_data(self) -> bool:
|
||||||
# load only if need (in client mode not needed)
|
# load only if need (in client mode not needed)
|
||||||
from CO2Meter import CO2Meter
|
from CO2Meter import CO2Meter
|
||||||
@@ -151,6 +100,66 @@ class AirQ:
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
class AirQServer(AirQLocal):
|
||||||
|
def __init__(self, port: int = 4554, device: str = None, ):
|
||||||
|
super().__init__(device = device)
|
||||||
|
self.threads = list()
|
||||||
|
self.port = port
|
||||||
|
logging.debug(f'start AirQ in server mode')
|
||||||
|
thread_data = threading.Thread(target=self.get_local_data_loop, group=None)
|
||||||
|
thread_server = threading.Thread(target=self.run_server, group=None)
|
||||||
|
if self.get_usb_dev():
|
||||||
|
thread_data.start()
|
||||||
|
thread_server.start()
|
||||||
|
self.threads.append(thread_server)
|
||||||
|
|
||||||
|
def stop_treads(self):
|
||||||
|
for thread in self.threads:
|
||||||
|
logging.debug(f'stop threads')
|
||||||
|
thread.join()
|
||||||
|
|
||||||
|
def get_local_data_loop(self):
|
||||||
|
while True:
|
||||||
|
self.get_local_data()
|
||||||
|
|
||||||
|
def run_server(self):
|
||||||
|
s = socket.socket()
|
||||||
|
s.bind(('', self.port))
|
||||||
|
s.listen(1)
|
||||||
|
logging.debug(f'run AirQ server on port {self.port}')
|
||||||
|
try:
|
||||||
|
while True:
|
||||||
|
conn, addr = s.accept()
|
||||||
|
data = {"co2": self.co2, "temp": self.temp}
|
||||||
|
logging.debug(f'connection from {addr}, send {data=}')
|
||||||
|
conn.send(str(json.dumps(data)).encode())
|
||||||
|
conn.close()
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
logging.debug(f'stop AirQ server')
|
||||||
|
s.close()
|
||||||
|
|
||||||
|
|
||||||
|
class AirQClient(AirQBase):
|
||||||
|
def __init__(self, server: str = 'localhost', port: int = 4554):
|
||||||
|
super().__init__()
|
||||||
|
self.server = server
|
||||||
|
self.port = port
|
||||||
|
logging.debug(f'start AirQ in client mode')
|
||||||
|
self.run_client()
|
||||||
|
|
||||||
|
def run_client(self):
|
||||||
|
s = socket.socket()
|
||||||
|
s.connect((self.server, self.port))
|
||||||
|
logging.debug(f'connected to {self.server=} on {self.port=}')
|
||||||
|
data = json.loads(s.recv(1024).decode())
|
||||||
|
logging.debug(f'server response: {data=}')
|
||||||
|
s.close()
|
||||||
|
if 'co2' in data.keys():
|
||||||
|
self.co2 = data['co2']
|
||||||
|
if 'temp' in data.keys():
|
||||||
|
self.temp = data['temp']
|
||||||
|
|
||||||
|
|
||||||
class AirQCO2Resource(nagiosplugin.Resource):
|
class AirQCO2Resource(nagiosplugin.Resource):
|
||||||
def __init__(self, airq) -> None:
|
def __init__(self, airq) -> None:
|
||||||
self.airq = airq
|
self.airq = airq
|
||||||
@@ -229,7 +238,13 @@ def main():
|
|||||||
logging.getLogger().setLevel(logging.DEBUG)
|
logging.getLogger().setLevel(logging.DEBUG)
|
||||||
|
|
||||||
if args.check_mode != 'server':
|
if args.check_mode != 'server':
|
||||||
airq = AirQ(run_mode=args.airq_mode, server=args.airq_server, port=args.airq_port, device=args.airq_device)
|
if args.airq_mode == 'local':
|
||||||
|
airq = AirQLocal(device=args.airq_device)
|
||||||
|
elif args.airq_mode == 'client':
|
||||||
|
airq = AirQClient(server=args.airq_server, port=args.airq_port)
|
||||||
|
else:
|
||||||
|
logging.error('Unknown airq mode')
|
||||||
|
exit()
|
||||||
check = None
|
check = None
|
||||||
|
|
||||||
# dice which check will be run bases on check_mode
|
# dice which check will be run bases on check_mode
|
||||||
@@ -248,7 +263,7 @@ def main():
|
|||||||
check.name = "Temperature"
|
check.name = "Temperature"
|
||||||
case 'server':
|
case 'server':
|
||||||
try:
|
try:
|
||||||
airq = AirQ(run_mode=args.check_mode, server=args.airq_server, port=args.airq_port, device=args.airq_device)
|
airq = AirQServer(port=args.airq_port, device=args.airq_device)
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
airq.stop_treads()
|
airq.stop_treads()
|
||||||
case _:
|
case _:
|
||||||
|
|||||||
Reference in New Issue
Block a user