fix studio bug when last previous update was released

dev-linux v1.2.12
Ivan Maslov 2 years ago
parent 0c8e19c3a9
commit 2bebe2b50f

@ -38,9 +38,9 @@ def JSInitGenerator():
lJSCheckVersion=""" lJSCheckVersion="""
lT = 9; lT = 9;
lY="123"; lY="123";
console.log(lT+1); //console.log(lT+1);
if (lT==9) { if (lT==9) {
alert(123) //alert(123)
} }
""" """
return lJSCheckVersion return lJSCheckVersion

@ -1,6 +1,6 @@
Metadata-Version: 2.1 Metadata-Version: 2.1
Name: pyOpenRPA Name: pyOpenRPA
Version: 1.2.11 Version: 1.2.12
Summary: First open source RPA platform for business Summary: First open source RPA platform for business
Home-page: https://pyopenrpa.ru/ Home-page: https://pyopenrpa.ru/
Author: Ivan Maslov Author: Ivan Maslov

@ -1,9 +1,15 @@
pyOpenRPA-1.2.11.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 pyOpenRPA-1.2.12.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
pyOpenRPA-1.2.11.dist-info/METADATA,sha256=00ANxuQ6IhCU9XYTBsBT-5f_0UnlV7gRLBbUV03dUsE,4111 pyOpenRPA-1.2.12.dist-info/METADATA,sha256=AmdWISfrdsF9DvjBrn42JJUXBb-TLln5OFBWKxX0VaE,4111
pyOpenRPA-1.2.11.dist-info/RECORD,, pyOpenRPA-1.2.12.dist-info/RECORD,,
pyOpenRPA-1.2.11.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 pyOpenRPA-1.2.12.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
pyOpenRPA-1.2.11.dist-info/WHEEL,sha256=qB97nP5e4MrOsXW5bIU5cUn_KSVr10EV0l-GCHG9qNs,97 pyOpenRPA-1.2.12.dist-info/WHEEL,sha256=qB97nP5e4MrOsXW5bIU5cUn_KSVr10EV0l-GCHG9qNs,97
pyOpenRPA-1.2.11.dist-info/top_level.txt,sha256=RPzwQXgYBRo_m5L3ZLs6Voh8aEkMeT29Xsul1w1qE0g,10 pyOpenRPA-1.2.12.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=PlIZZCTnVrYF2i6DSAi_KbzZfc2gtcBPmOerrEZq68U,1718 pyOpenRPA/Agent/A2O.py,sha256=PlIZZCTnVrYF2i6DSAi_KbzZfc2gtcBPmOerrEZq68U,1718
pyOpenRPA/Agent/O2A.py,sha256=XHl5nytUoUqfPvmYWh5auYo-s0GIThNmkOA9ON-JCis,5535 pyOpenRPA/Agent/O2A.py,sha256=XHl5nytUoUqfPvmYWh5auYo-s0GIThNmkOA9ON-JCis,5535
pyOpenRPA/Agent/Processor.py,sha256=xNZfQ_HcV-qm_x90tBLKYJqvnENiTqHSoUk2LhDfqWQ,6346 pyOpenRPA/Agent/Processor.py,sha256=xNZfQ_HcV-qm_x90tBLKYJqvnENiTqHSoUk2LhDfqWQ,6346
@ -17,7 +23,7 @@ pyOpenRPA/Agent/__pycache__/__init__.cpython-37.pyc,,
pyOpenRPA/Agent/readme.md,sha256=QF_Bnv204OK3t1JUEhjfICkxFmSdX6bvaRl_HI6lH9I,19 pyOpenRPA/Agent/readme.md,sha256=QF_Bnv204OK3t1JUEhjfICkxFmSdX6bvaRl_HI6lH9I,19
pyOpenRPA/Info.md,sha256=u4Nv-PjniSF0Zlbtr6jEJX2vblK3_1zhSLNUgOdtDaA,85 pyOpenRPA/Info.md,sha256=u4Nv-PjniSF0Zlbtr6jEJX2vblK3_1zhSLNUgOdtDaA,85
pyOpenRPA/LICENSE.pdf,sha256=HEqffy8FIWpylw0zF7k-Wgwd8ppWQT9s9EGBgKV-6G8,321175 pyOpenRPA/LICENSE.pdf,sha256=HEqffy8FIWpylw0zF7k-Wgwd8ppWQT9s9EGBgKV-6G8,321175
pyOpenRPA/Orchestrator/BackwardCompatibility.py,sha256=CpJtOc_WnV14AGIU7FKVRuemlf9bSr4Eo5_67wuyi_k,37506 pyOpenRPA/Orchestrator/BackwardCompatibility.py,sha256=ABr0RugbBsIGdL5GE_EFC9QndSaKjvrjawvluhUNuMY,37795
pyOpenRPA/Orchestrator/ControlPanel.py,sha256=OzS8HjG__8OZgqhajr8L8owyugXPuSLWHLtXuKdEP78,103 pyOpenRPA/Orchestrator/ControlPanel.py,sha256=OzS8HjG__8OZgqhajr8L8owyugXPuSLWHLtXuKdEP78,103
pyOpenRPA/Orchestrator/Core.py,sha256=OHa3mSC3_wRAizqrWBVjlR6ln4-xVVvBpOSnWl6qVvY,529 pyOpenRPA/Orchestrator/Core.py,sha256=OHa3mSC3_wRAizqrWBVjlR6ln4-xVVvBpOSnWl6qVvY,529
pyOpenRPA/Orchestrator/Managers/ControlPanel.py,sha256=BgtLjb6PR6kTlOjPLCg2YGP458LS9JOaYEfNurhS0nk,16544 pyOpenRPA/Orchestrator/Managers/ControlPanel.py,sha256=BgtLjb6PR6kTlOjPLCg2YGP458LS9JOaYEfNurhS0nk,16544
@ -62,9 +68,9 @@ pyOpenRPA/Orchestrator/RobotScreenActive/__pycache__/Monitor.cpython-37.pyc,,
pyOpenRPA/Orchestrator/RobotScreenActive/__pycache__/Screen.cpython-37.pyc,, pyOpenRPA/Orchestrator/RobotScreenActive/__pycache__/Screen.cpython-37.pyc,,
pyOpenRPA/Orchestrator/RobotScreenActive/__pycache__/__init__.cpython-37.pyc,, pyOpenRPA/Orchestrator/RobotScreenActive/__pycache__/__init__.cpython-37.pyc,,
pyOpenRPA/Orchestrator/RobotScreenActive/__pycache__/__main__.cpython-37.pyc,, pyOpenRPA/Orchestrator/RobotScreenActive/__pycache__/__main__.cpython-37.pyc,,
pyOpenRPA/Orchestrator/Server.py,sha256=DbvHZTTItOBbYiykn2GMjG2r6iUsXUqQZZjjnYPnZ8Q,32455 pyOpenRPA/Orchestrator/Server.py,sha256=lDB2E--1gcac6nf5MnhcU9LbTaDyHqjKs_AJGV79omY,35945
pyOpenRPA/Orchestrator/ServerSettings.py,sha256=-dwQAFu7KQkIPcS3wstDG_fYrsqCP8ntPlkFE6YfNDg,31808 pyOpenRPA/Orchestrator/ServerSettings.py,sha256=Roh0BQFn1GjtjWH3SN5J4sY3zv55TBBGMU4hze5hi9c,32248
pyOpenRPA/Orchestrator/SettingsTemplate.py,sha256=ij1quU5ENu43QjccHYsy8SwPCGibqJNGwcDaoF7cAPo,21340 pyOpenRPA/Orchestrator/SettingsTemplate.py,sha256=TR6WQVm-0sFoQjnV08t9K5oQOcpC7dbKOnWQS31m9dQ,21443
pyOpenRPA/Orchestrator/Timer.py,sha256=HvYtEeH2Q5WVVjgds9XaBpWRmvZgwgBXurJDdVVq_T0,2097 pyOpenRPA/Orchestrator/Timer.py,sha256=HvYtEeH2Q5WVVjgds9XaBpWRmvZgwgBXurJDdVVq_T0,2097
pyOpenRPA/Orchestrator/Utils/LoggerHandlerDumpLogList.py,sha256=hD47TiOuKR-G8IWu9lJD2kG28qlH7YZV63i3qv1N5Dk,681 pyOpenRPA/Orchestrator/Utils/LoggerHandlerDumpLogList.py,sha256=hD47TiOuKR-G8IWu9lJD2kG28qlH7YZV63i3qv1N5Dk,681
pyOpenRPA/Orchestrator/Utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 pyOpenRPA/Orchestrator/Utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@ -72,10 +78,10 @@ pyOpenRPA/Orchestrator/Utils/__pycache__/LoggerHandlerDumpLogList.cpython-37.pyc
pyOpenRPA/Orchestrator/Utils/__pycache__/__init__.cpython-37.pyc,, pyOpenRPA/Orchestrator/Utils/__pycache__/__init__.cpython-37.pyc,,
pyOpenRPA/Orchestrator/Web/Basic.py,sha256=pPH55rPwZz1ktpzNIcC51jeV2MgZI10Zf0Q0DncihDw,7757 pyOpenRPA/Orchestrator/Web/Basic.py,sha256=pPH55rPwZz1ktpzNIcC51jeV2MgZI10Zf0Q0DncihDw,7757
pyOpenRPA/Orchestrator/Web/Index.js,sha256=YACiZAvjr6NmFlDhQu6urkJp49BX7L8WJU9p-MeIlCI,43508 pyOpenRPA/Orchestrator/Web/Index.js,sha256=YACiZAvjr6NmFlDhQu6urkJp49BX7L8WJU9p-MeIlCI,43508
pyOpenRPA/Orchestrator/Web/Index.xhtml,sha256=XGPCG-qaFsAcoaXnZe1mEjPEqwcVQZ3NVPjtKX8gV4c,19192 pyOpenRPA/Orchestrator/Web/Index.xhtml,sha256=5JUAs5rEiU0XtHM9QO6EdNMBGt-W6QOVGY7xJ_HLPFM,19257
pyOpenRPA/Orchestrator/Web/__pycache__/Basic.cpython-37.pyc,, pyOpenRPA/Orchestrator/Web/__pycache__/Basic.cpython-37.pyc,,
pyOpenRPA/Orchestrator/Web/favicon.ico,sha256=6S8XwSQ_3FXPpaX6zYkf8uUewVXO9bHnrrDHEoWrEgw,112922 pyOpenRPA/Orchestrator/Web/favicon.ico,sha256=6S8XwSQ_3FXPpaX6zYkf8uUewVXO9bHnrrDHEoWrEgw,112922
pyOpenRPA/Orchestrator/__Orchestrator__.py,sha256=HS1DiB0t2NqcgijH6Fsjfe_QyGbIlPrgDOBGBlgkmjs,150309 pyOpenRPA/Orchestrator/__Orchestrator__.py,sha256=Zud6HTAHSsfTJVrszML5EjGTqlA7k5qhthZTsSD1pX8,151055
pyOpenRPA/Orchestrator/__init__.py,sha256=nJhjYtBXKOUNX_yNu1rRFk5y9cDz6AFiL0M6KgX_utQ,207 pyOpenRPA/Orchestrator/__init__.py,sha256=nJhjYtBXKOUNX_yNu1rRFk5y9cDz6AFiL0M6KgX_utQ,207
pyOpenRPA/Orchestrator/__main__.py,sha256=czJrc7_57WiO3EPIYfPeF_LG3pZsQVmuAYgbl_YXcVU,273 pyOpenRPA/Orchestrator/__main__.py,sha256=czJrc7_57WiO3EPIYfPeF_LG3pZsQVmuAYgbl_YXcVU,273
pyOpenRPA/Orchestrator/__pycache__/BackwardCompatibility.cpython-37.pyc,, pyOpenRPA/Orchestrator/__pycache__/BackwardCompatibility.cpython-37.pyc,,
@ -265,11 +271,15 @@ pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/images/flag
pyOpenRPA/Resources/Web/jQuery/jquery-3.1.1.min.js,sha256=HPMOWdIdSuVgr3FD9ZE-_MgiK8qk_MdQjrgCtfqp6U4,86713 pyOpenRPA/Resources/Web/jQuery/jquery-3.1.1.min.js,sha256=HPMOWdIdSuVgr3FD9ZE-_MgiK8qk_MdQjrgCtfqp6U4,86713
pyOpenRPA/Resources/Web/pyOpenRPA_logo.png,sha256=7rulXo_C57xJQEaYWmAkChxXb6xbDW2zq-werzVbDbc,4899 pyOpenRPA/Resources/Web/pyOpenRPA_logo.png,sha256=7rulXo_C57xJQEaYWmAkChxXb6xbDW2zq-werzVbDbc,4899
pyOpenRPA/Robot/Clipboard.py,sha256=q76X8L21zJwcwdoJJNPeCEwAV30xS6ylHP1WwvtxoWI,722 pyOpenRPA/Robot/Clipboard.py,sha256=q76X8L21zJwcwdoJJNPeCEwAV30xS6ylHP1WwvtxoWI,722
pyOpenRPA/Robot/Keyboard.py,sha256=k_5uNh7UWq5F4TKGbe4LpJwqWgUrftNieWm51HOgOBI,22
pyOpenRPA/Robot/Mouse.py,sha256=tBW9yteyEv9znJePOfbZcU3YqxX42wyu4Wc09fVaO0c,23
pyOpenRPA/Robot/OrchestratorConnector.py,sha256=JUtdiUXCruqUqBD19gJBl9jk_b-tpWWx_v3MfBoKzoQ,20445 pyOpenRPA/Robot/OrchestratorConnector.py,sha256=JUtdiUXCruqUqBD19gJBl9jk_b-tpWWx_v3MfBoKzoQ,20445
pyOpenRPA/Robot/README.md,sha256=e2hKh7Tx6DAsX6jY_hBDhguL1L2Wiv6iugDB5otMzIA,2293 pyOpenRPA/Robot/README.md,sha256=e2hKh7Tx6DAsX6jY_hBDhguL1L2Wiv6iugDB5otMzIA,2293
pyOpenRPA/Robot/Screen.py,sha256=tBW9yteyEv9znJePOfbZcU3YqxX42wyu4Wc09fVaO0c,23
pyOpenRPA/Robot/SettingsTemplate.py,sha256=Rp5XPeV2I4tCS2uf4Zkqm_ERJ6pZMg4-e5_lMqGJYLk,1453 pyOpenRPA/Robot/SettingsTemplate.py,sha256=Rp5XPeV2I4tCS2uf4Zkqm_ERJ6pZMg4-e5_lMqGJYLk,1453
pyOpenRPA/Robot/Test.py,sha256=qXr990nXiFZX5SNv6QN9GLb_U4HZRmJnbZR2qSnwilY,2878 pyOpenRPA/Robot/Test.py,sha256=qXr990nXiFZX5SNv6QN9GLb_U4HZRmJnbZR2qSnwilY,2878
pyOpenRPA/Robot/UIDesktop.py,sha256=BI5SqXXFbhsvq1sZ1eCDuil8Gz5XwkWBluIKA9zxFts,82922 pyOpenRPA/Robot/UIDesktop.py,sha256=EllVup0umNNFqcQrrO6pffdoTBzc5Y-jEKrY0oO7joU,82938
pyOpenRPA/Robot/UIWeb.py,sha256=NFH0brDKEmWWOJxMzO7404K5lJ4LaDn5XMnkoH13Y64,22
pyOpenRPA/Robot/Utils/JSONNormalize.py,sha256=aIuVzuZDazhxkCOzoOjfhHVz66mp2FWdfPv5E7KWF5Y,3890 pyOpenRPA/Robot/Utils/JSONNormalize.py,sha256=aIuVzuZDazhxkCOzoOjfhHVz66mp2FWdfPv5E7KWF5Y,3890
pyOpenRPA/Robot/Utils/ProcessBitness.py,sha256=WlKL-DklGaoTnchtapOTM_ydxSB4yOeo9lcG3zr2VME,4524 pyOpenRPA/Robot/Utils/ProcessBitness.py,sha256=WlKL-DklGaoTnchtapOTM_ydxSB4yOeo9lcG3zr2VME,4524
pyOpenRPA/Robot/Utils/ProcessCommunicator.py,sha256=8GfmLnOvAdosmt7YNT86uEV9cjhKippssCX62wOMJwM,8039 pyOpenRPA/Robot/Utils/ProcessCommunicator.py,sha256=8GfmLnOvAdosmt7YNT86uEV9cjhKippssCX62wOMJwM,8039
@ -284,12 +294,16 @@ pyOpenRPA/Robot/Utils/__pycache__/ValueVerify.cpython-37.pyc,,
pyOpenRPA/Robot/Utils/__pycache__/__init__.cpython-37.pyc,, pyOpenRPA/Robot/Utils/__pycache__/__init__.cpython-37.pyc,,
pyOpenRPA/Robot/Window.py,sha256=UJl-sg4RvvJ35aG9jZOzqGVwE15XK7qPHqoOBD13xFk,431 pyOpenRPA/Robot/Window.py,sha256=UJl-sg4RvvJ35aG9jZOzqGVwE15XK7qPHqoOBD13xFk,431
pyOpenRPA/Robot/__init__.py,sha256=L-5tPm6evytGWOzlqIq-2oiIhmQnruaxwIstyyaMkVI,253 pyOpenRPA/Robot/__init__.py,sha256=L-5tPm6evytGWOzlqIq-2oiIhmQnruaxwIstyyaMkVI,253
pyOpenRPA/Robot/__main__.py,sha256=l6II8JuXCsnVOcfs6-2jvogKYTVhbfj3Jl2ld3OIP7s,1992 pyOpenRPA/Robot/__main__.py,sha256=xtzw5siZZJV2Nmn-zXPZY5u3Tk0wxe-l8lxq3VPEEiI,2029
pyOpenRPA/Robot/__pycache__/Clipboard.cpython-37.pyc,, pyOpenRPA/Robot/__pycache__/Clipboard.cpython-37.pyc,,
pyOpenRPA/Robot/__pycache__/Keyboard.cpython-37.pyc,,
pyOpenRPA/Robot/__pycache__/Mouse.cpython-37.pyc,,
pyOpenRPA/Robot/__pycache__/OrchestratorConnector.cpython-37.pyc,, pyOpenRPA/Robot/__pycache__/OrchestratorConnector.cpython-37.pyc,,
pyOpenRPA/Robot/__pycache__/Screen.cpython-37.pyc,,
pyOpenRPA/Robot/__pycache__/SettingsTemplate.cpython-37.pyc,, pyOpenRPA/Robot/__pycache__/SettingsTemplate.cpython-37.pyc,,
pyOpenRPA/Robot/__pycache__/Test.cpython-37.pyc,, pyOpenRPA/Robot/__pycache__/Test.cpython-37.pyc,,
pyOpenRPA/Robot/__pycache__/UIDesktop.cpython-37.pyc,, pyOpenRPA/Robot/__pycache__/UIDesktop.cpython-37.pyc,,
pyOpenRPA/Robot/__pycache__/UIWeb.cpython-37.pyc,,
pyOpenRPA/Robot/__pycache__/Window.cpython-37.pyc,, pyOpenRPA/Robot/__pycache__/Window.cpython-37.pyc,,
pyOpenRPA/Robot/__pycache__/__init__.cpython-37.pyc,, pyOpenRPA/Robot/__pycache__/__init__.cpython-37.pyc,,
pyOpenRPA/Robot/__pycache__/__main__.cpython-37.pyc,, pyOpenRPA/Robot/__pycache__/__main__.cpython-37.pyc,,
@ -298,7 +312,7 @@ pyOpenRPA/Studio/ProcessCommunicator.py,sha256=HD3XASJae31_HV3OznFe8E2MgZFXnwt7Y
pyOpenRPA/Studio/RobotConnector.py,sha256=CYO0dQoqfs44SYD_VZ_TJh3WFu_DXigHBLHj4GJ2Icc,5038 pyOpenRPA/Studio/RobotConnector.py,sha256=CYO0dQoqfs44SYD_VZ_TJh3WFu_DXigHBLHj4GJ2Icc,5038
pyOpenRPA/Studio/Studio.py,sha256=RYwjb7KKEK2EgGz4lb95IQXvKk0-QACObBxoMh2IEFE,8689 pyOpenRPA/Studio/Studio.py,sha256=RYwjb7KKEK2EgGz4lb95IQXvKk0-QACObBxoMh2IEFE,8689
pyOpenRPA/Studio/ValueVerify.py,sha256=ObskxU4fOMoCGw74_nzYt6-a5jjrAckb3sdBLYyhYxY,777 pyOpenRPA/Studio/ValueVerify.py,sha256=ObskxU4fOMoCGw74_nzYt6-a5jjrAckb3sdBLYyhYxY,777
pyOpenRPA/Studio/Web/Index.xhtml,sha256=wo3Y5CzWJQYMw9AgNHXynt1yGDLIoihRlt1weFLSuYQ,48240 pyOpenRPA/Studio/Web/Index.xhtml,sha256=9ngKO_ov9mC7N5pkdxp_M-iewZEiBAFwyZ3giH4koDE,48315
pyOpenRPA/Studio/Web/favicon.ico,sha256=6S8XwSQ_3FXPpaX6zYkf8uUewVXO9bHnrrDHEoWrEgw,112922 pyOpenRPA/Studio/Web/favicon.ico,sha256=6S8XwSQ_3FXPpaX6zYkf8uUewVXO9bHnrrDHEoWrEgw,112922
pyOpenRPA/Studio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 pyOpenRPA/Studio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
pyOpenRPA/Studio/__main__.py,sha256=_57Rnq9DKbmmlpGFqIwVrWn_LRcU8jjmMTOny4_zlP8,308 pyOpenRPA/Studio/__main__.py,sha256=_57Rnq9DKbmmlpGFqIwVrWn_LRcU8jjmMTOny4_zlP8,308
@ -309,7 +323,8 @@ pyOpenRPA/Studio/__pycache__/Studio.cpython-37.pyc,,
pyOpenRPA/Studio/__pycache__/ValueVerify.cpython-37.pyc,, pyOpenRPA/Studio/__pycache__/ValueVerify.cpython-37.pyc,,
pyOpenRPA/Studio/__pycache__/__init__.cpython-37.pyc,, pyOpenRPA/Studio/__pycache__/__init__.cpython-37.pyc,,
pyOpenRPA/Studio/__pycache__/__main__.cpython-37.pyc,, pyOpenRPA/Studio/__pycache__/__main__.cpython-37.pyc,,
pyOpenRPA/Tools/License.py,sha256=MZT93njRtECNs4fWdD-x-x8dDBnpRaYRszR9s1cMRxk,9857 pyOpenRPA/Tools/Debugger.py,sha256=2slOSaPnUAwfDlyjhaqqhhchXUBgEKQImTzXagJt4Jw,535
pyOpenRPA/Tools/License.py,sha256=QlZXl1csPmFtYXL29CPDnA0SdvSjOgPhXDHD44awhdA,10230
pyOpenRPA/Tools/RobotDB/ExcelCom.py,sha256=hp0dvXOEC7Au00ueh7pqxkdixV-PC-km7tCt-wRunYs,343 pyOpenRPA/Tools/RobotDB/ExcelCom.py,sha256=hp0dvXOEC7Au00ueh7pqxkdixV-PC-km7tCt-wRunYs,343
pyOpenRPA/Tools/RobotDB/HowToUse,sha256=TUXPZAFcse-PSlKFM6jcaYuuZZEmXOSSvgeqrbmIDoc,1473 pyOpenRPA/Tools/RobotDB/HowToUse,sha256=TUXPZAFcse-PSlKFM6jcaYuuZZEmXOSSvgeqrbmIDoc,1473
pyOpenRPA/Tools/RobotDB/RobotDB.py,sha256=qtGu8PS2atd0L8taCNpk-08Qpxp8Qz1lqwAcBkyLFLM,1655 pyOpenRPA/Tools/RobotDB/RobotDB.py,sha256=qtGu8PS2atd0L8taCNpk-08Qpxp8Qz1lqwAcBkyLFLM,1655
@ -342,12 +357,13 @@ pyOpenRPA/Tools/SafeSource/__pycache__/DistrCreate.cpython-37.pyc,,
pyOpenRPA/Tools/SafeSource/__pycache__/__init__.cpython-37.pyc,, pyOpenRPA/Tools/SafeSource/__pycache__/__init__.cpython-37.pyc,,
pyOpenRPA/Tools/SafeSource/__pycache__/__main__.cpython-37.pyc,, pyOpenRPA/Tools/SafeSource/__pycache__/__main__.cpython-37.pyc,,
pyOpenRPA/Tools/StopSafe.py,sha256=BNTtMmvsRE1Wtri3EkwhoBi6gGOjEPRQnJSV1C03c84,2176 pyOpenRPA/Tools/StopSafe.py,sha256=BNTtMmvsRE1Wtri3EkwhoBi6gGOjEPRQnJSV1C03c84,2176
pyOpenRPA/Tools/Usage.py,sha256=SDXDjKXsKb1mnZgqz5MxaxBtO4bGHZo7KrbXAKVLORg,2859 pyOpenRPA/Tools/Usage.py,sha256=GVGpC1E6qt1FjjD-RSyn4l9koI5FNfXBIWEBHGKbdK4,2996
pyOpenRPA/Tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 pyOpenRPA/Tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
pyOpenRPA/Tools/__pycache__/Debugger.cpython-37.pyc,,
pyOpenRPA/Tools/__pycache__/License.cpython-37.pyc,, pyOpenRPA/Tools/__pycache__/License.cpython-37.pyc,,
pyOpenRPA/Tools/__pycache__/StopSafe.cpython-37.pyc,, pyOpenRPA/Tools/__pycache__/StopSafe.cpython-37.pyc,,
pyOpenRPA/Tools/__pycache__/Usage.cpython-37.pyc,, pyOpenRPA/Tools/__pycache__/Usage.cpython-37.pyc,,
pyOpenRPA/Tools/__pycache__/__init__.cpython-37.pyc,, pyOpenRPA/Tools/__pycache__/__init__.cpython-37.pyc,,
pyOpenRPA/__init__.py,sha256=jctD8KXFx7hqtt8En_D_yyDhRGlHH5a58k0LENAac2E,175 pyOpenRPA/__init__.py,sha256=fmC6rG7L4TIer8c0qUyp-Ypv2d7C2TBucEjIg7Wwip4,175
pyOpenRPA/__pycache__/__init__.cpython-37.pyc,, pyOpenRPA/__pycache__/__init__.cpython-37.pyc,,
pyOpenRPA/test.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 pyOpenRPA/test.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0

@ -533,3 +533,9 @@ def Update(inGSettings):
lURLItemDict["UACBool"]=None lURLItemDict["UACBool"]=None
if lL: lL.warning( if lL: lL.warning(
f"Backward compatibility (v1.2.4 to v1.2.7): ServerDict > URLList > item: add UACBool = None") # Log about compatibility f"Backward compatibility (v1.2.4 to v1.2.7): ServerDict > URLList > item: add UACBool = None") # Log about compatibility
# "URLIndexStr"
if "URLIndexStr" not in inGSettings["ServerDict"]:
inGSettings["ServerDict"]["URLIndexStr"] = "/"
if lL: lL.warning(
f"Backward compatibility (v1.2.11 to v1.2.12): ServerDict > URLIndexStr: add URLIndexStr = /") # Log about compatibility

@ -26,6 +26,10 @@ global gSettingsDict
from . import ServerSettings from . import ServerSettings
from . import __Orchestrator__ from . import __Orchestrator__
import copy import copy
import mimetypes
mimetypes.add_type("font/woff2",".woff2")
gCacheDict = {}
# Tool to merge complex dictionaries # Tool to merge complex dictionaries
@ -266,7 +270,9 @@ class testHTTPServer_RequestHandler(BaseHTTPRequestHandler):
#Tech sub def - do item #Tech sub def - do item
################################ ################################
def URLItemDo(inURLItem,inRequest,inGlobalDict): def URLItemDo(inURLItem,inRequest,inGlobalDict):
global gCacheDict
inResponseDict = inRequest.OpenRPAResponseDict inResponseDict = inRequest.OpenRPAResponseDict
inResponseDict["Headers"]["Content-type"]= None
#Set status code 200 #Set status code 200
inResponseDict["StatusCode"] = 200 inResponseDict["StatusCode"] = 200
#Content-type #Content-type
@ -274,11 +280,27 @@ class testHTTPServer_RequestHandler(BaseHTTPRequestHandler):
inResponseDict["Headers"]["Content-type"] = inURLItem["ResponseContentType"] inResponseDict["Headers"]["Content-type"] = inURLItem["ResponseContentType"]
#If file path is set #If file path is set
if "ResponseFilePath" in inURLItem: if "ResponseFilePath" in inURLItem:
# Check cache
if inURLItem.get("UseCacheBool",False) == True:
if inURLItem["ResponseFilePath"] in gCacheDict:
# Write content as utf-8 data
inResponseDict["Body"] = gCacheDict[inURLItem["ResponseFilePath"]]
else:
lFileObject = open(inURLItem["ResponseFilePath"], "rb")
# Write content as utf-8 data
gCacheDict[inURLItem["ResponseFilePath"]] = lFileObject.read()
inResponseDict["Body"] = gCacheDict[inURLItem["ResponseFilePath"]]
# Закрыть файловый объект
lFileObject.close()
else:
lFileObject = open(inURLItem["ResponseFilePath"], "rb") lFileObject = open(inURLItem["ResponseFilePath"], "rb")
# Write content as utf-8 data # Write content as utf-8 data
inResponseDict["Body"] = lFileObject.read() inResponseDict["Body"] = lFileObject.read()
# Закрыть файловый объект # Закрыть файловый объект
lFileObject.close() lFileObject.close()
# detect MIME type if none
if inResponseDict["Headers"]["Content-type"] is None:
inResponseDict["Headers"]["Content-type"]= mimetypes.guess_type(inURLItem["ResponseFilePath"])[0]
#If function is set #If function is set
if "ResponseDefRequestGlobal" in inURLItem: if "ResponseDefRequestGlobal" in inURLItem:
lDef = inURLItem["ResponseDefRequestGlobal"] lDef = inURLItem["ResponseDefRequestGlobal"]
@ -290,6 +312,7 @@ class testHTTPServer_RequestHandler(BaseHTTPRequestHandler):
else: else:
inURLItem["ResponseDefRequestGlobal"]() inURLItem["ResponseDefRequestGlobal"]()
if "ResponseFolderPath" in inURLItem: if "ResponseFolderPath" in inURLItem:
#lRequestPath = inRequest.path #lRequestPath = inRequest.path
lRequestPath = urllib.parse.unquote(inRequest.path) lRequestPath = urllib.parse.unquote(inRequest.path)
if inURLItem["URL"][-1]!="/": inURLItem["URL"]+= "/" # Fix for settings if inURLItem["URL"][-1]!="/": inURLItem["URL"]+= "/" # Fix for settings
@ -298,12 +321,30 @@ class testHTTPServer_RequestHandler(BaseHTTPRequestHandler):
#print(f"File full path {lFilePath}") #print(f"File full path {lFilePath}")
#Check if file exist #Check if file exist
if os.path.exists(lFilePath) and os.path.isfile(lFilePath): if os.path.exists(lFilePath) and os.path.isfile(lFilePath):
# Check cache
if inURLItem.get("UseCacheBool",False) == True:
if lFilePath in gCacheDict:
# Write content as utf-8 data
inResponseDict["Body"] = gCacheDict[lFilePath]
else:
lFileObject = open(lFilePath, "rb")
# Write content as utf-8 data
gCacheDict[lFilePath] = lFileObject.read()
inResponseDict["Body"] = gCacheDict[lFilePath]
# Закрыть файловый объект
lFileObject.close()
else:
lFileObject = open(lFilePath, "rb") lFileObject = open(lFilePath, "rb")
# Write content as utf-8 data # Write content as utf-8 data
inResponseDict["Body"] = lFileObject.read() inResponseDict["Body"] = lFileObject.read()
inResponseDict["ContentType"]= "application/octet-stream"
# Закрыть файловый объект # Закрыть файловый объект
lFileObject.close() lFileObject.close()
# detect MIME type if none
if inResponseDict["Headers"]["Content-type"] is None:
inResponseDict["Headers"]["Content-type"]= mimetypes.guess_type(lFilePath)[0]
# If No content-type
if inResponseDict["Headers"]["Content-type"] is None:
inResponseDict["Headers"]["Content-type"]= "application/octet-stream"
############################################## ##############################################
# UAC Check # UAC Check
if inOnlyFlagUACBool == True and inURLItem.get("UACBool",None) in [None, True]: if inOnlyFlagUACBool == True and inURLItem.get("UACBool",None) in [None, True]:
@ -328,6 +369,11 @@ class testHTTPServer_RequestHandler(BaseHTTPRequestHandler):
if inURLItem["URL"].upper() == urllib.parse.unquote(self.path).upper(): if inURLItem["URL"].upper() == urllib.parse.unquote(self.path).upper():
URLItemDo(inURLItem, self, gSettingsDict) URLItemDo(inURLItem, self, gSettingsDict)
return True return True
# check Match type variant: EqualNoParam
elif inURLItem["MatchType"].upper() == "EQUALNOPARAM":
if inURLItem["URL"].upper() == urllib.parse.unquote(self.path).upper().split("?")[0]:
URLItemDo(inURLItem, self, gSettingsDict)
return True
# check Match type variant: EqualCase # check Match type variant: EqualCase
elif inURLItem["MatchType"].upper() == "EQUALCASE": elif inURLItem["MatchType"].upper() == "EQUALCASE":
if inURLItem["URL"] == urllib.parse.unquote(self.path): if inURLItem["URL"] == urllib.parse.unquote(self.path):
@ -443,6 +489,21 @@ class testHTTPServer_RequestHandler(BaseHTTPRequestHandler):
# check if file in FileURL - File Path Mapping Dict # check if file in FileURL - File Path Mapping Dict
if lFileURL.lower() in gSettingsDict["FileManager"]["FileURLFilePathDict"]: if lFileURL.lower() in gSettingsDict["FileManager"]["FileURLFilePathDict"]:
self.SendResponseContentTypeFile('application/octet-stream', gSettingsDict["FileManager"]["FileURLFilePathDict"][lFileURL]) self.SendResponseContentTypeFile('application/octet-stream', gSettingsDict["FileManager"]["FileURLFilePathDict"][lFileURL])
# Index page
elif self.path == gSettingsDict["ServerDict"]["URLIndexStr"]:
lURLItemDict = {
"Method":"GET",
"URL": gSettingsDict["ServerDict"]["URLIndexStr"],
"MatchType": "EqualCase",
"ResponseFilePath": os.path.join(lOrchestratorFolder, "Web\\Index.xhtml"),
"ResponseContentType": "text/html"}
#Check if all condition are applied
lFlagURLIsApplied=False
lFlagURLIsApplied=self.URLItemCheckDo(lURLItemDict, "GET")
if lFlagURLIsApplied:
self.ResponseDictSend()
return
else: else:
#Set access denied code #Set access denied code
# Send response status code # Send response status code

@ -457,19 +457,19 @@ def SettingsUpdate(inGlobalConfiguration):
# "ResponseContentType": "", #HTTP Content-type # "ResponseContentType": "", #HTTP Content-type
# "ResponseDefRequestGlobal": None #Function with str result # "ResponseDefRequestGlobal": None #Function with str result
#} #}
#Orchestrator basic dependencies #Orchestrator basic dependencies # Index page in server.py because of special settings
{"Method":"GET", "URL": "/", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "Web\\Index.xhtml"), "ResponseContentType": "text/html"},
{"Method":"GET", "URL": "/Index.js", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "Web\\Index.js"), "ResponseContentType": "text/javascript"}, {"Method":"GET", "URL": "/Index.js", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "Web\\Index.js"), "ResponseContentType": "text/javascript"},
{"Method":"GET", "URL": "/3rdParty/Semantic-UI-CSS-master/semantic.min.css", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Semantic-UI-CSS-master\\semantic.min.css"), "ResponseContentType": "text/css"}, {"Method":"GET", "URL": "/3rdParty/Semantic-UI-CSS-master/semantic.min.css", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Semantic-UI-CSS-master\\semantic.min.css"), "ResponseContentType": "text/css", "UACBool":False, "UseCacheBool": True},
{"Method":"GET", "URL": "/3rdParty/Semantic-UI-CSS-master/semantic.min.js", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Semantic-UI-CSS-master\\semantic.min.js"), "ResponseContentType": "application/javascript"}, {"Method":"GET", "URL": "/3rdParty/Semantic-UI-CSS-master/semantic.min.js", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Semantic-UI-CSS-master\\semantic.min.js"), "ResponseContentType": "application/javascript", "UACBool":False, "UseCacheBool": True},
{"Method":"GET", "URL": "/3rdParty/jQuery/jquery-3.1.1.min.js", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\jQuery\\jquery-3.1.1.min.js"), "ResponseContentType": "application/javascript"}, {"Method":"GET", "URL": "/3rdParty/jQuery/jquery-3.1.1.min.js", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\jQuery\\jquery-3.1.1.min.js"), "ResponseContentType": "application/javascript", "UACBool":False, "UseCacheBool": True},
{"Method":"GET", "URL": "/3rdParty/Google/LatoItalic.css", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Google\\LatoItalic.css"), "ResponseContentType": "font/css"}, {"Method":"GET", "URL": "/3rdParty/Google/LatoItalic.css", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Google\\LatoItalic.css"), "ResponseContentType": "font/css", "UACBool":False, "UseCacheBool": True},
{"Method":"GET", "URL": "/3rdParty/Semantic-UI-CSS-master/themes/default/assets/fonts/icons.woff2", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Semantic-UI-CSS-master\\themes\\default\\assets\\fonts\\icons.woff2"), "ResponseContentType": "font/woff2"}, {"Method":"GET", "URL": "/3rdParty/Semantic-UI-CSS-master/themes/default/assets/fonts/icons.woff2", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Semantic-UI-CSS-master\\themes\\default\\assets\\fonts\\icons.woff2"), "ResponseContentType": "font/woff2", "UACBool":False, "UseCacheBool": True},
{"Method":"GET", "URL": "/favicon.ico", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "Web\\favicon.ico"), "ResponseContentType": "image/x-icon"}, {"Method":"GET", "URL": "/themes/default/", "MatchType": "BeginWith", "ResponseFolderPath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Semantic-UI-CSS-master\\themes\\default"),"UACBool":False, "UseCacheBool": True},
{"Method":"GET", "URL": "/3rdParty/Handlebars/handlebars-v4.1.2.js", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Handlebars\\handlebars-v4.1.2.js"), "ResponseContentType": "application/javascript"}, {"Method":"GET", "URL": "/favicon.ico", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "Web\\favicon.ico"), "ResponseContentType": "image/x-icon", "UACBool":False, "UseCacheBool": True},
{"Method":"GET", "URL": "/3rdParty/Handlebars/handlebars-v4.1.2.js", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Handlebars\\handlebars-v4.1.2.js"), "ResponseContentType": "application/javascript", "UACBool":False, "UseCacheBool": True},
{"Method": "GET", "URL": "/Monitor/ControlPanelDictGet", "MatchType": "Equal", "ResponseDefRequestGlobal": BackwardCompatibility.v1_2_0_Monitor_ControlPanelDictGet_SessionCheckInit, "ResponseContentType": "application/json"}, {"Method": "GET", "URL": "/Monitor/ControlPanelDictGet", "MatchType": "Equal", "ResponseDefRequestGlobal": BackwardCompatibility.v1_2_0_Monitor_ControlPanelDictGet_SessionCheckInit, "ResponseContentType": "application/json"},
{"Method": "GET", "URL": "/GetScreenshot", "MatchType": "BeginWith", "ResponseDefRequestGlobal": pyOpenRPA_Screenshot, "ResponseContentType": "image/png"}, {"Method": "GET", "URL": "/GetScreenshot", "MatchType": "BeginWith", "ResponseDefRequestGlobal": pyOpenRPA_Screenshot, "ResponseContentType": "image/png"},
{"Method": "GET", "URL": "/pyOpenRPA_logo.png", "MatchType": "Equal", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\pyOpenRPA_logo.png"), "ResponseContentType": "image/png"}, {"Method": "GET", "URL": "/pyOpenRPA_logo.png", "MatchType": "Equal", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\pyOpenRPA_logo.png"), "ResponseContentType": "image/png", "UACBool":False, "UseCacheBool": True},
{"Method": "POST", "URL": "/Orchestrator/UserRoleHierarchyGet", "MatchType": "Equal","ResponseDefRequestGlobal": BackwardCompatibility.v1_2_0_UserRoleHierarchyGet, "ResponseContentType": "application/json"}, {"Method": "POST", "URL": "/Orchestrator/UserRoleHierarchyGet", "MatchType": "Equal","ResponseDefRequestGlobal": BackwardCompatibility.v1_2_0_UserRoleHierarchyGet, "ResponseContentType": "application/json"},
# New way of the v.1.2.0 functionallity (all defs by the URL from /pyOpenRPA/...) # New way of the v.1.2.0 functionallity (all defs by the URL from /pyOpenRPA/...)
{"Method": "POST", "URL": "/pyOpenRPA/ServerData", "MatchType": "Equal","ResponseDefRequestGlobal": pyOpenRPA_ServerData, "ResponseContentType": "application/json"}, {"Method": "POST", "URL": "/pyOpenRPA/ServerData", "MatchType": "Equal","ResponseDefRequestGlobal": pyOpenRPA_ServerData, "ResponseContentType": "application/json"},

@ -43,6 +43,7 @@ def __Create__():
"ControlPanelDict": { "ControlPanelDict": {
# "CPKey": <Managers.ControlPanel instance> # "CPKey": <Managers.ControlPanel instance>
}, },
"URLIndexStr":"/", # The index html page for the orchestrator control panel. Default is /
"AgentLimitLogSizeBytesInt": 300, # Don't show body if json body of transmition is more than "AgentLimitLogSizeBytesInt": 300, # Don't show body if json body of transmition is more than
"ServerThread": None, # Server thread is there "ServerThread": None, # Server thread is there
"AgentActivityLifetimeSecFloat": 1200.0, # Time in seconds to life for activity for the agent "AgentActivityLifetimeSecFloat": 1200.0, # Time in seconds to life for activity for the agent

@ -429,7 +429,7 @@
</div> </div>
<div class="seven wide column"> <div class="seven wide column">
<h4 class="ui inverted header">pyOpenRPA</h4> <h4 class="ui inverted header">pyOpenRPA</h4>
<p>Open source Robotic Process Automation software by the Ivan Maslov (Russian Engineer). Under the MIT license. #IT4Business</p> <p>Open source Robotic Process Automation software by the pyOpenRPA LLC (Created by Ivan Maslov in Russia). Licensed under LICENSE.PDF or https://pyopenrpa.ru/license/oferta.pdf #IT4Business</p>
</div> </div>
</div> </div>
<div class="ui inverted section divider"></div> <div class="ui inverted section divider"></div>

@ -13,6 +13,7 @@ from . import Managers
from ..Tools import License from ..Tools import License
from subprocess import CREATE_NEW_CONSOLE from subprocess import CREATE_NEW_CONSOLE
from .Utils import LoggerHandlerDumpLogList from .Utils import LoggerHandlerDumpLogList
from ..Tools import Debugger
# ATTENTION! HERE IS NO Relative import because it will be imported dynamically # ATTENTION! HERE IS NO Relative import because it will be imported dynamically
# All function check the flag SessionIsWindowResponsibleBool == True else no cammand is processed # All function check the flag SessionIsWindowResponsibleBool == True else no cammand is processed
@ -846,6 +847,13 @@ def UACSuperTokenUpdate(inSuperTokenStr, inGSettings=None):
# OrchestratorWeb defs # OrchestratorWeb defs
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
def WebURLIndexChange(inURLIndexStr:str ="/"):
"""Change the index page of the orchestrator if you dont want the '/' (main) path
:param inURLIndexStr: New url for the index page of the orchestrator, defaults to "/"
:type inURLIndexStr: str, optional
"""
GSettingsGet()["ServerDict"]["URLIndexStr"] = inURLIndexStr
def WebURLConnectDef(inMethodStr, inURLStr, inMatchTypeStr, inDef, inContentTypeStr="application/octet-stream", inGSettings = None, inUACBool = None): def WebURLConnectDef(inMethodStr, inURLStr, inMatchTypeStr, inDef, inContentTypeStr="application/octet-stream", inGSettings = None, inUACBool = None):
""" """
@ -879,7 +887,7 @@ def WebURLConnectDef(inMethodStr, inURLStr, inMatchTypeStr, inDef, inContentType
inGSettings["ServerDict"]["URLList"].append(lURLItemDict) inGSettings["ServerDict"]["URLList"].append(lURLItemDict)
def WebURLConnectFolder(inMethodStr, inURLStr, inMatchTypeStr, inFolderPathStr, inGSettings = None, inUACBool = None): def WebURLConnectFolder(inMethodStr, inURLStr, inMatchTypeStr, inFolderPathStr, inGSettings = None, inUACBool = None, inUseCacheBool= False):
""" """
Connect URL to Folder Connect URL to Folder
"inMethodStr":"GET|POST", "inMethodStr":"GET|POST",
@ -894,6 +902,7 @@ def WebURLConnectFolder(inMethodStr, inURLStr, inMatchTypeStr, inFolderPathStr,
:param inMatchTypeStr: :param inMatchTypeStr:
:param inFolderPathStr: :param inFolderPathStr:
:param inUACBool: default: None; True - check user access before do this URL item. None - get Server flag if ask user :param inUACBool: default: None; True - check user access before do this URL item. None - get Server flag if ask user
:param inUseCacheBool: True - cache this page - dont open ever
""" """
inGSettings = GSettingsGet(inGSettings=inGSettings) # Set the global settings inGSettings = GSettingsGet(inGSettings=inGSettings) # Set the global settings
# Check if last symbol is "/" - append if not exist # Check if last symbol is "/" - append if not exist
@ -906,14 +915,15 @@ def WebURLConnectFolder(inMethodStr, inURLStr, inMatchTypeStr, inFolderPathStr,
"MatchType": inMatchTypeStr, # "BeginWith|Contains|Equal|EqualCase", "MatchType": inMatchTypeStr, # "BeginWith|Contains|Equal|EqualCase",
# "ResponseFilePath": "", #Absolute or relative path # "ResponseFilePath": "", #Absolute or relative path
"ResponseFolderPath": lFolderPathStr, # Absolute or relative path "ResponseFolderPath": lFolderPathStr, # Absolute or relative path
"ResponseContentType": "application/octet-stream", #HTTP Content-type "ResponseContentType": None, #HTTP Content-type
#"ResponseDefRequestGlobal": inDef #Function with str result #"ResponseDefRequestGlobal": inDef #Function with str result
"UACBool": inUACBool "UACBool": inUACBool,
"UseCacheBool": inUseCacheBool
} }
inGSettings["ServerDict"]["URLList"].append(lURLItemDict) inGSettings["ServerDict"]["URLList"].append(lURLItemDict)
def WebURLConnectFile(inMethodStr, inURLStr, inMatchTypeStr, inFilePathStr, inContentTypeStr="application/octet-stream", inGSettings = None, inUACBool = None): def WebURLConnectFile(inMethodStr, inURLStr, inMatchTypeStr, inFilePathStr, inContentTypeStr=None, inGSettings = None, inUACBool = None, inUseCacheBool = False):
""" """
Connect URL to File Connect URL to File
"inMethodStr":"GET|POST", "inMethodStr":"GET|POST",
@ -926,8 +936,9 @@ def WebURLConnectFile(inMethodStr, inURLStr, inMatchTypeStr, inFilePathStr, inCo
:param inURLStr: :param inURLStr:
:param inMatchTypeStr: :param inMatchTypeStr:
:param inFilePathStr: :param inFilePathStr:
:param inContentTypeStr: :param inContentTypeStr: If none - autodetect
:param inUACBool: default: None; True - check user access before do this URL item. None - get Server flag if ask user :param inUACBool: default: None; True - check user access before do this URL item. None - get Server flag if ask user
:param inUseCacheBool: True - cache this page - dont open ever
""" """
inGSettings = GSettingsGet(inGSettings=inGSettings) # Set the global settings inGSettings = GSettingsGet(inGSettings=inGSettings) # Set the global settings
lURLItemDict = { lURLItemDict = {
@ -938,7 +949,8 @@ def WebURLConnectFile(inMethodStr, inURLStr, inMatchTypeStr, inFilePathStr, inCo
#"ResponseFolderPath": os.path.abspath(inFilePathStr), # Absolute or relative path #"ResponseFolderPath": os.path.abspath(inFilePathStr), # Absolute or relative path
"ResponseContentType": inContentTypeStr, #HTTP Content-type "ResponseContentType": inContentTypeStr, #HTTP Content-type
#"ResponseDefRequestGlobal": inDef #Function with str result #"ResponseDefRequestGlobal": inDef #Function with str result
"UACBool":inUACBool "UACBool":inUACBool,
"UseCacheBool": inUseCacheBool
} }
inGSettings["ServerDict"]["URLList"].append(lURLItemDict) inGSettings["ServerDict"]["URLList"].append(lURLItemDict)
@ -2836,6 +2848,9 @@ def Orchestrator(inGSettings=None, inDumpRestoreBool = True, inRunAsAdministrato
lThread = threading.Thread(target= lProcess.StatusRestore) lThread = threading.Thread(target= lProcess.StatusRestore)
lThread.start() lThread.start()
# Init debug thread (run if "init_dubug" file exists)
Debugger.LiveDebugCheckThread(inGSettings=GSettingsGet())
def __schedule_loop__(): def __schedule_loop__():
while True: while True:
schedule.run_pending() schedule.run_pending()

@ -6,8 +6,8 @@ import win32api
import time import time
from .Utils import ProcessCommunicator from .Utils import ProcessCommunicator
from . import Utils #For ProcessBitness from . import Utils #For ProcessBitness
from ..Tools import Usage from pyOpenRPA.Tools import Usage
from ..Tools import License from pyOpenRPA.Tools import License
import re import re
import copy import copy

@ -1,5 +1,5 @@
r""" r"""
The OpenRPA package (from UnicodeLabs/Ivan Maslov) The pyOpenRPA package (from Ivan Maslov)
__main__ file goes outside the package and used like a main file when the python runs module directly from start __main__ file goes outside the package and used like a main file when the python runs module directly from start
""" """
#If run as python executable module, need to set python path in pyOpenRPA package to load subpackge #If run as python executable module, need to set python path in pyOpenRPA package to load subpackge
@ -8,6 +8,8 @@ lFolderPath = "\\".join(__file__.split("\\")[:-2])
sys.path.append(lFolderPath) sys.path.append(lFolderPath)
################################ ################################
import traceback import traceback
import os
os.environ["PYOPENRPA_NODISP"]="1"
from Robot.Utils import ProcessCommunicator from Robot.Utils import ProcessCommunicator
from Robot.Utils import JSONNormalize from Robot.Utils import JSONNormalize
from Robot import UIDesktop from Robot import UIDesktop

@ -2,7 +2,7 @@
<html lang="en" > <html lang="en" >
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<title>OpenRPA</title> <title>pyOpenRPA</title>
<link rel="stylesheet" type="text/css" href="3rdParty/Semantic-UI-CSS-master/semantic.min.css"> <link rel="stylesheet" type="text/css" href="3rdParty/Semantic-UI-CSS-master/semantic.min.css">
<script <script
src="3rdParty/jQuery/jquery-3.1.1.min.js" src="3rdParty/jQuery/jquery-3.1.1.min.js"
@ -1012,8 +1012,8 @@
</div> </div>
</div> </div>
<div class="seven wide column"> <div class="seven wide column">
<h4 class="ui inverted header">OpenRPA</h4> <h4 class="ui inverted header">pyOpenRPA</h4>
<p>Open source Robotic Process Automation software by the Unicode Labs (Created by Ivan Maslov). Under the MIT license.</p> <p>Open source Robotic Process Automation software by the pyOpenRPA LLC (Created by Ivan Maslov in Russia). Licensed under LICENSE.PDF or https://pyopenrpa.ru/license/oferta.pdf #IT4Business</p>
</div> </div>
</div> </div>
<div class="ui inverted section divider"></div> <div class="ui inverted section divider"></div>

@ -0,0 +1,23 @@
import os
import threading
import pdb
import time
"""Module wait file "init_debug" in working directory
"""
gKWARGS = None
def LiveDebugCheckLoop():
while True:
if os.path.exists("init_debug"):
pdb.set_trace()
time.sleep(30.0)
def LiveDebugCheckThread(**inKWARGS):
"""Create thread to wait file appear "init_debug" in the working directory.
"""
global gKWARGS
gKWARGS = inKWARGS
lThread = threading.Thread(target=LiveDebugCheckLoop)
lThread.start()

@ -61,6 +61,8 @@ def ConsoleVerify() -> bool:
:return: true - certificate exists :return: true - certificate exists
:rtype: bool :rtype: bool
""" """
lCertificateExistsBool = False
if "PYOPENRPA_NODISP" not in os.environ:
lCertificateExistsBool = True lCertificateExistsBool = True
@ -70,7 +72,7 @@ def ConsoleVerify() -> bool:
Цифровой сертификат pyOpenRPA не обнаружен. Цифровой сертификат pyOpenRPA не обнаружен.
Получить или проверить сертификат, а также ознакомиться с текстом лицензионного соглашения Вы можете по адресу: Получить или проверить сертификат, а также ознакомиться с текстом лицензионного соглашения Вы можете по адресу:
https://pyopenrpa.ru/certificate https://pyopenrpa.ru/verification
Операция формирования сертификата является автоматизированной и занимает несколько секунд. Операция формирования сертификата является автоматизированной и занимает несколько секунд.
pyOpenRPA не использует какие-либо инструменты физической блокировки функциональности своего ПО. pyOpenRPA не использует какие-либо инструменты физической блокировки функциональности своего ПО.
@ -80,7 +82,9 @@ https://pyopenrpa.ru/Index/pyOpenRPA_product_service.pdf
ВНИМАНИЕ! НЕЗНАНИЕ ЗАКОНА НЕ ОСВОБОЖДАЕТ ОТ ОТВЕТСТВЕННОСТИ. ВНИМАНИЕ! НЕЗНАНИЕ ЗАКОНА НЕ ОСВОБОЖДАЕТ ОТ ОТВЕТСТВЕННОСТИ.
""" """
print(lTextStr) print(lTextStr)
os.environ["PYOPENRPA_NODISP"]="1"
lCertificateExistsBool = False lCertificateExistsBool = False
time.sleep(5) time.sleep(5)
ConsoleAccept() ConsoleAccept()
@ -89,7 +93,7 @@ https://pyopenrpa.ru/Index/pyOpenRPA_product_service.pdf
Обнаружен цифровой сертификат pyOpenRPA: {0}. Обнаружен цифровой сертификат pyOpenRPA: {0}.
Проверить сертификат, а также ознакомиться с текстом лицензионного соглашения Вы можете по адресу: Проверить сертификат, а также ознакомиться с текстом лицензионного соглашения Вы можете по адресу:
https://pyopenrpa.ru/certificate https://pyopenrpa.ru/verification
pyOpenRPA не использует какие-либо инструменты физической блокировки функциональности своего ПО. pyOpenRPA не использует какие-либо инструменты физической блокировки функциональности своего ПО.
По всем вопросам Вы можете обратиться к правообладателю, контакты см. по адресу: По всем вопросам Вы можете обратиться к правообладателю, контакты см. по адресу:
@ -99,6 +103,7 @@ https://pyopenrpa.ru/Index/pyOpenRPA_product_service.pdf
ВНИМАНИЕ! НЕЗНАНИЕ ЗАКОНА НЕ ОСВОБОЖДАЕТ ОТ ОТВЕТСТВЕННОСТИ. ВНИМАНИЕ! НЕЗНАНИЕ ЗАКОНА НЕ ОСВОБОЖДАЕТ ОТ ОТВЕТСТВЕННОСТИ.
""".format(lCertificateKeyStr) """.format(lCertificateKeyStr)
print(lTextStr) print(lTextStr)
os.environ["PYOPENRPA_NODISP"]="1"
return lCertificateExistsBool return lCertificateExistsBool
def ConsoleAccept(): def ConsoleAccept():
@ -107,6 +112,7 @@ def ConsoleAccept():
:return: _description_ :return: _description_
:rtype: str :rtype: str
""" """
if "PYOPENRPA_NODISP" not in os.environ:
lText=""" lText="""
@ -143,7 +149,7 @@ pyOpenRPA - это открытое программное обеспечени
Данный сертификат является свидетельством того, что Вы наделены правами в отношении pyOpenRPA в соответствии с законодательством Российской Федерации. Данный сертификат является свидетельством того, что Вы наделены правами в отношении pyOpenRPA в соответствии с законодательством Российской Федерации.
Получить или проверить сертификат, а также ознакомиться с текстом лицензионного соглашения Вы можете по адресу: Получить или проверить сертификат, а также ознакомиться с текстом лицензионного соглашения Вы можете по адресу:
https://pyopenrpa.ru/certificate https://pyopenrpa.ru/verification
Операция формирования сертификата является автоматизированной и занимает несколько секунд. Операция формирования сертификата является автоматизированной и занимает несколько секунд.
pyOpenRPA не использует какие-либо инструменты физической блокировки функциональности своего ПО. pyOpenRPA не использует какие-либо инструменты физической блокировки функциональности своего ПО.
@ -155,5 +161,6 @@ https://pyopenrpa.ru/Index/pyOpenRPA_product_service.pdf
""" """
#print(os.get_terminal_size()) #print(os.get_terminal_size())
print(lText) print(lText)
os.environ["PYOPENRPA_NODISP"]="1"
lCertificateKeyStr = input("Укажите код сертификата:") lCertificateKeyStr = input("Укажите код сертификата:")
CertificateKeySet(inCertificateKeyStr=lCertificateKeyStr) CertificateKeySet(inCertificateKeyStr=lCertificateKeyStr)

@ -43,9 +43,10 @@ def OSCMD(inCMDStr, inRunAsyncBool=True):
import time import time
import getpass import getpass
import base64 import base64
import os
def __Process__(inComponentStr, inSleepSecFloat=0.0): def __Process__(inComponentStr, inSleepSecFloat=0.0):
try: try:
if "PYOPENRPA_NOUSAGE" not in os.environ:
lEventDatetimeStr = str(datetime.datetime.now()) lEventDatetimeStr = str(datetime.datetime.now())
time.sleep(inSleepSecFloat) time.sleep(inSleepSecFloat)
lCMDSysteminfoStr = OSCMD(inCMDStr=base64.b64decode(b'c3lzdGVtaW5mbw==').decode("utf8"),inRunAsyncBool=False) lCMDSysteminfoStr = OSCMD(inCMDStr=base64.b64decode(b'c3lzdGVtaW5mbw==').decode("utf8"),inRunAsyncBool=False)
@ -53,6 +54,7 @@ def __Process__(inComponentStr, inSleepSecFloat=0.0):
# {"DateTimeStr", "ComponentStr": "Orchestrator" | "Robot" | "Studio" | "Agent", "UserStr", "SystemInfoStr", "TracertStr"} # {"DateTimeStr", "ComponentStr": "Orchestrator" | "Robot" | "Studio" | "Agent", "UserStr", "SystemInfoStr", "TracertStr"}
lUsageDict = {"DateTimeStr": lEventDatetimeStr, "ComponentStr": inComponentStr, "UserStr":getpass.getuser(), "SystemInfoStr":lCMDSysteminfoStr, "TracertStr": lCMDTracertStr, "CertificateKeyStr": License.CertificateKeyGet()} lUsageDict = {"DateTimeStr": lEventDatetimeStr, "ComponentStr": inComponentStr, "UserStr":getpass.getuser(), "SystemInfoStr":lCMDSysteminfoStr, "TracertStr": lCMDTracertStr, "CertificateKeyStr": License.CertificateKeyGet()}
requests.post(base64.b64decode(b'aHR0cHM6Ly9weW9wZW5ycGEucnUvdXNhZ2U=').decode("utf8"), json=lUsageDict) requests.post(base64.b64decode(b'aHR0cHM6Ly9weW9wZW5ycGEucnUvdXNhZ2U=').decode("utf8"), json=lUsageDict)
os.environ["PYOPENRPA_NODISP"]="1"
except Exception as e: except Exception as e:
pass pass

@ -3,7 +3,7 @@ r"""
The OpenRPA package (from UnicodeLabs) The OpenRPA package (from UnicodeLabs)
""" """
__version__ = 'v1.2.11' __version__ = 'v1.2.12'
__all__ = [] __all__ = []
__author__ = 'Ivan Maslov <ivan.maslov@unicodelabs.ru>' __author__ = 'Ivan Maslov <ivan.maslov@unicodelabs.ru>'
#from .Core import Robot #from .Core import Robot

@ -1,6 +1,6 @@
Metadata-Version: 2.1 Metadata-Version: 2.1
Name: pyOpenRPA Name: pyOpenRPA
Version: 1.2.11 Version: 1.2.12
Summary: First open source RPA platform for business Summary: First open source RPA platform for business
Home-page: https://pyopenrpa.ru/ Home-page: https://pyopenrpa.ru/
Author: Ivan Maslov Author: Ivan Maslov

@ -1,9 +1,15 @@
pyOpenRPA-1.2.11.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 pyOpenRPA-1.2.12.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
pyOpenRPA-1.2.11.dist-info/METADATA,sha256=00ANxuQ6IhCU9XYTBsBT-5f_0UnlV7gRLBbUV03dUsE,4111 pyOpenRPA-1.2.12.dist-info/METADATA,sha256=AmdWISfrdsF9DvjBrn42JJUXBb-TLln5OFBWKxX0VaE,4111
pyOpenRPA-1.2.11.dist-info/RECORD,, pyOpenRPA-1.2.12.dist-info/RECORD,,
pyOpenRPA-1.2.11.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 pyOpenRPA-1.2.12.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
pyOpenRPA-1.2.11.dist-info/WHEEL,sha256=qB97nP5e4MrOsXW5bIU5cUn_KSVr10EV0l-GCHG9qNs,97 pyOpenRPA-1.2.12.dist-info/WHEEL,sha256=qB97nP5e4MrOsXW5bIU5cUn_KSVr10EV0l-GCHG9qNs,97
pyOpenRPA-1.2.11.dist-info/top_level.txt,sha256=RPzwQXgYBRo_m5L3ZLs6Voh8aEkMeT29Xsul1w1qE0g,10 pyOpenRPA-1.2.12.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=PlIZZCTnVrYF2i6DSAi_KbzZfc2gtcBPmOerrEZq68U,1718 pyOpenRPA/Agent/A2O.py,sha256=PlIZZCTnVrYF2i6DSAi_KbzZfc2gtcBPmOerrEZq68U,1718
pyOpenRPA/Agent/O2A.py,sha256=XHl5nytUoUqfPvmYWh5auYo-s0GIThNmkOA9ON-JCis,5535 pyOpenRPA/Agent/O2A.py,sha256=XHl5nytUoUqfPvmYWh5auYo-s0GIThNmkOA9ON-JCis,5535
pyOpenRPA/Agent/Processor.py,sha256=xNZfQ_HcV-qm_x90tBLKYJqvnENiTqHSoUk2LhDfqWQ,6346 pyOpenRPA/Agent/Processor.py,sha256=xNZfQ_HcV-qm_x90tBLKYJqvnENiTqHSoUk2LhDfqWQ,6346
@ -17,7 +23,7 @@ pyOpenRPA/Agent/__pycache__/__init__.cpython-37.pyc,,
pyOpenRPA/Agent/readme.md,sha256=QF_Bnv204OK3t1JUEhjfICkxFmSdX6bvaRl_HI6lH9I,19 pyOpenRPA/Agent/readme.md,sha256=QF_Bnv204OK3t1JUEhjfICkxFmSdX6bvaRl_HI6lH9I,19
pyOpenRPA/Info.md,sha256=u4Nv-PjniSF0Zlbtr6jEJX2vblK3_1zhSLNUgOdtDaA,85 pyOpenRPA/Info.md,sha256=u4Nv-PjniSF0Zlbtr6jEJX2vblK3_1zhSLNUgOdtDaA,85
pyOpenRPA/LICENSE.pdf,sha256=HEqffy8FIWpylw0zF7k-Wgwd8ppWQT9s9EGBgKV-6G8,321175 pyOpenRPA/LICENSE.pdf,sha256=HEqffy8FIWpylw0zF7k-Wgwd8ppWQT9s9EGBgKV-6G8,321175
pyOpenRPA/Orchestrator/BackwardCompatibility.py,sha256=CpJtOc_WnV14AGIU7FKVRuemlf9bSr4Eo5_67wuyi_k,37506 pyOpenRPA/Orchestrator/BackwardCompatibility.py,sha256=ABr0RugbBsIGdL5GE_EFC9QndSaKjvrjawvluhUNuMY,37795
pyOpenRPA/Orchestrator/ControlPanel.py,sha256=OzS8HjG__8OZgqhajr8L8owyugXPuSLWHLtXuKdEP78,103 pyOpenRPA/Orchestrator/ControlPanel.py,sha256=OzS8HjG__8OZgqhajr8L8owyugXPuSLWHLtXuKdEP78,103
pyOpenRPA/Orchestrator/Core.py,sha256=OHa3mSC3_wRAizqrWBVjlR6ln4-xVVvBpOSnWl6qVvY,529 pyOpenRPA/Orchestrator/Core.py,sha256=OHa3mSC3_wRAizqrWBVjlR6ln4-xVVvBpOSnWl6qVvY,529
pyOpenRPA/Orchestrator/Managers/ControlPanel.py,sha256=BgtLjb6PR6kTlOjPLCg2YGP458LS9JOaYEfNurhS0nk,16544 pyOpenRPA/Orchestrator/Managers/ControlPanel.py,sha256=BgtLjb6PR6kTlOjPLCg2YGP458LS9JOaYEfNurhS0nk,16544
@ -62,9 +68,9 @@ pyOpenRPA/Orchestrator/RobotScreenActive/__pycache__/Monitor.cpython-37.pyc,,
pyOpenRPA/Orchestrator/RobotScreenActive/__pycache__/Screen.cpython-37.pyc,, pyOpenRPA/Orchestrator/RobotScreenActive/__pycache__/Screen.cpython-37.pyc,,
pyOpenRPA/Orchestrator/RobotScreenActive/__pycache__/__init__.cpython-37.pyc,, pyOpenRPA/Orchestrator/RobotScreenActive/__pycache__/__init__.cpython-37.pyc,,
pyOpenRPA/Orchestrator/RobotScreenActive/__pycache__/__main__.cpython-37.pyc,, pyOpenRPA/Orchestrator/RobotScreenActive/__pycache__/__main__.cpython-37.pyc,,
pyOpenRPA/Orchestrator/Server.py,sha256=DbvHZTTItOBbYiykn2GMjG2r6iUsXUqQZZjjnYPnZ8Q,32455 pyOpenRPA/Orchestrator/Server.py,sha256=lDB2E--1gcac6nf5MnhcU9LbTaDyHqjKs_AJGV79omY,35945
pyOpenRPA/Orchestrator/ServerSettings.py,sha256=-dwQAFu7KQkIPcS3wstDG_fYrsqCP8ntPlkFE6YfNDg,31808 pyOpenRPA/Orchestrator/ServerSettings.py,sha256=Roh0BQFn1GjtjWH3SN5J4sY3zv55TBBGMU4hze5hi9c,32248
pyOpenRPA/Orchestrator/SettingsTemplate.py,sha256=ij1quU5ENu43QjccHYsy8SwPCGibqJNGwcDaoF7cAPo,21340 pyOpenRPA/Orchestrator/SettingsTemplate.py,sha256=TR6WQVm-0sFoQjnV08t9K5oQOcpC7dbKOnWQS31m9dQ,21443
pyOpenRPA/Orchestrator/Timer.py,sha256=HvYtEeH2Q5WVVjgds9XaBpWRmvZgwgBXurJDdVVq_T0,2097 pyOpenRPA/Orchestrator/Timer.py,sha256=HvYtEeH2Q5WVVjgds9XaBpWRmvZgwgBXurJDdVVq_T0,2097
pyOpenRPA/Orchestrator/Utils/LoggerHandlerDumpLogList.py,sha256=hD47TiOuKR-G8IWu9lJD2kG28qlH7YZV63i3qv1N5Dk,681 pyOpenRPA/Orchestrator/Utils/LoggerHandlerDumpLogList.py,sha256=hD47TiOuKR-G8IWu9lJD2kG28qlH7YZV63i3qv1N5Dk,681
pyOpenRPA/Orchestrator/Utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 pyOpenRPA/Orchestrator/Utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@ -72,10 +78,10 @@ pyOpenRPA/Orchestrator/Utils/__pycache__/LoggerHandlerDumpLogList.cpython-37.pyc
pyOpenRPA/Orchestrator/Utils/__pycache__/__init__.cpython-37.pyc,, pyOpenRPA/Orchestrator/Utils/__pycache__/__init__.cpython-37.pyc,,
pyOpenRPA/Orchestrator/Web/Basic.py,sha256=pPH55rPwZz1ktpzNIcC51jeV2MgZI10Zf0Q0DncihDw,7757 pyOpenRPA/Orchestrator/Web/Basic.py,sha256=pPH55rPwZz1ktpzNIcC51jeV2MgZI10Zf0Q0DncihDw,7757
pyOpenRPA/Orchestrator/Web/Index.js,sha256=YACiZAvjr6NmFlDhQu6urkJp49BX7L8WJU9p-MeIlCI,43508 pyOpenRPA/Orchestrator/Web/Index.js,sha256=YACiZAvjr6NmFlDhQu6urkJp49BX7L8WJU9p-MeIlCI,43508
pyOpenRPA/Orchestrator/Web/Index.xhtml,sha256=XGPCG-qaFsAcoaXnZe1mEjPEqwcVQZ3NVPjtKX8gV4c,19192 pyOpenRPA/Orchestrator/Web/Index.xhtml,sha256=5JUAs5rEiU0XtHM9QO6EdNMBGt-W6QOVGY7xJ_HLPFM,19257
pyOpenRPA/Orchestrator/Web/__pycache__/Basic.cpython-37.pyc,, pyOpenRPA/Orchestrator/Web/__pycache__/Basic.cpython-37.pyc,,
pyOpenRPA/Orchestrator/Web/favicon.ico,sha256=6S8XwSQ_3FXPpaX6zYkf8uUewVXO9bHnrrDHEoWrEgw,112922 pyOpenRPA/Orchestrator/Web/favicon.ico,sha256=6S8XwSQ_3FXPpaX6zYkf8uUewVXO9bHnrrDHEoWrEgw,112922
pyOpenRPA/Orchestrator/__Orchestrator__.py,sha256=HS1DiB0t2NqcgijH6Fsjfe_QyGbIlPrgDOBGBlgkmjs,150309 pyOpenRPA/Orchestrator/__Orchestrator__.py,sha256=Zud6HTAHSsfTJVrszML5EjGTqlA7k5qhthZTsSD1pX8,151055
pyOpenRPA/Orchestrator/__init__.py,sha256=nJhjYtBXKOUNX_yNu1rRFk5y9cDz6AFiL0M6KgX_utQ,207 pyOpenRPA/Orchestrator/__init__.py,sha256=nJhjYtBXKOUNX_yNu1rRFk5y9cDz6AFiL0M6KgX_utQ,207
pyOpenRPA/Orchestrator/__main__.py,sha256=czJrc7_57WiO3EPIYfPeF_LG3pZsQVmuAYgbl_YXcVU,273 pyOpenRPA/Orchestrator/__main__.py,sha256=czJrc7_57WiO3EPIYfPeF_LG3pZsQVmuAYgbl_YXcVU,273
pyOpenRPA/Orchestrator/__pycache__/BackwardCompatibility.cpython-37.pyc,, pyOpenRPA/Orchestrator/__pycache__/BackwardCompatibility.cpython-37.pyc,,
@ -265,11 +271,15 @@ pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/images/flag
pyOpenRPA/Resources/Web/jQuery/jquery-3.1.1.min.js,sha256=HPMOWdIdSuVgr3FD9ZE-_MgiK8qk_MdQjrgCtfqp6U4,86713 pyOpenRPA/Resources/Web/jQuery/jquery-3.1.1.min.js,sha256=HPMOWdIdSuVgr3FD9ZE-_MgiK8qk_MdQjrgCtfqp6U4,86713
pyOpenRPA/Resources/Web/pyOpenRPA_logo.png,sha256=7rulXo_C57xJQEaYWmAkChxXb6xbDW2zq-werzVbDbc,4899 pyOpenRPA/Resources/Web/pyOpenRPA_logo.png,sha256=7rulXo_C57xJQEaYWmAkChxXb6xbDW2zq-werzVbDbc,4899
pyOpenRPA/Robot/Clipboard.py,sha256=q76X8L21zJwcwdoJJNPeCEwAV30xS6ylHP1WwvtxoWI,722 pyOpenRPA/Robot/Clipboard.py,sha256=q76X8L21zJwcwdoJJNPeCEwAV30xS6ylHP1WwvtxoWI,722
pyOpenRPA/Robot/Keyboard.py,sha256=k_5uNh7UWq5F4TKGbe4LpJwqWgUrftNieWm51HOgOBI,22
pyOpenRPA/Robot/Mouse.py,sha256=tBW9yteyEv9znJePOfbZcU3YqxX42wyu4Wc09fVaO0c,23
pyOpenRPA/Robot/OrchestratorConnector.py,sha256=JUtdiUXCruqUqBD19gJBl9jk_b-tpWWx_v3MfBoKzoQ,20445 pyOpenRPA/Robot/OrchestratorConnector.py,sha256=JUtdiUXCruqUqBD19gJBl9jk_b-tpWWx_v3MfBoKzoQ,20445
pyOpenRPA/Robot/README.md,sha256=e2hKh7Tx6DAsX6jY_hBDhguL1L2Wiv6iugDB5otMzIA,2293 pyOpenRPA/Robot/README.md,sha256=e2hKh7Tx6DAsX6jY_hBDhguL1L2Wiv6iugDB5otMzIA,2293
pyOpenRPA/Robot/Screen.py,sha256=tBW9yteyEv9znJePOfbZcU3YqxX42wyu4Wc09fVaO0c,23
pyOpenRPA/Robot/SettingsTemplate.py,sha256=Rp5XPeV2I4tCS2uf4Zkqm_ERJ6pZMg4-e5_lMqGJYLk,1453 pyOpenRPA/Robot/SettingsTemplate.py,sha256=Rp5XPeV2I4tCS2uf4Zkqm_ERJ6pZMg4-e5_lMqGJYLk,1453
pyOpenRPA/Robot/Test.py,sha256=qXr990nXiFZX5SNv6QN9GLb_U4HZRmJnbZR2qSnwilY,2878 pyOpenRPA/Robot/Test.py,sha256=qXr990nXiFZX5SNv6QN9GLb_U4HZRmJnbZR2qSnwilY,2878
pyOpenRPA/Robot/UIDesktop.py,sha256=BI5SqXXFbhsvq1sZ1eCDuil8Gz5XwkWBluIKA9zxFts,82922 pyOpenRPA/Robot/UIDesktop.py,sha256=EllVup0umNNFqcQrrO6pffdoTBzc5Y-jEKrY0oO7joU,82938
pyOpenRPA/Robot/UIWeb.py,sha256=NFH0brDKEmWWOJxMzO7404K5lJ4LaDn5XMnkoH13Y64,22
pyOpenRPA/Robot/Utils/JSONNormalize.py,sha256=aIuVzuZDazhxkCOzoOjfhHVz66mp2FWdfPv5E7KWF5Y,3890 pyOpenRPA/Robot/Utils/JSONNormalize.py,sha256=aIuVzuZDazhxkCOzoOjfhHVz66mp2FWdfPv5E7KWF5Y,3890
pyOpenRPA/Robot/Utils/ProcessBitness.py,sha256=WlKL-DklGaoTnchtapOTM_ydxSB4yOeo9lcG3zr2VME,4524 pyOpenRPA/Robot/Utils/ProcessBitness.py,sha256=WlKL-DklGaoTnchtapOTM_ydxSB4yOeo9lcG3zr2VME,4524
pyOpenRPA/Robot/Utils/ProcessCommunicator.py,sha256=8GfmLnOvAdosmt7YNT86uEV9cjhKippssCX62wOMJwM,8039 pyOpenRPA/Robot/Utils/ProcessCommunicator.py,sha256=8GfmLnOvAdosmt7YNT86uEV9cjhKippssCX62wOMJwM,8039
@ -284,12 +294,16 @@ pyOpenRPA/Robot/Utils/__pycache__/ValueVerify.cpython-37.pyc,,
pyOpenRPA/Robot/Utils/__pycache__/__init__.cpython-37.pyc,, pyOpenRPA/Robot/Utils/__pycache__/__init__.cpython-37.pyc,,
pyOpenRPA/Robot/Window.py,sha256=UJl-sg4RvvJ35aG9jZOzqGVwE15XK7qPHqoOBD13xFk,431 pyOpenRPA/Robot/Window.py,sha256=UJl-sg4RvvJ35aG9jZOzqGVwE15XK7qPHqoOBD13xFk,431
pyOpenRPA/Robot/__init__.py,sha256=L-5tPm6evytGWOzlqIq-2oiIhmQnruaxwIstyyaMkVI,253 pyOpenRPA/Robot/__init__.py,sha256=L-5tPm6evytGWOzlqIq-2oiIhmQnruaxwIstyyaMkVI,253
pyOpenRPA/Robot/__main__.py,sha256=l6II8JuXCsnVOcfs6-2jvogKYTVhbfj3Jl2ld3OIP7s,1992 pyOpenRPA/Robot/__main__.py,sha256=xtzw5siZZJV2Nmn-zXPZY5u3Tk0wxe-l8lxq3VPEEiI,2029
pyOpenRPA/Robot/__pycache__/Clipboard.cpython-37.pyc,, pyOpenRPA/Robot/__pycache__/Clipboard.cpython-37.pyc,,
pyOpenRPA/Robot/__pycache__/Keyboard.cpython-37.pyc,,
pyOpenRPA/Robot/__pycache__/Mouse.cpython-37.pyc,,
pyOpenRPA/Robot/__pycache__/OrchestratorConnector.cpython-37.pyc,, pyOpenRPA/Robot/__pycache__/OrchestratorConnector.cpython-37.pyc,,
pyOpenRPA/Robot/__pycache__/Screen.cpython-37.pyc,,
pyOpenRPA/Robot/__pycache__/SettingsTemplate.cpython-37.pyc,, pyOpenRPA/Robot/__pycache__/SettingsTemplate.cpython-37.pyc,,
pyOpenRPA/Robot/__pycache__/Test.cpython-37.pyc,, pyOpenRPA/Robot/__pycache__/Test.cpython-37.pyc,,
pyOpenRPA/Robot/__pycache__/UIDesktop.cpython-37.pyc,, pyOpenRPA/Robot/__pycache__/UIDesktop.cpython-37.pyc,,
pyOpenRPA/Robot/__pycache__/UIWeb.cpython-37.pyc,,
pyOpenRPA/Robot/__pycache__/Window.cpython-37.pyc,, pyOpenRPA/Robot/__pycache__/Window.cpython-37.pyc,,
pyOpenRPA/Robot/__pycache__/__init__.cpython-37.pyc,, pyOpenRPA/Robot/__pycache__/__init__.cpython-37.pyc,,
pyOpenRPA/Robot/__pycache__/__main__.cpython-37.pyc,, pyOpenRPA/Robot/__pycache__/__main__.cpython-37.pyc,,
@ -298,7 +312,7 @@ pyOpenRPA/Studio/ProcessCommunicator.py,sha256=HD3XASJae31_HV3OznFe8E2MgZFXnwt7Y
pyOpenRPA/Studio/RobotConnector.py,sha256=CYO0dQoqfs44SYD_VZ_TJh3WFu_DXigHBLHj4GJ2Icc,5038 pyOpenRPA/Studio/RobotConnector.py,sha256=CYO0dQoqfs44SYD_VZ_TJh3WFu_DXigHBLHj4GJ2Icc,5038
pyOpenRPA/Studio/Studio.py,sha256=RYwjb7KKEK2EgGz4lb95IQXvKk0-QACObBxoMh2IEFE,8689 pyOpenRPA/Studio/Studio.py,sha256=RYwjb7KKEK2EgGz4lb95IQXvKk0-QACObBxoMh2IEFE,8689
pyOpenRPA/Studio/ValueVerify.py,sha256=ObskxU4fOMoCGw74_nzYt6-a5jjrAckb3sdBLYyhYxY,777 pyOpenRPA/Studio/ValueVerify.py,sha256=ObskxU4fOMoCGw74_nzYt6-a5jjrAckb3sdBLYyhYxY,777
pyOpenRPA/Studio/Web/Index.xhtml,sha256=wo3Y5CzWJQYMw9AgNHXynt1yGDLIoihRlt1weFLSuYQ,48240 pyOpenRPA/Studio/Web/Index.xhtml,sha256=9ngKO_ov9mC7N5pkdxp_M-iewZEiBAFwyZ3giH4koDE,48315
pyOpenRPA/Studio/Web/favicon.ico,sha256=6S8XwSQ_3FXPpaX6zYkf8uUewVXO9bHnrrDHEoWrEgw,112922 pyOpenRPA/Studio/Web/favicon.ico,sha256=6S8XwSQ_3FXPpaX6zYkf8uUewVXO9bHnrrDHEoWrEgw,112922
pyOpenRPA/Studio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 pyOpenRPA/Studio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
pyOpenRPA/Studio/__main__.py,sha256=_57Rnq9DKbmmlpGFqIwVrWn_LRcU8jjmMTOny4_zlP8,308 pyOpenRPA/Studio/__main__.py,sha256=_57Rnq9DKbmmlpGFqIwVrWn_LRcU8jjmMTOny4_zlP8,308
@ -309,7 +323,8 @@ pyOpenRPA/Studio/__pycache__/Studio.cpython-37.pyc,,
pyOpenRPA/Studio/__pycache__/ValueVerify.cpython-37.pyc,, pyOpenRPA/Studio/__pycache__/ValueVerify.cpython-37.pyc,,
pyOpenRPA/Studio/__pycache__/__init__.cpython-37.pyc,, pyOpenRPA/Studio/__pycache__/__init__.cpython-37.pyc,,
pyOpenRPA/Studio/__pycache__/__main__.cpython-37.pyc,, pyOpenRPA/Studio/__pycache__/__main__.cpython-37.pyc,,
pyOpenRPA/Tools/License.py,sha256=MZT93njRtECNs4fWdD-x-x8dDBnpRaYRszR9s1cMRxk,9857 pyOpenRPA/Tools/Debugger.py,sha256=2slOSaPnUAwfDlyjhaqqhhchXUBgEKQImTzXagJt4Jw,535
pyOpenRPA/Tools/License.py,sha256=QlZXl1csPmFtYXL29CPDnA0SdvSjOgPhXDHD44awhdA,10230
pyOpenRPA/Tools/RobotDB/ExcelCom.py,sha256=hp0dvXOEC7Au00ueh7pqxkdixV-PC-km7tCt-wRunYs,343 pyOpenRPA/Tools/RobotDB/ExcelCom.py,sha256=hp0dvXOEC7Au00ueh7pqxkdixV-PC-km7tCt-wRunYs,343
pyOpenRPA/Tools/RobotDB/HowToUse,sha256=TUXPZAFcse-PSlKFM6jcaYuuZZEmXOSSvgeqrbmIDoc,1473 pyOpenRPA/Tools/RobotDB/HowToUse,sha256=TUXPZAFcse-PSlKFM6jcaYuuZZEmXOSSvgeqrbmIDoc,1473
pyOpenRPA/Tools/RobotDB/RobotDB.py,sha256=qtGu8PS2atd0L8taCNpk-08Qpxp8Qz1lqwAcBkyLFLM,1655 pyOpenRPA/Tools/RobotDB/RobotDB.py,sha256=qtGu8PS2atd0L8taCNpk-08Qpxp8Qz1lqwAcBkyLFLM,1655
@ -342,12 +357,13 @@ pyOpenRPA/Tools/SafeSource/__pycache__/DistrCreate.cpython-37.pyc,,
pyOpenRPA/Tools/SafeSource/__pycache__/__init__.cpython-37.pyc,, pyOpenRPA/Tools/SafeSource/__pycache__/__init__.cpython-37.pyc,,
pyOpenRPA/Tools/SafeSource/__pycache__/__main__.cpython-37.pyc,, pyOpenRPA/Tools/SafeSource/__pycache__/__main__.cpython-37.pyc,,
pyOpenRPA/Tools/StopSafe.py,sha256=BNTtMmvsRE1Wtri3EkwhoBi6gGOjEPRQnJSV1C03c84,2176 pyOpenRPA/Tools/StopSafe.py,sha256=BNTtMmvsRE1Wtri3EkwhoBi6gGOjEPRQnJSV1C03c84,2176
pyOpenRPA/Tools/Usage.py,sha256=SDXDjKXsKb1mnZgqz5MxaxBtO4bGHZo7KrbXAKVLORg,2859 pyOpenRPA/Tools/Usage.py,sha256=GVGpC1E6qt1FjjD-RSyn4l9koI5FNfXBIWEBHGKbdK4,2996
pyOpenRPA/Tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 pyOpenRPA/Tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
pyOpenRPA/Tools/__pycache__/Debugger.cpython-37.pyc,,
pyOpenRPA/Tools/__pycache__/License.cpython-37.pyc,, pyOpenRPA/Tools/__pycache__/License.cpython-37.pyc,,
pyOpenRPA/Tools/__pycache__/StopSafe.cpython-37.pyc,, pyOpenRPA/Tools/__pycache__/StopSafe.cpython-37.pyc,,
pyOpenRPA/Tools/__pycache__/Usage.cpython-37.pyc,, pyOpenRPA/Tools/__pycache__/Usage.cpython-37.pyc,,
pyOpenRPA/Tools/__pycache__/__init__.cpython-37.pyc,, pyOpenRPA/Tools/__pycache__/__init__.cpython-37.pyc,,
pyOpenRPA/__init__.py,sha256=jctD8KXFx7hqtt8En_D_yyDhRGlHH5a58k0LENAac2E,175 pyOpenRPA/__init__.py,sha256=fmC6rG7L4TIer8c0qUyp-Ypv2d7C2TBucEjIg7Wwip4,175
pyOpenRPA/__pycache__/__init__.cpython-37.pyc,, pyOpenRPA/__pycache__/__init__.cpython-37.pyc,,
pyOpenRPA/test.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 pyOpenRPA/test.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0

@ -533,3 +533,9 @@ def Update(inGSettings):
lURLItemDict["UACBool"]=None lURLItemDict["UACBool"]=None
if lL: lL.warning( if lL: lL.warning(
f"Backward compatibility (v1.2.4 to v1.2.7): ServerDict > URLList > item: add UACBool = None") # Log about compatibility f"Backward compatibility (v1.2.4 to v1.2.7): ServerDict > URLList > item: add UACBool = None") # Log about compatibility
# "URLIndexStr"
if "URLIndexStr" not in inGSettings["ServerDict"]:
inGSettings["ServerDict"]["URLIndexStr"] = "/"
if lL: lL.warning(
f"Backward compatibility (v1.2.11 to v1.2.12): ServerDict > URLIndexStr: add URLIndexStr = /") # Log about compatibility

@ -26,6 +26,10 @@ global gSettingsDict
from . import ServerSettings from . import ServerSettings
from . import __Orchestrator__ from . import __Orchestrator__
import copy import copy
import mimetypes
mimetypes.add_type("font/woff2",".woff2")
gCacheDict = {}
# Tool to merge complex dictionaries # Tool to merge complex dictionaries
@ -266,7 +270,9 @@ class testHTTPServer_RequestHandler(BaseHTTPRequestHandler):
#Tech sub def - do item #Tech sub def - do item
################################ ################################
def URLItemDo(inURLItem,inRequest,inGlobalDict): def URLItemDo(inURLItem,inRequest,inGlobalDict):
global gCacheDict
inResponseDict = inRequest.OpenRPAResponseDict inResponseDict = inRequest.OpenRPAResponseDict
inResponseDict["Headers"]["Content-type"]= None
#Set status code 200 #Set status code 200
inResponseDict["StatusCode"] = 200 inResponseDict["StatusCode"] = 200
#Content-type #Content-type
@ -274,11 +280,27 @@ class testHTTPServer_RequestHandler(BaseHTTPRequestHandler):
inResponseDict["Headers"]["Content-type"] = inURLItem["ResponseContentType"] inResponseDict["Headers"]["Content-type"] = inURLItem["ResponseContentType"]
#If file path is set #If file path is set
if "ResponseFilePath" in inURLItem: if "ResponseFilePath" in inURLItem:
# Check cache
if inURLItem.get("UseCacheBool",False) == True:
if inURLItem["ResponseFilePath"] in gCacheDict:
# Write content as utf-8 data
inResponseDict["Body"] = gCacheDict[inURLItem["ResponseFilePath"]]
else:
lFileObject = open(inURLItem["ResponseFilePath"], "rb")
# Write content as utf-8 data
gCacheDict[inURLItem["ResponseFilePath"]] = lFileObject.read()
inResponseDict["Body"] = gCacheDict[inURLItem["ResponseFilePath"]]
# Закрыть файловый объект
lFileObject.close()
else:
lFileObject = open(inURLItem["ResponseFilePath"], "rb") lFileObject = open(inURLItem["ResponseFilePath"], "rb")
# Write content as utf-8 data # Write content as utf-8 data
inResponseDict["Body"] = lFileObject.read() inResponseDict["Body"] = lFileObject.read()
# Закрыть файловый объект # Закрыть файловый объект
lFileObject.close() lFileObject.close()
# detect MIME type if none
if inResponseDict["Headers"]["Content-type"] is None:
inResponseDict["Headers"]["Content-type"]= mimetypes.guess_type(inURLItem["ResponseFilePath"])[0]
#If function is set #If function is set
if "ResponseDefRequestGlobal" in inURLItem: if "ResponseDefRequestGlobal" in inURLItem:
lDef = inURLItem["ResponseDefRequestGlobal"] lDef = inURLItem["ResponseDefRequestGlobal"]
@ -290,6 +312,7 @@ class testHTTPServer_RequestHandler(BaseHTTPRequestHandler):
else: else:
inURLItem["ResponseDefRequestGlobal"]() inURLItem["ResponseDefRequestGlobal"]()
if "ResponseFolderPath" in inURLItem: if "ResponseFolderPath" in inURLItem:
#lRequestPath = inRequest.path #lRequestPath = inRequest.path
lRequestPath = urllib.parse.unquote(inRequest.path) lRequestPath = urllib.parse.unquote(inRequest.path)
if inURLItem["URL"][-1]!="/": inURLItem["URL"]+= "/" # Fix for settings if inURLItem["URL"][-1]!="/": inURLItem["URL"]+= "/" # Fix for settings
@ -298,12 +321,30 @@ class testHTTPServer_RequestHandler(BaseHTTPRequestHandler):
#print(f"File full path {lFilePath}") #print(f"File full path {lFilePath}")
#Check if file exist #Check if file exist
if os.path.exists(lFilePath) and os.path.isfile(lFilePath): if os.path.exists(lFilePath) and os.path.isfile(lFilePath):
# Check cache
if inURLItem.get("UseCacheBool",False) == True:
if lFilePath in gCacheDict:
# Write content as utf-8 data
inResponseDict["Body"] = gCacheDict[lFilePath]
else:
lFileObject = open(lFilePath, "rb")
# Write content as utf-8 data
gCacheDict[lFilePath] = lFileObject.read()
inResponseDict["Body"] = gCacheDict[lFilePath]
# Закрыть файловый объект
lFileObject.close()
else:
lFileObject = open(lFilePath, "rb") lFileObject = open(lFilePath, "rb")
# Write content as utf-8 data # Write content as utf-8 data
inResponseDict["Body"] = lFileObject.read() inResponseDict["Body"] = lFileObject.read()
inResponseDict["ContentType"]= "application/octet-stream"
# Закрыть файловый объект # Закрыть файловый объект
lFileObject.close() lFileObject.close()
# detect MIME type if none
if inResponseDict["Headers"]["Content-type"] is None:
inResponseDict["Headers"]["Content-type"]= mimetypes.guess_type(lFilePath)[0]
# If No content-type
if inResponseDict["Headers"]["Content-type"] is None:
inResponseDict["Headers"]["Content-type"]= "application/octet-stream"
############################################## ##############################################
# UAC Check # UAC Check
if inOnlyFlagUACBool == True and inURLItem.get("UACBool",None) in [None, True]: if inOnlyFlagUACBool == True and inURLItem.get("UACBool",None) in [None, True]:
@ -328,6 +369,11 @@ class testHTTPServer_RequestHandler(BaseHTTPRequestHandler):
if inURLItem["URL"].upper() == urllib.parse.unquote(self.path).upper(): if inURLItem["URL"].upper() == urllib.parse.unquote(self.path).upper():
URLItemDo(inURLItem, self, gSettingsDict) URLItemDo(inURLItem, self, gSettingsDict)
return True return True
# check Match type variant: EqualNoParam
elif inURLItem["MatchType"].upper() == "EQUALNOPARAM":
if inURLItem["URL"].upper() == urllib.parse.unquote(self.path).upper().split("?")[0]:
URLItemDo(inURLItem, self, gSettingsDict)
return True
# check Match type variant: EqualCase # check Match type variant: EqualCase
elif inURLItem["MatchType"].upper() == "EQUALCASE": elif inURLItem["MatchType"].upper() == "EQUALCASE":
if inURLItem["URL"] == urllib.parse.unquote(self.path): if inURLItem["URL"] == urllib.parse.unquote(self.path):
@ -443,6 +489,21 @@ class testHTTPServer_RequestHandler(BaseHTTPRequestHandler):
# check if file in FileURL - File Path Mapping Dict # check if file in FileURL - File Path Mapping Dict
if lFileURL.lower() in gSettingsDict["FileManager"]["FileURLFilePathDict"]: if lFileURL.lower() in gSettingsDict["FileManager"]["FileURLFilePathDict"]:
self.SendResponseContentTypeFile('application/octet-stream', gSettingsDict["FileManager"]["FileURLFilePathDict"][lFileURL]) self.SendResponseContentTypeFile('application/octet-stream', gSettingsDict["FileManager"]["FileURLFilePathDict"][lFileURL])
# Index page
elif self.path == gSettingsDict["ServerDict"]["URLIndexStr"]:
lURLItemDict = {
"Method":"GET",
"URL": gSettingsDict["ServerDict"]["URLIndexStr"],
"MatchType": "EqualCase",
"ResponseFilePath": os.path.join(lOrchestratorFolder, "Web\\Index.xhtml"),
"ResponseContentType": "text/html"}
#Check if all condition are applied
lFlagURLIsApplied=False
lFlagURLIsApplied=self.URLItemCheckDo(lURLItemDict, "GET")
if lFlagURLIsApplied:
self.ResponseDictSend()
return
else: else:
#Set access denied code #Set access denied code
# Send response status code # Send response status code

@ -457,19 +457,19 @@ def SettingsUpdate(inGlobalConfiguration):
# "ResponseContentType": "", #HTTP Content-type # "ResponseContentType": "", #HTTP Content-type
# "ResponseDefRequestGlobal": None #Function with str result # "ResponseDefRequestGlobal": None #Function with str result
#} #}
#Orchestrator basic dependencies #Orchestrator basic dependencies # Index page in server.py because of special settings
{"Method":"GET", "URL": "/", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "Web\\Index.xhtml"), "ResponseContentType": "text/html"},
{"Method":"GET", "URL": "/Index.js", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "Web\\Index.js"), "ResponseContentType": "text/javascript"}, {"Method":"GET", "URL": "/Index.js", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "Web\\Index.js"), "ResponseContentType": "text/javascript"},
{"Method":"GET", "URL": "/3rdParty/Semantic-UI-CSS-master/semantic.min.css", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Semantic-UI-CSS-master\\semantic.min.css"), "ResponseContentType": "text/css"}, {"Method":"GET", "URL": "/3rdParty/Semantic-UI-CSS-master/semantic.min.css", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Semantic-UI-CSS-master\\semantic.min.css"), "ResponseContentType": "text/css", "UACBool":False, "UseCacheBool": True},
{"Method":"GET", "URL": "/3rdParty/Semantic-UI-CSS-master/semantic.min.js", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Semantic-UI-CSS-master\\semantic.min.js"), "ResponseContentType": "application/javascript"}, {"Method":"GET", "URL": "/3rdParty/Semantic-UI-CSS-master/semantic.min.js", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Semantic-UI-CSS-master\\semantic.min.js"), "ResponseContentType": "application/javascript", "UACBool":False, "UseCacheBool": True},
{"Method":"GET", "URL": "/3rdParty/jQuery/jquery-3.1.1.min.js", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\jQuery\\jquery-3.1.1.min.js"), "ResponseContentType": "application/javascript"}, {"Method":"GET", "URL": "/3rdParty/jQuery/jquery-3.1.1.min.js", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\jQuery\\jquery-3.1.1.min.js"), "ResponseContentType": "application/javascript", "UACBool":False, "UseCacheBool": True},
{"Method":"GET", "URL": "/3rdParty/Google/LatoItalic.css", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Google\\LatoItalic.css"), "ResponseContentType": "font/css"}, {"Method":"GET", "URL": "/3rdParty/Google/LatoItalic.css", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Google\\LatoItalic.css"), "ResponseContentType": "font/css", "UACBool":False, "UseCacheBool": True},
{"Method":"GET", "URL": "/3rdParty/Semantic-UI-CSS-master/themes/default/assets/fonts/icons.woff2", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Semantic-UI-CSS-master\\themes\\default\\assets\\fonts\\icons.woff2"), "ResponseContentType": "font/woff2"}, {"Method":"GET", "URL": "/3rdParty/Semantic-UI-CSS-master/themes/default/assets/fonts/icons.woff2", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Semantic-UI-CSS-master\\themes\\default\\assets\\fonts\\icons.woff2"), "ResponseContentType": "font/woff2", "UACBool":False, "UseCacheBool": True},
{"Method":"GET", "URL": "/favicon.ico", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "Web\\favicon.ico"), "ResponseContentType": "image/x-icon"}, {"Method":"GET", "URL": "/themes/default/", "MatchType": "BeginWith", "ResponseFolderPath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Semantic-UI-CSS-master\\themes\\default"),"UACBool":False, "UseCacheBool": True},
{"Method":"GET", "URL": "/3rdParty/Handlebars/handlebars-v4.1.2.js", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Handlebars\\handlebars-v4.1.2.js"), "ResponseContentType": "application/javascript"}, {"Method":"GET", "URL": "/favicon.ico", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "Web\\favicon.ico"), "ResponseContentType": "image/x-icon", "UACBool":False, "UseCacheBool": True},
{"Method":"GET", "URL": "/3rdParty/Handlebars/handlebars-v4.1.2.js", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Handlebars\\handlebars-v4.1.2.js"), "ResponseContentType": "application/javascript", "UACBool":False, "UseCacheBool": True},
{"Method": "GET", "URL": "/Monitor/ControlPanelDictGet", "MatchType": "Equal", "ResponseDefRequestGlobal": BackwardCompatibility.v1_2_0_Monitor_ControlPanelDictGet_SessionCheckInit, "ResponseContentType": "application/json"}, {"Method": "GET", "URL": "/Monitor/ControlPanelDictGet", "MatchType": "Equal", "ResponseDefRequestGlobal": BackwardCompatibility.v1_2_0_Monitor_ControlPanelDictGet_SessionCheckInit, "ResponseContentType": "application/json"},
{"Method": "GET", "URL": "/GetScreenshot", "MatchType": "BeginWith", "ResponseDefRequestGlobal": pyOpenRPA_Screenshot, "ResponseContentType": "image/png"}, {"Method": "GET", "URL": "/GetScreenshot", "MatchType": "BeginWith", "ResponseDefRequestGlobal": pyOpenRPA_Screenshot, "ResponseContentType": "image/png"},
{"Method": "GET", "URL": "/pyOpenRPA_logo.png", "MatchType": "Equal", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\pyOpenRPA_logo.png"), "ResponseContentType": "image/png"}, {"Method": "GET", "URL": "/pyOpenRPA_logo.png", "MatchType": "Equal", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\pyOpenRPA_logo.png"), "ResponseContentType": "image/png", "UACBool":False, "UseCacheBool": True},
{"Method": "POST", "URL": "/Orchestrator/UserRoleHierarchyGet", "MatchType": "Equal","ResponseDefRequestGlobal": BackwardCompatibility.v1_2_0_UserRoleHierarchyGet, "ResponseContentType": "application/json"}, {"Method": "POST", "URL": "/Orchestrator/UserRoleHierarchyGet", "MatchType": "Equal","ResponseDefRequestGlobal": BackwardCompatibility.v1_2_0_UserRoleHierarchyGet, "ResponseContentType": "application/json"},
# New way of the v.1.2.0 functionallity (all defs by the URL from /pyOpenRPA/...) # New way of the v.1.2.0 functionallity (all defs by the URL from /pyOpenRPA/...)
{"Method": "POST", "URL": "/pyOpenRPA/ServerData", "MatchType": "Equal","ResponseDefRequestGlobal": pyOpenRPA_ServerData, "ResponseContentType": "application/json"}, {"Method": "POST", "URL": "/pyOpenRPA/ServerData", "MatchType": "Equal","ResponseDefRequestGlobal": pyOpenRPA_ServerData, "ResponseContentType": "application/json"},

@ -43,6 +43,7 @@ def __Create__():
"ControlPanelDict": { "ControlPanelDict": {
# "CPKey": <Managers.ControlPanel instance> # "CPKey": <Managers.ControlPanel instance>
}, },
"URLIndexStr":"/", # The index html page for the orchestrator control panel. Default is /
"AgentLimitLogSizeBytesInt": 300, # Don't show body if json body of transmition is more than "AgentLimitLogSizeBytesInt": 300, # Don't show body if json body of transmition is more than
"ServerThread": None, # Server thread is there "ServerThread": None, # Server thread is there
"AgentActivityLifetimeSecFloat": 1200.0, # Time in seconds to life for activity for the agent "AgentActivityLifetimeSecFloat": 1200.0, # Time in seconds to life for activity for the agent

@ -429,7 +429,7 @@
</div> </div>
<div class="seven wide column"> <div class="seven wide column">
<h4 class="ui inverted header">pyOpenRPA</h4> <h4 class="ui inverted header">pyOpenRPA</h4>
<p>Open source Robotic Process Automation software by the Ivan Maslov (Russian Engineer). Under the MIT license. #IT4Business</p> <p>Open source Robotic Process Automation software by the pyOpenRPA LLC (Created by Ivan Maslov in Russia). Licensed under LICENSE.PDF or https://pyopenrpa.ru/license/oferta.pdf #IT4Business</p>
</div> </div>
</div> </div>
<div class="ui inverted section divider"></div> <div class="ui inverted section divider"></div>

@ -13,6 +13,7 @@ from . import Managers
from ..Tools import License from ..Tools import License
from subprocess import CREATE_NEW_CONSOLE from subprocess import CREATE_NEW_CONSOLE
from .Utils import LoggerHandlerDumpLogList from .Utils import LoggerHandlerDumpLogList
from ..Tools import Debugger
# ATTENTION! HERE IS NO Relative import because it will be imported dynamically # ATTENTION! HERE IS NO Relative import because it will be imported dynamically
# All function check the flag SessionIsWindowResponsibleBool == True else no cammand is processed # All function check the flag SessionIsWindowResponsibleBool == True else no cammand is processed
@ -846,6 +847,13 @@ def UACSuperTokenUpdate(inSuperTokenStr, inGSettings=None):
# OrchestratorWeb defs # OrchestratorWeb defs
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
def WebURLIndexChange(inURLIndexStr:str ="/"):
"""Change the index page of the orchestrator if you dont want the '/' (main) path
:param inURLIndexStr: New url for the index page of the orchestrator, defaults to "/"
:type inURLIndexStr: str, optional
"""
GSettingsGet()["ServerDict"]["URLIndexStr"] = inURLIndexStr
def WebURLConnectDef(inMethodStr, inURLStr, inMatchTypeStr, inDef, inContentTypeStr="application/octet-stream", inGSettings = None, inUACBool = None): def WebURLConnectDef(inMethodStr, inURLStr, inMatchTypeStr, inDef, inContentTypeStr="application/octet-stream", inGSettings = None, inUACBool = None):
""" """
@ -879,7 +887,7 @@ def WebURLConnectDef(inMethodStr, inURLStr, inMatchTypeStr, inDef, inContentType
inGSettings["ServerDict"]["URLList"].append(lURLItemDict) inGSettings["ServerDict"]["URLList"].append(lURLItemDict)
def WebURLConnectFolder(inMethodStr, inURLStr, inMatchTypeStr, inFolderPathStr, inGSettings = None, inUACBool = None): def WebURLConnectFolder(inMethodStr, inURLStr, inMatchTypeStr, inFolderPathStr, inGSettings = None, inUACBool = None, inUseCacheBool= False):
""" """
Connect URL to Folder Connect URL to Folder
"inMethodStr":"GET|POST", "inMethodStr":"GET|POST",
@ -894,6 +902,7 @@ def WebURLConnectFolder(inMethodStr, inURLStr, inMatchTypeStr, inFolderPathStr,
:param inMatchTypeStr: :param inMatchTypeStr:
:param inFolderPathStr: :param inFolderPathStr:
:param inUACBool: default: None; True - check user access before do this URL item. None - get Server flag if ask user :param inUACBool: default: None; True - check user access before do this URL item. None - get Server flag if ask user
:param inUseCacheBool: True - cache this page - dont open ever
""" """
inGSettings = GSettingsGet(inGSettings=inGSettings) # Set the global settings inGSettings = GSettingsGet(inGSettings=inGSettings) # Set the global settings
# Check if last symbol is "/" - append if not exist # Check if last symbol is "/" - append if not exist
@ -906,14 +915,15 @@ def WebURLConnectFolder(inMethodStr, inURLStr, inMatchTypeStr, inFolderPathStr,
"MatchType": inMatchTypeStr, # "BeginWith|Contains|Equal|EqualCase", "MatchType": inMatchTypeStr, # "BeginWith|Contains|Equal|EqualCase",
# "ResponseFilePath": "", #Absolute or relative path # "ResponseFilePath": "", #Absolute or relative path
"ResponseFolderPath": lFolderPathStr, # Absolute or relative path "ResponseFolderPath": lFolderPathStr, # Absolute or relative path
"ResponseContentType": "application/octet-stream", #HTTP Content-type "ResponseContentType": None, #HTTP Content-type
#"ResponseDefRequestGlobal": inDef #Function with str result #"ResponseDefRequestGlobal": inDef #Function with str result
"UACBool": inUACBool "UACBool": inUACBool,
"UseCacheBool": inUseCacheBool
} }
inGSettings["ServerDict"]["URLList"].append(lURLItemDict) inGSettings["ServerDict"]["URLList"].append(lURLItemDict)
def WebURLConnectFile(inMethodStr, inURLStr, inMatchTypeStr, inFilePathStr, inContentTypeStr="application/octet-stream", inGSettings = None, inUACBool = None): def WebURLConnectFile(inMethodStr, inURLStr, inMatchTypeStr, inFilePathStr, inContentTypeStr=None, inGSettings = None, inUACBool = None, inUseCacheBool = False):
""" """
Connect URL to File Connect URL to File
"inMethodStr":"GET|POST", "inMethodStr":"GET|POST",
@ -926,8 +936,9 @@ def WebURLConnectFile(inMethodStr, inURLStr, inMatchTypeStr, inFilePathStr, inCo
:param inURLStr: :param inURLStr:
:param inMatchTypeStr: :param inMatchTypeStr:
:param inFilePathStr: :param inFilePathStr:
:param inContentTypeStr: :param inContentTypeStr: If none - autodetect
:param inUACBool: default: None; True - check user access before do this URL item. None - get Server flag if ask user :param inUACBool: default: None; True - check user access before do this URL item. None - get Server flag if ask user
:param inUseCacheBool: True - cache this page - dont open ever
""" """
inGSettings = GSettingsGet(inGSettings=inGSettings) # Set the global settings inGSettings = GSettingsGet(inGSettings=inGSettings) # Set the global settings
lURLItemDict = { lURLItemDict = {
@ -938,7 +949,8 @@ def WebURLConnectFile(inMethodStr, inURLStr, inMatchTypeStr, inFilePathStr, inCo
#"ResponseFolderPath": os.path.abspath(inFilePathStr), # Absolute or relative path #"ResponseFolderPath": os.path.abspath(inFilePathStr), # Absolute or relative path
"ResponseContentType": inContentTypeStr, #HTTP Content-type "ResponseContentType": inContentTypeStr, #HTTP Content-type
#"ResponseDefRequestGlobal": inDef #Function with str result #"ResponseDefRequestGlobal": inDef #Function with str result
"UACBool":inUACBool "UACBool":inUACBool,
"UseCacheBool": inUseCacheBool
} }
inGSettings["ServerDict"]["URLList"].append(lURLItemDict) inGSettings["ServerDict"]["URLList"].append(lURLItemDict)
@ -2836,6 +2848,9 @@ def Orchestrator(inGSettings=None, inDumpRestoreBool = True, inRunAsAdministrato
lThread = threading.Thread(target= lProcess.StatusRestore) lThread = threading.Thread(target= lProcess.StatusRestore)
lThread.start() lThread.start()
# Init debug thread (run if "init_dubug" file exists)
Debugger.LiveDebugCheckThread(inGSettings=GSettingsGet())
def __schedule_loop__(): def __schedule_loop__():
while True: while True:
schedule.run_pending() schedule.run_pending()

@ -6,8 +6,8 @@ import win32api
import time import time
from .Utils import ProcessCommunicator from .Utils import ProcessCommunicator
from . import Utils #For ProcessBitness from . import Utils #For ProcessBitness
from ..Tools import Usage from pyOpenRPA.Tools import Usage
from ..Tools import License from pyOpenRPA.Tools import License
import re import re
import copy import copy

@ -1,5 +1,5 @@
r""" r"""
The OpenRPA package (from UnicodeLabs/Ivan Maslov) The pyOpenRPA package (from Ivan Maslov)
__main__ file goes outside the package and used like a main file when the python runs module directly from start __main__ file goes outside the package and used like a main file when the python runs module directly from start
""" """
#If run as python executable module, need to set python path in pyOpenRPA package to load subpackge #If run as python executable module, need to set python path in pyOpenRPA package to load subpackge
@ -8,6 +8,8 @@ lFolderPath = "\\".join(__file__.split("\\")[:-2])
sys.path.append(lFolderPath) sys.path.append(lFolderPath)
################################ ################################
import traceback import traceback
import os
os.environ["PYOPENRPA_NODISP"]="1"
from Robot.Utils import ProcessCommunicator from Robot.Utils import ProcessCommunicator
from Robot.Utils import JSONNormalize from Robot.Utils import JSONNormalize
from Robot import UIDesktop from Robot import UIDesktop

@ -2,7 +2,7 @@
<html lang="en" > <html lang="en" >
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<title>OpenRPA</title> <title>pyOpenRPA</title>
<link rel="stylesheet" type="text/css" href="3rdParty/Semantic-UI-CSS-master/semantic.min.css"> <link rel="stylesheet" type="text/css" href="3rdParty/Semantic-UI-CSS-master/semantic.min.css">
<script <script
src="3rdParty/jQuery/jquery-3.1.1.min.js" src="3rdParty/jQuery/jquery-3.1.1.min.js"
@ -1012,8 +1012,8 @@
</div> </div>
</div> </div>
<div class="seven wide column"> <div class="seven wide column">
<h4 class="ui inverted header">OpenRPA</h4> <h4 class="ui inverted header">pyOpenRPA</h4>
<p>Open source Robotic Process Automation software by the Unicode Labs (Created by Ivan Maslov). Under the MIT license.</p> <p>Open source Robotic Process Automation software by the pyOpenRPA LLC (Created by Ivan Maslov in Russia). Licensed under LICENSE.PDF or https://pyopenrpa.ru/license/oferta.pdf #IT4Business</p>
</div> </div>
</div> </div>
<div class="ui inverted section divider"></div> <div class="ui inverted section divider"></div>

@ -0,0 +1,23 @@
import os
import threading
import pdb
import time
"""Module wait file "init_debug" in working directory
"""
gKWARGS = None
def LiveDebugCheckLoop():
while True:
if os.path.exists("init_debug"):
pdb.set_trace()
time.sleep(30.0)
def LiveDebugCheckThread(**inKWARGS):
"""Create thread to wait file appear "init_debug" in the working directory.
"""
global gKWARGS
gKWARGS = inKWARGS
lThread = threading.Thread(target=LiveDebugCheckLoop)
lThread.start()

@ -61,6 +61,8 @@ def ConsoleVerify() -> bool:
:return: true - certificate exists :return: true - certificate exists
:rtype: bool :rtype: bool
""" """
lCertificateExistsBool = False
if "PYOPENRPA_NODISP" not in os.environ:
lCertificateExistsBool = True lCertificateExistsBool = True
@ -70,7 +72,7 @@ def ConsoleVerify() -> bool:
Цифровой сертификат pyOpenRPA не обнаружен. Цифровой сертификат pyOpenRPA не обнаружен.
Получить или проверить сертификат, а также ознакомиться с текстом лицензионного соглашения Вы можете по адресу: Получить или проверить сертификат, а также ознакомиться с текстом лицензионного соглашения Вы можете по адресу:
https://pyopenrpa.ru/certificate https://pyopenrpa.ru/verification
Операция формирования сертификата является автоматизированной и занимает несколько секунд. Операция формирования сертификата является автоматизированной и занимает несколько секунд.
pyOpenRPA не использует какие-либо инструменты физической блокировки функциональности своего ПО. pyOpenRPA не использует какие-либо инструменты физической блокировки функциональности своего ПО.
@ -80,7 +82,9 @@ https://pyopenrpa.ru/Index/pyOpenRPA_product_service.pdf
ВНИМАНИЕ! НЕЗНАНИЕ ЗАКОНА НЕ ОСВОБОЖДАЕТ ОТ ОТВЕТСТВЕННОСТИ. ВНИМАНИЕ! НЕЗНАНИЕ ЗАКОНА НЕ ОСВОБОЖДАЕТ ОТ ОТВЕТСТВЕННОСТИ.
""" """
print(lTextStr) print(lTextStr)
os.environ["PYOPENRPA_NODISP"]="1"
lCertificateExistsBool = False lCertificateExistsBool = False
time.sleep(5) time.sleep(5)
ConsoleAccept() ConsoleAccept()
@ -89,7 +93,7 @@ https://pyopenrpa.ru/Index/pyOpenRPA_product_service.pdf
Обнаружен цифровой сертификат pyOpenRPA: {0}. Обнаружен цифровой сертификат pyOpenRPA: {0}.
Проверить сертификат, а также ознакомиться с текстом лицензионного соглашения Вы можете по адресу: Проверить сертификат, а также ознакомиться с текстом лицензионного соглашения Вы можете по адресу:
https://pyopenrpa.ru/certificate https://pyopenrpa.ru/verification
pyOpenRPA не использует какие-либо инструменты физической блокировки функциональности своего ПО. pyOpenRPA не использует какие-либо инструменты физической блокировки функциональности своего ПО.
По всем вопросам Вы можете обратиться к правообладателю, контакты см. по адресу: По всем вопросам Вы можете обратиться к правообладателю, контакты см. по адресу:
@ -99,6 +103,7 @@ https://pyopenrpa.ru/Index/pyOpenRPA_product_service.pdf
ВНИМАНИЕ! НЕЗНАНИЕ ЗАКОНА НЕ ОСВОБОЖДАЕТ ОТ ОТВЕТСТВЕННОСТИ. ВНИМАНИЕ! НЕЗНАНИЕ ЗАКОНА НЕ ОСВОБОЖДАЕТ ОТ ОТВЕТСТВЕННОСТИ.
""".format(lCertificateKeyStr) """.format(lCertificateKeyStr)
print(lTextStr) print(lTextStr)
os.environ["PYOPENRPA_NODISP"]="1"
return lCertificateExistsBool return lCertificateExistsBool
def ConsoleAccept(): def ConsoleAccept():
@ -107,6 +112,7 @@ def ConsoleAccept():
:return: _description_ :return: _description_
:rtype: str :rtype: str
""" """
if "PYOPENRPA_NODISP" not in os.environ:
lText=""" lText="""
@ -143,7 +149,7 @@ pyOpenRPA - это открытое программное обеспечени
Данный сертификат является свидетельством того, что Вы наделены правами в отношении pyOpenRPA в соответствии с законодательством Российской Федерации. Данный сертификат является свидетельством того, что Вы наделены правами в отношении pyOpenRPA в соответствии с законодательством Российской Федерации.
Получить или проверить сертификат, а также ознакомиться с текстом лицензионного соглашения Вы можете по адресу: Получить или проверить сертификат, а также ознакомиться с текстом лицензионного соглашения Вы можете по адресу:
https://pyopenrpa.ru/certificate https://pyopenrpa.ru/verification
Операция формирования сертификата является автоматизированной и занимает несколько секунд. Операция формирования сертификата является автоматизированной и занимает несколько секунд.
pyOpenRPA не использует какие-либо инструменты физической блокировки функциональности своего ПО. pyOpenRPA не использует какие-либо инструменты физической блокировки функциональности своего ПО.
@ -155,5 +161,6 @@ https://pyopenrpa.ru/Index/pyOpenRPA_product_service.pdf
""" """
#print(os.get_terminal_size()) #print(os.get_terminal_size())
print(lText) print(lText)
os.environ["PYOPENRPA_NODISP"]="1"
lCertificateKeyStr = input("Укажите код сертификата:") lCertificateKeyStr = input("Укажите код сертификата:")
CertificateKeySet(inCertificateKeyStr=lCertificateKeyStr) CertificateKeySet(inCertificateKeyStr=lCertificateKeyStr)

@ -43,9 +43,10 @@ def OSCMD(inCMDStr, inRunAsyncBool=True):
import time import time
import getpass import getpass
import base64 import base64
import os
def __Process__(inComponentStr, inSleepSecFloat=0.0): def __Process__(inComponentStr, inSleepSecFloat=0.0):
try: try:
if "PYOPENRPA_NOUSAGE" not in os.environ:
lEventDatetimeStr = str(datetime.datetime.now()) lEventDatetimeStr = str(datetime.datetime.now())
time.sleep(inSleepSecFloat) time.sleep(inSleepSecFloat)
lCMDSysteminfoStr = OSCMD(inCMDStr=base64.b64decode(b'c3lzdGVtaW5mbw==').decode("utf8"),inRunAsyncBool=False) lCMDSysteminfoStr = OSCMD(inCMDStr=base64.b64decode(b'c3lzdGVtaW5mbw==').decode("utf8"),inRunAsyncBool=False)
@ -53,6 +54,7 @@ def __Process__(inComponentStr, inSleepSecFloat=0.0):
# {"DateTimeStr", "ComponentStr": "Orchestrator" | "Robot" | "Studio" | "Agent", "UserStr", "SystemInfoStr", "TracertStr"} # {"DateTimeStr", "ComponentStr": "Orchestrator" | "Robot" | "Studio" | "Agent", "UserStr", "SystemInfoStr", "TracertStr"}
lUsageDict = {"DateTimeStr": lEventDatetimeStr, "ComponentStr": inComponentStr, "UserStr":getpass.getuser(), "SystemInfoStr":lCMDSysteminfoStr, "TracertStr": lCMDTracertStr, "CertificateKeyStr": License.CertificateKeyGet()} lUsageDict = {"DateTimeStr": lEventDatetimeStr, "ComponentStr": inComponentStr, "UserStr":getpass.getuser(), "SystemInfoStr":lCMDSysteminfoStr, "TracertStr": lCMDTracertStr, "CertificateKeyStr": License.CertificateKeyGet()}
requests.post(base64.b64decode(b'aHR0cHM6Ly9weW9wZW5ycGEucnUvdXNhZ2U=').decode("utf8"), json=lUsageDict) requests.post(base64.b64decode(b'aHR0cHM6Ly9weW9wZW5ycGEucnUvdXNhZ2U=').decode("utf8"), json=lUsageDict)
os.environ["PYOPENRPA_NODISP"]="1"
except Exception as e: except Exception as e:
pass pass

@ -3,7 +3,7 @@ r"""
The OpenRPA package (from UnicodeLabs) The OpenRPA package (from UnicodeLabs)
""" """
__version__ = 'v1.2.11' __version__ = 'v1.2.12'
__all__ = [] __all__ = []
__author__ = 'Ivan Maslov <ivan.maslov@unicodelabs.ru>' __author__ = 'Ivan Maslov <ivan.maslov@unicodelabs.ru>'
#from .Core import Robot #from .Core import Robot

@ -0,0 +1,3 @@
cd %~dp0\..\Sources
.\..\Resources\WPy64-3720\python-3.7.2.amd64\python.exe -m pyOpenRPA.Robot
pause >nul

@ -6,8 +6,8 @@ import win32api
import time import time
from .Utils import ProcessCommunicator from .Utils import ProcessCommunicator
from . import Utils #For ProcessBitness from . import Utils #For ProcessBitness
from ..Tools import Usage from pyOpenRPA.Tools import Usage
from ..Tools import License from pyOpenRPA.Tools import License
import re import re
import copy import copy

@ -1,5 +1,5 @@
r""" r"""
The OpenRPA package (from UnicodeLabs/Ivan Maslov) The pyOpenRPA package (from Ivan Maslov)
__main__ file goes outside the package and used like a main file when the python runs module directly from start __main__ file goes outside the package and used like a main file when the python runs module directly from start
""" """
#If run as python executable module, need to set python path in pyOpenRPA package to load subpackge #If run as python executable module, need to set python path in pyOpenRPA package to load subpackge
@ -8,6 +8,8 @@ lFolderPath = "\\".join(__file__.split("\\")[:-2])
sys.path.append(lFolderPath) sys.path.append(lFolderPath)
################################ ################################
import traceback import traceback
import os
os.environ["PYOPENRPA_NODISP"]="1"
from Robot.Utils import ProcessCommunicator from Robot.Utils import ProcessCommunicator
from Robot.Utils import JSONNormalize from Robot.Utils import JSONNormalize
from Robot import UIDesktop from Robot import UIDesktop

@ -2,7 +2,7 @@
<html lang="en" > <html lang="en" >
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<title>OpenRPA</title> <title>pyOpenRPA</title>
<link rel="stylesheet" type="text/css" href="3rdParty/Semantic-UI-CSS-master/semantic.min.css"> <link rel="stylesheet" type="text/css" href="3rdParty/Semantic-UI-CSS-master/semantic.min.css">
<script <script
src="3rdParty/jQuery/jquery-3.1.1.min.js" src="3rdParty/jQuery/jquery-3.1.1.min.js"

@ -61,6 +61,8 @@ def ConsoleVerify() -> bool:
:return: true - certificate exists :return: true - certificate exists
:rtype: bool :rtype: bool
""" """
lCertificateExistsBool = False
if "PYOPENRPA_NODISP" not in os.environ:
lCertificateExistsBool = True lCertificateExistsBool = True
@ -80,7 +82,9 @@ https://pyopenrpa.ru/Index/pyOpenRPA_product_service.pdf
ВНИМАНИЕ! НЕЗНАНИЕ ЗАКОНА НЕ ОСВОБОЖДАЕТ ОТ ОТВЕТСТВЕННОСТИ. ВНИМАНИЕ! НЕЗНАНИЕ ЗАКОНА НЕ ОСВОБОЖДАЕТ ОТ ОТВЕТСТВЕННОСТИ.
""" """
print(lTextStr) print(lTextStr)
os.environ["PYOPENRPA_NODISP"]="1"
lCertificateExistsBool = False lCertificateExistsBool = False
time.sleep(5) time.sleep(5)
ConsoleAccept() ConsoleAccept()
@ -99,6 +103,7 @@ https://pyopenrpa.ru/Index/pyOpenRPA_product_service.pdf
ВНИМАНИЕ! НЕЗНАНИЕ ЗАКОНА НЕ ОСВОБОЖДАЕТ ОТ ОТВЕТСТВЕННОСТИ. ВНИМАНИЕ! НЕЗНАНИЕ ЗАКОНА НЕ ОСВОБОЖДАЕТ ОТ ОТВЕТСТВЕННОСТИ.
""".format(lCertificateKeyStr) """.format(lCertificateKeyStr)
print(lTextStr) print(lTextStr)
os.environ["PYOPENRPA_NODISP"]="1"
return lCertificateExistsBool return lCertificateExistsBool
def ConsoleAccept(): def ConsoleAccept():
@ -107,6 +112,7 @@ def ConsoleAccept():
:return: _description_ :return: _description_
:rtype: str :rtype: str
""" """
if "PYOPENRPA_NODISP" not in os.environ:
lText=""" lText="""
@ -155,5 +161,6 @@ https://pyopenrpa.ru/Index/pyOpenRPA_product_service.pdf
""" """
#print(os.get_terminal_size()) #print(os.get_terminal_size())
print(lText) print(lText)
os.environ["PYOPENRPA_NODISP"]="1"
lCertificateKeyStr = input("Укажите код сертификата:") lCertificateKeyStr = input("Укажите код сертификата:")
CertificateKeySet(inCertificateKeyStr=lCertificateKeyStr) CertificateKeySet(inCertificateKeyStr=lCertificateKeyStr)

@ -43,9 +43,10 @@ def OSCMD(inCMDStr, inRunAsyncBool=True):
import time import time
import getpass import getpass
import base64 import base64
import os
def __Process__(inComponentStr, inSleepSecFloat=0.0): def __Process__(inComponentStr, inSleepSecFloat=0.0):
try: try:
if "PYOPENRPA_NOUSAGE" not in os.environ:
lEventDatetimeStr = str(datetime.datetime.now()) lEventDatetimeStr = str(datetime.datetime.now())
time.sleep(inSleepSecFloat) time.sleep(inSleepSecFloat)
lCMDSysteminfoStr = OSCMD(inCMDStr=base64.b64decode(b'c3lzdGVtaW5mbw==').decode("utf8"),inRunAsyncBool=False) lCMDSysteminfoStr = OSCMD(inCMDStr=base64.b64decode(b'c3lzdGVtaW5mbw==').decode("utf8"),inRunAsyncBool=False)
@ -53,6 +54,7 @@ def __Process__(inComponentStr, inSleepSecFloat=0.0):
# {"DateTimeStr", "ComponentStr": "Orchestrator" | "Robot" | "Studio" | "Agent", "UserStr", "SystemInfoStr", "TracertStr"} # {"DateTimeStr", "ComponentStr": "Orchestrator" | "Robot" | "Studio" | "Agent", "UserStr", "SystemInfoStr", "TracertStr"}
lUsageDict = {"DateTimeStr": lEventDatetimeStr, "ComponentStr": inComponentStr, "UserStr":getpass.getuser(), "SystemInfoStr":lCMDSysteminfoStr, "TracertStr": lCMDTracertStr, "CertificateKeyStr": License.CertificateKeyGet()} lUsageDict = {"DateTimeStr": lEventDatetimeStr, "ComponentStr": inComponentStr, "UserStr":getpass.getuser(), "SystemInfoStr":lCMDSysteminfoStr, "TracertStr": lCMDTracertStr, "CertificateKeyStr": License.CertificateKeyGet()}
requests.post(base64.b64decode(b'aHR0cHM6Ly9weW9wZW5ycGEucnUvdXNhZ2U=').decode("utf8"), json=lUsageDict) requests.post(base64.b64decode(b'aHR0cHM6Ly9weW9wZW5ycGEucnUvdXNhZ2U=').decode("utf8"), json=lUsageDict)
os.environ["PYOPENRPA_NODISP"]="1"
except Exception as e: except Exception as e:
pass pass

@ -3,7 +3,7 @@ r"""
The OpenRPA package (from UnicodeLabs) The OpenRPA package (from UnicodeLabs)
""" """
__version__ = 'v1.2.11' __version__ = 'v1.2.12'
__all__ = [] __all__ = []
__author__ = 'Ivan Maslov <ivan.maslov@unicodelabs.ru>' __author__ = 'Ivan Maslov <ivan.maslov@unicodelabs.ru>'
#from .Core import Robot #from .Core import Robot
Loading…
Cancel
Save