diff --git a/.gitignore b/.gitignore index 2766bcf..e58539e 100644 --- a/.gitignore +++ b/.gitignore @@ -149,3 +149,5 @@ cython_debug/ # Local History for Visual Studio Code .history/ + +config.yaml diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..c7e4e29 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,16 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Python: Current File", + "type": "python", + "request": "launch", + "module": "onlyone", + "console": "integratedTerminal", + "args": ["--configFile","config.yaml"] + } + ] +} \ No newline at end of file diff --git a/README.md b/README.md index 7c55fba..851c05e 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,4 @@ # onlyone +pip install yaml + diff --git a/config.example.yaml b/config.example.yaml new file mode 100644 index 0000000..ff1abf5 --- /dev/null +++ b/config.example.yaml @@ -0,0 +1,7 @@ + +defaultProcess: a +processes: +- key: a + cmd: aaa +- key: b + cmd: aaa diff --git a/onlyone/__init__.py b/onlyone/__init__.py index 54fd5f4..5d0054e 100644 --- a/onlyone/__init__.py +++ b/onlyone/__init__.py @@ -5,87 +5,96 @@ from typing import List -def b(): - return 3+3 - log = logging.getLogger(__name__) -def isrunning(process:str): +def isrunning(cmd:str): for proc in psutil.process_iter(): - if process.split(" ")[0] == proc.name().split(" ")[0]: + if cmd == " ".join(proc.cmdline()): return True return False -def startprocess(process:str): +def startprocess(cmd): try: - #raise Exception("aaa") - os.popen(process) - log.info("[onlyone][startprocess] -> processed started : " + process) + os.popen(cmd) + log.info("[onlyone][startprocess] -> processed started : " + cmd) except OSError as e: log.error("eror") except: log.error("eror") -def __killprocesses(killprocesses:List, processesList: List): +def __killprocesses(killcmds:List, sysprocesses: List): if killprocesses == None : return False - for proc in processesList: - if any(element.split(" ")[0] == proc.name().split(" ")[0] for element in killprocesses): + for proc in sysprocesses: + if any(" ".join(proc.cmdline()) == x for x in killcmds): 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 killprocesses(killcmds:List): + return __killprocesses(killcmds, psutil.process_iter()) -def __forceoneprocessinstance(process:str, processes:List): +def __forceoneprocessinstance(cmd:str, processes:List): found = False for proc in processes: - if proc.name().split(" ")[0] == process.split(" ")[0]: + if " ".join(proc.cmdline()) == cmd: if found: proc.kill() log.info("[onlyone][__forceoneprocessinstance] -> processed kiled : " + proc.name + "(" + proc.id + ")") else : found = True if not found: - startprocess(process) + startprocess(cmd) -def forceoneprocessinstance(processname:str): - return __forceoneprocessinstance(processname, psutil.process_iter()) +def forceoneprocessinstance(cmd:str): + return __forceoneprocessinstance(cmd, psutil.process_iter()) -def onlyone(process:str, killprocesses:list): +def onlyone(cmd:str, killcmds:list): processes = psutil.process_iter() - __killprocesses(killprocesses, processes) - __forceoneprocessinstance(process, processes) + __killprocesses(killcmds, processes) + __forceoneprocessinstance(cmd, processes) -def Manager(): +class Manager: def __init__(self): - self.processes=[] - self._current=None - - def addprocess(self, key, processname, initParams): - self.processes.append({ - key:key, - processname:processname, - initParams:initParams - }) + self.__processes=[] + self.__current=None + def load(self, dict:dict): + if(dict == None):return + if("processes" in dict): + for p in dict["processes"]: + if "key" in p and "cmd" in p: + self.addprocess(p["key"], p["cmd"]) + if("defaultProcess" in dict): + self.current(dict["defaultProcess"]) + + + def addprocess(self, key, cmd): + self.__processes.append({"key": key, "cmd":cmd}) + def current(self): - return None if self == None else self._current.key + if self.__current == None: + return None + else: + return self.__current["key"] def current(self, key): - item = any(element in key for element in self.processes) + + item = None + if key!=None: + for x in self.__processes: + if x["key"] == key: + item =x 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]) + killprocesses([x["cmd"] for x in self.__processes]) + self._current = None + return + + onlyone(item["cmd"], [x for x in self.__processes if x["key"]!=item["key"]]) + self._current = item["key"] diff --git a/onlyone/__main__.py b/onlyone/__main__.py index 2c83a43..192297c 100644 --- a/onlyone/__main__.py +++ b/onlyone/__main__.py @@ -2,37 +2,34 @@ import logging import argparse from types import new_class from typing import List -from __init__ import * +import sys +import onlyone +import yaml +import os + + + 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') +parser.add_argument('--configFile', type=str, required=False, help='configfile') args = parser.parse_args() - - +sys.stdout.write("arguments - " + str(sys.argv)) +log.info("Current Path:" + os.getcwd()) 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") + manager = onlyone.Manager() + if os.path.isfile(args.configfile): + log.info("trying to read file : " + args.configfile) + configTxt = open(args.configfile, "r").read() + log.info("config file content : " + configTxt) + log.info("trying read yaml") + configDict = yaml.safe_load(configTxt) + manager.load(configDict) + + else: + log.error("Current Path:" + os.getcwd()) + log.error("File dont exists:" + args.configfile) -def __oncurrent_changed(self, sender): - t="" diff --git a/onlyone/sample.yaml b/onlyone/sample.yaml deleted file mode 100644 index 9335df2..0000000 --- a/onlyone/sample.yaml +++ /dev/null @@ -1,34 +0,0 @@ -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