- Create /pyOpenRPA/ActivityListExecute

- Create /pyOpenRPA/Processor
- Orchestrator.OSCMD Listen output and send to logger
- Orchestrator.OSCMD Add 2 input args inLogger + inRunAsyncBool
- WEB Update CMD Input line (tranfer to Log view). Change /Utils/Processor to /pyOpenRPA/ActivityListExecute
- Defs has been added in ProcessorAliasDict as Alias with own def name
- WEB Remove client freeze when back is dead
dev-linux
Ivan Maslov 4 years ago
parent 1adf4b5683
commit fea3809d85

@ -0,0 +1,20 @@
import subprocess
lCMD = "for /l %x in (1, 1, 5) do echo %x && ping 127.0.0.1 -n 2"
lCMD = "git status"
proc = subprocess.Popen(f'cmd /c {lCMD}', stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
# proc = subprocess.Popen('notepad', stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
#proc = subprocess.Popen('cmd /c git status', stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
#proc = subprocess.run(f'cmd /c {lCMD}', stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
print(123)
#import pdb
#pdb.set_trace()
#tmp = proc.stdout.read()
lListenBool = True
while lListenBool:
tmp = proc.stdout.readline()
if tmp == b"":
lListenBool = False
#tmp = proc.stdout
#print(tmp)
print(tmp.decode("cp866"))
print("Happy end")

@ -351,7 +351,7 @@ def Update(inGSettings):
if lL: lL.warning(f"Backward compatibility (v1.1.20 to v1.2.0): Create new attribute 'VersionStr'") # Log about compatibility
if "DumpLogListRefreshIntervalSecFloat" not in inGSettings["Client"]: # Create new ProcessorDict structure
inGSettings["Client"].update({
"DumpLogListRefreshIntervalSecFloat": 5.0, # Duration between updates for the Client
"DumpLogListRefreshIntervalSecFloat": 3.0, # Duration between updates for the Client
"DumpLogListCountInt": 100, # Set the max row for the dump
"DumpLogList": [], # Will be filled automatically
"DumpLogListHashStr": None, # Will be filled automatically

@ -35,11 +35,38 @@ def OSCredentialsVerify(inUserStr, inPasswordStr, inDomainStr=""): ## Verify cre
else:
return True
def OSCMD(inCMDStr): ## OS send command in shell locally
lCMDCode = "cmd /c " + inCMDStr
subprocess.Popen(lCMDCode)
lResultCMDRun = 1 # os.system(lCMDCode)
return lResultCMDRun
def OSCMD(inCMDStr, inRunAsyncBool=True, inLogger = None): ## OS send command in shell locally
lResultStr = ""
# Subdef to listen OS result
def _CMDRunAndListenLogs(inCMDStr, inLogger):
lResultStr = ""
lOSCMDKeyStr = str(uuid.uuid4())[0:4].upper()
lCMDProcess = subprocess.Popen(f'cmd /c {inCMDStr}', stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
if inLogger:
lListenBool = True
inLogger.info(f"{lOSCMDKeyStr}: # # # # CMD Process has been STARTED # # # # ")
inLogger.info(f"{lOSCMDKeyStr}: {inCMDStr}")
while lListenBool:
lOutputLineBytes = lCMDProcess.stdout.readline()
if lOutputLineBytes == b"":
lListenBool = False
lStr = lOutputLineBytes.decode('cp866')
if lStr.endswith("\n"): lStr = lStr[:-1]
inLogger.info(f"{lOSCMDKeyStr}: {lStr}")
lResultStr+=lStr
inLogger.info(f"{lOSCMDKeyStr}: # # # # CMD Process has been FINISHED # # # # ")
return lResultStr
# New call
if inRunAsyncBool:
lThread = threading.Thread(target=_CMDRunAndListenLogs, kwargs={"inCMDStr":inCMDStr, "inLogger":inLogger})
lThread.start()
lResultStr="ActivityList has been started in async mode - no output is available here."
else:
lResultStr = _CMDRunAndListenLogs(inCMDStr=inCMDStr, inLogger=inLogger)
#lCMDCode = "cmd /c " + inCMDStr
#subprocess.Popen(lCMDCode)
#lResultCMDRun = 1 # os.system(lCMDCode)
return lResultStr
def OrchestratorRestart(inGSettings=None): ## Orchestrator restart
OrchestratorSessionSave(inGSettings=inGSettings) # Dump RDP List in file json
@ -541,9 +568,17 @@ def GSettingsAutocleaner(inGSettings):
from .. import __version__ # Get version from the package
# Main def for orchestrator
def Orchestrator(inGSettings):
# Test
lL = inGSettings["Logger"]
# Append Orchestrator def to ProcessorDictAlias
lModule = sys.modules[__name__]
lModuleDefList = dir(lModule)
for lItemDefNameStr in lModuleDefList:
# Dont append alias for defs Orchestrator and ___deprecated_orchestrator_start__
if lItemDefNameStr not in ["Orchestrator", "___deprecated_orchestrator_start__"]:
lItemDef = getattr(lModule,lItemDefNameStr)
if callable(lItemDef): inGSettings["ProcessorDict"]["AliasDefDict"][lItemDefNameStr]=lItemDef
#mGlobalDict = Settings.Settings(sys.argv[1])
gSettingsDict = inGSettings # Alias for old name in alg
inGSettings["VersionStr"] = __version__

@ -3,7 +3,7 @@ import time, copy, threading
# Run processor synchronious
def ProcessorRunSync(inGSettings):
"""
"ProcessorDict": { # Has been changed. New general processor (one threaded) v.1.2.0
"ProcessorDict": { # Has been changed. New general processor (one threaded) v.1.2.0
"ActivityList": [ # List of the activities
# {
# "Def":"DefAliasTest", # def link or def alias (look gSettings["Processor"]["AliasDefDict"])
@ -34,7 +34,7 @@ def ActivityListExecute(inGSettings, inActivityList):
if callable(lActivityItem["Def"]): # CHeck if def is callable
lDef = lActivityItem["Def"] # Get the def
else: # Is not callable - check alias
lDef = inGSettings["ProcessorDict"]["AliasDefDict"].pop(lActivityItem["Def"], None) # get def if def key in Alias def storage
lDef = inGSettings["ProcessorDict"]["AliasDefDict"].get(lActivityItem["Def"], None) # get def if def key in Alias def storage
#gSettings
lGSettingsDictKey = lActivityItem.pop("ArgGSettings",None)
# # Prepare arg dict - gSettings

@ -11,6 +11,7 @@ import datetime # datetime functions
import threading # Multi-threading
from .Web import Basic
from . import BackwardCompatibility # Support old up to 1.2.0 defs
from . import Processor
# # # # # # # # # # # #
# v 1.2.0 Functionallity
# # # # # # # # # # # #
@ -139,7 +140,6 @@ def pyOpenRPA_ServerLog(inRequest,inGSDict):
inResponseDict["Body"] = bytes(message, "utf8")
return lResult
def pyOpenRPA_Screenshot(inRequest,inGlobalDict):
# Get Screenshot
def SaveScreenshot(inFilePath):
@ -157,6 +157,38 @@ def pyOpenRPA_Screenshot(inRequest,inGlobalDict):
inRequest.OpenRPAResponseDict["Body"] = lFileObject.read()
# Закрыть файловый объект
lFileObject.close()
# Add activity item or activity list to the processor queue
# Body is Activity item or Activity List
def pyOpenRPA_Processor(inRequest, inGSettings):
# Recieve the data
lValueStr = None
if inRequest.headers.get('Content-Length') is not None:
lInputByteArrayLength = int(inRequest.headers.get('Content-Length'))
lInputByteArray = inRequest.rfile.read(lInputByteArrayLength)
# Превращение массива байт в объект
lInput = json.loads(lInputByteArray.decode('utf8'))
# If list - operator plus
if type(lInput) is list:
inGSettings["ProcessorDict"]["ActivityList"]+=lInput
else:
inGSettings["ProcessorDict"]["ActivityList"].append(lInput)
# Execute activity list
def pyOpenRPA_ActivityListExecute(inRequest, inGSettings):
# Recieve the data
lValueStr = None
if inRequest.headers.get('Content-Length') is not None:
lInputByteArrayLength = int(inRequest.headers.get('Content-Length'))
lInputByteArray = inRequest.rfile.read(lInputByteArrayLength)
# Превращение массива байт в объект
lInput = json.loads(lInputByteArray.decode('utf8'))
# If list - operator plus
if type(lInput) is list:
lResultList = Processor.ActivityListExecute(inGSettings = inGSettings, inActivityList = lInput)
inRequest.OpenRPAResponseDict["Body"] = bytes(json.dumps(lResultList), "utf8")
else:
lResultList = Processor.ActivityListExecute(inGSettings = inGSettings, inActivityList = [lInput])
inRequest.OpenRPAResponseDict["Body"] = bytes(json.dumps(lResultList[0]), "utf8")
def SettingsUpdate(inGlobalConfiguration):
import os
import pyOpenRPA.Orchestrator
@ -190,6 +222,8 @@ def SettingsUpdate(inGlobalConfiguration):
{"Method": "POST", "URL": "/pyOpenRPA/ServerData", "MatchType": "Equal","ResponseDefRequestGlobal": pyOpenRPA_ServerData, "ResponseContentType": "application/json"},
{"Method": "POST", "URL": "/pyOpenRPA/ServerLog", "MatchType": "Equal","ResponseDefRequestGlobal": pyOpenRPA_ServerLog, "ResponseContentType": "application/json"},
{"Method": "GET", "URL": "/pyOpenRPA/Screenshot", "MatchType": "BeginWith", "ResponseDefRequestGlobal": pyOpenRPA_Screenshot, "ResponseContentType": "image/png"},
{"Method": "POST", "URL": "/pyOpenRPA/Processor", "MatchType": "Equal","ResponseDefRequestGlobal": pyOpenRPA_Processor, "ResponseContentType": "application/json"},
{"Method": "POST", "URL": "/pyOpenRPA/ActivityListExecute", "MatchType": "Equal","ResponseDefRequestGlobal": pyOpenRPA_ActivityListExecute, "ResponseContentType": "application/json"},
]
inGlobalConfiguration["Server"]["URLList"]=inGlobalConfiguration["Server"]["URLList"]+lURLList
return inGlobalConfiguration

@ -31,7 +31,7 @@ def __Create__():
},
},
# # # # # # Client... # # # # # # # #
"DumpLogListRefreshIntervalSecFloat": 5.0, # Duration between updates for the Client
"DumpLogListRefreshIntervalSecFloat": 3.0, # Duration between updates for the Client
"DumpLogListCountInt": 100, # Set the max row for the dump
"DumpLogList": [], # Will be filled automatically
"DumpLogListHashStr": None, # Will be filled automatically

@ -122,11 +122,17 @@ $(document).ready(function() {
lCMDCode=$(".openrpa-controller-cmd-run-input")[0].value
///Подготовить конфигурацию
lData = [
{"Type":"CMDStart", "Command": lCMDCode }
{
"Def":"OSCMD", // def link or def alias (look gSettings["Processor"]["AliasDefDict"])
"ArgList":[], // Args list
"ArgDict":{"inCMDStr":lCMDCode,"inRunAsyncBool":false}, // Args dictionary
"ArgGSettings": null, // Name of GSettings attribute: str (ArgDict) or index (for ArgList)
"ArgLogger": "inLogger" // Name of GSettings attribute: str (ArgDict) or index (for ArgList)
}
]
$.ajax({
type: "POST",
url: 'Utils/Processor',
url: '/pyOpenRPA/ActivityListExecute',
data: JSON.stringify(lData),
success:
function(lData,l2,l3)
@ -390,14 +396,16 @@ $(document).ready(function() {
},
dataType: "text",
error: function(jqXHR, textStatus, errorThrown ) {
sleep(3000)
mGlobal.pyOpenRPA.ServerDataRefreshDef() // recursive
setTimeout(mGlobal.pyOpenRPA.ServerDataRefreshDef,3000)
//sleep(3000)
//mGlobal.pyOpenRPA.ServerDataRefreshDef() // recursive
}
});
}
catch(error) {
sleep(3000)
mGlobal.pyOpenRPA.ServerDataRefreshDef() // recursive
setTimeout(mGlobal.pyOpenRPA.ServerDataRefreshDef,3000)
//sleep(3000)
//mGlobal.pyOpenRPA.ServerDataRefreshDef() // recursive
}
}
/////////////////////////////////////////////////////////////
@ -437,14 +445,16 @@ $(document).ready(function() {
},
dataType: "text",
error: function(jqXHR, textStatus, errorThrown ) {
sleep(3000)
mGlobal.pyOpenRPA.ServerLogListRefreshDef() // recursive
setTimeout(mGlobal.pyOpenRPA.ServerLogListRefreshDef,3000)
//sleep(3000)
//mGlobal.pyOpenRPA.ServerLogListRefreshDef() // recursive
}
});
}
catch(error) {
sleep(3000)
mGlobal.pyOpenRPA.ServerLogListRefreshDef() // recursive
setTimeout(mGlobal.pyOpenRPA.ServerLogListRefreshDef,3000)
//sleep(3000)
//mGlobal.pyOpenRPA.ServerLogListRefreshDef() // recursive
}
}
/////////////////////////////////////////////////////////////

@ -190,9 +190,9 @@
</div>
</div>
</script>
<div class="sixteen wide column openrpa-robotrdpactive-control-panel-general" style="display:none;">
<div class="eight wide column openrpa-robotrdpactive-control-panel-general" style="display:none;">
<h2 class="ui header openrpa-rdpactive-title" style="display:none;">
<i class="server icon"></i>
<i class="desktop icon"></i>
<div class="content">
RDP active list
</div>
@ -230,6 +230,14 @@
</div>
</script>
</div>
<div class="eight wide column" style="">
<h2 class="ui header " style="">
<i class="bug icon"></i>
<div class="content">
Agent active list
</div>
</h2>
</div>
</div>
@ -244,32 +252,7 @@
Administration
</div>
</h2>
<div class="four ui buttons">
<div class="ui animated button openrpa-control-lookmachinescreenshot green" onclick="mGlobal.Monitor.ScreenshotModal.Show();" style="display: none; margin-top: 5px;">
<div class="visible content">Show live screenshots</div>
<div class="hidden content">
<i class="right arrow icon"></i>
</div>
</div>
<div class="ui animated button openrpa-control-restartorchestrator orange" onclick="mGlobal.Controller.OrchestratorRestart();" style="display: none; margin-top: 5px;">
<div class="visible content">Restart orchestrator</div>
<div class="hidden content">
<i class="right arrow icon"></i>
</div>
</div>
<div class="ui animated button openrpa-control-gitrestartorchestrator teal" onclick="mGlobal.Controller.OrchestratorGITPullRestart();" style="display: none; margin-top: 5px;">
<div class="visible content">Git pull, restart orchestrator</div>
<div class="hidden content">
<i class="right arrow icon"></i>
</div>
</div>
<div class="ui animated button openrpa-control-restartpc red" onclick="mGlobal.Controller.PCRestart();" style="display: none; margin-top: 5px;">
<div class="visible content">Restart PC</div>
<div class="hidden content">
<i class="right arrow icon"></i>
</div>
</div>
</div>
</div>
</div>
@ -280,51 +263,47 @@
Logs
</h4>
<textarea class="mGlobal-pyOpenRPA-ServerLogList " readonly="readonly" style="width:100%; resize: none; font-family:monospace; font-weight: bold;" id="textarea_id" rows="20">
var textarea = document.getElementById('textarea_id');
textarea.scrollTop = textarea.scrollHeight;
127.0.0.1 - - [30/Nov/2020 21:04:44] "GET /Index.js HTTP/1.1" 200 -
127.0.0.1 - - [30/Nov/2020 21:04:44] "GET /3rdParty/Google/LatoItalic.css HTTP/1.1" 200 -
127.0.0.1 - - [30/Nov/2020 21:04:45] "GET /3rdParty/Semantic-UI-CSS-master/themes/default/assets/fonts/icons.woff2 HTTP/1.1" 200 -
127.0.0.1 - - [30/Nov/2020 21:04:45] "GET /pyOpenRPA_logo.png HTTP/1.1" 200 -
127.0.0.1 - - [30/Nov/2020 21:04:45] "POST /Orchestrator/UserRoleHierarchyGet HTTP/1.1" 200 -
127.0.0.1 - - [30/Nov/2020 21:04:45] "POST /Utils/Processor HTTP/1.1" 200 -
2020-11-30 21:04:45,484 - INFO - Server:: User activity from web. Domain: , Username: nd, Activity: [{'Type': 'GlobalDictKeyListValueGet', 'KeyList': ['Server', 'WorkingDirectoryPathStr']}, {'Type': 'GlobalDictKeyListValueGet', 'KeyList': ['VersionStr']}]
127.0.0.1 - - [30/Nov/2020 21:04:45] "POST /pyOpenRPA/ServerData HTTP/1.1" 200 -
127.0.0.1 - - [30/Nov/2020 21:04:45] "GET /GetScreenshot HTTP/1.1" 200 -
127.0.0.1 - - [30/Nov/2020 21:04:45] "GET /favicon.ico HTTP/1.1" 200 -
127.0.0.1 - - [30/Nov/2020 21:05:21] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [30/Nov/2020 21:05:21] "GET /3rdParty/jQuery/jquery-3.1.1.min.js HTTP/1.1" 200 -
127.0.0.1 - - [30/Nov/2020 21:05:21] "GET /3rdParty/Semantic-UI-CSS-master/semantic.min.js HTTP/1.1" 200 -
127.0.0.1 - - [30/Nov/2020 21:05:21] "GET /3rdParty/Semantic-UI-CSS-master/semantic.min.css HTTP/1.1" 200 -
127.0.0.1 - - [30/Nov/2020 21:05:21] "GET /3rdParty/Handlebars/handlebars-v4.1.2.js HTTP/1.1" 200 -
127.0.0.1 - - [30/Nov/2020 21:05:21] "GET /Index.js HTTP/1.1" 200 -
127.0.0.1 - - [30/Nov/2020 21:05:21] "GET /3rdParty/Google/LatoItalic.css HTTP/1.1" 200 -
127.0.0.1 - - [30/Nov/2020 21:05:21] "GET /3rdParty/Semantic-UI-CSS-master/themes/default/assets/fonts/icons.woff2 HTTP/1.1" 200 -
127.0.0.1 - - [30/Nov/2020 21:05:21] "GET /pyOpenRPA_logo.png HTTP/1.1" 200 -
127.0.0.1 - - [30/Nov/2020 21:05:22] "POST /Orchestrator/UserRoleHierarchyGet HTTP/1.1" 200 -
127.0.0.1 - - [30/Nov/2020 21:05:22] "GET /GetScreenshot HTTP/1.1" 200 -
2020-11-30 21:05:22,265 - INFO - Server:: User activity from web. Domain: , Username: nd, Activity: [{'Type': 'GlobalDictKeyListValueGet', 'KeyList': ['Server', 'WorkingDirectoryPathStr']}, {'Type': 'GlobalDictKeyListValueGet', 'KeyList': ['VersionStr']}]
127.0.0.1 - - [30/Nov/2020 21:05:22] "POST /Utils/Processor HTTP/1.1" 200 -
127.0.0.1 - - [30/Nov/2020 21:05:22] "POST /pyOpenRPA/ServerData HTTP/1.1" 200 -
127.0.0.1 - - [30/Nov/2020 21:05:22] "GET /favicon.ico HTTP/1.1" 200 -
127.0.0.1 - - [30/Nov/2020 21:05:58] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [30/Nov/2020 21:05:59] "GET /3rdParty/Semantic-UI-CSS-master/semantic.min.css HTTP/1.1" 200 -
127.0.0.1 - - [30/Nov/2020 21:05:59] "GET /3rdParty/jQuery/jquery-3.1.1.min.js HTTP/1.1" 200 -
127.0.0.1 - - [30/Nov/2020 21:05:59] "GET /3rdParty/Semantic-UI-CSS-master/semantic.min.js HTTP/1.1" 200 -
127.0.0.1 - - [30/Nov/2020 21:05:59] "GET /3rdParty/Handlebars/handlebars-v4.1.2.js HTTP/1.1" 200 -
127.0.0.1 - - [30/Nov/2020 21:05:59] "GET /Index.js HTTP/1.1" 200 -
127.0.0.1 - - [30/Nov/2020 21:05:59] "GET /3rdParty/Google/LatoItalic.css HTTP/1.1" 200 -
127.0.0.1 - - [30/Nov/2020 21:05:59] "GET /pyOpenRPA_logo.png HTTP/1.1" 200 -
127.0.0.1 - - [30/Nov/2020 21:05:59] "GET /3rdParty/Semantic-UI-CSS-master/themes/default/assets/fonts/icons.woff2 HTTP/1.1" 200 -
127.0.0.1 - - [30/Nov/2020 21:05:59] "POST /Orchestrator/UserRoleHierarchyGet HTTP/1.1" 200 -
127.0.0.1 - - [30/Nov/2020 21:05:59] "POST /Utils/Processor HTTP/1.1" 200 -
2020-11-30 21:05:59,665 - INFO - Server:: User activity from web. Domain: , Username: nd, Activity: [{'Type': 'GlobalDictKeyListValueGet', 'KeyList': ['Server', 'WorkingDirectoryPathStr']}, {'Type': 'GlobalDictKeyListValueGet', 'KeyList': ['VersionStr']}]
127.0.0.1 - - [30/Nov/2020 21:05:59] "POST /pyOpenRPA/ServerData HTTP/1.1" 200 -
127.0.0.1 - - [30/Nov/2020 21:06:00] "GET /GetScreenshot HTTP/1.1" 200 -
127.0.0.1 - - [30/Nov/2020 21:06:00] "GET /favicon.ico HTTP/1.1" 200 -
</textarea>
<div class="ui fluid action input">
<input class="openrpa-controller-cmd-run-input" type="text" placeholder="CMD Code...">
<div class="ui button" onclick="mGlobal.Controller.CMDRun();">Run!</div>
<div class="ui button" onclick="mGlobal.Controller.CMDRunGUILogout();">GUI Logout</div>
</div>
</div>
</div>
<h4 class="ui horizontal divider header">
<i class="clipboard list icon"></i>
Controls
</h4>
<div class="four ui buttons">
<div class="ui animated button openrpa-control-lookmachinescreenshot green" onclick="mGlobal.Monitor.ScreenshotModal.Show();" style="display: none; margin-top: 5px;">
<div class="visible content">Show live screenshots</div>
<div class="hidden content">
<i class="right arrow icon"></i>
</div>
</div>
<div class="ui animated button openrpa-control-restartorchestrator orange" onclick="mGlobal.Controller.OrchestratorRestart();" style="display: none; margin-top: 5px;">
<div class="visible content">Restart orchestrator</div>
<div class="hidden content">
<i class="right arrow icon"></i>
</div>
</div>
<div class="ui animated button openrpa-control-gitrestartorchestrator teal" onclick="mGlobal.Controller.OrchestratorGITPullRestart();" style="display: none; margin-top: 5px;">
<div class="visible content">Git pull, restart orchestrator</div>
<div class="hidden content">
<i class="right arrow icon"></i>
</div>
</div>
<div class="ui animated button openrpa-control-restartpc red" onclick="mGlobal.Controller.PCRestart();" style="display: none; margin-top: 5px;">
<div class="visible content">Restart PC</div>
<div class="hidden content">
<i class="right arrow icon"></i>
</div>
</div>
</div>
<div class="row black">
@ -397,11 +376,6 @@ textarea.scrollTop = textarea.scrollHeight;
</div>
<div class="content">
<img src="GetScreenshot" class="ui fluid image">
<div class="ui fluid action input">
<input class="openrpa-controller-cmd-run-input" type="text" placeholder="CMD Code...">
<div class="ui button" onclick="mGlobal.Controller.CMDRun();">Run!</div>
<div class="ui button" onclick="mGlobal.Controller.CMDRunGUILogout();">GUI Logout</div>
</div>
</div>
<div class="actions">
<div class="ui green ok inverted button" onclick="mGlobal.Monitor.ScreenshotModal.Close()">

@ -1,4 +1,5 @@
[1.2.0]
!Orchestrator!
- Consolidated processor from old orchestrator and from RDPActive processor (one threaded). Look in GSettings
- - Support old orchestrator structure Processor.
- - - Create BackwardCompatibility def to update structure from old to new processor
@ -39,6 +40,13 @@
- Orchestrator WEB GUI update - Administrator mode - add log view - in progress
- - Add Server def /pyOpenRPA/ServerLogs
- - Create logger handler for the Client DumpLog
- Create /pyOpenRPA/ActivityListExecute
- Create /pyOpenRPA/Processor
- Orchestrator.OSCMD Listen output and send to logger
- Orchestrator.OSCMD Add 2 input args inLogger + inRunAsyncBool
- WEB Update CMD Input line (tranfer to Log view). Change /Utils/Processor to /pyOpenRPA/ActivityListExecute
- Defs has been added in ProcessorAliasDict as Alias with own def name
- WEB Remove client freeze when back is dead
[1.1.0]
After 2 month test prefinal with new improovements (+RobotRDPActive in Orchestrator + Easy ControlPanelTemplate)
Beta before 1.1.0 (new way of OpenRPA with improvements. Sorry, but no backward compatibility)/ Backward compatibility will start from 1.0.1

Loading…
Cancel
Save