From 2b773b4bb8f08964904385ead0c3ec0092750a1e Mon Sep 17 00:00:00 2001 From: Ivan Maslov Date: Thu, 22 Apr 2021 15:49:33 +0300 Subject: [PATCH] Add 3 defs to Agent (Recieve files) Update guide Add ProcessorMonitorThread to check long execution --- Sources/pyOpenRPA/Agent/Processor.py | 2 +- Sources/pyOpenRPA/Agent/__Agent__.py | 50 +++++- .../Orchestrator/BackwardCompatibility.py | 5 + Sources/pyOpenRPA/Orchestrator/Processor.py | 56 ++++-- .../Orchestrator/SettingsTemplate.py | 3 +- .../Orchestrator/__Orchestrator__.py | 95 ++++++++++- Wiki/ENG_Guide/html/Agent/02_Defs.html | 65 ++++++- Wiki/ENG_Guide/html/Orchestrator/02_Defs.html | 161 +++++++++++++----- .../Orchestrator/03_gSettingsTemplate.html | 3 +- .../_modules/pyOpenRPA/Agent/__Agent__.html | 52 +++++- .../Orchestrator/__Orchestrator__.html | 95 ++++++++++- Wiki/ENG_Guide/html/genindex.html | 16 +- Wiki/ENG_Guide/html/objects.inv | Bin 1352 -> 1381 bytes Wiki/ENG_Guide/html/searchindex.js | 2 +- Wiki/ENG_Guide/markdown/Agent/02_Defs.md | 85 ++++++++- .../markdown/Orchestrator/02_Defs.md | 112 +++++++++++- .../Orchestrator/03_gSettingsTemplate.md | 3 +- 17 files changed, 712 insertions(+), 93 deletions(-) diff --git a/Sources/pyOpenRPA/Agent/Processor.py b/Sources/pyOpenRPA/Agent/Processor.py index 9413235f..a96a973f 100644 --- a/Sources/pyOpenRPA/Agent/Processor.py +++ b/Sources/pyOpenRPA/Agent/Processor.py @@ -69,5 +69,5 @@ def ActivityListExecute(inGSettings, inActivityList): 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 + lResultList.append(None) # return the generated exception return lResultList # return the result list \ No newline at end of file diff --git a/Sources/pyOpenRPA/Agent/__Agent__.py b/Sources/pyOpenRPA/Agent/__Agent__.py index 154b0d93..2ac32d21 100644 --- a/Sources/pyOpenRPA/Agent/__Agent__.py +++ b/Sources/pyOpenRPA/Agent/__Agent__.py @@ -5,7 +5,10 @@ from subprocess import CREATE_NEW_CONSOLE # Flag to create new process in anothe # Create binary file by the base64 string (safe for JSON transmition) def OSFileBinaryDataBase64StrCreate(inFilePathStr, inFileDataBase64Str,inGSettings = None): - """ Create binary file by the base64 string (safe for JSON transmition)""" + """ + Create binary file by the base64 string (safe for JSON transmition) + + """ lFile = open(inFilePathStr, "wb") lFile.write(base64.b64decode(inFileDataBase64Str)) lFile.close() @@ -16,6 +19,15 @@ def OSFileBinaryDataBase64StrCreate(inFilePathStr, inFileDataBase64Str,inGSettin # Create text file by the string def OSFileTextDataStrCreate(inFilePathStr, inFileDataStr, inEncodingStr = "utf-8",inGSettings = None): + """ + Create text file in the agent GUI session + + :param inFilePathStr: File abs path + :param inFileDataStr: File data text content + :param inEncodingStr: Write file encoding + :param inGSettings: global settings of the Agent (singleton) + :return: + """ lFile = open(inFilePathStr, "w", encoding=inEncodingStr) lFile.write(inFileDataStr) lFile.close() @@ -24,6 +36,42 @@ def OSFileTextDataStrCreate(inFilePathStr, inFileDataStr, inEncodingStr = "utf-8 if lL: lL.info(lMessageStr) A2O.LogListSend(inGSettings=inGSettings, inLogList=[lMessageStr]) +def OSFileBinaryDataBase64StrReceive(inFilePathStr, inGSettings=None): + """ + Read binary file and encode in base64 to transmit (safe for JSON transmition) + + :param inFilePathStr: File path to read + :param inGSettings: global settings of the Agent (singleton) + :return: File content in string base64 format (use base64.b64decode to decode data). Return None if file is not exist + """ + lFile = open(inFilePathStr, "rb") + lFileDataBytes = lFile.read() + lFile.close() + lFileDataBase64Str = base64.b64encode(lFileDataBytes).decode("utf-8") + lL = inGSettings.get("Logger", None) if type(inGSettings) is dict else None + lMessageStr = f"AGENT Binary file {inFilePathStr} has been read." + if lL: lL.info(lMessageStr) + A2O.LogListSend(inGSettings=inGSettings, inLogList=[lMessageStr]) + return lFileDataBase64Str + +def OSFileTextDataStrReceive(inFilePathStr, inEncodingStr="utf-8", inGSettings=None): + """ + Read text file in the agent GUI session + + :param inFilePathStr: File abs path + :param inEncodingStr: Read file encoding. Default utf-8 + :param inGSettings: global settings of the Agent (singleton) + :return: File text content in string format (use base64.b64decode to decode data). Return None if file is not exist + """ + lFile = open(inFilePathStr, "r", encoding=inEncodingStr) + lFileDataStr = lFile.read() + lFile.close() + lL = inGSettings.get("Logger", None) if type(inGSettings) is dict else None + lMessageStr = f"AGENT Text file {inFilePathStr} has been read." + if lL: lL.info(lMessageStr) + A2O.LogListSend(inGSettings=inGSettings, inLogList=[lMessageStr]) + return lFileDataStr + # Send CMD to OS. Result return to log + Orchestrator by the A2O connection def OSCMD(inCMDStr, inRunAsyncBool=True, inGSettings = None, inSendOutputToOrchestratorLogsBool = True, inCMDEncodingStr = "cp1251"): """ diff --git a/Sources/pyOpenRPA/Orchestrator/BackwardCompatibility.py b/Sources/pyOpenRPA/Orchestrator/BackwardCompatibility.py index 3bedc69e..bef5a0e9 100644 --- a/Sources/pyOpenRPA/Orchestrator/BackwardCompatibility.py +++ b/Sources/pyOpenRPA/Orchestrator/BackwardCompatibility.py @@ -429,3 +429,8 @@ def Update(inGSettings): f"Backward compatibility (v1.2.1 to v1.2.2): Convert Storage to StorageDict") # Log about compatibility # Remove old structure Scheduler del inGSettings["Storage"] + # Add new key WarningExecutionMoreThanSecFloat in ProcessorDict + if "WarningExecutionMoreThanSecFloat" not in inGSettings["ProcessorDict"]: + inGSettings["ProcessorDict"]["WarningExecutionMoreThanSecFloat"] = 60.0 + if lL: lL.warning( + f"Backward compatibility (v1.2.1 to v1.2.2): Add key WarningExecutionMoreThanSecFloat in ProcessorDict") # Log about compatibility diff --git a/Sources/pyOpenRPA/Orchestrator/Processor.py b/Sources/pyOpenRPA/Orchestrator/Processor.py index 19145583..cae7f755 100644 --- a/Sources/pyOpenRPA/Orchestrator/Processor.py +++ b/Sources/pyOpenRPA/Orchestrator/Processor.py @@ -11,7 +11,8 @@ def ProcessorRunSync(inGSettings, inRobotRDPThreadControlDict): # "ArgList":[1,2,3], # Args list # "ArgDict":{"ttt":1,"222":2,"dsd":3}, # Args dictionary # "ArgGSettings": None # Name of GSettings attribute: str (ArgDict) or index (for ArgList) - # "ArgLogger": None # Name of GSettings attribute: str (ArgDict) or index (for ArgList) + # "ArgLogger": None ,# Name of GSettings attribute: str (ArgDict) or index (for ArgList) + # "GUIDStr": "" # }, ], "AliasDefDict": {}, # Storage for def with Str alias. To use it see pyOpenRPA.Orchestrator.ControlPanel @@ -20,16 +21,19 @@ def ProcessorRunSync(inGSettings, inRobotRDPThreadControlDict): """ lL = inGSettings["Logger"] # Logger alias inGSettings["ProcessorDict"]["ThreadIdInt"] = threading.get_ident() # fill Processor thread id - while inGSettings["ProcessorDict"]["ExecuteBool"]: - lActivityList = inGSettings["ProcessorDict"]["ActivityList"] # Alias - if len(lActivityList)>0: - if lL: lL.debug(f'Processor ActivityList len: {len(lActivityList)}') - lActivityItem = inGSettings["ProcessorDict"]["ActivityList"].pop(0) # Extract the first item from processor queue - inRobotRDPThreadControlDict["ThreadExecuteBool"]=False # Stop the RobotRDPActive monitoring - ActivityListExecute(inGSettings = inGSettings, inActivityList = [lActivityItem]) # execute the activity item - inRobotRDPThreadControlDict["ThreadExecuteBool"] = True # Continue the RobotRDPActive monitoring - else: - time.sleep(inGSettings["ProcessorDict"]["CheckIntervalSecFloat"]) # Sleep when list is empty + try: + while inGSettings["ProcessorDict"]["ExecuteBool"]: + lActivityList = inGSettings["ProcessorDict"]["ActivityList"] # Alias + if len(lActivityList)>0: + if lL: lL.debug(f'Processor ActivityList len: {len(lActivityList)}') + lActivityItem = inGSettings["ProcessorDict"]["ActivityList"].pop(0) # Extract the first item from processor queue + inRobotRDPThreadControlDict["ThreadExecuteBool"]=False # Stop the RobotRDPActive monitoring + ActivityListExecute(inGSettings = inGSettings, inActivityList = [lActivityItem]) # execute the activity item + inRobotRDPThreadControlDict["ThreadExecuteBool"] = True # Continue the RobotRDPActive monitoring + else: + time.sleep(inGSettings["ProcessorDict"]["CheckIntervalSecFloat"]) # Sleep when list is empty + except Exception as e: + if lL: lL.exception(f"Processor.ProcessorRunSync. Something goes very wrong in processor queue. See traceback") # Execute ActivityItem list # return the def result @@ -97,4 +101,32 @@ def __ActivityListVerify__(inActivityList): raise Exception(f"pyOpenRPA Processor.__ActivityListVerify__: inActivityList has wrong structure! Details: Activity item has no attribute 'Def'") #CASE NOT LIST else: - raise Exception(f"pyOpenRPA Processor.__ActivityListVerify__: inActivityList has wrong structure! Details: Your ActivityList is not a list.") \ No newline at end of file + raise Exception(f"pyOpenRPA Processor.__ActivityListVerify__: inActivityList has wrong structure! Details: Your ActivityList is not a list.") + +def ProcessorMonitorRunSync(inGSettings): + """ + Periodically check processor queue if task is updating. If one task is more than ... sec - send warning in log + + """ + lL = inGSettings["Logger"] # Logger alias + lActiveGUIDStr = None + lActiveTimeStart = time.time() + try: + while True: + if len(inGSettings["ProcessorDict"]["ActivityList"])>0: + lItemDict = inGSettings["ProcessorDict"]["ActivityList"][0] + # Check if GUID is identical + if lItemDict["GUIDStr"]==lActiveGUIDStr: + # Check time + lActiveTimeDeltaSec = time.time() - lActiveTimeStart + # If delta more than Warning limit sec float + lWaitTimeSecFloat = inGSettings["ProcessorDict"]["WarningExecutionMoreThanSecFloat"] + if lActiveTimeDeltaSec > lWaitTimeSecFloat: + if lL: lL.warning(f"Processor.ProcessorMonitorRunSync: Processor wait more than {lWaitTimeSecFloat} sec. Activity def: {lItemDict['Def']}; GUID: {lItemDict['GUIDStr']}") + else: + lActiveGUIDStr = lItemDict["GUIDStr"] + lActiveTimeStart = time.time() + time.sleep(10) # Sleep when list is empty + except Exception as e: + if lL: lL.exception( + f"Processor.ProcessorMonitorRunSync. Something goes very wrong in processor queue. See traceback") \ No newline at end of file diff --git a/Sources/pyOpenRPA/Orchestrator/SettingsTemplate.py b/Sources/pyOpenRPA/Orchestrator/SettingsTemplate.py index db814662..80419880 100644 --- a/Sources/pyOpenRPA/Orchestrator/SettingsTemplate.py +++ b/Sources/pyOpenRPA/Orchestrator/SettingsTemplate.py @@ -186,7 +186,8 @@ def __Create__(): "AliasDefDict": {}, # Storage for def with Str alias. To use it see pyOpenRPA.Orchestrator.ControlPanel "CheckIntervalSecFloat": 1.0, # Interval for check gSettings in ProcessorDict > ActivityList "ExecuteBool": True, # Flag to execute thread processor - "ThreadIdInt": None # Technical field - will be setup when processor init + "ThreadIdInt": None, # Technical field - will be setup when processor init + "WarningExecutionMoreThanSecFloat": 60.0 # Push warning if execution more than n seconds }, "ControlPanelDict": { # Old structure > CPDict "RefreshSeconds": 5, # deprecated parameter diff --git a/Sources/pyOpenRPA/Orchestrator/__Orchestrator__.py b/Sources/pyOpenRPA/Orchestrator/__Orchestrator__.py index 6ce9234d..8857bb68 100644 --- a/Sources/pyOpenRPA/Orchestrator/__Orchestrator__.py +++ b/Sources/pyOpenRPA/Orchestrator/__Orchestrator__.py @@ -183,6 +183,69 @@ def AgentOSFileTextDataStrCreate(inGSettings, inHostNameStr, inUserStr, inFilePa #Send item in AgentDict for the futher data transmition return AgentActivityItemAdd(inGSettings=inGSettings, inHostNameStr=inHostNameStr, inUserStr=inUserStr, inActivityItemDict=lActivityItemDict) +def AgentOSFileBinaryDataBase64StrReceive(inGSettings, inHostNameStr, inUserStr, inFilePathStr): + """ + Read binary file and encode in base64 to transmit (safe for JSON transmition) + + :param inGSettings: Global settings dict (singleton) + :param inHostNameStr: + :param inUserStr: + :param inFilePathStr: File path to read + :return: GUID String of the ActivityItem - you can wait (sync or async) result by this guid! + """ + + lActivityItemDict = { + "Def":"OSFileBinaryDataBase64StrReceive", # def alias (look pyOpeRPA.Agent gSettings["ProcessorDict"]["AliasDefDict"]) + "ArgList":[], # Args list + "ArgDict":{"inFilePathStr":inFilePathStr}, # Args dictionary + "ArgGSettings": "inGSettings", # Name of GSettings attribute: str (ArgDict) or index (for ArgList) + "ArgLogger": None # Name of GSettings attribute: str (ArgDict) or index (for ArgList) + } + #Send item in AgentDict for the futher data transmition + return AgentActivityItemAdd(inGSettings=inGSettings, inHostNameStr=inHostNameStr, inUserStr=inUserStr, inActivityItemDict=lActivityItemDict) + +def AgentOSFileTextDataStrReceive(inGSettings, inHostNameStr, inUserStr, inFilePathStr, inEncodingStr="utf-8"): + """ + Read text file in the agent GUI session + + :param inGSettings: Global settings dict (singleton) + :param inHostNameStr: + :param inUserStr: + :param inFilePathStr: File path to read + :param inEncodingStr: Text file encoding. Default 'utf-8' + :return: GUID String of the ActivityItem - you can wait (sync or async) result by this guid! + """ + + lActivityItemDict = { + "Def":"OSFileTextDataStrReceive", # def alias (look pyOpeRPA.Agent gSettings["ProcessorDict"]["AliasDefDict"]) + "ArgList":[], # Args list + "ArgDict":{"inFilePathStr":inFilePathStr, "inEncodingStr": inEncodingStr}, # Args dictionary + "ArgGSettings": "inGSettings", # Name of GSettings attribute: str (ArgDict) or index (for ArgList) + "ArgLogger": None # Name of GSettings attribute: str (ArgDict) or index (for ArgList) + } + #Send item in AgentDict for the futher data transmition + return AgentActivityItemAdd(inGSettings=inGSettings, inHostNameStr=inHostNameStr, inUserStr=inUserStr, inActivityItemDict=lActivityItemDict) + +def AgentProcessWOExeUpperUserListGet(inGSettings, inHostNameStr, inUserStr): + """ + Return the process list only for the current user (where Agent is running) without .EXE in upper case. Can use in ActivityItem from Orchestrator to Agent + + :param inGSettings: Global settings dict (singleton) + :param inHostNameStr: + :param inUserStr: + :return: GUID String of the ActivityItem - you can wait (sync or async) result by this guid! + """ + + lActivityItemDict = { + "Def":"ProcessWOExeUpperUserListGet", # def alias (look pyOpeRPA.Agent gSettings["ProcessorDict"]["AliasDefDict"]) + "ArgList":[], # Args list + "ArgDict":{}, # Args dictionary + "ArgGSettings": "inGSettings", # Name of GSettings attribute: str (ArgDict) or index (for ArgList) + "ArgLogger": None # Name of GSettings attribute: str (ArgDict) or index (for ArgList) + } + #Send item in AgentDict for the futher data transmition + return AgentActivityItemAdd(inGSettings=inGSettings, inHostNameStr=inHostNameStr, inUserStr=inUserStr, inActivityItemDict=lActivityItemDict) + # OS DEFS def OSCredentialsVerify(inUserStr, inPasswordStr, inDomainStr=""): ## """ @@ -670,7 +733,7 @@ def ProcessorAliasDefUpdate(inGSettings, inDef, inAliasStr): else: raise Exception(f"pyOpenRPA Exception: You can't use Orchestrator.ProcessorAliasDefUpdate with arg 'inDef' string value. inDef is '{inDef}', inAliasStr is '{inAliasStr}'") return inAliasStr -def ProcessorActivityItemCreate(inDef, inArgList=None, inArgDict=None, inArgGSettingsStr=None, inArgLoggerStr=None): +def ProcessorActivityItemCreate(inDef, inArgList=None, inArgDict=None, inArgGSettingsStr=None, inArgLoggerStr=None, inGUIDStr = None): """ Create activity item. Activity item can be used as list item in ProcessorActivityItemAppend or in Processor.ActivityListExecute. @@ -724,17 +787,22 @@ def ProcessorActivityItemCreate(inDef, inArgList=None, inArgDict=None, inArgGSet :param inArgDict: Args dict for the def :param inArgGSettingsStr: Name of def argument of the GSettings dict :param inArgLoggerStr: Name of def argument of the logging object + :param inGUIDStr: GUID which you can specify. If None the GUID will be generated :return: {} """ + # Work about GUID in Activity items + if inGUIDStr is None: + inGUIDStr = str(uuid.uuid4()) # generate new GUID if inArgList is None: inArgList=[] if inArgDict is None: inArgDict={} lActivityItemDict= { - "Def":inDef, # def link or def alias (look gSettings["Processor"]["AliasDefDict"]) - "ArgList":inArgList, # Args list - "ArgDict":inArgDict, # Args dictionary - "ArgGSettings": inArgGSettingsStr, # Name of GSettings attribute: str (ArgDict) or index (for ArgList) - "ArgLogger": inArgLoggerStr # Name of GSettings attribute: str (ArgDict) or index (for ArgList) - } + "Def":inDef, # def link or def alias (look gSettings["Processor"]["AliasDefDict"]) + "ArgList":inArgList, # Args list + "ArgDict":inArgDict, # Args dictionary + "ArgGSettings": inArgGSettingsStr, # Name of GSettings attribute: str (ArgDict) or index (for ArgList) + "ArgLogger": inArgLoggerStr, # Name of GSettings attribute: str (ArgDict) or index (for ArgList) + "GUIDStr": inGUIDStr + } return lActivityItemDict def ProcessorActivityItemAppend(inGSettings, inDef=None, inArgList=None, inArgDict=None, inArgGSettingsStr=None, inArgLoggerStr=None, inActivityItemDict=None): @@ -799,6 +867,14 @@ def ProcessorActivityItemAppend(inGSettings, inDef=None, inArgList=None, inArgDi ] else: lActivityList = [inActivityItemDict] + # Work about GUID in Activity items + for lItemDict in lActivityList: + # Add GUIDStr if not exist + lGUIDStr = None + if "GUIDStr" not in lItemDict: + lGUIDStr = str(uuid.uuid4()) # generate new GUID + lItemDict["GUIDStr"] = lGUIDStr + # Add activity list in ProcessorDict inGSettings["ProcessorDict"]["ActivityList"]+=lActivityList ## Process defs @@ -1864,6 +1940,11 @@ def Orchestrator(inGSettings): lProcessorThread.start() # Start the thread execution. if lL: lL.info("Processor has been started (ProcessorDict)") #Logging + # Processor monitor thread + lProcessorMonitorThread = threading.Thread(target= Processor.ProcessorMonitorRunSync, kwargs={"inGSettings":gSettingsDict}) + lProcessorMonitorThread.daemon = True # Run the thread in daemon mode. + lProcessorMonitorThread.start() # Start the thread execution. + if lL: lL.info("Processor monitor has been started") #Logging if lL: lL.info("Scheduler loop start") #Logging gDaemonActivityLogDictRefreshSecInt = 10 # The second period for clear lDaemonActivityLogDict from old items diff --git a/Wiki/ENG_Guide/html/Agent/02_Defs.html b/Wiki/ENG_Guide/html/Agent/02_Defs.html index 66431dbc..f9e9b5a7 100644 --- a/Wiki/ENG_Guide/html/Agent/02_Defs.html +++ b/Wiki/ENG_Guide/html/Agent/02_Defs.html @@ -202,7 +202,16 @@

OSFileBinaryDataBase64StrCreate(…[, …])

Create binary file by the base64 string (safe for JSON transmition)

-

ProcessWOExeUpperUserListGet()

+

OSFileBinaryDataBase64StrReceive(inFilePathStr)

+

Read binary file and encode in base64 to transmit (safe for JSON transmition)

+ +

OSFileTextDataStrCreate(inFilePathStr, …)

+

Create text file in the agent GUI session

+ +

OSFileTextDataStrReceive(inFilePathStr[, …])

+

Read text file in the agent GUI session

+ +

ProcessWOExeUpperUserListGet()

Return the process list only for the current user (where Agent is running) without .EXE in upper case.

@@ -232,6 +241,60 @@

Create binary file by the base64 string (safe for JSON transmition)

+
+
+pyOpenRPA.Agent.__Agent__.OSFileBinaryDataBase64StrReceive(inFilePathStr, inGSettings=None)[source]
+

Read binary file and encode in base64 to transmit (safe for JSON transmition)

+
+
Parameters
+
    +
  • inFilePathStr – File path to read

  • +
  • inGSettings – global settings of the Agent (singleton)

  • +
+
+
Returns
+

File content in string base64 format (use base64.b64decode to decode data). Return None if file is not exist

+
+
+
+ +
+
+pyOpenRPA.Agent.__Agent__.OSFileTextDataStrCreate(inFilePathStr, inFileDataStr, inEncodingStr='utf-8', inGSettings=None)[source]
+

Create text file in the agent GUI session

+
+
Parameters
+
    +
  • inFilePathStr – File abs path

  • +
  • inFileDataStr – File data text content

  • +
  • inEncodingStr – Write file encoding

  • +
  • inGSettings – global settings of the Agent (singleton)

  • +
+
+
Returns
+

+
+
+
+ +
+
+pyOpenRPA.Agent.__Agent__.OSFileTextDataStrReceive(inFilePathStr, inEncodingStr='utf-8', inGSettings=None)[source]
+

Read text file in the agent GUI session

+
+
Parameters
+
    +
  • inFilePathStr – File abs path

  • +
  • inEncodingStr – Read file encoding. Default utf-8

  • +
  • inGSettings – global settings of the Agent (singleton)

  • +
+
+
Returns
+

File text content in string format (use base64.b64decode to decode data). Return None if file is not exist

+
+
+
+
pyOpenRPA.Agent.__Agent__.ProcessWOExeUpperUserListGet()[source]
diff --git a/Wiki/ENG_Guide/html/Orchestrator/02_Defs.html b/Wiki/ENG_Guide/html/Orchestrator/02_Defs.html index 43d55ca6..44495048 100644 --- a/Wiki/ENG_Guide/html/Orchestrator/02_Defs.html +++ b/Wiki/ENG_Guide/html/Orchestrator/02_Defs.html @@ -272,142 +272,151 @@

AgentOSFileBinaryDataBase64StrCreate(…)

Create binary file by the base64 string by the pyOpenRPA.Agent daemon process (safe for JSON transmission)

-

AgentOSFileBinaryDataBytesCreate(…)

+

AgentOSFileBinaryDataBase64StrReceive(…)

+

Read binary file and encode in base64 to transmit (safe for JSON transmition)

+ +

AgentOSFileBinaryDataBytesCreate(…)

Create binary file by the base64 string by the pyOpenRPA.Agent daemon process (safe for JSON transmition)

-

AgentOSFileTextDataStrCreate(inGSettings, …)

+

AgentOSFileTextDataStrCreate(inGSettings, …)

Create text file by the string by the pyOpenRPA.Agent daemon process

-

GSettingsAutocleaner(inGSettings)

+

AgentOSFileTextDataStrReceive(inGSettings, …)

+

Read text file in the agent GUI session

+ +

AgentProcessWOExeUpperUserListGet(…)

+

Return the process list only for the current user (where Agent is running) without .EXE in upper case.

+ +

GSettingsAutocleaner(inGSettings)

HIDDEN Interval gSettings auto cleaner def to clear some garbage.

-

GSettingsKeyListValueAppend(inGSettings, inValue)

+

GSettingsKeyListValueAppend(inGSettings, inValue)

Append value in GSettings by the key list

-

GSettingsKeyListValueGet(inGSettings[, …])

+

GSettingsKeyListValueGet(inGSettings[, …])

Get the value from the GSettings by the key list

-

GSettingsKeyListValueOperatorPlus(…[, …])

+

GSettingsKeyListValueOperatorPlus(…[, …])

Execute plus operation between 2 lists (1:inValue and 2:gSettings by the inKeyList)

-

GSettingsKeyListValueSet(inGSettings, inValue)

+

GSettingsKeyListValueSet(inGSettings, inValue)

Set value in GSettings by the key list

-

OSCMD(inCMDStr[, inRunAsyncBool, inLogger])

+

OSCMD(inCMDStr[, inRunAsyncBool, inLogger])

OS send command in shell locally

-

OSCredentialsVerify(inUserStr, inPasswordStr)

+

OSCredentialsVerify(inUserStr, inPasswordStr)

Verify user credentials in windows.

-

OrchestratorRestart([inGSettings])

+

OrchestratorRestart([inGSettings])

Orchestrator restart

-

OrchestratorSessionSave([inGSettings])

+

OrchestratorSessionSave([inGSettings])

Orchestrator session save in file _SessionLast_RDPList.json (encoding = “utf-8”)

-

ProcessDefIntervalCall(inGSettings, inDef, …)

+

ProcessDefIntervalCall(inGSettings, inDef, …)

Use this procedure if you need to run periodically some def.

-

ProcessIsStarted(inProcessNameWOExeStr)

+

ProcessIsStarted(inProcessNameWOExeStr)

Check if there is any running process that contains the given name processName.

-

ProcessListGet([inProcessNameWOExeList])

+

ProcessListGet([inProcessNameWOExeList])

Return process list on the orchestrator machine sorted by Memory Usage.

-

ProcessStart(inPathStr, inArgList[, …])

+

ProcessStart(inPathStr, inArgList[, …])

Start process locally.

-

ProcessStop(inProcessNameWOExeStr, …[, …])

+

ProcessStop(inProcessNameWOExeStr, …[, …])

Stop process on the orchestrator machine.

-

ProcessorActivityItemAppend(inGSettings[, …])

+

ProcessorActivityItemAppend(inGSettings[, …])

Create and add activity item in processor queue.

-

ProcessorActivityItemCreate(inDef[, …])

+

ProcessorActivityItemCreate(inDef[, …])

Create activity item.

-

ProcessorAliasDefCreate(inGSettings, inDef)

+

ProcessorAliasDefCreate(inGSettings, inDef)

Create alias for def (can be used in ActivityItem in field Def) !WHEN DEF ALIAS IS REQUIRED! - Def alias is required when you try to call Python def from the Orchestrator WEB side (because you can’t transmit Python def object out of the Python environment)

-

ProcessorAliasDefUpdate(inGSettings, inDef, …)

+

ProcessorAliasDefUpdate(inGSettings, inDef, …)

Update alias for def (can be used in ActivityItem in field Def).

-

PythonStart(inModulePathStr, inDefNameStr[, …])

+

PythonStart(inModulePathStr, inDefNameStr[, …])

Import module and run def in the Orchestrator process.

-

RDPSessionCMDRun(inGSettings, …[, inModeStr])

+

RDPSessionCMDRun(inGSettings, …[, inModeStr])

Send CMD command to the RDP session “RUN” window

-

RDPSessionConnect(inGSettings, …[, …])

+

RDPSessionConnect(inGSettings, …[, …])

Create new RDPSession in RobotRDPActive. Attention - activity will be ignored if RDP key is already exists

-

RDPSessionDisconnect(inGSettings, …[, …])

+

RDPSessionDisconnect(inGSettings, …[, …])

Disconnect the RDP session and stop monitoring it.

-

RDPSessionDublicatesResolve(inGSettings)

+

RDPSessionDublicatesResolve(inGSettings)

DEVELOPING Search duplicates in GSettings RDPlist !def is developing!

-

RDPSessionFileStoredRecieve(inGSettings, …)

+

RDPSessionFileStoredRecieve(inGSettings, …)

Recieve file from RDP session to the Orchestrator session using shared drive in RDP (see RDP Configuration Dict, Shared drive)

-

RDPSessionFileStoredSend(inGSettings, …)

+

RDPSessionFileStoredSend(inGSettings, …)

Send file from Orchestrator session to the RDP session using shared drive in RDP (see RDP Configuration Dict, Shared drive)

-

RDPSessionLogoff(inGSettings, inRDPSessionKeyStr)

+

RDPSessionLogoff(inGSettings, inRDPSessionKeyStr)

Logoff the RDP session from the Orchestrator process (close all apps in session when logoff)

-

RDPSessionMonitorStop(inGSettings, …)

+

RDPSessionMonitorStop(inGSettings, …)

Stop monitoring the RDP session by the Orchestrator process.

-

RDPSessionProcessStartIfNotRunning(…[, …])

+

RDPSessionProcessStartIfNotRunning(…[, …])

Start process in RDP if it is not running (check by the arg inProcessNameWEXEStr)

-

RDPSessionProcessStop(inGSettings, …)

+

RDPSessionProcessStop(inGSettings, …)

Send CMD command to the RDP session “RUN” window.

-

RDPSessionReconnect(inGSettings, …[, …])

+

RDPSessionReconnect(inGSettings, …[, …])

Reconnect the RDP session

-

RDPSessionResponsibilityCheck(inGSettings, …)

+

RDPSessionResponsibilityCheck(inGSettings, …)

DEVELOPING, MAYBE NOT USEFUL Check RDP Session responsibility TODO NEED DEV + TEST

-

RDPTemplateCreate(inLoginStr, inPasswordStr)

+

RDPTemplateCreate(inLoginStr, inPasswordStr)

Create RDP connect dict item/ Use it connect/reconnect (Orchestrator.RDPSessionConnect)

-

SchedulerActivityTimeAddWeekly(inGSettings)

+

SchedulerActivityTimeAddWeekly(inGSettings)

Add activity item list in scheduler.

-

UACKeyListCheck(inRequest, inRoleKeyList)

+

UACKeyListCheck(inRequest, inRoleKeyList)

Check is client is has access for the key list

-

UACSuperTokenUpdate(inGSettings, inSuperTokenStr)

+

UACSuperTokenUpdate(inGSettings, inSuperTokenStr)

Add supertoken for the all access (it is need for the robot communication without human)

-

UACUpdate(inGSettings, inADLoginStr[, …])

+

UACUpdate(inGSettings, inADLoginStr[, …])

Update user access (UAC)

-

UACUserDictGet(inRequest)

+

UACUserDictGet(inRequest)

Return user UAC hierarchy dict of the inRequest object.

-

WebCPUpdate(inGSettings, inCPKeyStr[, …])

+

WebCPUpdate(inGSettings, inCPKeyStr[, …])

Add control panel HTML, JSON generator or JS when page init

-

WebURLConnectDef(inGSettings, inMethodStr, …)

+

WebURLConnectDef(inGSettings, inMethodStr, …)

Connect URL to DEF

-

WebURLConnectFile(inGSettings, inMethodStr, …)

+

WebURLConnectFile(inGSettings, inMethodStr, …)

Connect URL to File

-

WebURLConnectFolder(inGSettings, …)

+

WebURLConnectFolder(inGSettings, …)

Connect URL to Folder

-

WebUserInfoGet(inRequest)

+

WebUserInfoGet(inRequest)

Return User info about request

-

WebUserIsSuperToken(inRequest, inGSettings)

+

WebUserIsSuperToken(inRequest, inGSettings)

Return bool if request is authentificated with supetoken (token which is never expires)

-

WebUserUACHierarchyGet(inRequest)

+

WebUserUACHierarchyGet(inRequest)

Return User UAC Hierarchy DICT Return {…}

@@ -509,6 +518,25 @@
+
+
+pyOpenRPA.Orchestrator.__Orchestrator__.AgentOSFileBinaryDataBase64StrReceive(inGSettings, inHostNameStr, inUserStr, inFilePathStr)[source]
+

Read binary file and encode in base64 to transmit (safe for JSON transmition)

+
+
Parameters
+
    +
  • inGSettings – Global settings dict (singleton)

  • +
  • inHostNameStr

  • +
  • inUserStr

  • +
  • inFilePathStr – File path to read

  • +
+
+
Returns
+

GUID String of the ActivityItem - you can wait (sync or async) result by this guid!

+
+
+
+
pyOpenRPA.Orchestrator.__Orchestrator__.AgentOSFileBinaryDataBytesCreate(inGSettings, inHostNameStr, inUserStr, inFilePathStr, inFileDataBytes)[source]
@@ -550,6 +578,44 @@
+
+
+pyOpenRPA.Orchestrator.__Orchestrator__.AgentOSFileTextDataStrReceive(inGSettings, inHostNameStr, inUserStr, inFilePathStr, inEncodingStr='utf-8')[source]
+

Read text file in the agent GUI session

+
+
Parameters
+
    +
  • inGSettings – Global settings dict (singleton)

  • +
  • inHostNameStr

  • +
  • inUserStr

  • +
  • inFilePathStr – File path to read

  • +
  • inEncodingStr – Text file encoding. Default ‘utf-8’

  • +
+
+
Returns
+

GUID String of the ActivityItem - you can wait (sync or async) result by this guid!

+
+
+
+ +
+
+pyOpenRPA.Orchestrator.__Orchestrator__.AgentProcessWOExeUpperUserListGet(inGSettings, inHostNameStr, inUserStr)[source]
+

Return the process list only for the current user (where Agent is running) without .EXE in upper case. Can use in ActivityItem from Orchestrator to Agent

+
+
Parameters
+
    +
  • inGSettings – Global settings dict (singleton)

  • +
  • inHostNameStr

  • +
  • inUserStr

  • +
+
+
Returns
+

GUID String of the ActivityItem - you can wait (sync or async) result by this guid!

+
+
+
+
pyOpenRPA.Orchestrator.__Orchestrator__.GSettingsAutocleaner(inGSettings)[source]
@@ -928,7 +994,7 @@
-pyOpenRPA.Orchestrator.__Orchestrator__.ProcessorActivityItemCreate(inDef, inArgList=None, inArgDict=None, inArgGSettingsStr=None, inArgLoggerStr=None)[source]
+pyOpenRPA.Orchestrator.__Orchestrator__.ProcessorActivityItemCreate(inDef, inArgList=None, inArgDict=None, inArgGSettingsStr=None, inArgLoggerStr=None, inGUIDStr=None)[source]

Create activity item. Activity item can be used as list item in ProcessorActivityItemAppend or in Processor.ActivityListExecute.

# USAGE
 from pyOpenRPA import Orchestrator
@@ -982,6 +1048,7 @@
 
  • inArgDict – Args dict for the def

  • inArgGSettingsStr – Name of def argument of the GSettings dict

  • inArgLoggerStr – Name of def argument of the logging object

  • +
  • inGUIDStr – GUID which you can specify. If None the GUID will be generated

  • Returns
    diff --git a/Wiki/ENG_Guide/html/Orchestrator/03_gSettingsTemplate.html b/Wiki/ENG_Guide/html/Orchestrator/03_gSettingsTemplate.html index 48f660db..40240254 100644 --- a/Wiki/ENG_Guide/html/Orchestrator/03_gSettingsTemplate.html +++ b/Wiki/ENG_Guide/html/Orchestrator/03_gSettingsTemplate.html @@ -373,7 +373,8 @@ "AliasDefDict": {}, # Storage for def with Str alias. To use it see pyOpenRPA.Orchestrator.ControlPanel "CheckIntervalSecFloat": 1.0, # Interval for check gSettings in ProcessorDict > ActivityList "ExecuteBool": True, # Flag to execute thread processor - "ThreadIdInt": None # Technical field - will be setup when processor init + "ThreadIdInt": None, # Technical field - will be setup when processor init + "WarningExecutionMoreThanSecFloat": 60.0 # Push warning if execution more than n seconds }, "ControlPanelDict": { # Old structure > CPDict "RefreshSeconds": 5, # deprecated parameter diff --git a/Wiki/ENG_Guide/html/_modules/pyOpenRPA/Agent/__Agent__.html b/Wiki/ENG_Guide/html/_modules/pyOpenRPA/Agent/__Agent__.html index 69085983..3ab64f78 100644 --- a/Wiki/ENG_Guide/html/_modules/pyOpenRPA/Agent/__Agent__.html +++ b/Wiki/ENG_Guide/html/_modules/pyOpenRPA/Agent/__Agent__.html @@ -186,7 +186,10 @@ # Create binary file by the base64 string (safe for JSON transmition)
    [docs]def OSFileBinaryDataBase64StrCreate(inFilePathStr, inFileDataBase64Str,inGSettings = None): - """ Create binary file by the base64 string (safe for JSON transmition)""" + """ + Create binary file by the base64 string (safe for JSON transmition) + + """ lFile = open(inFilePathStr, "wb") lFile.write(base64.b64decode(inFileDataBase64Str)) lFile.close() @@ -196,14 +199,59 @@ A2O.LogListSend(inGSettings=inGSettings, inLogList=[lMessageStr])
    # Create text file by the string -def OSFileTextDataStrCreate(inFilePathStr, inFileDataStr, inEncodingStr = "utf-8",inGSettings = None): +
    [docs]def OSFileTextDataStrCreate(inFilePathStr, inFileDataStr, inEncodingStr = "utf-8",inGSettings = None): + """ + Create text file in the agent GUI session + + :param inFilePathStr: File abs path + :param inFileDataStr: File data text content + :param inEncodingStr: Write file encoding + :param inGSettings: global settings of the Agent (singleton) + :return: + """ lFile = open(inFilePathStr, "w", encoding=inEncodingStr) lFile.write(inFileDataStr) lFile.close() lL = inGSettings.get("Logger", None) if type(inGSettings) is dict else None lMessageStr = f"AGENT Text file {inFilePathStr} has been created." if lL: lL.info(lMessageStr) + A2O.LogListSend(inGSettings=inGSettings, inLogList=[lMessageStr])
    + +
    [docs]def OSFileBinaryDataBase64StrReceive(inFilePathStr, inGSettings=None): + """ + Read binary file and encode in base64 to transmit (safe for JSON transmition) + + :param inFilePathStr: File path to read + :param inGSettings: global settings of the Agent (singleton) + :return: File content in string base64 format (use base64.b64decode to decode data). Return None if file is not exist + """ + lFile = open(inFilePathStr, "rb") + lFileDataBytes = lFile.read() + lFile.close() + lFileDataBase64Str = base64.b64encode(lFileDataBytes).decode("utf-8") + lL = inGSettings.get("Logger", None) if type(inGSettings) is dict else None + lMessageStr = f"AGENT Binary file {inFilePathStr} has been read." + if lL: lL.info(lMessageStr) + A2O.LogListSend(inGSettings=inGSettings, inLogList=[lMessageStr]) + return lFileDataBase64Str
    + +
    [docs]def OSFileTextDataStrReceive(inFilePathStr, inEncodingStr="utf-8", inGSettings=None): + """ + Read text file in the agent GUI session + + :param inFilePathStr: File abs path + :param inEncodingStr: Read file encoding. Default utf-8 + :param inGSettings: global settings of the Agent (singleton) + :return: File text content in string format (use base64.b64decode to decode data). Return None if file is not exist + """ + lFile = open(inFilePathStr, "r", encoding=inEncodingStr) + lFileDataStr = lFile.read() + lFile.close() + lL = inGSettings.get("Logger", None) if type(inGSettings) is dict else None + lMessageStr = f"AGENT Text file {inFilePathStr} has been read." + if lL: lL.info(lMessageStr) A2O.LogListSend(inGSettings=inGSettings, inLogList=[lMessageStr]) + return lFileDataStr
    # Send CMD to OS. Result return to log + Orchestrator by the A2O connection
    [docs]def OSCMD(inCMDStr, inRunAsyncBool=True, inGSettings = None, inSendOutputToOrchestratorLogsBool = True, inCMDEncodingStr = "cp1251"): diff --git a/Wiki/ENG_Guide/html/_modules/pyOpenRPA/Orchestrator/__Orchestrator__.html b/Wiki/ENG_Guide/html/_modules/pyOpenRPA/Orchestrator/__Orchestrator__.html index ddb90459..bc1bfc44 100644 --- a/Wiki/ENG_Guide/html/_modules/pyOpenRPA/Orchestrator/__Orchestrator__.html +++ b/Wiki/ENG_Guide/html/_modules/pyOpenRPA/Orchestrator/__Orchestrator__.html @@ -364,6 +364,69 @@ #Send item in AgentDict for the futher data transmition return AgentActivityItemAdd(inGSettings=inGSettings, inHostNameStr=inHostNameStr, inUserStr=inUserStr, inActivityItemDict=lActivityItemDict)
    +
    [docs]def AgentOSFileBinaryDataBase64StrReceive(inGSettings, inHostNameStr, inUserStr, inFilePathStr): + """ + Read binary file and encode in base64 to transmit (safe for JSON transmition) + + :param inGSettings: Global settings dict (singleton) + :param inHostNameStr: + :param inUserStr: + :param inFilePathStr: File path to read + :return: GUID String of the ActivityItem - you can wait (sync or async) result by this guid! + """ + + lActivityItemDict = { + "Def":"OSFileBinaryDataBase64StrReceive", # def alias (look pyOpeRPA.Agent gSettings["ProcessorDict"]["AliasDefDict"]) + "ArgList":[], # Args list + "ArgDict":{"inFilePathStr":inFilePathStr}, # Args dictionary + "ArgGSettings": "inGSettings", # Name of GSettings attribute: str (ArgDict) or index (for ArgList) + "ArgLogger": None # Name of GSettings attribute: str (ArgDict) or index (for ArgList) + } + #Send item in AgentDict for the futher data transmition + return AgentActivityItemAdd(inGSettings=inGSettings, inHostNameStr=inHostNameStr, inUserStr=inUserStr, inActivityItemDict=lActivityItemDict)
    + +
    [docs]def AgentOSFileTextDataStrReceive(inGSettings, inHostNameStr, inUserStr, inFilePathStr, inEncodingStr="utf-8"): + """ + Read text file in the agent GUI session + + :param inGSettings: Global settings dict (singleton) + :param inHostNameStr: + :param inUserStr: + :param inFilePathStr: File path to read + :param inEncodingStr: Text file encoding. Default 'utf-8' + :return: GUID String of the ActivityItem - you can wait (sync or async) result by this guid! + """ + + lActivityItemDict = { + "Def":"OSFileTextDataStrReceive", # def alias (look pyOpeRPA.Agent gSettings["ProcessorDict"]["AliasDefDict"]) + "ArgList":[], # Args list + "ArgDict":{"inFilePathStr":inFilePathStr, "inEncodingStr": inEncodingStr}, # Args dictionary + "ArgGSettings": "inGSettings", # Name of GSettings attribute: str (ArgDict) or index (for ArgList) + "ArgLogger": None # Name of GSettings attribute: str (ArgDict) or index (for ArgList) + } + #Send item in AgentDict for the futher data transmition + return AgentActivityItemAdd(inGSettings=inGSettings, inHostNameStr=inHostNameStr, inUserStr=inUserStr, inActivityItemDict=lActivityItemDict)
    + +
    [docs]def AgentProcessWOExeUpperUserListGet(inGSettings, inHostNameStr, inUserStr): + """ + Return the process list only for the current user (where Agent is running) without .EXE in upper case. Can use in ActivityItem from Orchestrator to Agent + + :param inGSettings: Global settings dict (singleton) + :param inHostNameStr: + :param inUserStr: + :return: GUID String of the ActivityItem - you can wait (sync or async) result by this guid! + """ + + lActivityItemDict = { + "Def":"ProcessWOExeUpperUserListGet", # def alias (look pyOpeRPA.Agent gSettings["ProcessorDict"]["AliasDefDict"]) + "ArgList":[], # Args list + "ArgDict":{}, # Args dictionary + "ArgGSettings": "inGSettings", # Name of GSettings attribute: str (ArgDict) or index (for ArgList) + "ArgLogger": None # Name of GSettings attribute: str (ArgDict) or index (for ArgList) + } + #Send item in AgentDict for the futher data transmition + return AgentActivityItemAdd(inGSettings=inGSettings, inHostNameStr=inHostNameStr, inUserStr=inUserStr, inActivityItemDict=lActivityItemDict)
    + # OS DEFS
    [docs]def OSCredentialsVerify(inUserStr, inPasswordStr, inDomainStr=""): ## """ @@ -851,7 +914,7 @@ else: raise Exception(f"pyOpenRPA Exception: You can't use Orchestrator.ProcessorAliasDefUpdate with arg 'inDef' string value. inDef is '{inDef}', inAliasStr is '{inAliasStr}'") return inAliasStr
    -
    [docs]def ProcessorActivityItemCreate(inDef, inArgList=None, inArgDict=None, inArgGSettingsStr=None, inArgLoggerStr=None): +
    [docs]def ProcessorActivityItemCreate(inDef, inArgList=None, inArgDict=None, inArgGSettingsStr=None, inArgLoggerStr=None, inGUIDStr = None): """ Create activity item. Activity item can be used as list item in ProcessorActivityItemAppend or in Processor.ActivityListExecute. @@ -905,17 +968,22 @@ :param inArgDict: Args dict for the def :param inArgGSettingsStr: Name of def argument of the GSettings dict :param inArgLoggerStr: Name of def argument of the logging object + :param inGUIDStr: GUID which you can specify. If None the GUID will be generated :return: {} """ + # Work about GUID in Activity items + if inGUIDStr is None: + inGUIDStr = str(uuid.uuid4()) # generate new GUID if inArgList is None: inArgList=[] if inArgDict is None: inArgDict={} lActivityItemDict= { - "Def":inDef, # def link or def alias (look gSettings["Processor"]["AliasDefDict"]) - "ArgList":inArgList, # Args list - "ArgDict":inArgDict, # Args dictionary - "ArgGSettings": inArgGSettingsStr, # Name of GSettings attribute: str (ArgDict) or index (for ArgList) - "ArgLogger": inArgLoggerStr # Name of GSettings attribute: str (ArgDict) or index (for ArgList) - } + "Def":inDef, # def link or def alias (look gSettings["Processor"]["AliasDefDict"]) + "ArgList":inArgList, # Args list + "ArgDict":inArgDict, # Args dictionary + "ArgGSettings": inArgGSettingsStr, # Name of GSettings attribute: str (ArgDict) or index (for ArgList) + "ArgLogger": inArgLoggerStr, # Name of GSettings attribute: str (ArgDict) or index (for ArgList) + "GUIDStr": inGUIDStr + } return lActivityItemDict
    [docs]def ProcessorActivityItemAppend(inGSettings, inDef=None, inArgList=None, inArgDict=None, inArgGSettingsStr=None, inArgLoggerStr=None, inActivityItemDict=None): @@ -980,6 +1048,14 @@ ] else: lActivityList = [inActivityItemDict] + # Work about GUID in Activity items + for lItemDict in lActivityList: + # Add GUIDStr if not exist + lGUIDStr = None + if "GUIDStr" not in lItemDict: + lGUIDStr = str(uuid.uuid4()) # generate new GUID + lItemDict["GUIDStr"] = lGUIDStr + # Add activity list in ProcessorDict inGSettings["ProcessorDict"]["ActivityList"]+=lActivityList
    ## Process defs @@ -2045,6 +2121,11 @@ lProcessorThread.start() # Start the thread execution. if lL: lL.info("Processor has been started (ProcessorDict)") #Logging + # Processor monitor thread + lProcessorMonitorThread = threading.Thread(target= Processor.ProcessorMonitorRunSync, kwargs={"inGSettings":gSettingsDict}) + lProcessorMonitorThread.daemon = True # Run the thread in daemon mode. + lProcessorMonitorThread.start() # Start the thread execution. + if lL: lL.info("Processor monitor has been started") #Logging if lL: lL.info("Scheduler loop start") #Logging gDaemonActivityLogDictRefreshSecInt = 10 # The second period for clear lDaemonActivityLogDict from old items diff --git a/Wiki/ENG_Guide/html/genindex.html b/Wiki/ENG_Guide/html/genindex.html index 6269a9c5..672ca381 100644 --- a/Wiki/ENG_Guide/html/genindex.html +++ b/Wiki/ENG_Guide/html/genindex.html @@ -202,15 +202,21 @@
  • AgentActivityItemReturnGet() (in module pyOpenRPA.Orchestrator.__Orchestrator__)
  • - - + @@ -270,6 +276,12 @@
  • OSCredentialsVerify() (in module pyOpenRPA.Orchestrator.__Orchestrator__)
  • OSFileBinaryDataBase64StrCreate() (in module pyOpenRPA.Agent.__Agent__) +
  • +
  • OSFileBinaryDataBase64StrReceive() (in module pyOpenRPA.Agent.__Agent__) +
  • +
  • OSFileTextDataStrCreate() (in module pyOpenRPA.Agent.__Agent__) +
  • +
  • OSFileTextDataStrReceive() (in module pyOpenRPA.Agent.__Agent__)
  • diff --git a/Wiki/ENG_Guide/html/objects.inv b/Wiki/ENG_Guide/html/objects.inv index 44e2a2ce27af6fa1bd1824b74378a025ef573aa8..2bbda80ee3dde410efd24c5d6a93f88ac3265a52 100644 GIT binary patch delta 1277 zcmVZP~`y#N=nk%^?*_Eqz~0>Oa{e*)#z;pAG%t2Bh`FF#jKhUXp#@sW=tj zU3hul?-!Th7}mz$+MW1N$oju|{a$hk!=DDD`>{h>r!ul!Nq=w9hV>fAS1#a&OQy3i zv+RZ$_~SaTdZd9_AcLPn1pG%w_zQTl4!vWwYp@-uJJTuxV^-5IPq0i9&`SgQjvM<8 z?0d1NI@*GA7Sb}@CnYGX`hp8nZ#sVncZS2AhWyqcvglRjMVc~Qj;htA);Q&n49Q4 zMCpUz5uUxl+@J(eygu-`$`V5aWI%pb8WRvOBd=>oqaSy^`FeSgJUCV5+B# z$@(v4(SN%n7GCF~C0`(#;8~muT`N)2@CPn1kBqhuJyJ0)V3!DVXTszWV9UMQsS@LY z?_e0mD}YBqQ^PKYqq5ki+dSk5QoOq?)FVj3e26^6=y-P?^N6gHT*1R=Mz{pTU(WB! zJc|(YBrZvufkla!=q-ce!Bd~ewIV$AoWdNOgnyC;?f901W+=@5|B~kFL0Nw}8H0H& z(@FK_I+wlSmGu#ZkJ^OO;D%f2u7&bgwHDZy@n)-GkYFvec4Zi1gpL3^@oFQ=E)t66 zWcsVP2oZol({?xh$b>7#t-Fyi9o{G%M3*RjtWCx?#h z#&1DZmldE$<@*H#gp27i2A zwX1Nm|ID<%QlExv8C)GzCGqy6Bc|)Z#<1u;O>h`f;9gfYh{50p?^B4i^J%DDT%dgN zJvX%Pxq{mpMtNj($E%g-mEJN4^M^WKQ_^}G4OeTK+qVCu=&E%)o(Ze{t?ffO=o-P@ zR{@X_hc@=+fNDqUoxQ-OF;{Mt#dcF2=2+Ic1^Yplt?PL%tu~{!AoL@S8a*`~c;8#h zn7GH@#*|iO>&9A5d7HWB;qX9Ms#@b(fr!)&oO)GY{`c>HjQ5j2@*duvTC`2F{$5ak n+!q(HLhqXNm1)Iigyw9MC&uQ)qOX`!Bu;O}HqiSIZKwlNfjyV~ delta 1248 zcmV<61Rwk53djnOcz;>Va^g4;zWXUuHCuDT81)u*bS&6B$p&- z;@iH)zTQ5`wrpc;Vv@|n;y_`k)!(O|{*#?#lLW+UI`9V@5XKL~{67pyl6~IEIORYt zNZ$A7#br2xwf47W$3GOZ-XEmrC8sd_Nie)0S)_F;BEzI0{eL#B*Fe594mV6tm5r#O zH&nx4*MU((1=PTM;ipPQp!IU{>q^LKKcC;>f z!^XY{Tr6pTvwUPG8ynaS;`nIlr}^GRGy{_=@#P7(OP`bR`PpNow?zuHD~xhm2u7!V46hifIhl$-!c=U@>m#9kCYE7 z=Ps$nIM+)=zf@Yxa%Lj-2N8AJ@u z$QQT@6bG_9xsmI&W0HF*m`$;+;_QK`o-)SkzokL%5?FYhi`Mx9(FD)pWawIn6q>CV z$2>CJLVxt&ig6CRgrhq^Jq?=Exs z0K#EDL>|ZJ8q|nI&ML_ztcFvEOF;a^?5@nS2;rW@CW$k!NFF2i9iDnl zp$|^tk_YYhmVu%u%zl4KGr5w+UyMhfAIfx6y?ABctY}>@(0JiJdIx*ycu3=)fpz^p{+$}oA2b-jFU%AQd zWvZcT8);{lD}XLp<|?zVhw-Z1b?no}$)RJr(Jk5G?GzXN@K*ku%dybLzC_k0{v6AQ z^!nsTl>Tb_?{*W<$tQT(7W`BZSQE}U0j7jnPkeEy2eLgXk>Il zxphPVbmfzSjC>?}sdwe~qDs*Fh>aRBrz_yEK!2#ISIQ^p8sE6W z8m`u&+qVCu=&E%)o(Ze{t?ffO=o-Q8R{; zJH09}|M$