@ -1,18 +1,21 @@
import psutil , datetime , logging , os , json
# # # # # # # ORCHESTRATOR CONTROL PANEL <Robot name> # # # # # # #
# 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_<RobotKeyName> "
gRDPOrchestratorStorageKey = " <RobotKeyName> "
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 = " <RobotProcessName> "
gRobotProcessFilePath = r " path \ to \ start \ link "
# Function, which is generate Dict for front-endswith
def ControlPanelRenderDict ( inGSettings ) :
""" result= {
" HeaderLeftText " : " <Robot name> " ,
" HeaderRightText " : " <header> " ,
" DataStorageKey " : " Robot RDPActiv e" , #Use key for set current dict in mGlobal.DataStorage["DataStorageKey"] on client side
" DataStorageKey " : " Robot _Nam e" , #Use key for set current dict in mGlobal.DataStorage["DataStorageKey"] on client side
" SubheaderText " : " State: <span style= \" color:green \" >Turned on</span> " ,
" 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 ( " \\ " , " \\ \\ " )
## R ecieve file from RDP session to Orchestrator session
lActivity FileRDP2OrchestratorDic t = [
lActivityRDPKillEscaped = ( f " mGlobal.Controller.CMDRunText( ' taskkill /F /im { gProcessNameWOEXE } .exe ' ); " ) . replace ( " \\ " , " \\ \\ " ) . replace ( " \" " , " \' " )
## R obot start
lActivity ROBOTStartLis t = [
{
" 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 ' <a onclick= " { lActivityROBOTStartEscaped } " style= \" color:green \" >Start</a> '
lBodyKeyValue_r3_stop = f ' <a onclick= " { lActivityROBOTStopEscaped } " style= \" color:red \" >Stop</a> '
lBodyKeyValue_r3_restart = f ' <a onclick= " { lActivityROBOTRestartEscaped } " style= \" color:orange \" >restart</a> '
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 " : " <Subheader text> " ,
" 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 ' <a onclick= " { lOnClickSetFullScreen } " style= \" color:blue \" >Set fullscreen</a> '
if lRDPListIndex == lFullScreenSessionIndex :
lLabelSessionFullScreen = ' <span style= \" color:blue \" >[Fullscreen]</span> '
lOnClickSetFullScreen = f " mGlobal.Processor.ServerValueSet([ ' Storage ' , ' RobotRDPActive ' , ' OrchestratorToRobotStorage ' , ' FullScreenSessionIndex ' ],null); "
lOnClickSetFullScreen = f " mGlobal.Processor.ServerValueSet([ ' Storage ' , ' { gRDPOrchestratorStorageKey } ' , ' OrchestratorToRobotStorage ' , ' FullScreenSessionIndex ' ],null); "
lSetFullScreenA = f ' <a onclick= " { lOnClickSetFullScreen } " style= \" color:blue \" >Set minimized</a> '
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 ' <a onclick= " { lIgnoreIndexListOnClick } " style= \" color:red \" >Ignore</a> '
### 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 = ' <span style= \" color:red \" >[Ignored]</span> '
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 ' <a onclick= " { lIgnoreIndexListOnClick } " style= \" color:red \" >Unignore</a> '
### Session state
lItemSessionState = ' <span style= \" color:red \" >Disconnected</span> '
@ -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
}