From 51b8647dedfa60fc57bc2948f2df57e693a04456 Mon Sep 17 00:00:00 2001 From: martin Date: Thu, 5 Dec 2024 10:40:38 +0100 Subject: [PATCH] added several new files --- .gitignore | 1 + arguments.py | 18 ++++++++++++++++++ config.py | 22 ++++++++++++++++++++++ cpu_governor_auto_adjust.py | 15 +++++++++++++++ cpu_governor_auto_adjust.xml | 4 ++++ logger.py | 33 +++++++++++++++++++++++++++++++++ logging.py | 0 requirements.txt | 1 + trigger.py | 8 ++++++++ triggers/roon.py | 7 +++++++ 10 files changed, 109 insertions(+) create mode 100644 .gitignore create mode 100644 arguments.py create mode 100644 config.py mode change 100644 => 100755 cpu_governor_auto_adjust.py create mode 100644 cpu_governor_auto_adjust.xml create mode 100644 logger.py delete mode 100644 logging.py create mode 100644 requirements.txt create mode 100644 trigger.py create mode 100644 triggers/roon.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c18dd8d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +__pycache__/ diff --git a/arguments.py b/arguments.py new file mode 100644 index 0000000..c56410d --- /dev/null +++ b/arguments.py @@ -0,0 +1,18 @@ +import argparse +from functools import cached_property + +class ArgumentsParser: + @cached_property + def parser(self): + parser = argparse.ArgumentParser( + prog=__file__, + description='Trigger based CPU governor auto adjust program.', + epilog='Happy CPU controlling' + ) + parser.add_argument( + '-c', '--config', + type=str, + required=False, + default='cpu_governor_auto_adjust.xml', + ) + return parser.parse_args() diff --git a/config.py b/config.py new file mode 100644 index 0000000..767ded4 --- /dev/null +++ b/config.py @@ -0,0 +1,22 @@ +from pathlib import Path +from lxml import etree +from functools import cached_property +from arguments import ArgumentsParser + + +class Config: + def __init__(self, basepath: Path) -> None: + self.basepath = basepath + self.config = ArgumentsParser().parser.config + + @cached_property + def root(self) -> etree.ElementTree: + return etree.parse(self.basepath / self.config) + + @cached_property + def app_root(self) -> etree.Element: + return self.root.xpath('/cpuGovernorAutoAdjust').pop() + + @cached_property + def loglevel(self) -> str: + return self.app_root.xpath('logLevel').pop().text diff --git a/cpu_governor_auto_adjust.py b/cpu_governor_auto_adjust.py old mode 100644 new mode 100755 index ecf7241..9d3c4f0 --- a/cpu_governor_auto_adjust.py +++ b/cpu_governor_auto_adjust.py @@ -1,2 +1,17 @@ #!/usr/bin/python3 +from pathlib import Path +from logger import getLogger +from triggers.roon import RoonTrigger +from config import Config + +def main(): + basepath = Path(__file__).parent.resolve() + config = Config(basepath) + log = getLogger('main', loglevel=config.loglevel.upper()) + log.info("starting") + new_trigger = RoonTrigger(config) + + +if __name__ == "__main__": + main() diff --git a/cpu_governor_auto_adjust.xml b/cpu_governor_auto_adjust.xml new file mode 100644 index 0000000..137799a --- /dev/null +++ b/cpu_governor_auto_adjust.xml @@ -0,0 +1,4 @@ + + + Debug + diff --git a/logger.py b/logger.py new file mode 100644 index 0000000..eb79d7a --- /dev/null +++ b/logger.py @@ -0,0 +1,33 @@ +import logging +from logging import Logger +import os +import sys + + +def getLogger(name: str = 'root', loglevel: str = 'INFO') -> Logger: + logger = logging.getLogger(name) + + # if logger 'name' already exists, return it to avoid logging duplicate + # messages by attaching multiple handlers of the same type + if logger.handlers: + return logger + # if logger 'name' does not already exist, create it and attach handlers + else: + # set logLevel to loglevel or to INFO if requested level is incorrect + loglevel = getattr(logging, loglevel.upper(), logging.INFO) + logger.setLevel(loglevel) + if loglevel == logging.DEBUG: + fmt = '%(asctime)s %(levelname)-8s %(message)s (%(filename)s)' + else: + fmt = '%(asctime)s %(levelname)-8s %(message)s' + fmt_date = '%Y-%m-%dT%T' + formatter = logging.Formatter(fmt, fmt_date) + handler = logging.StreamHandler() + handler.setFormatter(formatter) + logger.addHandler(handler) + + if logger.name == 'root': + logger.warning('Running: %s %s', + os.path.basename(sys.argv[0]), + ' '.join(sys.argv[1:])) + return logger diff --git a/logging.py b/logging.py deleted file mode 100644 index e69de29..0000000 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ + diff --git a/trigger.py b/trigger.py new file mode 100644 index 0000000..45618b8 --- /dev/null +++ b/trigger.py @@ -0,0 +1,8 @@ +from logger import getLogger +from config import Config + +class Trigger: + def __init__(self, config: Config) -> None: + self.log = getLogger('trigger', loglevel=config.loglevel.upper()) + self.log.info(f'initializing {self.__class__.__name__}') + \ No newline at end of file diff --git a/triggers/roon.py b/triggers/roon.py new file mode 100644 index 0000000..4fd6edd --- /dev/null +++ b/triggers/roon.py @@ -0,0 +1,7 @@ +from trigger import Trigger +from config import Config + +class RoonTrigger(Trigger): + def __init__(self, config: Config) -> None: + super().__init__(config) + \ No newline at end of file