From 18b0d2d1fdf28baf573c5020c8908c6227434e4e Mon Sep 17 00:00:00 2001 From: Ivan Maslov Date: Fri, 17 Dec 2021 13:19:02 +0300 Subject: [PATCH] uploaded to pypi --- .../INSTALLER | 0 .../pyOpenRPA-1.2.5.dist-info}/METADATA | 4 +- .../pyOpenRPA-1.2.5.dist-info}/RECORD | 28 +-- .../REQUESTED | 0 .../WHEEL | 0 .../top_level.txt | 0 .../Lib/site-packages/pyOpenRPA/Agent/A2O.py | 2 +- .../Lib/site-packages/pyOpenRPA/Agent/O2A.py | 28 ++- .../pyOpenRPA/Agent/__Agent__.py | 14 ++ .../Orchestrator/BackwardCompatibility.py | 22 ++- .../pyOpenRPA/Orchestrator/ServerSettings.py | 23 ++- .../Orchestrator/SettingsTemplate.py | 4 + .../Orchestrator/__Orchestrator__.py | 113 +++++++++++ .../Lib/site-packages/pyOpenRPA/__init__.py | 2 +- .../INSTALLER | 0 .../pyOpenRPA-1.2.5.dist-info}/METADATA | 4 +- .../pyOpenRPA-1.2.5.dist-info}/RECORD | 28 +-- .../REQUESTED | 0 .../WHEEL | 0 .../top_level.txt | 0 .../Lib/site-packages/pyOpenRPA/Agent/A2O.py | 2 +- .../Lib/site-packages/pyOpenRPA/Agent/O2A.py | 28 ++- .../pyOpenRPA/Agent/__Agent__.py | 14 ++ .../Orchestrator/BackwardCompatibility.py | 22 ++- .../pyOpenRPA/Orchestrator/ServerSettings.py | 23 ++- .../Orchestrator/SettingsTemplate.py | 4 + .../Orchestrator/__Orchestrator__.py | 113 +++++++++++ .../Lib/site-packages/pyOpenRPA/__init__.py | 2 +- Sources/pyOpenRPA/__init__.py | 2 +- Sources/setup.py | 2 +- Wiki/ENG_Guide/html/Agent/02_Defs.html | 19 +- Wiki/ENG_Guide/html/Orchestrator/02_Defs.html | 184 ++++++++++++------ .../Orchestrator/03_gSettingsTemplate.html | 4 + .../_modules/pyOpenRPA/Agent/__Agent__.html | 14 ++ .../Orchestrator/__Orchestrator__.html | 113 +++++++++++ Wiki/ENG_Guide/html/genindex.html | 10 +- Wiki/ENG_Guide/html/objects.inv | Bin 1462 -> 1476 bytes Wiki/ENG_Guide/html/searchindex.js | 2 +- Wiki/ENG_Guide/markdown/Agent/02_Defs.md | 9 + .../markdown/Orchestrator/02_Defs.md | 118 ++++++++++- .../Orchestrator/03_gSettingsTemplate.md | 4 + Wiki/ENG_Guide/pdf/pyOpenRPA_Guide_ENG.pdf | Bin 894870 -> 909296 bytes v1.2.4 => v1.2.5 | 0 43 files changed, 828 insertions(+), 133 deletions(-) rename Resources/WPy32-3720/python-3.7.2/Lib/site-packages/{pyOpenRPA-1.2.3.dist-info => pyOpenRPA-1.2.5.dist-info}/INSTALLER (100%) rename Resources/{WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.2.3.dist-info => WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.5.dist-info}/METADATA (98%) rename Resources/{WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.2.3.dist-info => WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.5.dist-info}/RECORD (96%) rename Resources/WPy32-3720/python-3.7.2/Lib/site-packages/{pyOpenRPA-1.2.3.dist-info => pyOpenRPA-1.2.5.dist-info}/REQUESTED (100%) rename Resources/WPy32-3720/python-3.7.2/Lib/site-packages/{pyOpenRPA-1.2.3.dist-info => pyOpenRPA-1.2.5.dist-info}/WHEEL (100%) rename Resources/WPy32-3720/python-3.7.2/Lib/site-packages/{pyOpenRPA-1.2.3.dist-info => pyOpenRPA-1.2.5.dist-info}/top_level.txt (100%) rename Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/{pyOpenRPA-1.2.3.dist-info => pyOpenRPA-1.2.5.dist-info}/INSTALLER (100%) rename Resources/{WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.3.dist-info => WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.2.5.dist-info}/METADATA (98%) rename Resources/{WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.3.dist-info => WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.2.5.dist-info}/RECORD (96%) rename Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/{pyOpenRPA-1.2.3.dist-info => pyOpenRPA-1.2.5.dist-info}/REQUESTED (100%) rename Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/{pyOpenRPA-1.2.3.dist-info => pyOpenRPA-1.2.5.dist-info}/WHEEL (100%) rename Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/{pyOpenRPA-1.2.3.dist-info => pyOpenRPA-1.2.5.dist-info}/top_level.txt (100%) rename v1.2.4 => v1.2.5 (100%) diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.3.dist-info/INSTALLER b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.5.dist-info/INSTALLER similarity index 100% rename from Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.3.dist-info/INSTALLER rename to Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.5.dist-info/INSTALLER diff --git a/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.2.3.dist-info/METADATA b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.5.dist-info/METADATA similarity index 98% rename from Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.2.3.dist-info/METADATA rename to Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.5.dist-info/METADATA index ffb24fc0..0ce18453 100644 --- a/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.2.3.dist-info/METADATA +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.5.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: pyOpenRPA -Version: 1.2.3 +Version: 1.2.5 Summary: First open source RPA platform for business Home-page: https://gitlab.com/UnicodeLabs/OpenRPA Author: Ivan Maslov @@ -23,7 +23,7 @@ Classifier: Topic :: Home Automation Description-Content-Type: text/markdown Requires-Dist: pillow (>=6.0.0) Requires-Dist: keyboard (>=0.13.3) -Requires-Dist: pyautogui (>=0.9.44) +Requires-Dist: pyautogui (<=0.9.52) Requires-Dist: crypto (>=1.4.1) Requires-Dist: pywinauto (>=0.6.8) ; platform_system == "win32" and python_version >= "3.0" Requires-Dist: WMI (>=1.4.9) ; platform_system == "win32" and python_version >= "3.0" diff --git a/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.2.3.dist-info/RECORD b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.5.dist-info/RECORD similarity index 96% rename from Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.2.3.dist-info/RECORD rename to Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.5.dist-info/RECORD index 36c49d75..b9987d04 100644 --- a/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.2.3.dist-info/RECORD +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.5.dist-info/RECORD @@ -1,19 +1,19 @@ -pyOpenRPA-1.2.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -pyOpenRPA-1.2.3.dist-info/METADATA,sha256=JhjZUhqMXGka3uVYTABHekXvly9bG89Dm0VyfqhnUA4,3612 -pyOpenRPA-1.2.3.dist-info/RECORD,, -pyOpenRPA-1.2.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pyOpenRPA-1.2.3.dist-info/WHEEL,sha256=qB97nP5e4MrOsXW5bIU5cUn_KSVr10EV0l-GCHG9qNs,97 -pyOpenRPA-1.2.3.dist-info/top_level.txt,sha256=RPzwQXgYBRo_m5L3ZLs6Voh8aEkMeT29Xsul1w1qE0g,10 +pyOpenRPA-1.2.5.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pyOpenRPA-1.2.5.dist-info/METADATA,sha256=IeBQ9YskhMg5mmzeY-DBQVnCbKUI4pgnl8E9XLlGrQs,3612 +pyOpenRPA-1.2.5.dist-info/RECORD,, +pyOpenRPA-1.2.5.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pyOpenRPA-1.2.5.dist-info/WHEEL,sha256=qB97nP5e4MrOsXW5bIU5cUn_KSVr10EV0l-GCHG9qNs,97 +pyOpenRPA-1.2.5.dist-info/top_level.txt,sha256=RPzwQXgYBRo_m5L3ZLs6Voh8aEkMeT29Xsul1w1qE0g,10 pyOpenRPA/.idea/inspectionProfiles/profiles_settings.xml,sha256=YXLFmX7rPNGcnKK1uX1uKYPN0fpgskYNe7t0BV7cqkY,174 pyOpenRPA/.idea/misc.xml,sha256=V-fQnOz-bYEZULgfbFgm-8mURphZrKfXMSd0wKjeEyA,188 pyOpenRPA/.idea/modules.xml,sha256=Q__U1JIA2cjxbLRXAv-SfYY00fZA0TNlpkkbY4s3ncg,277 pyOpenRPA/.idea/pyOpenRPA.iml,sha256=EXh41F8lqRiSBMVg-n2tKaEaHC6_3gGSuKkPJA12Na0,408 pyOpenRPA/.idea/vcs.xml,sha256=2HygA1oRAwc3VBf-irxHrX5JJG9DXuQwrN0BlubhoKY,191 pyOpenRPA/.idea/workspace.xml,sha256=6tJZehshdK4And6tEoUvkIB0KE7waL_NnTSkTYYAeFA,3802 -pyOpenRPA/Agent/A2O.py,sha256=ZVXNamhKOB1y3j9b4gp_rzJq55Nr5pBGeoBgMnCtNKc,1657 -pyOpenRPA/Agent/O2A.py,sha256=4W2bbU34MBmuveXkPvkCzmzKAryR_YB-gnA013fxMoY,3356 +pyOpenRPA/Agent/A2O.py,sha256=PlIZZCTnVrYF2i6DSAi_KbzZfc2gtcBPmOerrEZq68U,1718 +pyOpenRPA/Agent/O2A.py,sha256=vu7UgiB0qY6-1i9qVWEBGyXWSi68TTNfkvnpMIZH7Vo,4458 pyOpenRPA/Agent/Processor.py,sha256=Co8nWpffgsnEE_TpG9WrpKxz3N0sDF7eFnKxDOk1sd8,4653 -pyOpenRPA/Agent/__Agent__.py,sha256=Id75cxA6kwed1r8NaLWHfYIyUrTZx7RPlxw1PdzropI,10006 +pyOpenRPA/Agent/__Agent__.py,sha256=JcMFvSC3_M94HEdZe8AK2IHuJOxeDJi4RpnY_LivWpM,10639 pyOpenRPA/Agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 pyOpenRPA/Agent/__pycache__/A2O.cpython-37.pyc,, pyOpenRPA/Agent/__pycache__/O2A.cpython-37.pyc,, @@ -22,7 +22,7 @@ pyOpenRPA/Agent/__pycache__/__Agent__.cpython-37.pyc,, pyOpenRPA/Agent/__pycache__/__init__.cpython-37.pyc,, pyOpenRPA/Agent/readme.md,sha256=QF_Bnv204OK3t1JUEhjfICkxFmSdX6bvaRl_HI6lH9I,19 pyOpenRPA/Info.md,sha256=u4Nv-PjniSF0Zlbtr6jEJX2vblK3_1zhSLNUgOdtDaA,85 -pyOpenRPA/Orchestrator/BackwardCompatibility.py,sha256=-pV_zaPcqD5lYz-2OXUJQ7tB2BZknd3_ci0HPHKcLFg,33110 +pyOpenRPA/Orchestrator/BackwardCompatibility.py,sha256=a2UZINDnHCKZVvHtOOPMyFZmDynzfcyQhFJCEEMhadY,34599 pyOpenRPA/Orchestrator/ControlPanel.py,sha256=OzS8HjG__8OZgqhajr8L8owyugXPuSLWHLtXuKdEP78,103 pyOpenRPA/Orchestrator/Core.py,sha256=Kjphtu0g6iaS4D_fIWmzRaLLgBQ9fcwccpQJhOETTAc,521 pyOpenRPA/Orchestrator/Processor.py,sha256=Z1SglmX6ykTLifD3M1mzWEJQUgweWo6HjjCjHldjGyM,8594 @@ -60,8 +60,8 @@ pyOpenRPA/Orchestrator/RobotScreenActive/__pycache__/Screen.cpython-37.pyc,, pyOpenRPA/Orchestrator/RobotScreenActive/__pycache__/__init__.cpython-37.pyc,, pyOpenRPA/Orchestrator/RobotScreenActive/__pycache__/__main__.cpython-37.pyc,, pyOpenRPA/Orchestrator/Server.py,sha256=Ke89zh5iZezhA_qyQ3sfWJmL9bfc1rBBYeq-WzznfsE,30432 -pyOpenRPA/Orchestrator/ServerSettings.py,sha256=Ndo30YHn6XmNDLP9hPMM1867Gyx2hcYbh0UP2H1Tx_c,31205 -pyOpenRPA/Orchestrator/SettingsTemplate.py,sha256=d6l3YrJnh8eteBUc7DX-Qu7Ioc5mZ0ZVBAkw7i0NMa0,20139 +pyOpenRPA/Orchestrator/ServerSettings.py,sha256=zVI-brV_58uKJ-MWESTZGYv89nN_0iW_-HfVNhip4jE,32890 +pyOpenRPA/Orchestrator/SettingsTemplate.py,sha256=-LIyHRKVnbrALAyss6r6L56jBX_yOAdMEhnj8N2fN9A,20532 pyOpenRPA/Orchestrator/Timer.py,sha256=HvYtEeH2Q5WVVjgds9XaBpWRmvZgwgBXurJDdVVq_T0,2097 pyOpenRPA/Orchestrator/Utils/LoggerHandlerDumpLogList.py,sha256=hD47TiOuKR-G8IWu9lJD2kG28qlH7YZV63i3qv1N5Dk,681 pyOpenRPA/Orchestrator/Utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 @@ -72,7 +72,7 @@ pyOpenRPA/Orchestrator/Web/Index.js,sha256=Blo3LHe_a3zrW7MqYo4BSIwoOx7nlO7Ko9LWx pyOpenRPA/Orchestrator/Web/Index.xhtml,sha256=a4N_reLA6_Zb2KXiL73a7cWtJwO0W0Dr5lZ-RpUwuI0,16428 pyOpenRPA/Orchestrator/Web/__pycache__/Basic.cpython-37.pyc,, pyOpenRPA/Orchestrator/Web/favicon.ico,sha256=6S8XwSQ_3FXPpaX6zYkf8uUewVXO9bHnrrDHEoWrEgw,112922 -pyOpenRPA/Orchestrator/__Orchestrator__.py,sha256=uqH9ma0C8OxnnfgZ4mMNl15rE5tc9k9v3hn6CY67PMU,111546 +pyOpenRPA/Orchestrator/__Orchestrator__.py,sha256=2WbaatF0yN1Sx3P1Zru3clMbUTq4N-ErjMmsi0V7TKE,117659 pyOpenRPA/Orchestrator/__init__.py,sha256=f1RFDzOkL3IVorCtqogjGdXYPtHH-P-y-5CqT7PGy7A,183 pyOpenRPA/Orchestrator/__main__.py,sha256=czJrc7_57WiO3EPIYfPeF_LG3pZsQVmuAYgbl_YXcVU,273 pyOpenRPA/Orchestrator/__pycache__/BackwardCompatibility.cpython-37.pyc,, @@ -341,6 +341,6 @@ pyOpenRPA/Tools/Terminator.py,sha256=VcjX3gFXiCGu3MMCidhrTNsmC9wsAqfjRJdTSU9fLnU pyOpenRPA/Tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 pyOpenRPA/Tools/__pycache__/Terminator.cpython-37.pyc,, pyOpenRPA/Tools/__pycache__/__init__.cpython-37.pyc,, -pyOpenRPA/__init__.py,sha256=O8SOldPlZbE_YguduoMHJNJaRtlVN3dHXEC0JVpQMYY,174 +pyOpenRPA/__init__.py,sha256=7jBgAILYoa342lTEQGpNGus8Zpiei0bAZkw1sVLtsGI,174 pyOpenRPA/__pycache__/__init__.cpython-37.pyc,, pyOpenRPA/test.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.3.dist-info/REQUESTED b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.5.dist-info/REQUESTED similarity index 100% rename from Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.3.dist-info/REQUESTED rename to Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.5.dist-info/REQUESTED diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.3.dist-info/WHEEL b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.5.dist-info/WHEEL similarity index 100% rename from Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.3.dist-info/WHEEL rename to Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.5.dist-info/WHEEL diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.3.dist-info/top_level.txt b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.5.dist-info/top_level.txt similarity index 100% rename from Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.3.dist-info/top_level.txt rename to Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.5.dist-info/top_level.txt diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Agent/A2O.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Agent/A2O.py index f16cdf1d..3f302476 100644 --- a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Agent/A2O.py +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Agent/A2O.py @@ -16,7 +16,7 @@ def _A2ODataSend(inGSettings, inDataDict): lHostStr = inGSettings["OrchestratorDict"]["HostStr"] lPortInt = inGSettings["OrchestratorDict"]["PortInt"] lURLStr=f"{lProtocolStr}://{lHostStr}:{lPortInt}/pyOpenRPA/Agent/A2O" - lResponse = requests.post(url= lURLStr, cookies = {"AuthToken":inGSettings["OrchestratorDict"]["SuperTokenStr"]}, json=inDataDict) + lResponse = requests.post(url= lURLStr, cookies = {"AuthToken":inGSettings["OrchestratorDict"]["SuperTokenStr"]}, json=inDataDict, timeout=inGSettings["A2ODict"]["ConnectionTimeoutSecFloat"]) except Exception as e: if lL: lL.exception(f"A2O Error handler.") diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Agent/O2A.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Agent/O2A.py index 38b92316..0994a0c0 100644 --- a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Agent/O2A.py +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Agent/O2A.py @@ -26,25 +26,37 @@ def O2A_Loop(inGSettings): lPortInt = inGSettings["OrchestratorDict"]["PortInt"] lURLStr=f"{lProtocolStr}://{lHostStr}:{lPortInt}/pyOpenRPA/Agent/O2A" lDataDict = { "HostNameUpperStr": inGSettings["AgentDict"]["HostNameUpperStr"], "UserUpperStr": inGSettings["AgentDict"]["UserUpperStr"], "ActivityLastGUIDStr": lActivityLastGUIDStr} - lResponse = requests.post(url= lURLStr, cookies = {"AuthToken":inGSettings["OrchestratorDict"]["SuperTokenStr"]}, json=lDataDict) + lResponse = requests.post(url= lURLStr, cookies = {"AuthToken":inGSettings["OrchestratorDict"]["SuperTokenStr"]}, json=lDataDict, timeout=inGSettings["O2ADict"]["ConnectionTimeoutSecFloat"]) if lResponse.status_code != 200: if lL: lL.warning(f"Agent can not connect to Orchestrator. Below the response from the orchestrator:{lResponse}") time.sleep(inGSettings["O2ADict"]["RetryTimeoutSecFloat"]) else: lRequestBody = lResponse.text - lQueueItem = lResponse.json() # Try to get JSON - # Append QUEUE item in ProcessorDict > ActivityList - lActivityLastGUIDStr = lQueueItem["GUIDStr"] - inGSettings["ProcessorDict"]["ActivityList"].append(lQueueItem) - if lL: lL.debug(f"ActivityItem was received from orchestrator: {lQueueItem}"); + lBodyLenInt = len(lRequestBody) + if lBodyLenInt != 0: # CHeck if not empty result when close the connection from orch + lQueueItem = lResponse.json() # Try to get JSON + # Append QUEUE item in ProcessorDict > ActivityList + lActivityLastGUIDStr = lQueueItem["GUIDStr"] + inGSettings["ProcessorDict"]["ActivityList"].append(lQueueItem) + # Log full version if bytes size is less than limit . else short + lAgentLimitLogSizeBytesInt = 500 + if lBodyLenInt <= lAgentLimitLogSizeBytesInt: + if lL: lL.info(f"ActivityItem was received from orchestrator: {lQueueItem}"); + else: + if lL: lL.info(f"ActivityItem was received from orchestrator: Was supressed because of big size. Max is {lAgentLimitLogSizeBytesInt} bytes"); + else: + if lL: lL.debug(f"Empty response from the orchestrator - loop when refresh the connection between Orc and Agent"); except requests.exceptions.ConnectionError as e: if lL: lL.error(f"O2A Connection error - orchestrator is not available. Sleep for {inGSettings['A2ODict']['RetryTimeoutSecFloat']} s.") time.sleep(inGSettings["O2ADict"]["RetryTimeoutSecFloat"]) except ConnectionResetError as e: - if lL: lL.error(f"O2A Connection error - orchestrator is not available. Sleep for {inGSettings['A2ODict']['RetryTimeoutSecFloat']} s.") + if lL: lL.error(f"O2A Connection reset error - orchestrator is not available. Sleep for {inGSettings['A2ODict']['RetryTimeoutSecFloat']} s.") time.sleep(inGSettings["O2ADict"]["RetryTimeoutSecFloat"]) except json.decoder.JSONDecodeError as e: - if lL: lL.error(f"See body of the recieved content from the Orchestrator: {lRequestBody}") + if lL: lL.error(f"O2A JSON decode error - See body of the recieved content from the Orchestrator: {lRequestBody}") + time.sleep(inGSettings["O2ADict"]["RetryTimeoutSecFloat"]) + except requests.exceptions.Timeout as e: + if lL: lL.exception(f"O2A requests timeout error (no response for long time). Sleep for {inGSettings['A2ODict']['RetryTimeoutSecFloat']} s.") time.sleep(inGSettings["O2ADict"]["RetryTimeoutSecFloat"]) except Exception as e: if lL: lL.exception(f"O2A Error handler. Sleep for {inGSettings['A2ODict']['RetryTimeoutSecFloat']} s.") diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Agent/__Agent__.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Agent/__Agent__.py index 2ac32d21..9ac93c19 100644 --- a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Agent/__Agent__.py +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Agent/__Agent__.py @@ -17,6 +17,20 @@ def OSFileBinaryDataBase64StrCreate(inFilePathStr, inFileDataBase64Str,inGSettin if lL: lL.info(lMessageStr) A2O.LogListSend(inGSettings=inGSettings, inLogList=[lMessageStr]) +# Append binary file by the base64 string (safe for JSON transmition) +def OSFileBinaryDataBase64StrAppend(inFilePathStr, inFileDataBase64Str,inGSettings = None): + """ + Create binary file by the base64 string (safe for JSON transmition) + + """ + lFile = open(inFilePathStr, "ab") + lFile.write(base64.b64decode(inFileDataBase64Str)) + lFile.close() + lL = inGSettings.get("Logger", None) if type(inGSettings) is dict else None + lMessageStr = f"AGENT Binary file {inFilePathStr} has been appended." + if lL: lL.info(lMessageStr) + A2O.LogListSend(inGSettings=inGSettings, inLogList=[lMessageStr]) + # Create text file by the string def OSFileTextDataStrCreate(inFilePathStr, inFileDataStr, inEncodingStr = "utf-8",inGSettings = None): """ diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/BackwardCompatibility.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/BackwardCompatibility.py index 2bfac13b..727376ee 100644 --- a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/BackwardCompatibility.py +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/BackwardCompatibility.py @@ -468,4 +468,24 @@ def Update(inGSettings): } } if lL: lL.warning( - f"Backward compatibility (v1.2.2 to v1.2.3): Add new key ServerDict > ListenDict. Transfer port from ServerDict > ListenPort") # Log about compatibility \ No newline at end of file + f"Backward compatibility (v1.2.2 to v1.2.3): Add new key ServerDict > ListenDict. Transfer port from ServerDict > ListenPort") # Log about compatibility + # Add new key + #"ServerDict": { + # "AgentFileChunkBytesSizeInt": 50000000, # size of the each chunk for the agent transmition + # "AgentFileChunkCheckIntervalSecFloat": 0.2, # The interval for check last activity item was successfully sent + if "AgentFileChunkBytesSizeInt" not in inGSettings["ServerDict"]: + inGSettings["ServerDict"]["AgentFileChunkBytesSizeInt"]= 50000000 + if lL: lL.warning( + f"Backward compatibility (v1.2.3 to v1.2.4): Add new key ServerDict > AgentFileChunkBytesSizeInt") # Log about compatibility + if "AgentFileChunkCheckIntervalSecFloat" not in inGSettings["ServerDict"]: + inGSettings["ServerDict"]["AgentFileChunkCheckIntervalSecFloat"]= 0.2 + if lL: lL.warning( + f"Backward compatibility (v1.2.3 to v1.2.4): Add new key ServerDict > AgentFileChunkCheckIntervalSecFloat") # Log about compatibility + if "ServerThread" not in inGSettings["ServerDict"]: + inGSettings["ServerDict"]["ServerThread"]= None + if lL: lL.warning( + f"Backward compatibility (v1.2.3 to v1.2.4): Add new key ServerDict > ServerThread") # Log about compatibility + if "AgentLimitLogSizeBytesInt" not in inGSettings["ServerDict"]: + inGSettings["ServerDict"]["AgentLimitLogSizeBytesInt"] = 300 + if lL: lL.warning( + f"Backward compatibility (v1.2.3 to v1.2.4): Add new key ServerDict > AgentLimitLogSizeBytesInt") # Log about compatibility \ No newline at end of file diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/ServerSettings.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/ServerSettings.py index b3197ee8..ed09b85f 100644 --- a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/ServerSettings.py +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/ServerSettings.py @@ -397,8 +397,16 @@ def pyOpenRPA_Agent_O2A(inRequest, inGSettings): lReturnActivityItemDict = copy.deepcopy(lReturnActivityItemDict) if "CreatedByDatetime" in lReturnActivityItemDict: del lReturnActivityItemDict["CreatedByDatetime"] - if lL: lL.info(f"Activity item to agent Hostname {lInput['HostNameUpperStr']}, User {lInput['UserUpperStr']}. Activity item: {lReturnActivityItemDict}") inRequest.OpenRPAResponseDict["Body"] = bytes(json.dumps(lReturnActivityItemDict), "utf8") + # Log full version if bytes size is less than limit . else short + lBodyLenInt = len(inRequest.OpenRPAResponseDict["Body"]) + lAgentLimitLogSizeBytesInt = inGSettings["ServerDict"]["AgentLimitLogSizeBytesInt"] + if lBodyLenInt <= lAgentLimitLogSizeBytesInt: + if lL: lL.info(f"Activity item to agent Hostname {lInput['HostNameUpperStr']}, User {lInput['UserUpperStr']}. Activity item: {lReturnActivityItemDict}") + else: + if lL: lL.info( + f"Activity item to agent Hostname {lInput['HostNameUpperStr']}, User {lInput['UserUpperStr']}. " + f"Activity item: Was suppressed because of body size of {lBodyLenInt} bytes. Max is {lAgentLimitLogSizeBytesInt}") lDoLoopBool = False # CLose the connection else: # Nothing to send - sleep for the next iteration time.sleep(lAgentLoopSleepSecFloat) @@ -417,6 +425,7 @@ def pyOpenRPA_Agent_A2O(inRequest, inGSettings): lInputByteArray = inRequest.rfile.read(lInputByteArrayLength) # Превращение массива байт в объект lInput = json.loads(lInputByteArray.decode('utf8')) + lAgentDictItemKeyTurple = (lInput["HostNameUpperStr"], lInput["UserUpperStr"]) if "LogList" in lInput: for lLogItemStr in lInput["LogList"]: inGSettings["Logger"].info(lLogItemStr) @@ -426,7 +435,17 @@ def pyOpenRPA_Agent_A2O(inRequest, inGSettings): # Create item in gSettings inGSettings["AgentActivityReturnDict"][lActivityReturnItemKeyStr]=SettingsTemplate.__AgentActivityReturnDictItemCreate__(inReturn=lActivityReturnItemValue) if lL: lL.debug(f"SERVER: pyOpenRPA_Agent_A2O:: Has recieved result of the activity items from agent! ActivityItem GUID Str: {lActivityReturnItemKeyStr}; Return value: {lActivityReturnItemValue}") - + # Delete the source activity item from AgentDict + if lAgentDictItemKeyTurple in inGSettings["AgentDict"]: + lAgentDictActivityListNew = [] + lAgentDict = inGSettings["AgentDict"][lAgentDictItemKeyTurple] + for lActivityItem in lAgentDict["ActivityList"]: + if lActivityReturnItemKeyStr != lActivityItem.get("GUIDStr",None): + lAgentDictActivityListNew.append(lActivityItem) + else: + del lActivityItem + if lL: lL.debug(f"SERVER: pyOpenRPA_Agent_A2O:: Source activity item request was deleted from the orchestrator. ActivityItem GUID Str: {lActivityReturnItemKeyStr}") + inGSettings["AgentDict"][lAgentDictItemKeyTurple]["ActivityList"] = lAgentDictActivityListNew def SettingsUpdate(inGlobalConfiguration): import os import pyOpenRPA.Orchestrator diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/SettingsTemplate.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/SettingsTemplate.py index 923a0ce1..242ddf55 100644 --- a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/SettingsTemplate.py +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/SettingsTemplate.py @@ -39,9 +39,13 @@ def __Create__(): # # # # # # # # # # # # # # # # # # }, "ServerDict": { + "AgentLimitLogSizeBytesInt": 300, # Don't show body if json body of transmition is more than + "ServerThread": None, # Server thread is there "AgentActivityLifetimeSecFloat": 1200.0, # Time in seconds to life for activity for the agent "AgentConnectionLifetimeSecFloat": 300.0, # Time in seconds to handle the open connection to the Agent "AgentLoopSleepSecFloat": 2.0, # Time in seconds to sleep between loops when check to send some activity to the agent + "AgentFileChunkBytesSizeInt": 50000000, # size of the each chunk for the agent transmition + "AgentFileChunkCheckIntervalSecFloat": 0.2, # The interval for check last activity item was successfully sent "WorkingDirectoryPathStr": None, # Will be filled automatically "RequestTimeoutSecFloat": 300, # Time to handle request in seconds, "ListenDict": { # Prototype diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/__Orchestrator__.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/__Orchestrator__.py index 366db88b..805472d0 100644 --- a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/__Orchestrator__.py +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/__Orchestrator__.py @@ -26,6 +26,7 @@ from .RobotScreenActive import Monitor #Start robot screen active from . import SettingsTemplate # Settings template import uuid # Generate uuid import datetime # datetime +import math #Единый глобальный словарь (За основу взять из Settings.py) gSettingsDict = None @@ -60,6 +61,26 @@ def AgentActivityItemAdd(inGSettings, inHostNameStr, inUserStr, inActivityItemDi # Return the result return lGUIDStr + +def AgentActivityItemExists(inGSettings, inHostNameStr, inUserStr, inGUIDStr): + """ + Check by GUID if ActivityItem has exists in request list. If exist - the result response has not been recieved from the agent + + :param inGSettings: Global settings dict (singleton) + :param inGUIDStr: GUID String of the ActivityItem + :return: True - ActivityItem is exist in AgentDict ; False - else case + """ + # Check if GUID is exists in dict - has been recieved + # Main alg + lAgentDictItemKeyTurple = (inHostNameStr.upper(),inUserStr.upper()) + lResultBool = False + if lAgentDictItemKeyTurple in inGSettings["AgentDict"]: + for lActivityItem in inGSettings["AgentDict"][lAgentDictItemKeyTurple]["ActivityList"]: + if inGUIDStr == lActivityItem.get("GUIDStr",None): + lResultBool = True + break + return lResultBool + def AgentActivityItemReturnExists(inGSettings, inGUIDStr): """ Check by GUID if ActivityItem has been executed and result has come to the Orchestrator @@ -117,6 +138,73 @@ def AgentOSCMD(inGSettings, inHostNameStr, inUserStr, inCMDStr, inRunAsyncBool=T #Send item in AgentDict for the futher data transmition return AgentActivityItemAdd(inGSettings=inGSettings, inHostNameStr=inHostNameStr, inUserStr=inUserStr, inActivityItemDict=lActivityItemDict) + +def AgentOSFileSend(inGSettings, inHostNameStr, inUserStr, inOrchestratorFilePathStr, inAgentFilePathStr): + """ + Send the file from the Orchestrator to Agent (synchroniously) pyOpenRPA.Agent daemon process (safe for JSON transmition). + Work safety with big files + Thread safe - you can call def even if you dont init the orchestrator - def will be executed later + + :param inGSettings: Global settings dict (singleton) + :param inHostNameStr: + :param inUserStr: + :param inFilePathStr: + :param inFileDataBytes: + :return: GUID String of the ActivityItem - you can wait (sync or async) result by this guid! + """ + + + # Check thread + if inGSettings["ServerDict"]["ServerThread"] is None: + if inGSettings["Logger"]: inGSettings["Logger"].warning(f"AgentOSFileSend run before server init - activity will be append in the processor queue.") + lResult = { + "Def": AgentOSFileSend, # def link or def alias (look gSettings["Processor"]["AliasDefDict"]) + "ArgList": [], # Args list + "ArgDict": {"inHostNameStr":inHostNameStr, "inUserStr":inUserStr, "inOrchestratorFilePathStr":inOrchestratorFilePathStr, "inAgentFilePathStr": inAgentFilePathStr}, # 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) + } + inGSettings["ProcessorDict"]["ActivityList"].append(lResult) + else: # In processor - do execution + lActivityItemCheckIntervalSecFloat = inGSettings["ServerDict"]["AgentFileChunkCheckIntervalSecFloat"] + + # Get the chunk limit + lChunkByteSizeInt = inGSettings["ServerDict"]["AgentFileChunkBytesSizeInt"] + + lL = inGSettings.get("Logger",None) + + # Open the file and get the size (in bytes) + lFile = open(inOrchestratorFilePathStr,"rb") + lFileSizeBytesInt = lFile.seek(0,2) + lFile.seek(0) + #import pdb + #pdb.set_trace() + lChunkCountInt = math.ceil(lFileSizeBytesInt/lChunkByteSizeInt) + if lL: lL.info(f"O2A: Start to send binary file via chunks. Chunk count: {lChunkCountInt}, From (Orch side): {inOrchestratorFilePathStr}, To (Agent side): {inAgentFilePathStr}") + for lChunkNumberInt in range(lChunkCountInt): + # Read chunk + lFileChunkBytes = lFile.read(lChunkByteSizeInt) + # Convert to base64 + lFileChunkBase64Str = base64.b64encode(lFileChunkBytes).decode("utf-8") + # Send chunk + if lChunkNumberInt == 0: + lActivityItemGUIDStr = AgentOSFileBinaryDataBase64StrCreate(inGSettings=inGSettings,inHostNameStr=inHostNameStr, + inUserStr=inUserStr,inFilePathStr=inAgentFilePathStr, + inFileDataBase64Str=lFileChunkBase64Str) + else: + lActivityItemGUIDStr = AgentOSFileBinaryDataBase64StrAppend(inGSettings=inGSettings, inHostNameStr=inHostNameStr, + inUserStr=inUserStr, inFilePathStr=inAgentFilePathStr, + inFileDataBase64Str=lFileChunkBase64Str) + # Wait for the activity will be deleted + while AgentActivityItemExists(inGSettings=inGSettings,inHostNameStr=inHostNameStr,inUserStr=inUserStr,inGUIDStr=lActivityItemGUIDStr): + time.sleep(lActivityItemCheckIntervalSecFloat) + if lL: lL.debug( + f"O2A: BINARY SEND: Current chunk index: {lChunkNumberInt}") + if lL: lL.info( + f"O2A: BINARY SEND: Transmition has been complete") + # Close the file + lFile.close() + def AgentOSFileBinaryDataBytesCreate(inGSettings, inHostNameStr, inUserStr, inFilePathStr, inFileDataBytes): """ Create binary file by the base64 string by the pyOpenRPA.Agent daemon process (safe for JSON transmition) @@ -163,6 +251,30 @@ def AgentOSFileBinaryDataBase64StrCreate(inGSettings, inHostNameStr, inUserStr, #Send item in AgentDict for the futher data transmition return AgentActivityItemAdd(inGSettings=inGSettings, inHostNameStr=inHostNameStr, inUserStr=inUserStr, inActivityItemDict=lActivityItemDict) + +def AgentOSFileBinaryDataBase64StrAppend(inGSettings, inHostNameStr, inUserStr, inFilePathStr, inFileDataBase64Str): + """ + Append binary file by the base64 string by the pyOpenRPA.Agent daemon process (safe for JSON transmission) + + :param inGSettings: Global settings dict (singleton) + :param inHostNameStr: + :param inUserStr: + :param inFilePathStr: + :param inFileDataBase64Str: + :return: GUID String of the ActivityItem - you can wait (sync or async) result by this guid! + """ + + lActivityItemDict = { + "Def":"OSFileBinaryDataBase64StrAppend", # def alias (look pyOpeRPA.Agent gSettings["ProcessorDict"]["AliasDefDict"]) + "ArgList":[], # Args list + "ArgDict":{"inFilePathStr":inFilePathStr,"inFileDataBase64Str":inFileDataBase64Str}, # 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) + + # Send text file to Agent (string) def AgentOSFileTextDataStrCreate(inGSettings, inHostNameStr, inUserStr, inFilePathStr, inFileDataStr, inEncodingStr = "utf-8"): """ @@ -2036,6 +2148,7 @@ def Orchestrator(inGSettings, inDumpRestoreBool = True, inRunAsAdministratorBool lItemDict = lListenDict[lItemKeyStr] lThreadServer = Server.RobotDaemonServer(lItemKeyStr, gSettingsDict) lThreadServer.start() + gSettingsDict["ServerDict"]["ServerThread"] = lThreadServer lItemDict["ServerInstance"] = lThreadServer # Init the RobotScreenActive in another thread diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/__init__.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/__init__.py index aeff0887..a01645a7 100644 --- a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/__init__.py +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/__init__.py @@ -3,7 +3,7 @@ r""" The OpenRPA package (from UnicodeLabs) """ -__version__ = 'v1.2.3' +__version__ = 'v1.2.5' __all__ = [] __author__ = 'Ivan Maslov ' #from .Core import Robot \ No newline at end of file diff --git a/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.2.3.dist-info/INSTALLER b/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.2.5.dist-info/INSTALLER similarity index 100% rename from Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.2.3.dist-info/INSTALLER rename to Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.2.5.dist-info/INSTALLER diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.3.dist-info/METADATA b/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.2.5.dist-info/METADATA similarity index 98% rename from Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.3.dist-info/METADATA rename to Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.2.5.dist-info/METADATA index ffb24fc0..0ce18453 100644 --- a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.3.dist-info/METADATA +++ b/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.2.5.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: pyOpenRPA -Version: 1.2.3 +Version: 1.2.5 Summary: First open source RPA platform for business Home-page: https://gitlab.com/UnicodeLabs/OpenRPA Author: Ivan Maslov @@ -23,7 +23,7 @@ Classifier: Topic :: Home Automation Description-Content-Type: text/markdown Requires-Dist: pillow (>=6.0.0) Requires-Dist: keyboard (>=0.13.3) -Requires-Dist: pyautogui (>=0.9.44) +Requires-Dist: pyautogui (<=0.9.52) Requires-Dist: crypto (>=1.4.1) Requires-Dist: pywinauto (>=0.6.8) ; platform_system == "win32" and python_version >= "3.0" Requires-Dist: WMI (>=1.4.9) ; platform_system == "win32" and python_version >= "3.0" diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.3.dist-info/RECORD b/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.2.5.dist-info/RECORD similarity index 96% rename from Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.3.dist-info/RECORD rename to Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.2.5.dist-info/RECORD index 36c49d75..b9987d04 100644 --- a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.3.dist-info/RECORD +++ b/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.2.5.dist-info/RECORD @@ -1,19 +1,19 @@ -pyOpenRPA-1.2.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -pyOpenRPA-1.2.3.dist-info/METADATA,sha256=JhjZUhqMXGka3uVYTABHekXvly9bG89Dm0VyfqhnUA4,3612 -pyOpenRPA-1.2.3.dist-info/RECORD,, -pyOpenRPA-1.2.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pyOpenRPA-1.2.3.dist-info/WHEEL,sha256=qB97nP5e4MrOsXW5bIU5cUn_KSVr10EV0l-GCHG9qNs,97 -pyOpenRPA-1.2.3.dist-info/top_level.txt,sha256=RPzwQXgYBRo_m5L3ZLs6Voh8aEkMeT29Xsul1w1qE0g,10 +pyOpenRPA-1.2.5.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pyOpenRPA-1.2.5.dist-info/METADATA,sha256=IeBQ9YskhMg5mmzeY-DBQVnCbKUI4pgnl8E9XLlGrQs,3612 +pyOpenRPA-1.2.5.dist-info/RECORD,, +pyOpenRPA-1.2.5.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pyOpenRPA-1.2.5.dist-info/WHEEL,sha256=qB97nP5e4MrOsXW5bIU5cUn_KSVr10EV0l-GCHG9qNs,97 +pyOpenRPA-1.2.5.dist-info/top_level.txt,sha256=RPzwQXgYBRo_m5L3ZLs6Voh8aEkMeT29Xsul1w1qE0g,10 pyOpenRPA/.idea/inspectionProfiles/profiles_settings.xml,sha256=YXLFmX7rPNGcnKK1uX1uKYPN0fpgskYNe7t0BV7cqkY,174 pyOpenRPA/.idea/misc.xml,sha256=V-fQnOz-bYEZULgfbFgm-8mURphZrKfXMSd0wKjeEyA,188 pyOpenRPA/.idea/modules.xml,sha256=Q__U1JIA2cjxbLRXAv-SfYY00fZA0TNlpkkbY4s3ncg,277 pyOpenRPA/.idea/pyOpenRPA.iml,sha256=EXh41F8lqRiSBMVg-n2tKaEaHC6_3gGSuKkPJA12Na0,408 pyOpenRPA/.idea/vcs.xml,sha256=2HygA1oRAwc3VBf-irxHrX5JJG9DXuQwrN0BlubhoKY,191 pyOpenRPA/.idea/workspace.xml,sha256=6tJZehshdK4And6tEoUvkIB0KE7waL_NnTSkTYYAeFA,3802 -pyOpenRPA/Agent/A2O.py,sha256=ZVXNamhKOB1y3j9b4gp_rzJq55Nr5pBGeoBgMnCtNKc,1657 -pyOpenRPA/Agent/O2A.py,sha256=4W2bbU34MBmuveXkPvkCzmzKAryR_YB-gnA013fxMoY,3356 +pyOpenRPA/Agent/A2O.py,sha256=PlIZZCTnVrYF2i6DSAi_KbzZfc2gtcBPmOerrEZq68U,1718 +pyOpenRPA/Agent/O2A.py,sha256=vu7UgiB0qY6-1i9qVWEBGyXWSi68TTNfkvnpMIZH7Vo,4458 pyOpenRPA/Agent/Processor.py,sha256=Co8nWpffgsnEE_TpG9WrpKxz3N0sDF7eFnKxDOk1sd8,4653 -pyOpenRPA/Agent/__Agent__.py,sha256=Id75cxA6kwed1r8NaLWHfYIyUrTZx7RPlxw1PdzropI,10006 +pyOpenRPA/Agent/__Agent__.py,sha256=JcMFvSC3_M94HEdZe8AK2IHuJOxeDJi4RpnY_LivWpM,10639 pyOpenRPA/Agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 pyOpenRPA/Agent/__pycache__/A2O.cpython-37.pyc,, pyOpenRPA/Agent/__pycache__/O2A.cpython-37.pyc,, @@ -22,7 +22,7 @@ pyOpenRPA/Agent/__pycache__/__Agent__.cpython-37.pyc,, pyOpenRPA/Agent/__pycache__/__init__.cpython-37.pyc,, pyOpenRPA/Agent/readme.md,sha256=QF_Bnv204OK3t1JUEhjfICkxFmSdX6bvaRl_HI6lH9I,19 pyOpenRPA/Info.md,sha256=u4Nv-PjniSF0Zlbtr6jEJX2vblK3_1zhSLNUgOdtDaA,85 -pyOpenRPA/Orchestrator/BackwardCompatibility.py,sha256=-pV_zaPcqD5lYz-2OXUJQ7tB2BZknd3_ci0HPHKcLFg,33110 +pyOpenRPA/Orchestrator/BackwardCompatibility.py,sha256=a2UZINDnHCKZVvHtOOPMyFZmDynzfcyQhFJCEEMhadY,34599 pyOpenRPA/Orchestrator/ControlPanel.py,sha256=OzS8HjG__8OZgqhajr8L8owyugXPuSLWHLtXuKdEP78,103 pyOpenRPA/Orchestrator/Core.py,sha256=Kjphtu0g6iaS4D_fIWmzRaLLgBQ9fcwccpQJhOETTAc,521 pyOpenRPA/Orchestrator/Processor.py,sha256=Z1SglmX6ykTLifD3M1mzWEJQUgweWo6HjjCjHldjGyM,8594 @@ -60,8 +60,8 @@ pyOpenRPA/Orchestrator/RobotScreenActive/__pycache__/Screen.cpython-37.pyc,, pyOpenRPA/Orchestrator/RobotScreenActive/__pycache__/__init__.cpython-37.pyc,, pyOpenRPA/Orchestrator/RobotScreenActive/__pycache__/__main__.cpython-37.pyc,, pyOpenRPA/Orchestrator/Server.py,sha256=Ke89zh5iZezhA_qyQ3sfWJmL9bfc1rBBYeq-WzznfsE,30432 -pyOpenRPA/Orchestrator/ServerSettings.py,sha256=Ndo30YHn6XmNDLP9hPMM1867Gyx2hcYbh0UP2H1Tx_c,31205 -pyOpenRPA/Orchestrator/SettingsTemplate.py,sha256=d6l3YrJnh8eteBUc7DX-Qu7Ioc5mZ0ZVBAkw7i0NMa0,20139 +pyOpenRPA/Orchestrator/ServerSettings.py,sha256=zVI-brV_58uKJ-MWESTZGYv89nN_0iW_-HfVNhip4jE,32890 +pyOpenRPA/Orchestrator/SettingsTemplate.py,sha256=-LIyHRKVnbrALAyss6r6L56jBX_yOAdMEhnj8N2fN9A,20532 pyOpenRPA/Orchestrator/Timer.py,sha256=HvYtEeH2Q5WVVjgds9XaBpWRmvZgwgBXurJDdVVq_T0,2097 pyOpenRPA/Orchestrator/Utils/LoggerHandlerDumpLogList.py,sha256=hD47TiOuKR-G8IWu9lJD2kG28qlH7YZV63i3qv1N5Dk,681 pyOpenRPA/Orchestrator/Utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 @@ -72,7 +72,7 @@ pyOpenRPA/Orchestrator/Web/Index.js,sha256=Blo3LHe_a3zrW7MqYo4BSIwoOx7nlO7Ko9LWx pyOpenRPA/Orchestrator/Web/Index.xhtml,sha256=a4N_reLA6_Zb2KXiL73a7cWtJwO0W0Dr5lZ-RpUwuI0,16428 pyOpenRPA/Orchestrator/Web/__pycache__/Basic.cpython-37.pyc,, pyOpenRPA/Orchestrator/Web/favicon.ico,sha256=6S8XwSQ_3FXPpaX6zYkf8uUewVXO9bHnrrDHEoWrEgw,112922 -pyOpenRPA/Orchestrator/__Orchestrator__.py,sha256=uqH9ma0C8OxnnfgZ4mMNl15rE5tc9k9v3hn6CY67PMU,111546 +pyOpenRPA/Orchestrator/__Orchestrator__.py,sha256=2WbaatF0yN1Sx3P1Zru3clMbUTq4N-ErjMmsi0V7TKE,117659 pyOpenRPA/Orchestrator/__init__.py,sha256=f1RFDzOkL3IVorCtqogjGdXYPtHH-P-y-5CqT7PGy7A,183 pyOpenRPA/Orchestrator/__main__.py,sha256=czJrc7_57WiO3EPIYfPeF_LG3pZsQVmuAYgbl_YXcVU,273 pyOpenRPA/Orchestrator/__pycache__/BackwardCompatibility.cpython-37.pyc,, @@ -341,6 +341,6 @@ pyOpenRPA/Tools/Terminator.py,sha256=VcjX3gFXiCGu3MMCidhrTNsmC9wsAqfjRJdTSU9fLnU pyOpenRPA/Tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 pyOpenRPA/Tools/__pycache__/Terminator.cpython-37.pyc,, pyOpenRPA/Tools/__pycache__/__init__.cpython-37.pyc,, -pyOpenRPA/__init__.py,sha256=O8SOldPlZbE_YguduoMHJNJaRtlVN3dHXEC0JVpQMYY,174 +pyOpenRPA/__init__.py,sha256=7jBgAILYoa342lTEQGpNGus8Zpiei0bAZkw1sVLtsGI,174 pyOpenRPA/__pycache__/__init__.cpython-37.pyc,, pyOpenRPA/test.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.2.3.dist-info/REQUESTED b/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.2.5.dist-info/REQUESTED similarity index 100% rename from Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.2.3.dist-info/REQUESTED rename to Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.2.5.dist-info/REQUESTED diff --git a/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.2.3.dist-info/WHEEL b/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.2.5.dist-info/WHEEL similarity index 100% rename from Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.2.3.dist-info/WHEEL rename to Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.2.5.dist-info/WHEEL diff --git a/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.2.3.dist-info/top_level.txt b/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.2.5.dist-info/top_level.txt similarity index 100% rename from Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.2.3.dist-info/top_level.txt rename to Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.2.5.dist-info/top_level.txt diff --git a/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA/Agent/A2O.py b/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA/Agent/A2O.py index f16cdf1d..3f302476 100644 --- a/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA/Agent/A2O.py +++ b/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA/Agent/A2O.py @@ -16,7 +16,7 @@ def _A2ODataSend(inGSettings, inDataDict): lHostStr = inGSettings["OrchestratorDict"]["HostStr"] lPortInt = inGSettings["OrchestratorDict"]["PortInt"] lURLStr=f"{lProtocolStr}://{lHostStr}:{lPortInt}/pyOpenRPA/Agent/A2O" - lResponse = requests.post(url= lURLStr, cookies = {"AuthToken":inGSettings["OrchestratorDict"]["SuperTokenStr"]}, json=inDataDict) + lResponse = requests.post(url= lURLStr, cookies = {"AuthToken":inGSettings["OrchestratorDict"]["SuperTokenStr"]}, json=inDataDict, timeout=inGSettings["A2ODict"]["ConnectionTimeoutSecFloat"]) except Exception as e: if lL: lL.exception(f"A2O Error handler.") diff --git a/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA/Agent/O2A.py b/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA/Agent/O2A.py index 38b92316..0994a0c0 100644 --- a/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA/Agent/O2A.py +++ b/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA/Agent/O2A.py @@ -26,25 +26,37 @@ def O2A_Loop(inGSettings): lPortInt = inGSettings["OrchestratorDict"]["PortInt"] lURLStr=f"{lProtocolStr}://{lHostStr}:{lPortInt}/pyOpenRPA/Agent/O2A" lDataDict = { "HostNameUpperStr": inGSettings["AgentDict"]["HostNameUpperStr"], "UserUpperStr": inGSettings["AgentDict"]["UserUpperStr"], "ActivityLastGUIDStr": lActivityLastGUIDStr} - lResponse = requests.post(url= lURLStr, cookies = {"AuthToken":inGSettings["OrchestratorDict"]["SuperTokenStr"]}, json=lDataDict) + lResponse = requests.post(url= lURLStr, cookies = {"AuthToken":inGSettings["OrchestratorDict"]["SuperTokenStr"]}, json=lDataDict, timeout=inGSettings["O2ADict"]["ConnectionTimeoutSecFloat"]) if lResponse.status_code != 200: if lL: lL.warning(f"Agent can not connect to Orchestrator. Below the response from the orchestrator:{lResponse}") time.sleep(inGSettings["O2ADict"]["RetryTimeoutSecFloat"]) else: lRequestBody = lResponse.text - lQueueItem = lResponse.json() # Try to get JSON - # Append QUEUE item in ProcessorDict > ActivityList - lActivityLastGUIDStr = lQueueItem["GUIDStr"] - inGSettings["ProcessorDict"]["ActivityList"].append(lQueueItem) - if lL: lL.debug(f"ActivityItem was received from orchestrator: {lQueueItem}"); + lBodyLenInt = len(lRequestBody) + if lBodyLenInt != 0: # CHeck if not empty result when close the connection from orch + lQueueItem = lResponse.json() # Try to get JSON + # Append QUEUE item in ProcessorDict > ActivityList + lActivityLastGUIDStr = lQueueItem["GUIDStr"] + inGSettings["ProcessorDict"]["ActivityList"].append(lQueueItem) + # Log full version if bytes size is less than limit . else short + lAgentLimitLogSizeBytesInt = 500 + if lBodyLenInt <= lAgentLimitLogSizeBytesInt: + if lL: lL.info(f"ActivityItem was received from orchestrator: {lQueueItem}"); + else: + if lL: lL.info(f"ActivityItem was received from orchestrator: Was supressed because of big size. Max is {lAgentLimitLogSizeBytesInt} bytes"); + else: + if lL: lL.debug(f"Empty response from the orchestrator - loop when refresh the connection between Orc and Agent"); except requests.exceptions.ConnectionError as e: if lL: lL.error(f"O2A Connection error - orchestrator is not available. Sleep for {inGSettings['A2ODict']['RetryTimeoutSecFloat']} s.") time.sleep(inGSettings["O2ADict"]["RetryTimeoutSecFloat"]) except ConnectionResetError as e: - if lL: lL.error(f"O2A Connection error - orchestrator is not available. Sleep for {inGSettings['A2ODict']['RetryTimeoutSecFloat']} s.") + if lL: lL.error(f"O2A Connection reset error - orchestrator is not available. Sleep for {inGSettings['A2ODict']['RetryTimeoutSecFloat']} s.") time.sleep(inGSettings["O2ADict"]["RetryTimeoutSecFloat"]) except json.decoder.JSONDecodeError as e: - if lL: lL.error(f"See body of the recieved content from the Orchestrator: {lRequestBody}") + if lL: lL.error(f"O2A JSON decode error - See body of the recieved content from the Orchestrator: {lRequestBody}") + time.sleep(inGSettings["O2ADict"]["RetryTimeoutSecFloat"]) + except requests.exceptions.Timeout as e: + if lL: lL.exception(f"O2A requests timeout error (no response for long time). Sleep for {inGSettings['A2ODict']['RetryTimeoutSecFloat']} s.") time.sleep(inGSettings["O2ADict"]["RetryTimeoutSecFloat"]) except Exception as e: if lL: lL.exception(f"O2A Error handler. Sleep for {inGSettings['A2ODict']['RetryTimeoutSecFloat']} s.") diff --git a/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA/Agent/__Agent__.py b/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA/Agent/__Agent__.py index 2ac32d21..9ac93c19 100644 --- a/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA/Agent/__Agent__.py +++ b/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA/Agent/__Agent__.py @@ -17,6 +17,20 @@ def OSFileBinaryDataBase64StrCreate(inFilePathStr, inFileDataBase64Str,inGSettin if lL: lL.info(lMessageStr) A2O.LogListSend(inGSettings=inGSettings, inLogList=[lMessageStr]) +# Append binary file by the base64 string (safe for JSON transmition) +def OSFileBinaryDataBase64StrAppend(inFilePathStr, inFileDataBase64Str,inGSettings = None): + """ + Create binary file by the base64 string (safe for JSON transmition) + + """ + lFile = open(inFilePathStr, "ab") + lFile.write(base64.b64decode(inFileDataBase64Str)) + lFile.close() + lL = inGSettings.get("Logger", None) if type(inGSettings) is dict else None + lMessageStr = f"AGENT Binary file {inFilePathStr} has been appended." + if lL: lL.info(lMessageStr) + A2O.LogListSend(inGSettings=inGSettings, inLogList=[lMessageStr]) + # Create text file by the string def OSFileTextDataStrCreate(inFilePathStr, inFileDataStr, inEncodingStr = "utf-8",inGSettings = None): """ diff --git a/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA/Orchestrator/BackwardCompatibility.py b/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA/Orchestrator/BackwardCompatibility.py index 2bfac13b..727376ee 100644 --- a/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA/Orchestrator/BackwardCompatibility.py +++ b/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA/Orchestrator/BackwardCompatibility.py @@ -468,4 +468,24 @@ def Update(inGSettings): } } if lL: lL.warning( - f"Backward compatibility (v1.2.2 to v1.2.3): Add new key ServerDict > ListenDict. Transfer port from ServerDict > ListenPort") # Log about compatibility \ No newline at end of file + f"Backward compatibility (v1.2.2 to v1.2.3): Add new key ServerDict > ListenDict. Transfer port from ServerDict > ListenPort") # Log about compatibility + # Add new key + #"ServerDict": { + # "AgentFileChunkBytesSizeInt": 50000000, # size of the each chunk for the agent transmition + # "AgentFileChunkCheckIntervalSecFloat": 0.2, # The interval for check last activity item was successfully sent + if "AgentFileChunkBytesSizeInt" not in inGSettings["ServerDict"]: + inGSettings["ServerDict"]["AgentFileChunkBytesSizeInt"]= 50000000 + if lL: lL.warning( + f"Backward compatibility (v1.2.3 to v1.2.4): Add new key ServerDict > AgentFileChunkBytesSizeInt") # Log about compatibility + if "AgentFileChunkCheckIntervalSecFloat" not in inGSettings["ServerDict"]: + inGSettings["ServerDict"]["AgentFileChunkCheckIntervalSecFloat"]= 0.2 + if lL: lL.warning( + f"Backward compatibility (v1.2.3 to v1.2.4): Add new key ServerDict > AgentFileChunkCheckIntervalSecFloat") # Log about compatibility + if "ServerThread" not in inGSettings["ServerDict"]: + inGSettings["ServerDict"]["ServerThread"]= None + if lL: lL.warning( + f"Backward compatibility (v1.2.3 to v1.2.4): Add new key ServerDict > ServerThread") # Log about compatibility + if "AgentLimitLogSizeBytesInt" not in inGSettings["ServerDict"]: + inGSettings["ServerDict"]["AgentLimitLogSizeBytesInt"] = 300 + if lL: lL.warning( + f"Backward compatibility (v1.2.3 to v1.2.4): Add new key ServerDict > AgentLimitLogSizeBytesInt") # Log about compatibility \ No newline at end of file diff --git a/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA/Orchestrator/ServerSettings.py b/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA/Orchestrator/ServerSettings.py index b3197ee8..ed09b85f 100644 --- a/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA/Orchestrator/ServerSettings.py +++ b/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA/Orchestrator/ServerSettings.py @@ -397,8 +397,16 @@ def pyOpenRPA_Agent_O2A(inRequest, inGSettings): lReturnActivityItemDict = copy.deepcopy(lReturnActivityItemDict) if "CreatedByDatetime" in lReturnActivityItemDict: del lReturnActivityItemDict["CreatedByDatetime"] - if lL: lL.info(f"Activity item to agent Hostname {lInput['HostNameUpperStr']}, User {lInput['UserUpperStr']}. Activity item: {lReturnActivityItemDict}") inRequest.OpenRPAResponseDict["Body"] = bytes(json.dumps(lReturnActivityItemDict), "utf8") + # Log full version if bytes size is less than limit . else short + lBodyLenInt = len(inRequest.OpenRPAResponseDict["Body"]) + lAgentLimitLogSizeBytesInt = inGSettings["ServerDict"]["AgentLimitLogSizeBytesInt"] + if lBodyLenInt <= lAgentLimitLogSizeBytesInt: + if lL: lL.info(f"Activity item to agent Hostname {lInput['HostNameUpperStr']}, User {lInput['UserUpperStr']}. Activity item: {lReturnActivityItemDict}") + else: + if lL: lL.info( + f"Activity item to agent Hostname {lInput['HostNameUpperStr']}, User {lInput['UserUpperStr']}. " + f"Activity item: Was suppressed because of body size of {lBodyLenInt} bytes. Max is {lAgentLimitLogSizeBytesInt}") lDoLoopBool = False # CLose the connection else: # Nothing to send - sleep for the next iteration time.sleep(lAgentLoopSleepSecFloat) @@ -417,6 +425,7 @@ def pyOpenRPA_Agent_A2O(inRequest, inGSettings): lInputByteArray = inRequest.rfile.read(lInputByteArrayLength) # Превращение массива байт в объект lInput = json.loads(lInputByteArray.decode('utf8')) + lAgentDictItemKeyTurple = (lInput["HostNameUpperStr"], lInput["UserUpperStr"]) if "LogList" in lInput: for lLogItemStr in lInput["LogList"]: inGSettings["Logger"].info(lLogItemStr) @@ -426,7 +435,17 @@ def pyOpenRPA_Agent_A2O(inRequest, inGSettings): # Create item in gSettings inGSettings["AgentActivityReturnDict"][lActivityReturnItemKeyStr]=SettingsTemplate.__AgentActivityReturnDictItemCreate__(inReturn=lActivityReturnItemValue) if lL: lL.debug(f"SERVER: pyOpenRPA_Agent_A2O:: Has recieved result of the activity items from agent! ActivityItem GUID Str: {lActivityReturnItemKeyStr}; Return value: {lActivityReturnItemValue}") - + # Delete the source activity item from AgentDict + if lAgentDictItemKeyTurple in inGSettings["AgentDict"]: + lAgentDictActivityListNew = [] + lAgentDict = inGSettings["AgentDict"][lAgentDictItemKeyTurple] + for lActivityItem in lAgentDict["ActivityList"]: + if lActivityReturnItemKeyStr != lActivityItem.get("GUIDStr",None): + lAgentDictActivityListNew.append(lActivityItem) + else: + del lActivityItem + if lL: lL.debug(f"SERVER: pyOpenRPA_Agent_A2O:: Source activity item request was deleted from the orchestrator. ActivityItem GUID Str: {lActivityReturnItemKeyStr}") + inGSettings["AgentDict"][lAgentDictItemKeyTurple]["ActivityList"] = lAgentDictActivityListNew def SettingsUpdate(inGlobalConfiguration): import os import pyOpenRPA.Orchestrator diff --git a/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA/Orchestrator/SettingsTemplate.py b/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA/Orchestrator/SettingsTemplate.py index 923a0ce1..242ddf55 100644 --- a/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA/Orchestrator/SettingsTemplate.py +++ b/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA/Orchestrator/SettingsTemplate.py @@ -39,9 +39,13 @@ def __Create__(): # # # # # # # # # # # # # # # # # # }, "ServerDict": { + "AgentLimitLogSizeBytesInt": 300, # Don't show body if json body of transmition is more than + "ServerThread": None, # Server thread is there "AgentActivityLifetimeSecFloat": 1200.0, # Time in seconds to life for activity for the agent "AgentConnectionLifetimeSecFloat": 300.0, # Time in seconds to handle the open connection to the Agent "AgentLoopSleepSecFloat": 2.0, # Time in seconds to sleep between loops when check to send some activity to the agent + "AgentFileChunkBytesSizeInt": 50000000, # size of the each chunk for the agent transmition + "AgentFileChunkCheckIntervalSecFloat": 0.2, # The interval for check last activity item was successfully sent "WorkingDirectoryPathStr": None, # Will be filled automatically "RequestTimeoutSecFloat": 300, # Time to handle request in seconds, "ListenDict": { # Prototype diff --git a/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA/Orchestrator/__Orchestrator__.py b/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA/Orchestrator/__Orchestrator__.py index 366db88b..805472d0 100644 --- a/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA/Orchestrator/__Orchestrator__.py +++ b/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA/Orchestrator/__Orchestrator__.py @@ -26,6 +26,7 @@ from .RobotScreenActive import Monitor #Start robot screen active from . import SettingsTemplate # Settings template import uuid # Generate uuid import datetime # datetime +import math #Единый глобальный словарь (За основу взять из Settings.py) gSettingsDict = None @@ -60,6 +61,26 @@ def AgentActivityItemAdd(inGSettings, inHostNameStr, inUserStr, inActivityItemDi # Return the result return lGUIDStr + +def AgentActivityItemExists(inGSettings, inHostNameStr, inUserStr, inGUIDStr): + """ + Check by GUID if ActivityItem has exists in request list. If exist - the result response has not been recieved from the agent + + :param inGSettings: Global settings dict (singleton) + :param inGUIDStr: GUID String of the ActivityItem + :return: True - ActivityItem is exist in AgentDict ; False - else case + """ + # Check if GUID is exists in dict - has been recieved + # Main alg + lAgentDictItemKeyTurple = (inHostNameStr.upper(),inUserStr.upper()) + lResultBool = False + if lAgentDictItemKeyTurple in inGSettings["AgentDict"]: + for lActivityItem in inGSettings["AgentDict"][lAgentDictItemKeyTurple]["ActivityList"]: + if inGUIDStr == lActivityItem.get("GUIDStr",None): + lResultBool = True + break + return lResultBool + def AgentActivityItemReturnExists(inGSettings, inGUIDStr): """ Check by GUID if ActivityItem has been executed and result has come to the Orchestrator @@ -117,6 +138,73 @@ def AgentOSCMD(inGSettings, inHostNameStr, inUserStr, inCMDStr, inRunAsyncBool=T #Send item in AgentDict for the futher data transmition return AgentActivityItemAdd(inGSettings=inGSettings, inHostNameStr=inHostNameStr, inUserStr=inUserStr, inActivityItemDict=lActivityItemDict) + +def AgentOSFileSend(inGSettings, inHostNameStr, inUserStr, inOrchestratorFilePathStr, inAgentFilePathStr): + """ + Send the file from the Orchestrator to Agent (synchroniously) pyOpenRPA.Agent daemon process (safe for JSON transmition). + Work safety with big files + Thread safe - you can call def even if you dont init the orchestrator - def will be executed later + + :param inGSettings: Global settings dict (singleton) + :param inHostNameStr: + :param inUserStr: + :param inFilePathStr: + :param inFileDataBytes: + :return: GUID String of the ActivityItem - you can wait (sync or async) result by this guid! + """ + + + # Check thread + if inGSettings["ServerDict"]["ServerThread"] is None: + if inGSettings["Logger"]: inGSettings["Logger"].warning(f"AgentOSFileSend run before server init - activity will be append in the processor queue.") + lResult = { + "Def": AgentOSFileSend, # def link or def alias (look gSettings["Processor"]["AliasDefDict"]) + "ArgList": [], # Args list + "ArgDict": {"inHostNameStr":inHostNameStr, "inUserStr":inUserStr, "inOrchestratorFilePathStr":inOrchestratorFilePathStr, "inAgentFilePathStr": inAgentFilePathStr}, # 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) + } + inGSettings["ProcessorDict"]["ActivityList"].append(lResult) + else: # In processor - do execution + lActivityItemCheckIntervalSecFloat = inGSettings["ServerDict"]["AgentFileChunkCheckIntervalSecFloat"] + + # Get the chunk limit + lChunkByteSizeInt = inGSettings["ServerDict"]["AgentFileChunkBytesSizeInt"] + + lL = inGSettings.get("Logger",None) + + # Open the file and get the size (in bytes) + lFile = open(inOrchestratorFilePathStr,"rb") + lFileSizeBytesInt = lFile.seek(0,2) + lFile.seek(0) + #import pdb + #pdb.set_trace() + lChunkCountInt = math.ceil(lFileSizeBytesInt/lChunkByteSizeInt) + if lL: lL.info(f"O2A: Start to send binary file via chunks. Chunk count: {lChunkCountInt}, From (Orch side): {inOrchestratorFilePathStr}, To (Agent side): {inAgentFilePathStr}") + for lChunkNumberInt in range(lChunkCountInt): + # Read chunk + lFileChunkBytes = lFile.read(lChunkByteSizeInt) + # Convert to base64 + lFileChunkBase64Str = base64.b64encode(lFileChunkBytes).decode("utf-8") + # Send chunk + if lChunkNumberInt == 0: + lActivityItemGUIDStr = AgentOSFileBinaryDataBase64StrCreate(inGSettings=inGSettings,inHostNameStr=inHostNameStr, + inUserStr=inUserStr,inFilePathStr=inAgentFilePathStr, + inFileDataBase64Str=lFileChunkBase64Str) + else: + lActivityItemGUIDStr = AgentOSFileBinaryDataBase64StrAppend(inGSettings=inGSettings, inHostNameStr=inHostNameStr, + inUserStr=inUserStr, inFilePathStr=inAgentFilePathStr, + inFileDataBase64Str=lFileChunkBase64Str) + # Wait for the activity will be deleted + while AgentActivityItemExists(inGSettings=inGSettings,inHostNameStr=inHostNameStr,inUserStr=inUserStr,inGUIDStr=lActivityItemGUIDStr): + time.sleep(lActivityItemCheckIntervalSecFloat) + if lL: lL.debug( + f"O2A: BINARY SEND: Current chunk index: {lChunkNumberInt}") + if lL: lL.info( + f"O2A: BINARY SEND: Transmition has been complete") + # Close the file + lFile.close() + def AgentOSFileBinaryDataBytesCreate(inGSettings, inHostNameStr, inUserStr, inFilePathStr, inFileDataBytes): """ Create binary file by the base64 string by the pyOpenRPA.Agent daemon process (safe for JSON transmition) @@ -163,6 +251,30 @@ def AgentOSFileBinaryDataBase64StrCreate(inGSettings, inHostNameStr, inUserStr, #Send item in AgentDict for the futher data transmition return AgentActivityItemAdd(inGSettings=inGSettings, inHostNameStr=inHostNameStr, inUserStr=inUserStr, inActivityItemDict=lActivityItemDict) + +def AgentOSFileBinaryDataBase64StrAppend(inGSettings, inHostNameStr, inUserStr, inFilePathStr, inFileDataBase64Str): + """ + Append binary file by the base64 string by the pyOpenRPA.Agent daemon process (safe for JSON transmission) + + :param inGSettings: Global settings dict (singleton) + :param inHostNameStr: + :param inUserStr: + :param inFilePathStr: + :param inFileDataBase64Str: + :return: GUID String of the ActivityItem - you can wait (sync or async) result by this guid! + """ + + lActivityItemDict = { + "Def":"OSFileBinaryDataBase64StrAppend", # def alias (look pyOpeRPA.Agent gSettings["ProcessorDict"]["AliasDefDict"]) + "ArgList":[], # Args list + "ArgDict":{"inFilePathStr":inFilePathStr,"inFileDataBase64Str":inFileDataBase64Str}, # 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) + + # Send text file to Agent (string) def AgentOSFileTextDataStrCreate(inGSettings, inHostNameStr, inUserStr, inFilePathStr, inFileDataStr, inEncodingStr = "utf-8"): """ @@ -2036,6 +2148,7 @@ def Orchestrator(inGSettings, inDumpRestoreBool = True, inRunAsAdministratorBool lItemDict = lListenDict[lItemKeyStr] lThreadServer = Server.RobotDaemonServer(lItemKeyStr, gSettingsDict) lThreadServer.start() + gSettingsDict["ServerDict"]["ServerThread"] = lThreadServer lItemDict["ServerInstance"] = lThreadServer # Init the RobotScreenActive in another thread diff --git a/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA/__init__.py b/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA/__init__.py index aeff0887..a01645a7 100644 --- a/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA/__init__.py +++ b/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA/__init__.py @@ -3,7 +3,7 @@ r""" The OpenRPA package (from UnicodeLabs) """ -__version__ = 'v1.2.3' +__version__ = 'v1.2.5' __all__ = [] __author__ = 'Ivan Maslov ' #from .Core import Robot \ No newline at end of file diff --git a/Sources/pyOpenRPA/__init__.py b/Sources/pyOpenRPA/__init__.py index aeff0887..a01645a7 100644 --- a/Sources/pyOpenRPA/__init__.py +++ b/Sources/pyOpenRPA/__init__.py @@ -3,7 +3,7 @@ r""" The OpenRPA package (from UnicodeLabs) """ -__version__ = 'v1.2.3' +__version__ = 'v1.2.5' __all__ = [] __author__ = 'Ivan Maslov ' #from .Core import Robot \ No newline at end of file diff --git a/Sources/setup.py b/Sources/setup.py index acc919a3..5c206a07 100644 --- a/Sources/setup.py +++ b/Sources/setup.py @@ -53,7 +53,7 @@ setup(name='pyOpenRPA', install_requires=[ 'pywinauto>=0.6.8;platform_system=="win32" and python_version>="3.0"', 'WMI>=1.4.9;platform_system=="win32" and python_version>="3.0"', - 'pillow>=6.0.0','keyboard>=0.13.3','pyautogui>=0.9.44 and pyautogui<=0.9.52', + 'pillow>=6.0.0','keyboard>=0.13.3','pyautogui<=0.9.52', 'pywin32>=224;platform_system=="win32" and python_version>="3.0"', 'crypto>=1.4.1' #'pywin32>=224;platform_system=="Linux" and python_version>="3.0"', 'crypto>=1.4.1' ], diff --git a/Wiki/ENG_Guide/html/Agent/02_Defs.html b/Wiki/ENG_Guide/html/Agent/02_Defs.html index f9e9b5a7..d30b7fb3 100644 --- a/Wiki/ENG_Guide/html/Agent/02_Defs.html +++ b/Wiki/ENG_Guide/html/Agent/02_Defs.html @@ -199,19 +199,22 @@

OSCMD(inCMDStr[, inRunAsyncBool, …])

Execute CMD on the Agent daemonic process

-

OSFileBinaryDataBase64StrCreate(…[, …])

+

OSFileBinaryDataBase64StrAppend(…[, …])

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

-

OSFileBinaryDataBase64StrReceive(inFilePathStr)

+

OSFileBinaryDataBase64StrCreate(…[, …])

+

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

+ +

OSFileBinaryDataBase64StrReceive(inFilePathStr)

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

-

OSFileTextDataStrCreate(inFilePathStr, …)

+

OSFileTextDataStrCreate(inFilePathStr, …)

Create text file in the agent GUI session

-

OSFileTextDataStrReceive(inFilePathStr[, …])

+

OSFileTextDataStrReceive(inFilePathStr[, …])

Read text file in the agent GUI session

-

ProcessWOExeUpperUserListGet()

+

ProcessWOExeUpperUserListGet()

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

@@ -235,6 +238,12 @@ :return:

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

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

+
+
pyOpenRPA.Agent.__Agent__.OSFileBinaryDataBase64StrCreate(inFilePathStr, inFileDataBase64Str, inGSettings=None)[source]
diff --git a/Wiki/ENG_Guide/html/Orchestrator/02_Defs.html b/Wiki/ENG_Guide/html/Orchestrator/02_Defs.html index 7de85958..993087d9 100644 --- a/Wiki/ENG_Guide/html/Orchestrator/02_Defs.html +++ b/Wiki/ENG_Guide/html/Orchestrator/02_Defs.html @@ -261,15 +261,21 @@

AgentActivityItemAdd(inGSettings, …)

Add activity in AgentDict.

-

AgentActivityItemReturnExists(inGSettings, …)

+

AgentActivityItemExists(inGSettings, …)

+

Check by GUID if ActivityItem has exists in request list.

+ +

AgentActivityItemReturnExists(inGSettings, …)

Check by GUID if ActivityItem has been executed and result has come to the Orchestrator

-

AgentActivityItemReturnGet(inGSettings, …)

+

AgentActivityItemReturnGet(inGSettings, …)

Work synchroniously! Wait while result will be recieved.

-

AgentOSCMD(inGSettings, inHostNameStr, …)

+

AgentOSCMD(inGSettings, inHostNameStr, …)

Send CMD to OS thought the pyOpenRPA.Agent daemon.

+

AgentOSFileBinaryDataBase64StrAppend(…)

+

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

+

AgentOSFileBinaryDataBase64StrCreate(…)

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

@@ -279,163 +285,166 @@

AgentOSFileBinaryDataBytesCreate(…)

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

-

AgentOSFileTextDataStrCreate(inGSettings, …)

+

AgentOSFileSend(inGSettings, inHostNameStr, …)

+

Send the file from the Orchestrator to Agent (synchroniously) pyOpenRPA.Agent daemon process (safe for JSON transmition).

+ +

AgentOSFileTextDataStrCreate(inGSettings, …)

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

-

AgentOSFileTextDataStrReceive(inGSettings, …)

+

AgentOSFileTextDataStrReceive(inGSettings, …)

Read text file in the agent GUI session

-

AgentProcessWOExeUpperUserListGet(…)

+

AgentProcessWOExeUpperUserListGet(…)

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

-

GSettingsAutocleaner(inGSettings)

+

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.

-

OSRemotePCRestart(inLogger, inHostStr[, …])

+

OSRemotePCRestart(inLogger, inHostStr[, …])

Send signal via power shell to restart remote PC ATTENTION: Orchestrator user need to have restart right on the Remote machine to restart PC.

-

OrchestratorIsAdmin()

+

OrchestratorIsAdmin()

Check if Orchestrator process is running as administrator

-

OrchestratorRerunAsAdmin()

+

OrchestratorRerunAsAdmin()

Check if not admin - then rerun orchestrator as administrator

-

OrchestratorRestart([inGSettings])

+

OrchestratorRestart([inGSettings])

Orchestrator restart

-

OrchestratorSessionRestore(inGSettings)

+

OrchestratorSessionRestore(inGSettings)

Check _SessionLast_RDPList.json and _SessionLast_StorageDict.pickle in working directory. if exist - load into gsettings # _SessionLast_StorageDict.pickle (binary) _SessionLast_RDPList.json (encoding = “utf-8”) _SessionLast_StorageDict.pickle (binary).

-

OrchestratorSessionSave(inGSettings)

+

OrchestratorSessionSave(inGSettings)

Orchestrator session save in file

-

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.

-

WebAuditMessageCreate(inRequest[, …])

+

WebAuditMessageCreate(inRequest[, …])

Create message string with request user details (IP, Login etc…).

-

WebCPUpdate(inGSettings, inCPKeyStr[, …])

+

WebCPUpdate(inGSettings, inCPKeyStr[, …])

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

-

WebListenCreate(inGSettings[, …])

+

WebListenCreate(inGSettings[, …])

Create listen interface for the web server

-

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 {…}

@@ -459,6 +468,23 @@
+
+
+pyOpenRPA.Orchestrator.__Orchestrator__.AgentActivityItemExists(inGSettings, inHostNameStr, inUserStr, inGUIDStr)[source]
+

Check by GUID if ActivityItem has exists in request list. If exist - the result response has not been recieved from the agent

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

  • +
  • inGUIDStr – GUID String of the ActivityItem

  • +
+
+
Returns
+

True - ActivityItem is exist in AgentDict ; False - else case

+
+
+
+
pyOpenRPA.Orchestrator.__Orchestrator__.AgentActivityItemReturnExists(inGSettings, inGUIDStr)[source]
@@ -517,6 +543,26 @@
+
+
+pyOpenRPA.Orchestrator.__Orchestrator__.AgentOSFileBinaryDataBase64StrAppend(inGSettings, inHostNameStr, inUserStr, inFilePathStr, inFileDataBase64Str)[source]
+

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

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

  • +
  • inHostNameStr

  • +
  • inUserStr

  • +
  • inFilePathStr

  • +
  • inFileDataBase64Str

  • +
+
+
Returns
+

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

+
+
+
+
pyOpenRPA.Orchestrator.__Orchestrator__.AgentOSFileBinaryDataBase64StrCreate(inGSettings, inHostNameStr, inUserStr, inFilePathStr, inFileDataBase64Str)[source]
@@ -576,6 +622,32 @@
+
+
+pyOpenRPA.Orchestrator.__Orchestrator__.AgentOSFileSend(inGSettings, inHostNameStr, inUserStr, inOrchestratorFilePathStr, inAgentFilePathStr)[source]
+

Send the file from the Orchestrator to Agent (synchroniously) pyOpenRPA.Agent daemon process (safe for JSON transmition). +Work safety with big files +Thread safe - you can call def even if you dont init the orchestrator - def will be executed later

+
+
+
param inGSettings
+

Global settings dict (singleton)

+
+
param inHostNameStr
+

+
param inUserStr
+

+
param inFilePathStr
+

+
param inFileDataBytes
+

+
return
+

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

+
+
+
+
+
pyOpenRPA.Orchestrator.__Orchestrator__.AgentOSFileTextDataStrCreate(inGSettings, inHostNameStr, inUserStr, inFilePathStr, inFileDataStr, inEncodingStr='utf-8')[source]
diff --git a/Wiki/ENG_Guide/html/Orchestrator/03_gSettingsTemplate.html b/Wiki/ENG_Guide/html/Orchestrator/03_gSettingsTemplate.html index 235974da..a8bfa1c2 100644 --- a/Wiki/ENG_Guide/html/Orchestrator/03_gSettingsTemplate.html +++ b/Wiki/ENG_Guide/html/Orchestrator/03_gSettingsTemplate.html @@ -226,9 +226,13 @@ # # # # # # # # # # # # # # # # # # }, "ServerDict": { + "AgentLimitLogSizeBytesInt": 300, # Don't show body if json body of transmition is more than + "ServerThread": None, # Server thread is there "AgentActivityLifetimeSecFloat": 1200.0, # Time in seconds to life for activity for the agent "AgentConnectionLifetimeSecFloat": 300.0, # Time in seconds to handle the open connection to the Agent "AgentLoopSleepSecFloat": 2.0, # Time in seconds to sleep between loops when check to send some activity to the agent + "AgentFileChunkBytesSizeInt": 50000000, # size of the each chunk for the agent transmition + "AgentFileChunkCheckIntervalSecFloat": 0.2, # The interval for check last activity item was successfully sent "WorkingDirectoryPathStr": None, # Will be filled automatically "RequestTimeoutSecFloat": 300, # Time to handle request in seconds, "ListenDict": { # Prototype diff --git a/Wiki/ENG_Guide/html/_modules/pyOpenRPA/Agent/__Agent__.html b/Wiki/ENG_Guide/html/_modules/pyOpenRPA/Agent/__Agent__.html index 3ab64f78..0308047c 100644 --- a/Wiki/ENG_Guide/html/_modules/pyOpenRPA/Agent/__Agent__.html +++ b/Wiki/ENG_Guide/html/_modules/pyOpenRPA/Agent/__Agent__.html @@ -198,6 +198,20 @@ if lL: lL.info(lMessageStr) A2O.LogListSend(inGSettings=inGSettings, inLogList=[lMessageStr]) +# Append binary file by the base64 string (safe for JSON transmition) +
[docs]def OSFileBinaryDataBase64StrAppend(inFilePathStr, inFileDataBase64Str,inGSettings = None): + """ + Create binary file by the base64 string (safe for JSON transmition) + + """ + lFile = open(inFilePathStr, "ab") + lFile.write(base64.b64decode(inFileDataBase64Str)) + lFile.close() + lL = inGSettings.get("Logger", None) if type(inGSettings) is dict else None + lMessageStr = f"AGENT Binary file {inFilePathStr} has been appended." + if lL: lL.info(lMessageStr) + A2O.LogListSend(inGSettings=inGSettings, inLogList=[lMessageStr])
+ # Create text file by the string
[docs]def OSFileTextDataStrCreate(inFilePathStr, inFileDataStr, inEncodingStr = "utf-8",inGSettings = None): """ diff --git a/Wiki/ENG_Guide/html/_modules/pyOpenRPA/Orchestrator/__Orchestrator__.html b/Wiki/ENG_Guide/html/_modules/pyOpenRPA/Orchestrator/__Orchestrator__.html index ba5d1a6a..f12fe695 100644 --- a/Wiki/ENG_Guide/html/_modules/pyOpenRPA/Orchestrator/__Orchestrator__.html +++ b/Wiki/ENG_Guide/html/_modules/pyOpenRPA/Orchestrator/__Orchestrator__.html @@ -207,6 +207,7 @@ from . import SettingsTemplate # Settings template import uuid # Generate uuid import datetime # datetime +import math #Единый глобальный словарь (За основу взять из Settings.py) gSettingsDict = None @@ -241,6 +242,26 @@ # Return the result return lGUIDStr
+ +
[docs]def AgentActivityItemExists(inGSettings, inHostNameStr, inUserStr, inGUIDStr): + """ + Check by GUID if ActivityItem has exists in request list. If exist - the result response has not been recieved from the agent + + :param inGSettings: Global settings dict (singleton) + :param inGUIDStr: GUID String of the ActivityItem + :return: True - ActivityItem is exist in AgentDict ; False - else case + """ + # Check if GUID is exists in dict - has been recieved + # Main alg + lAgentDictItemKeyTurple = (inHostNameStr.upper(),inUserStr.upper()) + lResultBool = False + if lAgentDictItemKeyTurple in inGSettings["AgentDict"]: + for lActivityItem in inGSettings["AgentDict"][lAgentDictItemKeyTurple]["ActivityList"]: + if inGUIDStr == lActivityItem.get("GUIDStr",None): + lResultBool = True + break + return lResultBool
+
[docs]def AgentActivityItemReturnExists(inGSettings, inGUIDStr): """ Check by GUID if ActivityItem has been executed and result has come to the Orchestrator @@ -298,6 +319,73 @@ #Send item in AgentDict for the futher data transmition return AgentActivityItemAdd(inGSettings=inGSettings, inHostNameStr=inHostNameStr, inUserStr=inUserStr, inActivityItemDict=lActivityItemDict)
+ +
[docs]def AgentOSFileSend(inGSettings, inHostNameStr, inUserStr, inOrchestratorFilePathStr, inAgentFilePathStr): + """ + Send the file from the Orchestrator to Agent (synchroniously) pyOpenRPA.Agent daemon process (safe for JSON transmition). + Work safety with big files + Thread safe - you can call def even if you dont init the orchestrator - def will be executed later + + :param inGSettings: Global settings dict (singleton) + :param inHostNameStr: + :param inUserStr: + :param inFilePathStr: + :param inFileDataBytes: + :return: GUID String of the ActivityItem - you can wait (sync or async) result by this guid! + """ + + + # Check thread + if inGSettings["ServerDict"]["ServerThread"] is None: + if inGSettings["Logger"]: inGSettings["Logger"].warning(f"AgentOSFileSend run before server init - activity will be append in the processor queue.") + lResult = { + "Def": AgentOSFileSend, # def link or def alias (look gSettings["Processor"]["AliasDefDict"]) + "ArgList": [], # Args list + "ArgDict": {"inHostNameStr":inHostNameStr, "inUserStr":inUserStr, "inOrchestratorFilePathStr":inOrchestratorFilePathStr, "inAgentFilePathStr": inAgentFilePathStr}, # 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) + } + inGSettings["ProcessorDict"]["ActivityList"].append(lResult) + else: # In processor - do execution + lActivityItemCheckIntervalSecFloat = inGSettings["ServerDict"]["AgentFileChunkCheckIntervalSecFloat"] + + # Get the chunk limit + lChunkByteSizeInt = inGSettings["ServerDict"]["AgentFileChunkBytesSizeInt"] + + lL = inGSettings.get("Logger",None) + + # Open the file and get the size (in bytes) + lFile = open(inOrchestratorFilePathStr,"rb") + lFileSizeBytesInt = lFile.seek(0,2) + lFile.seek(0) + #import pdb + #pdb.set_trace() + lChunkCountInt = math.ceil(lFileSizeBytesInt/lChunkByteSizeInt) + if lL: lL.info(f"O2A: Start to send binary file via chunks. Chunk count: {lChunkCountInt}, From (Orch side): {inOrchestratorFilePathStr}, To (Agent side): {inAgentFilePathStr}") + for lChunkNumberInt in range(lChunkCountInt): + # Read chunk + lFileChunkBytes = lFile.read(lChunkByteSizeInt) + # Convert to base64 + lFileChunkBase64Str = base64.b64encode(lFileChunkBytes).decode("utf-8") + # Send chunk + if lChunkNumberInt == 0: + lActivityItemGUIDStr = AgentOSFileBinaryDataBase64StrCreate(inGSettings=inGSettings,inHostNameStr=inHostNameStr, + inUserStr=inUserStr,inFilePathStr=inAgentFilePathStr, + inFileDataBase64Str=lFileChunkBase64Str) + else: + lActivityItemGUIDStr = AgentOSFileBinaryDataBase64StrAppend(inGSettings=inGSettings, inHostNameStr=inHostNameStr, + inUserStr=inUserStr, inFilePathStr=inAgentFilePathStr, + inFileDataBase64Str=lFileChunkBase64Str) + # Wait for the activity will be deleted + while AgentActivityItemExists(inGSettings=inGSettings,inHostNameStr=inHostNameStr,inUserStr=inUserStr,inGUIDStr=lActivityItemGUIDStr): + time.sleep(lActivityItemCheckIntervalSecFloat) + if lL: lL.debug( + f"O2A: BINARY SEND: Current chunk index: {lChunkNumberInt}") + if lL: lL.info( + f"O2A: BINARY SEND: Transmition has been complete") + # Close the file + lFile.close()
+
[docs]def AgentOSFileBinaryDataBytesCreate(inGSettings, inHostNameStr, inUserStr, inFilePathStr, inFileDataBytes): """ Create binary file by the base64 string by the pyOpenRPA.Agent daemon process (safe for JSON transmition) @@ -344,6 +432,30 @@ #Send item in AgentDict for the futher data transmition return AgentActivityItemAdd(inGSettings=inGSettings, inHostNameStr=inHostNameStr, inUserStr=inUserStr, inActivityItemDict=lActivityItemDict)
+ +
[docs]def AgentOSFileBinaryDataBase64StrAppend(inGSettings, inHostNameStr, inUserStr, inFilePathStr, inFileDataBase64Str): + """ + Append binary file by the base64 string by the pyOpenRPA.Agent daemon process (safe for JSON transmission) + + :param inGSettings: Global settings dict (singleton) + :param inHostNameStr: + :param inUserStr: + :param inFilePathStr: + :param inFileDataBase64Str: + :return: GUID String of the ActivityItem - you can wait (sync or async) result by this guid! + """ + + lActivityItemDict = { + "Def":"OSFileBinaryDataBase64StrAppend", # def alias (look pyOpeRPA.Agent gSettings["ProcessorDict"]["AliasDefDict"]) + "ArgList":[], # Args list + "ArgDict":{"inFilePathStr":inFilePathStr,"inFileDataBase64Str":inFileDataBase64Str}, # 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)
+ + # Send text file to Agent (string)
[docs]def AgentOSFileTextDataStrCreate(inGSettings, inHostNameStr, inUserStr, inFilePathStr, inFileDataStr, inEncodingStr = "utf-8"): """ @@ -2217,6 +2329,7 @@ lItemDict = lListenDict[lItemKeyStr] lThreadServer = Server.RobotDaemonServer(lItemKeyStr, gSettingsDict) lThreadServer.start() + gSettingsDict["ServerDict"]["ServerThread"] = lThreadServer lItemDict["ServerInstance"] = lThreadServer # Init the RobotScreenActive in another thread diff --git a/Wiki/ENG_Guide/html/genindex.html b/Wiki/ENG_Guide/html/genindex.html index c4fca017..3be0eab4 100644 --- a/Wiki/ENG_Guide/html/genindex.html +++ b/Wiki/ENG_Guide/html/genindex.html @@ -198,6 +198,8 @@