diff --git a/Orchestrator/ControlPanel_RobotRDPActive_Template.py b/Orchestrator/ControlPanel_RobotRDPActive_Template.py index 2aa4f2f9..0bb59f4f 100644 --- a/Orchestrator/ControlPanel_RobotRDPActive_Template.py +++ b/Orchestrator/ControlPanel_RobotRDPActive_Template.py @@ -1,18 +1,21 @@ import psutil, datetime, logging, os, json # # # # # # # ORCHESTRATOR CONTROL PANEL # # # # # # # # Init parameters -gProcessNameWOEXE = "OpenRPA_RobotRDPActive" -gRDPStartFilePath = os.path.abspath(os.path.join(os.getcwd(), "..\\Utils\\RobotRDPActive\\pyOpenRPA.Tools.RobotRDPActive_x64.cmd")) # cwd is orchestrator working directory -gOrchestratorToRobotKeyList = ["Storage","RobotRDPActive","OrchestratorToRobotStorage"] -gRobotToOrchestratorKeyList = ["Storage","RobotRDPActive","RobotToOrchestratorStorage"] +gProcessNameWOEXE = "OpenRPA_RobotRDPActive_" +gRDPOrchestratorStorageKey = "" +gRDPStartFilePath = os.path.abspath(os.path.join(os.getcwd(), gRDPOrchestratorStorageKey+r"\pyOpenRPA.Tools.RobotRDPActive_x64.cmd")) # cwd is orchestrator working directory +gOrchestratorToRobotKeyList = ["Storage",gRDPOrchestratorStorageKey,"OrchestratorToRobotStorage"] +gOrchestratorToRobotResetKeyList = ["Storage",gRDPOrchestratorStorageKey,"OrchestratorToRobotResetStorage"] +gRobotToOrchestratorKeyList = ["Storage",gRDPOrchestratorStorageKey,"RobotToOrchestratorStorage"] gRobotRDPActiveDefsFolderPath = "" - +gRobotProcessNameWOEXE = "" +gRobotProcessFilePath = r"path\to\start\link" # Function, which is generate Dict for front-endswith def ControlPanelRenderDict(inGSettings): """result={ "HeaderLeftText":"", "HeaderRightText":"
", - "DataStorageKey":"RobotRDPActive", #Use key for set current dict in mGlobal.DataStorage["DataStorageKey"] on client side + "DataStorageKey":"Robot_Name", #Use key for set current dict in mGlobal.DataStorage["DataStorageKey"] on client side "SubheaderText": "State: Turned on", "BodyKeyValueList":[ {"Key":"Session list","Value":""}, @@ -28,29 +31,47 @@ def ControlPanelRenderDict(inGSettings): }""" # START :: Create activities :: START # ## RDP Start - lActivityRDPStartEscaped = (f"mGlobal.Controller.CMDRunText('start cmd /K {gRDPStartFilePath}');").replace("\\","\\\\") # Need escape because this is render on client side and after that it goes to server side :( + lActivityRDPStartEscaped = (f"mGlobal.Controller.CMDRunText('start cmd /K {gRDPStartFilePath}');").replace("\\","\\\\").replace("\"","\'") # Need escape because this is render on client side and after that it goes to server side :( ## RDP Safe turn off - lActivityRDPSafeOffEscaped = (f"mGlobal.Processor.ServerValueSet({json.dumps(gOrchestratorToRobotKeyList+['SafeTurnOff'])},true);").replace("\\","\\\\") + lActivityRDPSafeOffEscaped = (f"mGlobal.Processor.ServerValueSet({json.dumps(gOrchestratorToRobotKeyList+['SafeTurnOff'])},true);").replace("\\","\\\\").replace("\"","\'") ## RDP Kill - lActivityRDPKillEscaped = (f"mGlobal.Controller.CMDRunText('taskkill /F /im {gProcessNameWOEXE}.exe');").replace("\\","\\\\") - ## Recieve file from RDP session to Orchestrator session - lActivityFileRDP2OrchestratorDict = [ + lActivityRDPKillEscaped = (f"mGlobal.Controller.CMDRunText('taskkill /F /im {gProcessNameWOEXE}.exe');").replace("\\","\\\\").replace("\"","\'") + ## Robot start + lActivityROBOTStartList = [ { - "ModulePath": f"{os.path.join(gRobotRDPActiveDefsFolderPath,'Defs_SessionIndex.py')}", # "Session\\SessionDefs.py" - "DefName":"FileStoredRecieve", # Function name + "ModulePath": f"{os.path.abspath(os.path.join(gRobotRDPActiveDefsFolderPath,'Defs_SessionIndex.py'))}", # "RobotRDPActive\\SessionDefs.py" + "DefName":"ProcessStartIfNotRunning", # Function name "ArgList":[], # Args list - "ArgDict":{"inSessionIndex": 0, "inHostFilePath": "testRecieve.txt","inRDPFilePath": "C:\\Temp\\testRecieve.txt"} # Args dictionary + "ArgDict":{"inSessionIndex": 0, "inProcessName": f"{gRobotProcessNameWOEXE}.exe", "inFilePath": gRobotProcessFilePath} # Args dictionary } ] - lActivityFileRDP2Orchestrator = f"mGlobal.Processor.ServerValueSet(['Storage','RobotRDPActive','OrchestratorToRobotResetStorage','ActivityList'],{json.dumps(lActivityFileRDP2OrchestratorDict)});" + lActivityROBOTStartEscaped = f"mGlobal.Processor.ServerValueSet({json.dumps(gOrchestratorToRobotResetKeyList+['ActivityList'])},{json.dumps(lActivityROBOTStartList)});".replace("\"","\'") + ## ROBOT r3 stop + lActivityROBOTStopList = [ + { + "ModulePath": f"{os.path.abspath(os.path.join(gRobotRDPActiveDefsFolderPath,'Defs_SessionIndex.py'))}", # "Session\\SessionDefs.py" + "DefName":"ProcessStop", # Function name + "ArgList":[], # Args list + "ArgDict":{"inSessionIndex": 0, "inProcessName": f"{gRobotProcessNameWOEXE}.exe", "inFlagForceClose":True} # Args dictionary + } + ] + lActivityROBOTStopEscaped = f"mGlobal.Processor.ServerValueSet({json.dumps(gOrchestratorToRobotResetKeyList+['ActivityList'])},{json.dumps(lActivityROBOTStopList)});".replace("\"","\'") + ## ROBOT r3 restart + lActivityROBOTRestartList = lActivityROBOTStartList + lActivityROBOTStopList + lActivityROBOTRestartEscaped = f"mGlobal.Processor.ServerValueSet({json.dumps(gOrchestratorToRobotResetKeyList+['ActivityList'])},{json.dumps(lActivityROBOTRestartList)});".replace("\"","\'") # END :: Create activities :: END # # START :: Init result dict template :: START # + lBodyKeyValue_r3_start=f'Start' + lBodyKeyValue_r3_stop=f'Stop' + lBodyKeyValue_r3_restart=f'restart' lResultDict={ - "HeaderLeftText":"Keep active RDP sessions", - "HeaderRightText":"Tech", - "DataStorageKey":"RobotRDPActive", #Use key for set current dict in mGlobal.DataStorage["DataStorageKey"] on client side + "HeaderLeftText":"ROBOT r4", + "HeaderRightText":"r4", + "DataStorageKey":gRDPOrchestratorStorageKey, #Use key for set current dict in mGlobal.DataStorage["DataStorageKey"] on client side "SubheaderText":"", "BodyKeyValueList":[ + {"Key":"ROBOT robots (r1-r5) list","Value":""}, + {"Key":"r4","Value":f"{lBodyKeyValue_r3_start}, {lBodyKeyValue_r3_stop}, {lBodyKeyValue_r3_restart}"}, {"Key":"Session list","Value":""} ], "FooterText":"Last update: 9:38:00 09.10.2019", @@ -60,32 +81,32 @@ def ControlPanelRenderDict(inGSettings): ], "FooterButtonX1List":[ {"Text":"Kill", "Color":"red", "Link":"", "OnClick": lActivityRDPKillEscaped} - ]#, - #"GlobalStorage": inGSettings.get("Storage",{}) # UNCOMMENT FOR DEBUG PURPOSE TO WATCH inGSettings on client side + ], + "GlobalStorage": inGSettings.get("Storage",{}) # UNCOMMENT FOR DEBUG PURPOSE TO WATCH inGSettings on client side } # END :: Init result dict template :: END # # START :: Fill BodyKeyValueList :: START # ## Read RDPList - lRDPList = TechDictKeyList_ItemGet(inDict=inGSettings, inKeyList=gRobotToOrchestratorKeyList+["RDPList"], inDefault=[]): - lFullScreenSessionIndex = TechDictKeyList_ItemGet(inDict=inGSettings, inKeyList=gRobotToOrchestratorKeyList+["FullScreenSessionIndex"], inDefault=None): + lRDPList = TechDictKeyList_ItemGet(inDict=inGSettings, inKeyList=gRobotToOrchestratorKeyList+["RDPList"], inDefault=[]) + lFullScreenSessionIndex = TechDictKeyList_ItemGet(inDict=inGSettings, inKeyList=gRobotToOrchestratorKeyList+["FullScreenSessionIndex"], inDefault=None) lRDPListIndex = 0 for lItem in lRDPList: ### Lable that session has fullscreen lLabelSessionFullScreen = "" lLabelIsIgnored = "" ### Link set full screen - lOnClickSetFullScreen = f"mGlobal.Processor.ServerValueSet(['Storage','RobotRDPActive','OrchestratorToRobotStorage','FullScreenSessionIndex'],{lRDPListIndex});" + lOnClickSetFullScreen = f"mGlobal.Processor.ServerValueSet(['Storage','{gRDPOrchestratorStorageKey}','OrchestratorToRobotStorage','FullScreenSessionIndex'],{lRDPListIndex});" lSetFullScreenA = f'Set fullscreen' if lRDPListIndex == lFullScreenSessionIndex: lLabelSessionFullScreen = '[Fullscreen]' - lOnClickSetFullScreen = f"mGlobal.Processor.ServerValueSet(['Storage','RobotRDPActive','OrchestratorToRobotStorage','FullScreenSessionIndex'],null);" + lOnClickSetFullScreen = f"mGlobal.Processor.ServerValueSet(['Storage','{gRDPOrchestratorStorageKey}','OrchestratorToRobotStorage','FullScreenSessionIndex'],null);" lSetFullScreenA = f'Set minimized' - lIgnoreIndexListOnClick = "$.ajax({type: 'POST', url: 'RobotRDPActive/IgnoreIndexListAppend', data: '"+str(lRDPListIndex)+"', success: function(lData,l2,l3){}, dataType: 'text'});" + lIgnoreIndexListOnClick = "$.ajax({type: 'POST', url: '{gRDPOrchestratorStorageKey}/IgnoreIndexListAppend', data: '"+str(lRDPListIndex)+"', success: function(lData,l2,l3){}, dataType: 'text'});" lIgnoreIndexListLink = f'Ignore' ### Check if in ignore - if lRDPListIndex in inGSettings.get("Storage",{}).get("RobotRDPActive",{}).get("OrchestratorToRobotStorage",{}).get("IgnoreIndexList",[]): + if lRDPListIndex in inGSettings.get("Storage",{}).get(gRDPOrchestratorStorageKey,{}).get("OrchestratorToRobotStorage",{}).get("IgnoreIndexList",[]): lLabelIsIgnored = '[Ignored]' - lIgnoreIndexListOnClick = "$.ajax({type: 'POST', url: 'RobotRDPActive/IgnoreIndexListRemove', data: '"+str(lRDPListIndex)+"', success: function(lData,l2,l3){}, dataType: 'text'});" + lIgnoreIndexListOnClick = "$.ajax({type: 'POST', url: '"+gRDPOrchestratorStorageKey+"/IgnoreIndexListRemove', data: '"+str(lRDPListIndex)+"', success: function(lData,l2,l3){}, dataType: 'text'});" lIgnoreIndexListLink = f'Unignore' ### Session state lItemSessionState='Disconnected' @@ -120,7 +141,7 @@ def CheckIfProcessRunning(processName): return False #Add to ignore list - AJAX request from client side def IgnoreIndexListAppend(inRequest,inConfiguration): - lIgnoreList = TechDictKeyList_ItemGet(inDict=inConfiguration, inKeyList=gOrchestratorToRobotKeyList+["IgnoreIndexList"], inDefault=[]): + lIgnoreList = TechDictKeyList_ItemGet(inDict=inConfiguration, inKeyList=gOrchestratorToRobotKeyList+["IgnoreIndexList"], inDefault=[]) lIgnoreIndex={} if inRequest.headers.get('Content-Length') is not None: lInputByteArrayLength = int(inRequest.headers.get('Content-Length')) @@ -133,7 +154,7 @@ def IgnoreIndexListAppend(inRequest,inConfiguration): lIgnoreList.append(lIgnoreIndex) #remove from Ignore list - AJAX request from client side def IgnoreIndexListRemove(inRequest,inConfiguration): - lIgnoreList = TechDictKeyList_ItemGet(inDict=inConfiguration, inKeyList=gOrchestratorToRobotKeyList+["IgnoreIndexList"], inDefault=[]): + lIgnoreList = TechDictKeyList_ItemGet(inDict=inConfiguration, inKeyList=gOrchestratorToRobotKeyList+["IgnoreIndexList"], inDefault=[]) lIgnoreIndex={} if inRequest.headers.get('Content-Length') is not None: lInputByteArrayLength = int(inRequest.headers.get('Content-Length')) @@ -150,7 +171,7 @@ def TechDictKeyList_ItemGet(inDict, inKeyList, inDefault={}): for lItem in inKeyList: if lResult: lResult = lResult.get(lItem,None) - if not lResult: + if lResult is None: lResult=inDefault return lResult # # # # # # # # # # # # # # # # # # # # # # # # @@ -159,18 +180,18 @@ def SettingsUpdate(inGSettings): #Add RobotRDPActive in control panel inGSettings["ControlPanelDict"]["RobotList"].append({"RenderFunction": ControlPanelRenderDict}) #Default structure - inGSettings["Storage"]["RobotRDPActive"]={ - "OrchestratorToRobotResetStorage":{"SafeTurnOff":False}, + inGSettings["Storage"][gRDPOrchestratorStorageKey]={ + "OrchestratorToRobotResetStorage":{"SafeTurnOff":False, "ActivityList":[]}, "OrchestratorToRobotStorage":{ "FullScreenSessionIndex":None, "IgnoreIndexList": [] } - } + } #Add methods inGSettings["Server"]["URLList"].append( { "Method":"POST", - "URL": "/RobotRDPActive/IgnoreIndexListAppend", #URL of the request + "URL": f"/{gRDPOrchestratorStorageKey}/IgnoreIndexListAppend", #URL of the request "MatchType": "Equal", #"BeginWith|Contains|Equal|EqualCase", "ResponseDefRequestGlobal": IgnoreIndexListAppend #Function with str result } @@ -178,7 +199,7 @@ def SettingsUpdate(inGSettings): inGSettings["Server"]["URLList"].append( { "Method":"POST", - "URL": "/RobotRDPActive/IgnoreIndexListRemove", #URL of the request + "URL": f"/{gRDPOrchestratorStorageKey}/IgnoreIndexListRemove", #URL of the request "MatchType": "Equal", #"BeginWith|Contains|Equal|EqualCase", "ResponseDefRequestGlobal": IgnoreIndexListRemove #Function with str result } diff --git a/Utils/RobotRDPActive/SettingsRobotRDPActiveExample.py b/Utils/RobotRDPActive/SettingsRobotRDPActiveExample.py index bfe412d2..07e486b8 100644 --- a/Utils/RobotRDPActive/SettingsRobotRDPActiveExample.py +++ b/Utils/RobotRDPActive/SettingsRobotRDPActiveExample.py @@ -10,7 +10,7 @@ lOrchestratorHost="localhost" lOrchestratorPort=8081 lOrchestratorProtocol="http" lOrchestratorAuthToken="1992-04-03-0643-ru-b4ff-openrpa52zzz" - +gRobotName="RobotRDPActive" lRobotRDPActiveFolderPath = '\\'.join(RobotRDPActive.__file__.split('\\')[:-1]) #print(f"{os.path.join(lRobotRDPActiveFolderPath,'SessionDefs.py')}") def Settings(): @@ -38,7 +38,7 @@ def Settings(): ], "ResponsibilityCheckIntervalSec": None, # Seconds interval when Robot check the RDP responsibility. if None - dont check "FullScreenSessionIndex": None, #Index of the current session which is full screened, None is no session in fullscreen - "Logger": logging.getLogger("RobotRDPActive"), + "Logger": logging.getLogger(gRobotName), "Logs": { "FlagShowInConsole":True }, @@ -102,7 +102,7 @@ def Settings(): "Interval": 1.1, "RobotStorage": mDict, "RobotStorageKey": "RDPList", - "OrchestratorKeyList": ["Storage", "RobotRDPActive","RobotToOrchestratorStorage","RDPList"], + "OrchestratorKeyList": ["Storage", gRobotName,"RobotToOrchestratorStorage","RDPList"], "OrchestratorProtocol": lOrchestratorProtocol, "OrchestratorHost": lOrchestratorHost, "OrchestratorPort": lOrchestratorPort, @@ -112,7 +112,7 @@ def Settings(): "Interval": 1, "RobotStorage": mDict, "RobotStorageKey": "RDPList", - "OrchestratorKeyList": ["Storage", "RobotRDPActive","RobotToOrchestratorStorage","FullScreenSessionIndex"], + "OrchestratorKeyList": ["Storage", gRobotName,"RobotToOrchestratorStorage","FullScreenSessionIndex"], "OrchestratorProtocol": lOrchestratorProtocol, "OrchestratorHost": lOrchestratorHost, "OrchestratorPort": lOrchestratorPort, @@ -125,7 +125,7 @@ def Settings(): "RobotStorage": mDict, "RobotStorageKey": "OrchestratorToRobotResetStorage", "RobotResetValue": mDict["OrchestratorToRobotResetStorage"], - "OrchestratorKeyList": ["Storage", "RobotRDPActive","OrchestratorToRobotResetStorage"], + "OrchestratorKeyList": ["Storage", gRobotName,"OrchestratorToRobotResetStorage"], "OrchestratorProtocol": lOrchestratorProtocol, "OrchestratorHost": lOrchestratorHost, "OrchestratorPort": lOrchestratorPort, @@ -137,7 +137,7 @@ def Settings(): "Interval": 1.25, "RobotStorage": mDict, "RobotStorageKey": "OrchestratorToRobotStorage", - "OrchestratorKeyList": ["Storage", "RobotRDPActive","OrchestratorToRobotStorage"], + "OrchestratorKeyList": ["Storage", gRobotName,"OrchestratorToRobotStorage"], "OrchestratorProtocol": lOrchestratorProtocol, "OrchestratorHost": lOrchestratorHost, "OrchestratorPort": lOrchestratorPort,