added scheduler code
This commit is contained in:
@@ -56,7 +56,7 @@ class Config:
|
|||||||
ret_val.append(
|
ret_val.append(
|
||||||
TriggerTuple(
|
TriggerTuple(
|
||||||
name=name,
|
name=name,
|
||||||
interval_in_seconds=interval_in_seconds
|
interval_in_seconds=int(interval_in_seconds)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -1,23 +1,27 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
import asyncio
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from logger import getLogger
|
from logger import getLogger
|
||||||
from mapping import trigger_mapping
|
from mapping import trigger_mapping
|
||||||
from config import Config
|
from config import Config
|
||||||
from governor import Governor
|
from governor import Governor
|
||||||
|
from schedule import TriggerScheduler
|
||||||
|
|
||||||
|
|
||||||
def main() -> None:
|
async def main() -> None:
|
||||||
basepath = Path(__file__).parent.resolve()
|
basepath = Path(__file__).parent.resolve()
|
||||||
config = Config(basepath)
|
config = Config(basepath)
|
||||||
log = getLogger('main', loglevel=config.loglevel.upper())
|
log = getLogger('main', loglevel=config.loglevel.upper())
|
||||||
if config.testmode:
|
if config.testmode:
|
||||||
log.warning("starting in testmode, cpu adjustments have been disabled")
|
log.warning("starting in testmode, cpu adjustments have been disabled")
|
||||||
triggers = []
|
|
||||||
for triggertuple in config.triggertuples:
|
|
||||||
triggers.append(
|
|
||||||
trigger_mapping[triggertuple.name](triggertuple.name, config)
|
|
||||||
)
|
|
||||||
governor = Governor(config)
|
governor = Governor(config)
|
||||||
|
scheduler = TriggerScheduler(config)
|
||||||
|
for triggertuple in config.triggertuples:
|
||||||
|
_trigger = trigger_mapping[triggertuple.name](config)
|
||||||
|
scheduler.start_trigger(_trigger)
|
||||||
|
|
||||||
|
await scheduler.run()
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
asyncio.run(main())
|
||||||
|
|||||||
@@ -4,8 +4,8 @@
|
|||||||
<testMode>true</testMode>
|
<testMode>true</testMode>
|
||||||
<triggers>
|
<triggers>
|
||||||
<trigger>
|
<trigger>
|
||||||
<name>roon</name>
|
<name>Roon</name>
|
||||||
<intervalInSeconds>1</intervalInSeconds>
|
<intervalInSeconds>2</intervalInSeconds>
|
||||||
</trigger>
|
</trigger>
|
||||||
</triggers>
|
</triggers>
|
||||||
</cpuGovernorAutoAdjust>
|
</cpuGovernorAutoAdjust>
|
||||||
|
|||||||
+8
-5
@@ -9,18 +9,21 @@ class Governor(AppClass):
|
|||||||
super().__init__(_config)
|
super().__init__(_config)
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
def cpufreq(self) -> cpuFreq:
|
def _cpufreq(self) -> cpuFreq:
|
||||||
return cpuFreq()
|
return cpuFreq()
|
||||||
|
|
||||||
def set_governor(self, governor_name: str) -> None:
|
def set_governor(self, governor_name: str) -> None:
|
||||||
self.log.debug("setting governor to %s by using command self.cpufreq.set_governors(%s)", governor_name)
|
self.log.debug(
|
||||||
|
"setting cpu governor to %s by using command self._cpufreq.set_governors(%s)",
|
||||||
|
governor_name, governor_name
|
||||||
|
)
|
||||||
|
|
||||||
if self._config.testmode:
|
if self._config.testmode:
|
||||||
self.log.warning("application is running in testmode, governor not set")
|
self.log.warning("application is running in testmode, cpu governor not set")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
if governor_name not in self.cpufreq.available_governors:
|
if governor_name not in self._cpufreq.available_governors:
|
||||||
self.log.error("governor %s not supported by cpu", governor_name)
|
self.log.error("governor %s not supported by cpu", governor_name)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
self.cpufreq.set_governors(governor_name)
|
self._cpufreq.set_governors(governor_name)
|
||||||
|
|||||||
+1
-1
@@ -2,6 +2,6 @@ from types import MappingProxyType
|
|||||||
from triggers.roon import RoonTrigger
|
from triggers.roon import RoonTrigger
|
||||||
|
|
||||||
_dict_mapping = {
|
_dict_mapping = {
|
||||||
'roon': RoonTrigger
|
'Roon': RoonTrigger
|
||||||
}
|
}
|
||||||
trigger_mapping = MappingProxyType(_dict_mapping)
|
trigger_mapping = MappingProxyType(_dict_mapping)
|
||||||
+33
-3
@@ -1,6 +1,36 @@
|
|||||||
|
from app_class import AppClass
|
||||||
|
from config import Config
|
||||||
|
from trigger import Trigger
|
||||||
import asyncio
|
import asyncio
|
||||||
|
|
||||||
|
|
||||||
class TriggerScheduler:
|
class TriggerScheduler(AppClass):
|
||||||
def __init__(self):
|
def __init__(self, _config: Config) -> None:
|
||||||
pass
|
super().__init__(_config)
|
||||||
|
self.tasks = []
|
||||||
|
|
||||||
|
async def trigger(self, _trigger: Trigger) -> None:
|
||||||
|
"""Run a trigger with a specific name at a given interval."""
|
||||||
|
while True:
|
||||||
|
self.log.info("Trigger %s is running", _trigger.name)
|
||||||
|
_trigger.run()
|
||||||
|
await asyncio.sleep(_trigger.config.interval_in_seconds)
|
||||||
|
|
||||||
|
def start_trigger(self, _trigger: Trigger) -> None:
|
||||||
|
"""Start a new trigger."""
|
||||||
|
task = asyncio.create_task(self.trigger(_trigger))
|
||||||
|
self.tasks.append(task)
|
||||||
|
|
||||||
|
async def stop_triggers(self) -> None:
|
||||||
|
"""Stop all triggers."""
|
||||||
|
for task in self.tasks:
|
||||||
|
task.cancel()
|
||||||
|
await asyncio.gather(*self.tasks, return_exceptions=True)
|
||||||
|
|
||||||
|
async def run(self) -> None:
|
||||||
|
"""Run the scheduler and keep it alive until stopped."""
|
||||||
|
try:
|
||||||
|
while True:
|
||||||
|
await asyncio.sleep(1) # Keep the main function alive
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
await self.stop_triggers()
|
||||||
|
|||||||
+6
-2
@@ -2,9 +2,9 @@ from app_class import AppClass
|
|||||||
from config import Config, TriggerTuple, MissingConfig
|
from config import Config, TriggerTuple, MissingConfig
|
||||||
|
|
||||||
class Trigger(AppClass):
|
class Trigger(AppClass):
|
||||||
def __init__(self, name: str, _config: Config) -> None:
|
def __init__(self, _config: Config) -> None:
|
||||||
super().__init__(_config)
|
super().__init__(_config)
|
||||||
self.name = name
|
self.name = "name has to be filled in inherited class and this name has to match the name from config file"
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def config(self) -> TriggerTuple:
|
def config(self) -> TriggerTuple:
|
||||||
@@ -12,3 +12,7 @@ class Trigger(AppClass):
|
|||||||
if _config is None:
|
if _config is None:
|
||||||
raise MissingConfig(f"Trigger {self.name} hasn't been properly configured")
|
raise MissingConfig(f"Trigger {self.name} hasn't been properly configured")
|
||||||
return _config
|
return _config
|
||||||
|
|
||||||
|
def run(self) -> bool:
|
||||||
|
# return True if Trigger is valid
|
||||||
|
return False
|
||||||
|
|||||||
+7
-2
@@ -2,6 +2,11 @@ from trigger import Trigger
|
|||||||
from config import Config
|
from config import Config
|
||||||
|
|
||||||
class RoonTrigger(Trigger):
|
class RoonTrigger(Trigger):
|
||||||
def __init__(self, name: str, _config: Config) -> None:
|
def __init__(self, _config: Config) -> None:
|
||||||
super().__init__(name, _config)
|
super().__init__(_config)
|
||||||
|
self.name = "Roon"
|
||||||
|
|
||||||
|
def run(self) -> bool:
|
||||||
|
self.log.info("run check code")
|
||||||
|
return False
|
||||||
|
|
||||||
Reference in New Issue
Block a user