From f08c99800d37d93c6f821b070679b2dacbda8c9d Mon Sep 17 00:00:00 2001 From: Antonio de la Rosa Date: Thu, 3 Jun 2021 12:35:29 +0200 Subject: [PATCH] Added pastafariagent --- pastafaristats/pastafariagent.py | 102 ++++++++++++++++ pastafaristats/send_info_daemon.py | 183 +++++++++++++++-------------- setup.py | 8 +- 3 files changed, 201 insertions(+), 92 deletions(-) create mode 100644 pastafaristats/pastafariagent.py diff --git a/pastafaristats/pastafariagent.py b/pastafaristats/pastafariagent.py new file mode 100644 index 0000000..735e346 --- /dev/null +++ b/pastafaristats/pastafariagent.py @@ -0,0 +1,102 @@ +from PyQt5.QtGui import * +from PyQt5.QtWidgets import * +from PyQt5.QtCore import * +from pastafaristats import send_info_daemon +from time import sleep +import os +import psutil + +def quit_app(): + print('Quitting Application...') + #print(QThreadPool.globalInstance().activeThreadCount()) + #QThreadPool.globalInstance().exit() + """ + thread=QThread.currentThread() + print(thread) + thread.quit() + """ + #QThreadPool.globalInstance().tryTake(p) + app.quit() + + # Get pid + + pid=os.getpid() + + p=psutil.Process(pid) + + p.terminate() + + exit(0) + + # Killing using pid + + #p.stop() + +def send_data(): + print('Init daemon...') + while True: + + send_info_daemon.run() + + sleep(120) + + +class ProcessRunnable(QRunnable): + + def __init__(self, target, args): + QRunnable.__init__(self) + #self.setAutoDelete(True) + #self.waitForDone(100) + self.t = target + self.args = args + + def run(self): + self.t(*self.args) + + def start(self): + #QThreadPool.globalInstance().waitForDone(100) + QThreadPool.globalInstance().start(self) + """ + def stop(self): + print('Stopping daemon...') + del self.t + """ + +app = QApplication([]) +app.setQuitOnLastWindowClosed(False) + +# Adding an icon +icon = QIcon("icon.png") + +# Adding item on the menu bar +tray = QSystemTrayIcon() +tray.setIcon(icon) +tray.setVisible(True) + +# Creating the options + +menu = QMenu() + +option1 = QAction("Pastafari monitoring") +menu.addAction(option1) +""" +option2 = QAction("GFG") +menu.addAction(option2) +""" + +# To quit the app +quit = QAction("Quit") +quit.triggered.connect(quit_app) +menu.addAction(quit) + +# Adding options to the System Tray +tray.setContextMenu(menu) + +# Begin background process + +p = ProcessRunnable(target=send_data, args=()) +p.start() + +# Begin tray loop + +app.exec_() diff --git a/pastafaristats/send_info_daemon.py b/pastafaristats/send_info_daemon.py index 60e707a..289f0fe 100644 --- a/pastafaristats/send_info_daemon.py +++ b/pastafaristats/send_info_daemon.py @@ -16,100 +16,107 @@ import signal # Get config from /etc/pastafari or ~/.config/pastafari +# Load configuration + +yes_config=False + +user_home=str(Path.home()) + +config = configparser.ConfigParser(interpolation=None) + +if os.path.isfile(user_home+'/.config/pastafari/stats.cfg'): + + config.read(user_home+'/.config/pastafari/stats.cfg') + + yes_config=True + +elif os.path.isfile('/etc/pastafari/stats.cfg'): + + config.read('/etc/pastafari/stats.cfg') + + yes_config=True + + +if not yes_config: + + exit("Sorry, cannot load config file") + +if not 'DEFAULT' in config: + + exit("Sorry, config file need [DEFAULT] section") + +if not 'url_server' in config['DEFAULT']: + + exit("Sorry, config file need url_server variable in [DEFAULT] section") + +url=config['DEFAULT']['url_server'] + +def run(): + + network_info=psutil.net_io_counters(pernic=False) + + network_devices=psutil.net_if_addrs() + + cpu_idle=psutil.cpu_percent(interval=1) + + cpus_idle=psutil.cpu_percent(interval=1, percpu=True) + + cpu_number=psutil.cpu_count() + + disk_info=psutil.disk_partitions() + + partitions={} + + for disk in disk_info: + + partition=str(disk[1]) + partitions[partition]=psutil.disk_usage(partition) + #print(partition+"="+str(partitions[partition])) + + dev_info={} + + mem_info=psutil.virtual_memory() + + json_info=json.dumps({'net_info': network_info, 'cpu_idle': cpu_idle, 'cpu_number': cpu_number, 'disks_info': partitions, 'mem_info': mem_info}) + + data = urllib.parse.urlencode({'data_json': json_info}) + + data = data.encode('ascii') + + try: + + if url[:5]=='https': + + # For nexts versions 3.5 + + ctx = ssl.create_default_context() + ctx.check_hostname = False + ctx.verify_mode = ssl.CERT_NONE + + content=urllib.request.urlopen(url, data, context=ctx) + + else: + + content=urllib.request.urlopen(url, data) + + except Exception as e: + + print('Cannot connect to data server -> '+str(e)) + +def start(): + + while True: + + run() + + sleep(120) + def catch_signal(sig, frame): print('Exiting...') exit(0) signal.signal(signal.SIGINT, catch_signal) -def start(): - - yes_config=False - - user_home=str(Path.home()) - - config = configparser.ConfigParser(interpolation=None) - - if os.path.isfile(user_home+'/.config/pastafari/stats.cfg'): - - config.read(user_home+'/.config/pastafari/stats.cfg') - - yes_config=True - - elif os.path.isfile('/etc/pastafari/stats.cfg'): - - config.read('/etc/pastafari/stats.cfg') - - yes_config=True - - - if not yes_config: - - exit("Sorry, cannot load config file") - - if not 'DEFAULT' in config: - - exit("Sorry, config file need [DEFAULT] section") - - if not 'url_server' in config['DEFAULT']: - - exit("Sorry, config file need url_server variable in [DEFAULT] section") - - url=config['DEFAULT']['url_server'] - - while True: - - network_info=psutil.net_io_counters(pernic=False) - - network_devices=psutil.net_if_addrs() - - cpu_idle=psutil.cpu_percent(interval=1) - - cpu_number=psutil.cpu_count() - - disk_info=psutil.disk_partitions() - - partitions={} - - for disk in disk_info: - - partition=str(disk[1]) - partitions[partition]=psutil.disk_usage(partition) - #print(partition+"="+str(partitions[partition])) - - dev_info={} - - mem_info=psutil.virtual_memory() - - json_info=json.dumps({'net_info': network_info, 'cpu_idle': cpu_idle, 'cpu_number': cpu_number, 'disks_info': partitions, 'mem_info': mem_info}) - - data = urllib.parse.urlencode({'data_json': json_info}) - - data = data.encode('ascii') - - try: - - if url[:5]=='https': - - # For nexts versions 3.5 - - ctx = ssl.create_default_context() - ctx.check_hostname = False - ctx.verify_mode = ssl.CERT_NONE - - content=urllib.request.urlopen(url, data, context=ctx) - - else: - - content=urllib.request.urlopen(url, data) - - except Exception as e: - - print('Cannot connect to data server -> '+str(e)) - - - sleep(120) - if __name__=='__main__': start() diff --git a/setup.py b/setup.py index 3b049be..4b9e5a7 100644 --- a/setup.py +++ b/setup.py @@ -14,13 +14,13 @@ if sys.version_info < (3, 5): setup(name='pastafaristats', version='1.0.0', - description='Simple scripts for send basic data of a server how complement to other stats solutions more comples.', + description='Simple scripts for send basic data of a server how complement to other stats solutions more complex.', author='Antonio de la Rosa Caballero', author_email='antonio.delarosa@coesinfo.com', url='https://bitbucket.org/paramecio/pastafaristats/', packages=['pastafaristats'], include_package_data=True, - install_requires=['psutil'], + install_requires=['psutil', 'pyqt5'], entry_points={'console_scripts': [ 'pastafaristats = pastafaristats.send_info_daemon:start', ]}, @@ -31,9 +31,9 @@ setup(name='pastafaristats', 'Intended Audience :: Developers', 'License :: OSI Approved :: GPLV3 License', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', - 'Programming Language :: Python :: 3.8' + 'Programming Language :: Python :: 3.8', + 'Programming Language :: Python :: 3.9' ], )