parent
bbe555857f
commit
9a7fc13d9f
@ -0,0 +1,2 @@
|
|||||||
|
# Defs to use in ControlPanel files to render panels (busines users + technical user manipulations)
|
||||||
|
|
@ -1,301 +1,50 @@
|
|||||||
import datetime
|
# 1.2.0 - general processor - contains old orchestrator processor + RDPActive processor
|
||||||
import http.client
|
import time, copy
|
||||||
import json
|
# Run processor synchronious
|
||||||
import pdb
|
def ProcessorRunSync(inGSettings):
|
||||||
import os
|
"""
|
||||||
import sys
|
"ProcessorDict": { # Has been changed. New general processor (one threaded) v.1.2.0
|
||||||
import subprocess
|
"ActivityList": [ # List of the activities
|
||||||
import importlib
|
# {
|
||||||
import psutil
|
# "Def":"DefAliasTest", # def link or def alias (look gSettings["Processor"]["AliasDefDict"])
|
||||||
#Input arg
|
# "ArgList":[1,2,3], # Args list
|
||||||
# [
|
# "ArgDict":{"ttt":1,"222":2,"dsd":3} # Args dictionary
|
||||||
# {
|
# "ArgGSettings": # Name of GSettings attribute: str (ArgDict) or index (for ArgList)
|
||||||
# "Type": <RemoteMachineProcessingRun>,
|
# },
|
||||||
# host: <localhost>,
|
],
|
||||||
# port: <port>,
|
"AliasDefDict": {}, # Storage for def with Str alias. To use it see pyOpenRPA.Orchestrator.ControlPanel
|
||||||
# bodyObject: <object dict, int, str, list>
|
"CheckIntervalSecFloat": 1.0 # Interval for check gSettings in ProcessorDict > ActivityList
|
||||||
# },
|
"ExecuteBool": True # Flag to execute thread processor
|
||||||
# {
|
"""
|
||||||
# "Type": "CMDStart",
|
while inGSettings["ProcessorDict"]["ExecuteBool"]:
|
||||||
# "Command": ""
|
lActivityItem = inGSettings["ProcessorDict"]["ActivityList"].pop(0, None) # Extract the first item from processor queue
|
||||||
# },
|
while lActivityItem is not None:
|
||||||
# {
|
ActivityListExecute(inGSettings = inGSettings, inActivityList = [lActivityItem]) # execute the activity item
|
||||||
# "Type": "OrchestratorRestart"
|
time.sleep(inGSettings["ProcessorDict"]["CheckIntervalSecFloat"]) # Sleep when list is empty
|
||||||
# },
|
|
||||||
# {
|
|
||||||
# "Type": "OrchestratorSessionSave"
|
|
||||||
# },
|
|
||||||
# {
|
|
||||||
# "Type": "GlobalDictKeyListValueSet",
|
|
||||||
# "KeyList": ["key1","key2",...],
|
|
||||||
# "Value": <List, Dict, String, int>
|
|
||||||
# },
|
|
||||||
# {
|
|
||||||
# "Type": "GlobalDictKeyListValueAppend",
|
|
||||||
# "KeyList": ["key1","key2",...],
|
|
||||||
# "Value": <List, Dict, String, int>
|
|
||||||
# },
|
|
||||||
# {
|
|
||||||
# "Type": "GlobalDictKeyListValueOperator+",
|
|
||||||
# "KeyList": ["key1","key2",...],
|
|
||||||
# "Value": <List, Dict, String, int>
|
|
||||||
# },
|
|
||||||
# {
|
|
||||||
# "Type": "GlobalDictKeyListValueGet",
|
|
||||||
# "KeyList": ["key1","key2",...]
|
|
||||||
# },
|
|
||||||
# {
|
|
||||||
# "Type":"ProcessStart",
|
|
||||||
# "Path":"",
|
|
||||||
# "ArgList":[]
|
|
||||||
# },
|
|
||||||
# {
|
|
||||||
# "Type":"ProcessStartIfTurnedOff",
|
|
||||||
# "CheckTaskName":"", #Check if current task name is not active (then start process),
|
|
||||||
# "Path":"",
|
|
||||||
# "ArgList":[]
|
|
||||||
# },
|
|
||||||
# {
|
|
||||||
# "Type":"ProcessStop",
|
|
||||||
# "Name":"",
|
|
||||||
# "FlagForce":True,
|
|
||||||
# "User":"" #Empty - all users, user or %username%
|
|
||||||
# },
|
|
||||||
# {
|
|
||||||
# "Type":"PythonStart",
|
|
||||||
# "ModuleName":"",
|
|
||||||
# "FunctionName":"",
|
|
||||||
# "ArgList":[],
|
|
||||||
# "ArgDict":{}
|
|
||||||
# },
|
|
||||||
# {
|
|
||||||
# "Type":"WindowsLogon",
|
|
||||||
# "Domain":"",
|
|
||||||
# "User":"",
|
|
||||||
# "Password":""
|
|
||||||
# # Return "Result": True - user is logged on, False - user is not logged on
|
|
||||||
# }
|
|
||||||
# ]
|
|
||||||
##################################
|
|
||||||
#Output result
|
|
||||||
# <input arg> with attributes:
|
|
||||||
# "DateTimeUTCStringStart"
|
|
||||||
# "DateTimeUTCStringStop"
|
|
||||||
# "Result"
|
|
||||||
gSettingsDict = None
|
|
||||||
def Activity(inActivity):
|
|
||||||
#Глобальная переменная - глобальный словарь унаследованный от Settings.py
|
|
||||||
global gSettingsDict
|
|
||||||
lL = gSettingsDict["Logger"] # Alias for logger
|
|
||||||
#Alias (compatibility)
|
|
||||||
lItem = inActivity
|
|
||||||
lCurrentDateTime = datetime.datetime.now()
|
|
||||||
###########################################################
|
|
||||||
#Обработка запроса на отправку команды на удаленную машину
|
|
||||||
###########################################################
|
|
||||||
if lItem["Type"]=="RemoteMachineProcessingRun":
|
|
||||||
lHTTPConnection = http.client.HTTPConnection(lItem["host"], lItem["port"], timeout=5)
|
|
||||||
try:
|
|
||||||
lHTTPConnection.request("POST","/ProcessingRun",json.dumps(lItem["bodyObject"]))
|
|
||||||
except Exception as e:
|
|
||||||
#Объединение словарей
|
|
||||||
lItem["Result"] = {"State":"disconnected","ExceptionString":str(e)}
|
|
||||||
else:
|
|
||||||
lHTTPResponse=lHTTPConnection.getresponse()
|
|
||||||
lHTTPResponseByteArray=lHTTPResponse.read()
|
|
||||||
lItem["Result"] = json.loads(lHTTPResponseByteArray.decode('utf8'))
|
|
||||||
###########################################################
|
|
||||||
#Обработка команды CMDStart
|
|
||||||
###########################################################
|
|
||||||
if lItem["Type"]=="CMDStart":
|
|
||||||
lCMDCode="cmd /c "+lItem["Command"]
|
|
||||||
subprocess.Popen(lCMDCode)
|
|
||||||
lResultCMDRun=1#os.system(lCMDCode)
|
|
||||||
lItem["Result"] = str(lResultCMDRun)
|
|
||||||
###########################################################
|
|
||||||
#Обработка команды OrchestratorRestart
|
|
||||||
###########################################################
|
|
||||||
if lItem["Type"]=="OrchestratorRestart":
|
|
||||||
# Dump RDP List in file json
|
|
||||||
lFile = open("_SessionLast_RDPList.json", "w", encoding="utf-8")
|
|
||||||
lFile.write(json.dumps(gSettingsDict["RobotRDPActive"]["RDPList"])) # dump json to file
|
|
||||||
lFile.close() # Close the file
|
|
||||||
if lL: lL.info(f"Orchestrator has dump the RDP list before the restart. The RDP List is {gSettingsDict['RobotRDPActive']['RDPList']}. Do restart")
|
|
||||||
# Restart session
|
|
||||||
os.execl(sys.executable, os.path.abspath(__file__), *sys.argv)
|
|
||||||
lItem["Result"] = True
|
|
||||||
sys.exit(0)
|
|
||||||
###########################################################
|
|
||||||
# Обработка команды OrchestratorSessionSave
|
|
||||||
###########################################################
|
|
||||||
if lItem["Type"] == "OrchestratorSessionSave":
|
|
||||||
# Dump RDP List in file json
|
|
||||||
lFile = open("_SessionLast_RDPList.json", "w", encoding="utf-8")
|
|
||||||
lFile.write(json.dumps(gSettingsDict["RobotRDPActive"]["RDPList"])) # dump json to file
|
|
||||||
lFile.close() # Close the file
|
|
||||||
if lL: lL.info(
|
|
||||||
f"Orchestrator has dump the RDP list before the restart. The RDP List is {gSettingsDict['RobotRDPActive']['RDPList']}")
|
|
||||||
lItem["Result"] = True
|
|
||||||
###########################################################
|
|
||||||
#Обработка команды GlobalDictKeyListValueSet
|
|
||||||
###########################################################
|
|
||||||
if lItem["Type"]=="GlobalDictKeyListValueSet":
|
|
||||||
lDict = gSettingsDict
|
|
||||||
for lItem2 in lItem["KeyList"][:-1]:
|
|
||||||
#Check if key - value exists
|
|
||||||
if lItem2 in lDict:
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
lDict[lItem2]={}
|
|
||||||
lDict=lDict[lItem2]
|
|
||||||
#Set value
|
|
||||||
lDict[lItem["KeyList"][-1]]=lItem["Value"]
|
|
||||||
lItem["Result"] = True
|
|
||||||
###########################################################
|
|
||||||
# Обработка команды GlobalDictKeyListValueAppend
|
|
||||||
###########################################################
|
|
||||||
if lItem["Type"] == "GlobalDictKeyListValueAppend":
|
|
||||||
lDict = gSettingsDict
|
|
||||||
for lItem2 in lItem["KeyList"][:-1]:
|
|
||||||
# Check if key - value exists
|
|
||||||
if lItem2 in lDict:
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
lDict[lItem2] = {}
|
|
||||||
lDict = lDict[lItem2]
|
|
||||||
# Set value
|
|
||||||
lDict[lItem["KeyList"][-1]].append(lItem["Value"])
|
|
||||||
lItem["Result"] = True
|
|
||||||
###########################################################
|
|
||||||
# Обработка команды GlobalDictKeyListValueOperator+
|
|
||||||
###########################################################
|
|
||||||
if lItem["Type"] == "GlobalDictKeyListValueOperator+":
|
|
||||||
lDict = gSettingsDict
|
|
||||||
for lItem2 in lItem["KeyList"][:-1]:
|
|
||||||
# Check if key - value exists
|
|
||||||
if lItem2 in lDict:
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
lDict[lItem2] = {}
|
|
||||||
lDict = lDict[lItem2]
|
|
||||||
# Set value
|
|
||||||
lDict[lItem["KeyList"][-1]]+=lItem["Value"]
|
|
||||||
lItem["Result"] = True
|
|
||||||
###########################################################
|
|
||||||
#Обработка команды GlobalDictKeyListValueGet
|
|
||||||
###########################################################
|
|
||||||
if lItem["Type"]=="GlobalDictKeyListValueGet":
|
|
||||||
lDict = gSettingsDict
|
|
||||||
for lItem2 in lItem["KeyList"][:-1]:
|
|
||||||
#Check if key - value exists
|
|
||||||
if lItem2 in lDict:
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
lDict[lItem2]={}
|
|
||||||
lDict=lDict[lItem2]
|
|
||||||
#Return value
|
|
||||||
lItem["Result"]=lDict.get(lItem["KeyList"][-1],None)
|
|
||||||
#####################################
|
|
||||||
#ProcessStart
|
|
||||||
#####################################
|
|
||||||
if lItem["Type"]=="ProcessStart":
|
|
||||||
#Вид активности - запуск процесса
|
|
||||||
#Запись в массив отработанных активностей
|
|
||||||
#Запустить процесс
|
|
||||||
lItemArgs=[lItem["Path"]]
|
|
||||||
lItemArgs.extend(lItem["ArgList"])
|
|
||||||
subprocess.Popen(lItemArgs,shell=True)
|
|
||||||
#####################################
|
|
||||||
#ProcessStartIfTurnedOff
|
|
||||||
#####################################
|
|
||||||
if lItem["Type"]=="ProcessStartIfTurnedOff":
|
|
||||||
#Check if process running
|
|
||||||
#remove .exe from Taskname if exists
|
|
||||||
lCheckTaskName = lItem["CheckTaskName"]
|
|
||||||
if len(lCheckTaskName)>4:
|
|
||||||
if lCheckTaskName[-4:].upper() != ".EXE":
|
|
||||||
lCheckTaskName = lCheckTaskName+".exe"
|
|
||||||
else:
|
|
||||||
lCheckTaskName = lCheckTaskName+".exe"
|
|
||||||
#Check if process exist
|
|
||||||
if not CheckIfProcessRunning(lCheckTaskName):
|
|
||||||
#Вид активности - запуск процесса
|
|
||||||
#Запись в массив отработанных активностей
|
|
||||||
#Запустить процесс
|
|
||||||
lItemArgs=[lItem["Path"]]
|
|
||||||
lItemArgs.extend(lItem["ArgList"])
|
|
||||||
subprocess.Popen(lItemArgs,shell=True)
|
|
||||||
#################################
|
|
||||||
#ProcessStop
|
|
||||||
#################################
|
|
||||||
if lItem["Type"]=="ProcessStop":
|
|
||||||
#Вид активности - остановка процесса
|
|
||||||
#часовой пояс пока не учитываем
|
|
||||||
#Сформировать команду на завершение
|
|
||||||
lActivityCloseCommand='taskkill /im '+lItem["Name"]
|
|
||||||
#TODO Сделать безопасную обработку,если параметра нет в конфигурации
|
|
||||||
if lItem.get('FlagForce',False):
|
|
||||||
lActivityCloseCommand+=" /F"
|
|
||||||
#Завершить процессы только текущего пользоваиеля
|
|
||||||
if lItem.get('User',"")!="":
|
|
||||||
lActivityCloseCommand+=f' /fi "username eq {lItem["User"]}"'
|
|
||||||
#Завершить процесс
|
|
||||||
os.system(lActivityCloseCommand)
|
|
||||||
#################################
|
|
||||||
#PythonStart
|
|
||||||
#################################
|
|
||||||
if lItem["Type"]=="PythonStart":
|
|
||||||
try:
|
|
||||||
#Подключить модуль для вызова
|
|
||||||
lModule=importlib.import_module(lItem["ModuleName"])
|
|
||||||
#Найти функцию
|
|
||||||
lFunction=getattr(lModule,lItem["FunctionName"])
|
|
||||||
lItem["Result"]=lFunction(*lItem.get("ArgList",[]),**lItem.get("ArgDict",{}))
|
|
||||||
except Exception as e:
|
|
||||||
if lL: lL.exception("Loop activity error: module/function not founded")
|
|
||||||
#################################
|
|
||||||
# Windows logon
|
|
||||||
#################################
|
|
||||||
if lItem["Type"] == "WindowsLogon":
|
|
||||||
import win32security
|
|
||||||
try:
|
|
||||||
hUser = win32security.LogonUser(
|
|
||||||
lItem["User"],
|
|
||||||
lItem["Domain"],
|
|
||||||
lItem["Password"],
|
|
||||||
win32security.LOGON32_LOGON_NETWORK,
|
|
||||||
win32security.LOGON32_PROVIDER_DEFAULT
|
|
||||||
)
|
|
||||||
except win32security.error:
|
|
||||||
lItem["Result"] = False
|
|
||||||
else:
|
|
||||||
lItem["Result"] = True
|
|
||||||
###################################
|
|
||||||
#Вернуть результат
|
|
||||||
return lItem
|
|
||||||
|
|
||||||
def ActivityListOrDict(inActivityListOrDict):
|
|
||||||
#Check arg type (list or dict)
|
|
||||||
if type(inActivityListOrDict)==list:
|
|
||||||
#List activity
|
|
||||||
lResult=[]
|
|
||||||
for lItem in inActivityListOrDict:
|
|
||||||
lResult.append(Activity(lItem))
|
|
||||||
return lResult
|
|
||||||
if type(inActivityListOrDict)==dict:
|
|
||||||
#Dict activity
|
|
||||||
return Activity(inActivityListOrDict)
|
|
||||||
|
|
||||||
def CheckIfProcessRunning(processName):
|
# Execute ActivityItem list
|
||||||
'''
|
# return the def result
|
||||||
Check if there is any running process that contains the given name processName.
|
def ActivityListExecute(inGSettings, inActivityList):
|
||||||
'''
|
lL = inGSettings["Logger"] # Logger alias
|
||||||
#Iterate over the all the running process
|
lResultList = [] # init the result list
|
||||||
for proc in psutil.process_iter():
|
for lActivityItem in inActivityList: # Iterate throught the activity list
|
||||||
try:
|
lDef = None # Def variable
|
||||||
# Check if process name contains the given name string.
|
if callable(lActivityItem["Def"]): # CHeck if def is callable
|
||||||
if processName.lower() in proc.name().lower():
|
lDef = lActivityItem["Def"] # Get the def
|
||||||
return True
|
else: # Is not callable - check alias
|
||||||
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
|
lDef = inGSettings["ProcessorDict"]["AliasDefDict"].pop(lActivityItem["Def"], None) # get def if def key in Alias def storage
|
||||||
pass
|
#
|
||||||
return False;
|
lGSettingsDictKey = lActivityItem.pop("ArgGSettings",None)
|
||||||
|
# # Prepare arg dict
|
||||||
|
if type(lGSettingsDictKey) is str: # check if gSetting key is in ArgDict
|
||||||
|
lActivityItem["ArgDict"]["lGSettingsDictKey"] = inGSettings # Set the gSettings in dict
|
||||||
|
# # Prepare arg list
|
||||||
|
elif type(lGSettingsDictKey) is int: # check if gSetting key is in ArgDict
|
||||||
|
lActivityItem["ArgList"].insert(lGSettingsDictKey,inGSettings)# Set the gSettings in list by the index
|
||||||
|
try: # try to run function from Processor.py
|
||||||
|
lActivityItemResult = lDef(*lActivityItem["ArgList"], **lActivityItem["ArgDict"])
|
||||||
|
lResultList.append(lActivityItemResult) # return the result
|
||||||
|
except Exception as e:
|
||||||
|
if lL: lL.exception(f"Processor.ActivityListExecute: Exception in def execution - activity will be ignored. Activity item: {lActivityItem}") # Logging
|
||||||
|
lResultList.append(e) # return the generated exception
|
||||||
|
return lResultList # return the result list
|
@ -0,0 +1,301 @@
|
|||||||
|
import datetime
|
||||||
|
import http.client
|
||||||
|
import json
|
||||||
|
import pdb
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import subprocess
|
||||||
|
import importlib
|
||||||
|
import psutil
|
||||||
|
#Input arg
|
||||||
|
# [
|
||||||
|
# {
|
||||||
|
# "Type": <RemoteMachineProcessingRun>,
|
||||||
|
# host: <localhost>,
|
||||||
|
# port: <port>,
|
||||||
|
# bodyObject: <object dict, int, str, list>
|
||||||
|
# },
|
||||||
|
# {
|
||||||
|
# "Type": "CMDStart",
|
||||||
|
# "Command": ""
|
||||||
|
# },
|
||||||
|
# {
|
||||||
|
# "Type": "OrchestratorRestart"
|
||||||
|
# },
|
||||||
|
# {
|
||||||
|
# "Type": "OrchestratorSessionSave"
|
||||||
|
# },
|
||||||
|
# {
|
||||||
|
# "Type": "GlobalDictKeyListValueSet",
|
||||||
|
# "KeyList": ["key1","key2",...],
|
||||||
|
# "Value": <List, Dict, String, int>
|
||||||
|
# },
|
||||||
|
# {
|
||||||
|
# "Type": "GlobalDictKeyListValueAppend",
|
||||||
|
# "KeyList": ["key1","key2",...],
|
||||||
|
# "Value": <List, Dict, String, int>
|
||||||
|
# },
|
||||||
|
# {
|
||||||
|
# "Type": "GlobalDictKeyListValueOperator+",
|
||||||
|
# "KeyList": ["key1","key2",...],
|
||||||
|
# "Value": <List, Dict, String, int>
|
||||||
|
# },
|
||||||
|
# {
|
||||||
|
# "Type": "GlobalDictKeyListValueGet",
|
||||||
|
# "KeyList": ["key1","key2",...]
|
||||||
|
# },
|
||||||
|
# {
|
||||||
|
# "Type":"ProcessStart",
|
||||||
|
# "Path":"",
|
||||||
|
# "ArgList":[]
|
||||||
|
# },
|
||||||
|
# {
|
||||||
|
# "Type":"ProcessStartIfTurnedOff",
|
||||||
|
# "CheckTaskName":"", #Check if current task name is not active (then start process),
|
||||||
|
# "Path":"",
|
||||||
|
# "ArgList":[]
|
||||||
|
# },
|
||||||
|
# {
|
||||||
|
# "Type":"ProcessStop",
|
||||||
|
# "Name":"",
|
||||||
|
# "FlagForce":True,
|
||||||
|
# "User":"" #Empty - all users, user or %username%
|
||||||
|
# },
|
||||||
|
# {
|
||||||
|
# "Type":"PythonStart",
|
||||||
|
# "ModuleName":"",
|
||||||
|
# "FunctionName":"",
|
||||||
|
# "ArgList":[],
|
||||||
|
# "ArgDict":{}
|
||||||
|
# },
|
||||||
|
# {
|
||||||
|
# "Type":"WindowsLogon",
|
||||||
|
# "Domain":"",
|
||||||
|
# "User":"",
|
||||||
|
# "Password":""
|
||||||
|
# # Return "Result": True - user is logged on, False - user is not logged on
|
||||||
|
# }
|
||||||
|
# ]
|
||||||
|
##################################
|
||||||
|
#Output result
|
||||||
|
# <input arg> with attributes:
|
||||||
|
# "DateTimeUTCStringStart"
|
||||||
|
# "DateTimeUTCStringStop"
|
||||||
|
# "Result"
|
||||||
|
gSettingsDict = None
|
||||||
|
def Activity(inActivity):
|
||||||
|
#Глобальная переменная - глобальный словарь унаследованный от Settings.py
|
||||||
|
global gSettingsDict
|
||||||
|
lL = gSettingsDict["Logger"] # Alias for logger
|
||||||
|
#Alias (compatibility)
|
||||||
|
lItem = inActivity
|
||||||
|
lCurrentDateTime = datetime.datetime.now()
|
||||||
|
###########################################################
|
||||||
|
#Обработка запроса на отправку команды на удаленную машину
|
||||||
|
###########################################################
|
||||||
|
if lItem["Type"]=="RemoteMachineProcessingRun":
|
||||||
|
lHTTPConnection = http.client.HTTPConnection(lItem["host"], lItem["port"], timeout=5)
|
||||||
|
try:
|
||||||
|
lHTTPConnection.request("POST","/ProcessingRun",json.dumps(lItem["bodyObject"]))
|
||||||
|
except Exception as e:
|
||||||
|
#Объединение словарей
|
||||||
|
lItem["Result"] = {"State":"disconnected","ExceptionString":str(e)}
|
||||||
|
else:
|
||||||
|
lHTTPResponse=lHTTPConnection.getresponse()
|
||||||
|
lHTTPResponseByteArray=lHTTPResponse.read()
|
||||||
|
lItem["Result"] = json.loads(lHTTPResponseByteArray.decode('utf8'))
|
||||||
|
###########################################################
|
||||||
|
#Обработка команды CMDStart
|
||||||
|
###########################################################
|
||||||
|
if lItem["Type"]=="CMDStart":
|
||||||
|
lCMDCode="cmd /c "+lItem["Command"]
|
||||||
|
subprocess.Popen(lCMDCode)
|
||||||
|
lResultCMDRun=1#os.system(lCMDCode)
|
||||||
|
lItem["Result"] = str(lResultCMDRun)
|
||||||
|
###########################################################
|
||||||
|
#Обработка команды OrchestratorRestart
|
||||||
|
###########################################################
|
||||||
|
if lItem["Type"]=="OrchestratorRestart":
|
||||||
|
# Dump RDP List in file json
|
||||||
|
lFile = open("_SessionLast_RDPList.json", "w", encoding="utf-8")
|
||||||
|
lFile.write(json.dumps(gSettingsDict["RobotRDPActive"]["RDPList"])) # dump json to file
|
||||||
|
lFile.close() # Close the file
|
||||||
|
if lL: lL.info(f"Orchestrator has dump the RDP list before the restart. The RDP List is {gSettingsDict['RobotRDPActive']['RDPList']}. Do restart")
|
||||||
|
# Restart session
|
||||||
|
os.execl(sys.executable, os.path.abspath(__file__), *sys.argv)
|
||||||
|
lItem["Result"] = True
|
||||||
|
sys.exit(0)
|
||||||
|
###########################################################
|
||||||
|
# Обработка команды OrchestratorSessionSave
|
||||||
|
###########################################################
|
||||||
|
if lItem["Type"] == "OrchestratorSessionSave":
|
||||||
|
# Dump RDP List in file json
|
||||||
|
lFile = open("_SessionLast_RDPList.json", "w", encoding="utf-8")
|
||||||
|
lFile.write(json.dumps(gSettingsDict["RobotRDPActive"]["RDPList"])) # dump json to file
|
||||||
|
lFile.close() # Close the file
|
||||||
|
if lL: lL.info(
|
||||||
|
f"Orchestrator has dump the RDP list before the restart. The RDP List is {gSettingsDict['RobotRDPActive']['RDPList']}")
|
||||||
|
lItem["Result"] = True
|
||||||
|
###########################################################
|
||||||
|
#Обработка команды GlobalDictKeyListValueSet
|
||||||
|
###########################################################
|
||||||
|
if lItem["Type"]=="GlobalDictKeyListValueSet":
|
||||||
|
lDict = gSettingsDict
|
||||||
|
for lItem2 in lItem["KeyList"][:-1]:
|
||||||
|
#Check if key - value exists
|
||||||
|
if lItem2 in lDict:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
lDict[lItem2]={}
|
||||||
|
lDict=lDict[lItem2]
|
||||||
|
#Set value
|
||||||
|
lDict[lItem["KeyList"][-1]]=lItem["Value"]
|
||||||
|
lItem["Result"] = True
|
||||||
|
###########################################################
|
||||||
|
# Обработка команды GlobalDictKeyListValueAppend
|
||||||
|
###########################################################
|
||||||
|
if lItem["Type"] == "GlobalDictKeyListValueAppend":
|
||||||
|
lDict = gSettingsDict
|
||||||
|
for lItem2 in lItem["KeyList"][:-1]:
|
||||||
|
# Check if key - value exists
|
||||||
|
if lItem2 in lDict:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
lDict[lItem2] = {}
|
||||||
|
lDict = lDict[lItem2]
|
||||||
|
# Set value
|
||||||
|
lDict[lItem["KeyList"][-1]].append(lItem["Value"])
|
||||||
|
lItem["Result"] = True
|
||||||
|
###########################################################
|
||||||
|
# Обработка команды GlobalDictKeyListValueOperator+
|
||||||
|
###########################################################
|
||||||
|
if lItem["Type"] == "GlobalDictKeyListValueOperator+":
|
||||||
|
lDict = gSettingsDict
|
||||||
|
for lItem2 in lItem["KeyList"][:-1]:
|
||||||
|
# Check if key - value exists
|
||||||
|
if lItem2 in lDict:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
lDict[lItem2] = {}
|
||||||
|
lDict = lDict[lItem2]
|
||||||
|
# Set value
|
||||||
|
lDict[lItem["KeyList"][-1]]+=lItem["Value"]
|
||||||
|
lItem["Result"] = True
|
||||||
|
###########################################################
|
||||||
|
#Обработка команды GlobalDictKeyListValueGet
|
||||||
|
###########################################################
|
||||||
|
if lItem["Type"]=="GlobalDictKeyListValueGet":
|
||||||
|
lDict = gSettingsDict
|
||||||
|
for lItem2 in lItem["KeyList"][:-1]:
|
||||||
|
#Check if key - value exists
|
||||||
|
if lItem2 in lDict:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
lDict[lItem2]={}
|
||||||
|
lDict=lDict[lItem2]
|
||||||
|
#Return value
|
||||||
|
lItem["Result"]=lDict.get(lItem["KeyList"][-1],None)
|
||||||
|
#####################################
|
||||||
|
#ProcessStart
|
||||||
|
#####################################
|
||||||
|
if lItem["Type"]=="ProcessStart":
|
||||||
|
#Вид активности - запуск процесса
|
||||||
|
#Запись в массив отработанных активностей
|
||||||
|
#Запустить процесс
|
||||||
|
lItemArgs=[lItem["Path"]]
|
||||||
|
lItemArgs.extend(lItem["ArgList"])
|
||||||
|
subprocess.Popen(lItemArgs,shell=True)
|
||||||
|
#####################################
|
||||||
|
#ProcessStartIfTurnedOff
|
||||||
|
#####################################
|
||||||
|
if lItem["Type"]=="ProcessStartIfTurnedOff":
|
||||||
|
#Check if process running
|
||||||
|
#remove .exe from Taskname if exists
|
||||||
|
lCheckTaskName = lItem["CheckTaskName"]
|
||||||
|
if len(lCheckTaskName)>4:
|
||||||
|
if lCheckTaskName[-4:].upper() != ".EXE":
|
||||||
|
lCheckTaskName = lCheckTaskName+".exe"
|
||||||
|
else:
|
||||||
|
lCheckTaskName = lCheckTaskName+".exe"
|
||||||
|
#Check if process exist
|
||||||
|
if not CheckIfProcessRunning(lCheckTaskName):
|
||||||
|
#Вид активности - запуск процесса
|
||||||
|
#Запись в массив отработанных активностей
|
||||||
|
#Запустить процесс
|
||||||
|
lItemArgs=[lItem["Path"]]
|
||||||
|
lItemArgs.extend(lItem["ArgList"])
|
||||||
|
subprocess.Popen(lItemArgs,shell=True)
|
||||||
|
#################################
|
||||||
|
#ProcessStop
|
||||||
|
#################################
|
||||||
|
if lItem["Type"]=="ProcessStop":
|
||||||
|
#Вид активности - остановка процесса
|
||||||
|
#часовой пояс пока не учитываем
|
||||||
|
#Сформировать команду на завершение
|
||||||
|
lActivityCloseCommand='taskkill /im '+lItem["Name"]
|
||||||
|
#TODO Сделать безопасную обработку,если параметра нет в конфигурации
|
||||||
|
if lItem.get('FlagForce',False):
|
||||||
|
lActivityCloseCommand+=" /F"
|
||||||
|
#Завершить процессы только текущего пользоваиеля
|
||||||
|
if lItem.get('User',"")!="":
|
||||||
|
lActivityCloseCommand+=f' /fi "username eq {lItem["User"]}"'
|
||||||
|
#Завершить процесс
|
||||||
|
os.system(lActivityCloseCommand)
|
||||||
|
#################################
|
||||||
|
#PythonStart
|
||||||
|
#################################
|
||||||
|
if lItem["Type"]=="PythonStart":
|
||||||
|
try:
|
||||||
|
#Подключить модуль для вызова
|
||||||
|
lModule=importlib.import_module(lItem["ModuleName"])
|
||||||
|
#Найти функцию
|
||||||
|
lFunction=getattr(lModule,lItem["FunctionName"])
|
||||||
|
lItem["Result"]=lFunction(*lItem.get("ArgList",[]),**lItem.get("ArgDict",{}))
|
||||||
|
except Exception as e:
|
||||||
|
if lL: lL.exception("Loop activity error: module/function not founded")
|
||||||
|
#################################
|
||||||
|
# Windows logon
|
||||||
|
#################################
|
||||||
|
if lItem["Type"] == "WindowsLogon":
|
||||||
|
import win32security
|
||||||
|
try:
|
||||||
|
hUser = win32security.LogonUser(
|
||||||
|
lItem["User"],
|
||||||
|
lItem["Domain"],
|
||||||
|
lItem["Password"],
|
||||||
|
win32security.LOGON32_LOGON_NETWORK,
|
||||||
|
win32security.LOGON32_PROVIDER_DEFAULT
|
||||||
|
)
|
||||||
|
except win32security.error:
|
||||||
|
lItem["Result"] = False
|
||||||
|
else:
|
||||||
|
lItem["Result"] = True
|
||||||
|
###################################
|
||||||
|
#Вернуть результат
|
||||||
|
return lItem
|
||||||
|
|
||||||
|
def ActivityListOrDict(inActivityListOrDict):
|
||||||
|
#Check arg type (list or dict)
|
||||||
|
if type(inActivityListOrDict)==list:
|
||||||
|
#List activity
|
||||||
|
lResult=[]
|
||||||
|
for lItem in inActivityListOrDict:
|
||||||
|
lResult.append(Activity(lItem))
|
||||||
|
return lResult
|
||||||
|
if type(inActivityListOrDict)==dict:
|
||||||
|
#Dict activity
|
||||||
|
return Activity(inActivityListOrDict)
|
||||||
|
|
||||||
|
def CheckIfProcessRunning(processName):
|
||||||
|
'''
|
||||||
|
Check if there is any running process that contains the given name processName.
|
||||||
|
'''
|
||||||
|
#Iterate over the all the running process
|
||||||
|
for proc in psutil.process_iter():
|
||||||
|
try:
|
||||||
|
# Check if process name contains the given name string.
|
||||||
|
if processName.lower() in proc.name().lower():
|
||||||
|
return True
|
||||||
|
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
|
||||||
|
pass
|
||||||
|
return False;
|
Loading…
Reference in new issue