* server abstration

* default config file value
This commit is contained in:
2022-01-21 09:39:33 +00:00
parent 0b073e1739
commit 51c7f77bdc
3 changed files with 77 additions and 46 deletions

View File

@@ -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)

View File

@@ -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")
configPath = onlyone.DEFAULT_CONFIG_PATH
if args.configFile:
configPath = args.configFile
server = onlyone.Server(configPath)

View File

@@ -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):