diff --git a/onlyone/__init__.py b/onlyone/__init__.py new file mode 100644 index 0000000..54fd5f4 --- /dev/null +++ b/onlyone/__init__.py @@ -0,0 +1,91 @@ +import os +import psutil +import logging +from typing import List + + + +def b(): + return 3+3 + +log = logging.getLogger(__name__) + +def isrunning(process:str): + for proc in psutil.process_iter(): + if process.split(" ")[0] == proc.name().split(" ")[0]: + return True + return False + +def startprocess(process:str): + try: + #raise Exception("aaa") + os.popen(process) + log.info("[onlyone][startprocess] -> processed started : " + process) + except OSError as e: + log.error("eror") + except: + log.error("eror") + + +def __killprocesses(killprocesses:List, processesList: List): + if killprocesses == None : + return False + for proc in processesList: + if any(element.split(" ")[0] == proc.name().split(" ")[0] for element in killprocesses): + proc.kill() + log.info("[onlyone][__killprocesses] -> processed kiled : " + proc.name + "(" + proc.id + ")") + return False + + +def killprocesses(killprocesses:List): + return __killprocesses(killprocesses, psutil.process_iter()) + + +def __forceoneprocessinstance(process:str, processes:List): + found = False + for proc in processes: + if proc.name().split(" ")[0] == process.split(" ")[0]: + if found: + proc.kill() + log.info("[onlyone][__forceoneprocessinstance] -> processed kiled : " + proc.name + "(" + proc.id + ")") + else : + found = True + if not found: + startprocess(process) + +def forceoneprocessinstance(processname:str): + return __forceoneprocessinstance(processname, psutil.process_iter()) + +def onlyone(process:str, killprocesses:list): + processes = psutil.process_iter() + __killprocesses(killprocesses, processes) + __forceoneprocessinstance(process, processes) + +def Manager(): + def __init__(self): + self.processes=[] + self._current=None + + def addprocess(self, key, processname, initParams): + self.processes.append({ + key:key, + processname:processname, + initParams:initParams + }) + + def current(self): + return None if self == None else self._current.key + + def current(self, key): + item = any(element in key for element in self.processes) + if item == None: + return None + self._current=item + others = [] + for item in self.processes: + if item.key!=key: + others.append(item.processname) + onlyone(item.processname, item.initParams, [element.processname for element in others]) + + + diff --git a/onlyone/__main__.py b/onlyone/__main__.py new file mode 100644 index 0000000..2c83a43 --- /dev/null +++ b/onlyone/__main__.py @@ -0,0 +1,38 @@ +import logging +import argparse +from types import new_class +from typing import List +from __init__ import * + + +logging.basicConfig(level="DEBUG") +log = logging.getLogger(__name__) +parser = argparse.ArgumentParser(description='onlyone') +parser.add_argument('--init', type=str, required=False, help='init processes') +parser.add_argument('--kill', type=List, required=False, help='kill processes') +parser.add_argument('--configfile', type=str, required=False, help='configfile') +parser.add_argument('--mode', type=str, required=False, help='configfile') +args = parser.parse_args() + + + +if args.configfile: + manager = Manager() + #manager.refreshrate(1000) + manager.addprocess("x", "aaaaa", None) + manager.current("x") + #manager.oncurrent_changed(__oncurrent_changed) + console.writeline("write !quit and enter to exit") +else: + if args.init: + log.debug("invoking onlyone.onlyone") + onlyone(args.init, args.kill) + quit() + if args.kill: + log.debug("invoking onlyone.killprocesses") + killprocesses(args.kill) + quit() + log.debug("invoked without arguments") + +def __oncurrent_changed(self, sender): + t="" diff --git a/onlyone/fifo/__init__.py b/onlyone/fifo/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/onlyone/fifo/client.py b/onlyone/fifo/client.py new file mode 100644 index 0000000..e69de29 diff --git a/onlyone/fifo/server.py b/onlyone/fifo/server.py new file mode 100644 index 0000000..e69de29 diff --git a/onlyone/sample.yaml b/onlyone/sample.yaml new file mode 100644 index 0000000..9335df2 --- /dev/null +++ b/onlyone/sample.yaml @@ -0,0 +1,34 @@ +refresrate: 3000 +default: +fifo: + name: "aaaaaa" +mqtt: + broker: "aaaaaaaaaa" + clientid: "aaaaaaa" + topic: home/pi/onlyone + username: + password: +rest: + username: aaaa + password: aaa + port: 67777 +processes: _ + key: blue + process: smb + params: _ + teste + teste + aaa + key: blue + process: smb + findexp: aaaaaa + params: _ + teste + teste + aaa + key: blue + process: smb + params: _ + teste + teste + aaa