From 51c7f77bdc8e3c7ebec298b66067d162622cd4da Mon Sep 17 00:00:00 2001 From: Marcio Fernandes Date: Fri, 21 Jan 2022 09:39:33 +0000 Subject: [PATCH] * server abstration * default config file value --- onlyone/__init__.py | 38 ++++++++++++++--------- onlyone/__main__.py | 30 +++++-------------- onlyone/namedpipes/__init__.py | 55 ++++++++++++++++++++++++++++------ 3 files changed, 77 insertions(+), 46 deletions(-) diff --git a/onlyone/__init__.py b/onlyone/__init__.py index 4334bde..f745ce8 100644 --- a/onlyone/__init__.py +++ b/onlyone/__init__.py @@ -1,11 +1,27 @@ +from distutils.command.config import config import os import psutil import logging +import yaml from typing import List +from onlyone import namedpipes +DEFAULT_CONFIG_PATH = "/etc/config.yaml" log = logging.getLogger(__name__) +def config_file_to_dict(path:str): + if not os.path.isfile(path): + log.error("missing file " + path) + raise "missing file " + path + return + log.info("trying to read file : " + path) + configTxt = open(path, "r").read() + log.info("config file content : " + configTxt) + log.info("trying read yaml") + retval = yaml.safe_load(configTxt) + return retval + def __is_process(cmd:str, arr): item = " ".join(arr) #log.info("[onlyone][startprocess] -> " + item + " ends with " + cmd) @@ -64,20 +80,6 @@ def killprocesses(killcmds:List): return __killprocesses(killcmds, psutil.process_iter()) -# def __forceoneprocessinstance(cmd:str, processes:List): -# found = False -# for proc in processes: -# if __is_process(cmd, proc.cmdline()): -# if found: -# proc.kill() -# log.info("[onlyone][__forceoneprocessinstance] -> processed killed : " + proc.name + "(" + proc.id + ")") -# else : -# found = True -# if not found: -# startprocess(cmd) - -# def forceoneprocessinstance(cmd:str): -# return __forceoneprocessinstance(cmd, psutil.process_iter()) def onlyone(cmd:str, killcmds:list): log.info("[onlyone][onlyone] -> invoked start " + cmd + ", kill " + str(killcmds)) @@ -125,4 +127,12 @@ class Manager: onlyone(item["cmd"], [x["cmd"] for x in self.__processes if x["key"]!=item["key"]]) self._current = item["key"] + +class Server: + def __init__(self, configPath): + self.manager = Manager() + if(configPath != None and configPath!=""): + configDict = config_file_to_dict(configPath) + self.manager.load(configDict, True) + self.npserver = namedpipes.Server(self.manager) \ No newline at end of file diff --git a/onlyone/__main__.py b/onlyone/__main__.py index 78ff47f..10ebf44 100644 --- a/onlyone/__main__.py +++ b/onlyone/__main__.py @@ -1,3 +1,4 @@ +from asyncio.base_events import Server import logging import argparse from types import new_class @@ -21,27 +22,10 @@ args = parser.parse_args() log.info("arguments - " + str(sys.argv)) log.info("Current Path:" + os.getcwd()) -manager=None -if args.configFile: - 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, True) - else: - log.error("Current Path:" + os.getcwd()) - log.error("File dont exists:" + args.configfile) - if args.server: - if(manager==None): - log.error("server mode selected, but manager not loaded maybe missing --configFile") - else: - npServer = None - try: - npServer = onlyone.namedpipes.Server(manager, "/tmp/onlyone_fifo") - log.info("server loaded...") - except KeyboardInterrupt: - log.info("KeyboardInterrupt") \ No newline at end of file + configPath = onlyone.DEFAULT_CONFIG_PATH + if args.configFile: + configPath = args.configFile + server = onlyone.Server(configPath) + + \ No newline at end of file diff --git a/onlyone/namedpipes/__init__.py b/onlyone/namedpipes/__init__.py index 3799e6f..92adde3 100644 --- a/onlyone/namedpipes/__init__.py +++ b/onlyone/namedpipes/__init__.py @@ -2,24 +2,61 @@ import os import errno import logging +from signal import default_int_handler import threading +import subprocess + +FIFO_PATH="/tmp/onlyone_fifo" +SECURITY_GROUP="onlyone" log = logging.getLogger(__name__) +def securitygroup_check(groupName:str): + if not securitygroup_exists(groupName): + securitygroup_create(groupName) + +def securitygroup_create(groupName:str): + try: + + subprocess.run(['groupadd ', 'groupName']) + except: + print(f"Failed to create group " + groupName) + raise + +def securityfifo_checkpermissions(fifoPath:str, groupName:str): + try: + + subprocess.run(['chown', 'root:' + groupName, fifoPath]) + subprocess.run(['chmod', '660', fifoPath]) + except: + print(f"Failed to set permissions") + raise + +def securitygroup_exists(groupName:str): + with open("/etc/group", "r") as groupFile: + for line in groupFile: + if line.startswith(groupName): + return True + return False + +def createfifo(path): + try: + os.mkfifo(path) + except OSError as oe: + if oe.errno != errno.EEXIST: + raise + class Server: - def __init__(self, manager, fifoname:str): + def __init__(self, manager): self.manager=manager - self__fifoname=fifoname - try: - os.mkfifo(fifoname) - except OSError as oe: - if oe.errno != errno.EEXIST: - raise - + self__fifoname="" + securitygroup_check(SECURITY_GROUP) + createfifo(FIFO_PATH) + securityfifo_checkpermissions(FIFO_PATH, SECURITY_GROUP) readTask = ReadTask(self) - self.__readThread = threading.Thread(target=readTask.run, args = (fifoname,) ) + self.__readThread = threading.Thread(target=readTask.run, args = (FIFO_PATH,) ) self.__readThread.start() def kill(self):