collector/collector.py

99 lines
3.1 KiB
Python
Raw Permalink Normal View History

2020-04-18 20:52:27 +00:00
import logging
2020-04-14 22:49:22 +00:00
import signal
2020-04-18 20:52:27 +00:00
from datetime import datetime, timedelta
2020-04-14 22:49:22 +00:00
from threading import Event
2020-04-18 20:52:27 +00:00
from apscheduler.schedulers.blocking import BlockingScheduler
import config
import database
from plugins.finance.robor_plugin import RoborPlugin
from plugins.finance.stocks_plugin import StocksPlugin
from plugins.system.cpu_plugin import CpuPlugin
2020-04-17 16:16:58 +00:00
from plugins.system.disk_plugin import DiskIOPlugin, DiskUsagePlugin
2020-04-18 20:52:27 +00:00
from plugins.system.memory_plugin import MemoryPlugin
from plugins.system.network_plugin import NetworkPlugin
from plugins.system.ping_plugin import PingPlugin
2020-04-18 20:52:27 +00:00
from plugins.system.temperatures_plugin import TemperaturesPlugin
from plugins.system.speedtest_plugin import SpeedtestPlugin
2020-04-17 16:16:58 +00:00
2020-04-14 22:49:22 +00:00
class Collector(object):
def __init__(self):
self.plugins = [
2020-04-17 16:16:58 +00:00
# system
2020-04-14 22:49:22 +00:00
CpuPlugin(),
MemoryPlugin(),
2020-04-17 16:16:58 +00:00
DiskUsagePlugin(),
DiskIOPlugin(),
2020-04-14 22:49:22 +00:00
NetworkPlugin(),
TemperaturesPlugin(),
2020-04-15 20:29:29 +00:00
PingPlugin(),
SpeedtestPlugin(),
2020-04-15 20:29:29 +00:00
# finance
2020-04-17 16:16:58 +00:00
StocksPlugin(),
2020-04-15 20:29:29 +00:00
RoborPlugin()
2020-04-14 22:49:22 +00:00
]
self.event = Event()
2020-04-17 16:16:58 +00:00
self.scheduler = BlockingScheduler()
2020-04-14 22:49:22 +00:00
def collect_models(self):
models = []
for plugin in self.plugins:
models.extend(plugin.models)
return models
2020-04-17 16:16:58 +00:00
def schedule_plugins(self):
2020-04-18 20:52:27 +00:00
start_date = datetime.now() + timedelta(seconds=10)
2020-04-17 16:16:58 +00:00
for plugin in self.plugins:
self.scheduler.add_job(plugin.execute_wrapper, 'interval',
2020-04-18 20:52:27 +00:00
seconds=plugin.get_interval(),
start_date=start_date,
name=plugin.__class__.__name__)
2020-04-17 16:16:58 +00:00
def schedule_cleanup(self):
start_date = datetime.now() + timedelta(seconds=100)
self.scheduler.add_job(self.cleanup, 'interval',
hours=24,
start_date=start_date,
name='Cleanup')
2020-04-17 16:16:58 +00:00
def run(self):
logging.basicConfig()
logging.getLogger().setLevel(logging.INFO)
2020-04-17 16:16:58 +00:00
logging.getLogger('apscheduler').setLevel(logging.INFO)
2020-04-14 22:49:22 +00:00
models = self.collect_models()
database.initialize_db()
with database.DB.connection_context():
database.DB.create_tables(models)
2020-04-14 22:49:22 +00:00
2020-04-17 16:16:58 +00:00
self.schedule_plugins()
self.schedule_cleanup()
2020-04-18 20:52:27 +00:00
logging.info('Started.')
2020-04-14 22:49:22 +00:00
2020-04-17 16:16:58 +00:00
try:
self.scheduler.start()
except (KeyboardInterrupt, SystemExit):
pass
2020-04-14 22:49:22 +00:00
2020-04-18 20:52:27 +00:00
logging.info(f'Stopped.')
2020-04-14 22:49:22 +00:00
def cleanup(self):
for plugin in self.plugins:
logging.info(f'Cleaning up {plugin.__class__.__name__}...')
try:
items = plugin.cleanup_wrapper()
logging.info(f'... deleted {items} entries')
except BaseException as e:
logging.error("Cleanup error:", exc_info=e)
pass
2020-04-14 22:49:22 +00:00
if __name__ == "__main__":
2020-04-18 20:52:27 +00:00
try:
Collector().run()
except BaseException as ex:
logging.critical("Unhandled exception.", exc_info=ex)