diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.1.13.dist-info/INSTALLER b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.1.14.dist-info/INSTALLER similarity index 100% rename from Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.1.13.dist-info/INSTALLER rename to Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.1.14.dist-info/INSTALLER diff --git a/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.1.13.dist-info/METADATA b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.1.14.dist-info/METADATA similarity index 99% rename from Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.1.13.dist-info/METADATA rename to Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.1.14.dist-info/METADATA index 37aee8b7..21fbaa35 100644 --- a/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.1.13.dist-info/METADATA +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.1.14.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: pyOpenRPA -Version: 1.1.13 +Version: 1.1.14 Summary: First open source RPA platform for business Home-page: https://gitlab.com/UnicodeLabs/OpenRPA Author: Ivan Maslov diff --git a/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.1.13.dist-info/RECORD b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.1.14.dist-info/RECORD similarity index 92% rename from Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.1.13.dist-info/RECORD rename to Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.1.14.dist-info/RECORD index c2187512..4fbba60d 100644 --- a/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.1.13.dist-info/RECORD +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.1.14.dist-info/RECORD @@ -1,8 +1,8 @@ -pyOpenRPA-1.1.13.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -pyOpenRPA-1.1.13.dist-info/METADATA,sha256=rjIGRZpHzGWnt9LvY4CqdNByJhS4FqqdMUdzP_2BWmk,3352 -pyOpenRPA-1.1.13.dist-info/RECORD,, -pyOpenRPA-1.1.13.dist-info/WHEEL,sha256=qB97nP5e4MrOsXW5bIU5cUn_KSVr10EV0l-GCHG9qNs,97 -pyOpenRPA-1.1.13.dist-info/top_level.txt,sha256=RPzwQXgYBRo_m5L3ZLs6Voh8aEkMeT29Xsul1w1qE0g,10 +pyOpenRPA-1.1.14.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pyOpenRPA-1.1.14.dist-info/METADATA,sha256=aOG2bCjUIdJa6gP7Meoa873LoWkxQhlllqL4y4EU5L0,3352 +pyOpenRPA-1.1.14.dist-info/RECORD,, +pyOpenRPA-1.1.14.dist-info/WHEEL,sha256=qB97nP5e4MrOsXW5bIU5cUn_KSVr10EV0l-GCHG9qNs,97 +pyOpenRPA-1.1.14.dist-info/top_level.txt,sha256=RPzwQXgYBRo_m5L3ZLs6Voh8aEkMeT29Xsul1w1qE0g,10 pyOpenRPA/.idea/inspectionProfiles/profiles_settings.xml,sha256=YXLFmX7rPNGcnKK1uX1uKYPN0fpgskYNe7t0BV7cqkY,174 pyOpenRPA/.idea/misc.xml,sha256=ySjeaQ1DfqxaRTlFGT_3zW5r9mWuwxoAK_AX4QiuAZM,203 pyOpenRPA/.idea/modules.xml,sha256=Q__U1JIA2cjxbLRXAv-SfYY00fZA0TNlpkkbY4s3ncg,277 @@ -10,14 +10,15 @@ pyOpenRPA/.idea/pyOpenRPA.iml,sha256=EXh41F8lqRiSBMVg-n2tKaEaHC6_3gGSuKkPJA12Na0 pyOpenRPA/.idea/vcs.xml,sha256=2HygA1oRAwc3VBf-irxHrX5JJG9DXuQwrN0BlubhoKY,191 pyOpenRPA/.idea/workspace.xml,sha256=kcCP7x0iSOAWJdy7YtntGrgsQ04QIq0b6_9w04DKxfg,2555 pyOpenRPA/Info.md,sha256=u4Nv-PjniSF0Zlbtr6jEJX2vblK3_1zhSLNUgOdtDaA,85 -pyOpenRPA/Orchestrator/Orchestrator.py,sha256=iVp7DlLZHsURBOBegfDG4LanqSrI0A5a6GebP1cBOnI,8301 -pyOpenRPA/Orchestrator/Processor.py,sha256=ur0jDDteyBzfXR4DXnpUfBwNEW-M2nEtgyd-HQoPVtQ,11376 +pyOpenRPA/Orchestrator/BackwardCompatibility.py,sha256=y1Dyb8wmRcJmk1SxTVmgpR8r64Aa-Io9MG_5khvYgH0,3672 +pyOpenRPA/Orchestrator/Orchestrator.py,sha256=32AVVDVpMgam9Zg5n79WJDiuhGQTehtBWTFQrm6Mzhg,12387 +pyOpenRPA/Orchestrator/Processor.py,sha256=JI7nnkwXXnpkSJx6GlxoPjjiFOv3q3e-xZDLxKVYKrg,12634 pyOpenRPA/Orchestrator/RobotRDPActive/CMDStr.py,sha256=6otw1WnR2_evvQ5LGyOVh0BLk_nTdilViGub7p56fXQ,1531 pyOpenRPA/Orchestrator/RobotRDPActive/Clipboard.py,sha256=YB5HJL-Qf4IlVrFHyRv_ZMJ0Vo4vjyYqWKjvrTnf1k4,1564 pyOpenRPA/Orchestrator/RobotRDPActive/Connector.py,sha256=MkxTVaOVITl1V3EvH3oNx2gbCx3EeRS9Gb_83rmjdjg,25553 pyOpenRPA/Orchestrator/RobotRDPActive/ConnectorExceptions.py,sha256=wwH9JOoMFFxDKQ7IyNyh1OkFkZ23o1cD8Jm3n31ycII,657 pyOpenRPA/Orchestrator/RobotRDPActive/Processor.py,sha256=HcysWMmxMxSjaUybqovoCZToGrvzC0WFSVZbw6nfa68,9254 -pyOpenRPA/Orchestrator/RobotRDPActive/RobotRDPActive.py,sha256=_dZQWv1lUMV8VwzeL2GclU4ZodNcYiEF7uKLrsYZjOI,10137 +pyOpenRPA/Orchestrator/RobotRDPActive/RobotRDPActive.py,sha256=h41JsJu3ca68KV9F6oIhJhVPaH72m7TDvZIdEK4k-Xk,10301 pyOpenRPA/Orchestrator/RobotRDPActive/Scheduler.py,sha256=21N0ilFzWI1mj3X5S9tPMgwvG7BviuBxfTuqBY85Hy4,9144 pyOpenRPA/Orchestrator/RobotRDPActive/Template.rdp,sha256=JEMVYkEmNcfg_p8isdIyvj9E-2ZB5mj-R3MkcNMKxkA,2426 pyOpenRPA/Orchestrator/RobotRDPActive/Timer.py,sha256=y8--fUvg10qEFomecl_cmdWpdGjarZBlFpMbs_GvzoQ,1077 @@ -33,13 +34,24 @@ pyOpenRPA/Orchestrator/RobotRDPActive/__pycache__/Scheduler.cpython-37.pyc,, pyOpenRPA/Orchestrator/RobotRDPActive/__pycache__/Timer.cpython-37.pyc,, pyOpenRPA/Orchestrator/RobotRDPActive/__pycache__/__init__.cpython-37.pyc,, pyOpenRPA/Orchestrator/RobotRDPActive/__pycache__/__main__.cpython-37.pyc,, -pyOpenRPA/Orchestrator/Server.py,sha256=F7AZX_5n1EPY0dD4vTH90sR-x3nM41Qv3j3Qcba_W1w,25356 -pyOpenRPA/Orchestrator/ServerSettings.py,sha256=8Y6uqYIevE_VCNF5exiDMKfZ74YuYJJzagrtHjM2jNs,8419 +pyOpenRPA/Orchestrator/RobotScreenActive/ConsoleStart.bat,sha256=_HNadUKHOYI5y6foG3srh8wjSzhX33xaKNylFtDjOJk,114 +pyOpenRPA/Orchestrator/RobotScreenActive/Monitor.py,sha256=TV-YisVqa_uGiyJLG9oK4u-5aDjGiFYZFh1dPjOgYc8,492 +pyOpenRPA/Orchestrator/RobotScreenActive/Screen.py,sha256=VnYcvCVymrD35l2J4ln_tlVn7CilZhxE4Ggw9P-OhIw,606 +pyOpenRPA/Orchestrator/RobotScreenActive/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pyOpenRPA/Orchestrator/RobotScreenActive/__main__.py,sha256=JASxDDVKWUU7DAbDkRrGTrPk-P7LZchTZFh8usp6b4U,593 +pyOpenRPA/Orchestrator/RobotScreenActive/__pycache__/Monitor.cpython-37.pyc,, +pyOpenRPA/Orchestrator/RobotScreenActive/__pycache__/Screen.cpython-37.pyc,, +pyOpenRPA/Orchestrator/RobotScreenActive/__pycache__/__init__.cpython-37.pyc,, +pyOpenRPA/Orchestrator/RobotScreenActive/__pycache__/__main__.cpython-37.pyc,, +pyOpenRPA/Orchestrator/Server.py,sha256=kWMAUDeHlG4RX3lZR-pHBIpeZ6lxF_PJ_KDVENvbFK8,25403 +pyOpenRPA/Orchestrator/ServerSettings.py,sha256=dK8pQzg2mcLPjbizOPCP7yHMMVLiTh8RbYVnJXn-Mvg,15640 pyOpenRPA/Orchestrator/Timer.py,sha256=HvYtEeH2Q5WVVjgds9XaBpWRmvZgwgBXurJDdVVq_T0,2097 -pyOpenRPA/Orchestrator/Web/Index.xhtml,sha256=5yakmckWxrwz_HKjUmYOCQaO7mJmKTl9r9k_kDV0eCY,37432 -pyOpenRPA/Orchestrator/Web/favicon.ico,sha256=0vdsnwKGh6pgB0FDB5mOKO7RwbxQ9F13Zg16F1pkvXs,5430 +pyOpenRPA/Orchestrator/Web/Index.js,sha256=9_-DeipJ8Dx6RjGnySbk6q7FQbMnzmh0UH-O9LrOeGM,27786 +pyOpenRPA/Orchestrator/Web/Index.xhtml,sha256=dHxRf_eYWbsr504OpC-Ex6uz6AVw15mxXHYeaUiZSGQ,14267 +pyOpenRPA/Orchestrator/Web/favicon.ico,sha256=6S8XwSQ_3FXPpaX6zYkf8uUewVXO9bHnrrDHEoWrEgw,112922 pyOpenRPA/Orchestrator/__init__.py,sha256=qVH8fEPgXk54rmy-ol0PnT8GF5OlGE0a8mExwJ4tFqY,124 pyOpenRPA/Orchestrator/__main__.py,sha256=cOd8WU77VGgzTZUB0WmWpPmdYyMZY1zVyuU9yx26MKs,144 +pyOpenRPA/Orchestrator/__pycache__/BackwardCompatibility.cpython-37.pyc,, pyOpenRPA/Orchestrator/__pycache__/Orchestrator.cpython-37.pyc,, pyOpenRPA/Orchestrator/__pycache__/Processor.cpython-37.pyc,, pyOpenRPA/Orchestrator/__pycache__/Server.cpython-37.pyc,, @@ -220,6 +232,7 @@ pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/outli pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/outline-icons.woff2,sha256=TSiDRDsk5CRSf2oKeqKJez33HyOdtANzxP92DkgUeAE,12240 pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/images/flags.png,sha256=lNXH8WYTAcSm3Ekdct1VmgYgzZF6gm8N8bAju5bqnd0,28123 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/Robot/Clipboard.py,sha256=q76X8L21zJwcwdoJJNPeCEwAV30xS6ylHP1WwvtxoWI,722 pyOpenRPA/Robot/OrchestratorConnector.py,sha256=JUtdiUXCruqUqBD19gJBl9jk_b-tpWWx_v3MfBoKzoQ,20445 pyOpenRPA/Robot/README.md,sha256=e2hKh7Tx6DAsX6jY_hBDhguL1L2Wiv6iugDB5otMzIA,2293 @@ -252,10 +265,10 @@ pyOpenRPA/Robot/__pycache__/__main__.cpython-37.pyc,, pyOpenRPA/Studio/JSONNormalize.py,sha256=g0Z8G2wojCgTAdZtyRiCfe0_FHSeAi72Va7R7mk27gg,3347 pyOpenRPA/Studio/ProcessCommunicator.py,sha256=HD3XASJae31_HV3OznFe8E2MgZFXnwt7YveVN82M8nU,7912 pyOpenRPA/Studio/RobotConnector.py,sha256=CYO0dQoqfs44SYD_VZ_TJh3WFu_DXigHBLHj4GJ2Icc,5038 -pyOpenRPA/Studio/Studio.py,sha256=UoMDqnZm-MCiZHR8ToLTHHPN0Yx0Oa6-VOTJdUtoMKE,8352 +pyOpenRPA/Studio/Studio.py,sha256=_BXQjAMHew2fRWloXdqPOmYHX6i6C8ELPsW1TZNvjz4,8618 pyOpenRPA/Studio/ValueVerify.py,sha256=ObskxU4fOMoCGw74_nzYt6-a5jjrAckb3sdBLYyhYxY,777 -pyOpenRPA/Studio/Web/Index.xhtml,sha256=RqFW3qC1pFRr-qWEEDlCEhL9l3PwANyRbll3KZJnLvo,47927 -pyOpenRPA/Studio/Web/favicon.ico,sha256=0vdsnwKGh6pgB0FDB5mOKO7RwbxQ9F13Zg16F1pkvXs,5430 +pyOpenRPA/Studio/Web/Index.xhtml,sha256=wo3Y5CzWJQYMw9AgNHXynt1yGDLIoihRlt1weFLSuYQ,48240 +pyOpenRPA/Studio/Web/favicon.ico,sha256=6S8XwSQ_3FXPpaX6zYkf8uUewVXO9bHnrrDHEoWrEgw,112922 pyOpenRPA/Studio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 pyOpenRPA/Studio/__main__.py,sha256=_57Rnq9DKbmmlpGFqIwVrWn_LRcU8jjmMTOny4_zlP8,308 pyOpenRPA/Studio/__pycache__/JSONNormalize.cpython-37.pyc,, @@ -300,6 +313,6 @@ pyOpenRPA/Tools/Terminator.py,sha256=VcjX3gFXiCGu3MMCidhrTNsmC9wsAqfjRJdTSU9fLnU pyOpenRPA/Tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 pyOpenRPA/Tools/__pycache__/Terminator.cpython-37.pyc,, pyOpenRPA/Tools/__pycache__/__init__.cpython-37.pyc,, -pyOpenRPA/__init__.py,sha256=MLl4coStn9rfw3D3uxDlH6uWJFlRPjAXs2Scbs-T3KA,175 +pyOpenRPA/__init__.py,sha256=zJQYGBDH-YV1iJmK03mujDcj8s95Ct5RaUAYji-Xdf0,175 pyOpenRPA/__pycache__/__init__.cpython-37.pyc,, pyOpenRPA/test.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.1.13.dist-info/WHEEL b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.1.14.dist-info/WHEEL similarity index 100% rename from Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.1.13.dist-info/WHEEL rename to Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.1.14.dist-info/WHEEL diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.1.13.dist-info/top_level.txt b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.1.14.dist-info/top_level.txt similarity index 100% rename from Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.1.13.dist-info/top_level.txt rename to Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.1.14.dist-info/top_level.txt diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/BackwardCompatibility.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/BackwardCompatibility.py new file mode 100644 index 00000000..763119c8 --- /dev/null +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/BackwardCompatibility.py @@ -0,0 +1,43 @@ +# Def to check inGSettings and update structure to the backward compatibility +# !!! ATTENTION: Backward compatibility has been started from v1.1.13 !!! +# So you can use config of the orchestrator 1.1.13 in new Orchestrator versions and all will be ok :) (hope it's true) +def Update(inGSettings): + lL = inGSettings["Logger"] # Alias for logger + # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # + # v1.1.13 to v1.1.14 + # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # + if "Autocleaner" not in inGSettings: # Add "Autocleaner" structure + inGSettings["Autocleaner"] = { # Some gurbage is collecting in g settings. So you can configure autocleaner to periodically clear gSettings + "IntervalSecFloat": 600.0, # Sec float to periodically clear gsettings + } + if lL: lL.warning(f"Backward compatibility (v1.1.13 to v1.1.14): Add default 'Autocleaner' structure") # Log about compatibility + if "Client" not in inGSettings: # Add "Client" structure + inGSettings["Client"] = { # Settings about client web orchestrator + "Session":{ # Settings about web session. Session algorythms works only for special requests (URL in ServerSettings) + "LifetimeSecFloat": 600.0, # Client Session lifetime in seconds. after this time server will forget about this client session + "LifetimeRequestSecFloat": 120.0, # 1 client request lifetime in server in seconds + "ControlPanelRefreshIntervalSecFloat": 1.5, # Interval to refresh control panels for session, + "TechnicalSessionGUIDCache": { # TEchnical cache. Fills when web browser is requesting + #"SessionGUIDStr":{ # Session with some GUID str. On client session guid stored in cookie "SessionGUIDStr" + # "InitDatetime": None, # Datetime when session GUID was created + # "DatasetLast": { + # "ControlPanel": { + # "Data": None, # Struct to check with new iterations. None if starts + # "ReturnBool": False # flag to return, close request and return data as json + # } + # }, + # "ClientRequestHandler": None, # Last client request handler + # "UserADStr": None, # User, who connect. None if user is not exists + # "DomainADStr": None, # Domain of the user who connect. None if user is not exists + #} + } + } + } + if lL: lL.warning(f"Backward compatibility (v1.1.13 to v1.1.14): Add default 'Client' structure") # Log about compatibility + if "RequestTimeoutSecFloat" not in inGSettings["Server"]: # Add Server > "RequestTimeoutSecFloat" property + inGSettings["Server"]["RequestTimeoutSecFloat"] = 300 # Time to handle request in seconds + if lL: lL.warning( + f"Backward compatibility (v1.1.13 to v1.1.14): Add default 'Server' > 'RequestTimeoutSecFloat' property") # Log about compatibility + if "DefSettingsUpdatePathList" not in inGSettings["OrchestratorStart"]: # Add OrchestratorStart > "DefSettingsUpdatePathList" property + inGSettings["OrchestratorStart"]["DefSettingsUpdatePathList"] = [] # List of the .py files which should be loaded before init the algorythms + if lL: lL.warning(f"Backward compatibility (v1.1.13 to v1.1.14): Add default 'OrchestratorStart' > 'DefSettingsUpdatePathList' property list") # Log about compatibility \ No newline at end of file diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Orchestrator.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Orchestrator.py index f60809c4..7ea775cb 100644 --- a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Orchestrator.py +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Orchestrator.py @@ -10,16 +10,37 @@ import pdb from . import Server from . import Timer from . import Processor +from . import BackwardCompatibility # Backward compatibility from v1.1.13 #from .Settings import Settings import importlib from importlib import util import threading # Multi-threading for RobotRDPActive from .RobotRDPActive import RobotRDPActive #Start robot rdp active +from .RobotScreenActive import Monitor #Start robot screen active import uuid # Generate uuid +import datetime # datetime #Единый глобальный словарь (За основу взять из Settings.py) global gSettingsDict + +# Interval gsettings auto cleaner +def GSettingsAutocleaner(inGSettings): + while True: + time.sleep(inGSettings["Autocleaner"]["IntervalSecFloat"]) # Wait for the next iteration + lL = inGSettings["Logger"] + if lL: lL.info(f"Autocleaner is running") # Info + lNowDatetime = datetime.datetime.now() # Get now time + # Clean old items in Client > Session > TechnicalSessionGUIDCache + lTechnicalSessionGUIDCacheNew = {} + for lItemKeyStr in inGSettings["Client"]["Session"]["TechnicalSessionGUIDCache"]: + lItemValue = inGSettings["Client"]["Session"]["TechnicalSessionGUIDCache"][lItemKeyStr] + if (lNowDatetime - lItemValue["InitDatetime"]).total_seconds() < inGSettings["Client"]["Session"]["LifetimeSecFloat"]: # Add if lifetime is ok + lTechnicalSessionGUIDCacheNew[lItemKeyStr]=lItemValue # Lifetime is ok - set + else: + if lL: lL.debug(f"Client > Session > TechnicalSessionGUIDCache > lItemKeyStr: Lifetime is expired. Remove from gSettings") # Info + inGSettings["Client"]["Session"]["TechnicalSessionGUIDCache"] = lTechnicalSessionGUIDCacheNew # Set updated Cache + # # # # # # # # # # # # # # # # # # # # # # # # # # #Call Settings function from argv[1] file ################################################ lSubmoduleFunctionName = "Settings" @@ -44,22 +65,67 @@ Timer.Processor.gSettingsDict = gSettingsDict Server.gSettingsDict = gSettingsDict Server.Processor.gSettingsDict = gSettingsDict +# Check _SessionLast_RDPList.json in working directory. if exist - load into gsettings +# GSettings +#"RobotRDPActive": { +# "RDPList": { +if os.path.exists("_SessionLast_RDPList.json"): + lFile = open("_SessionLast_RDPList.json", "r", encoding="utf-8") + lSessionLastRDPList = json.loads(lFile.read()) + lFile.close() # Close the file + os.remove("_SessionLast_RDPList.json") # remove the temp file + gSettingsDict["RobotRDPActive"]["RDPList"]=lSessionLastRDPList # Set the last session dict + if lL: lL.warning(f"RDP Session List was restored from previous Orchestrator session") + #Инициализация настроечных параметров lDaemonLoopSeconds=gSettingsDict["Scheduler"]["ActivityTimeCheckLoopSeconds"] lDaemonActivityLogDict={} #Словарь отработанных активностей, ключ - кортеж (, , , ) lDaemonLastDateTime=datetime.datetime.now() +gSettingsDict["Server"]["WorkingDirectoryPathStr"] = os.getcwd() # Set working directory in g settings + +# Init SettingsUpdate defs from file list (after RDP restore) +lSettingsUpdateFilePathList = gSettingsDict.get("OrchestratorStart", {}).get("DefSettingsUpdatePathList",[]) +lSubmoduleFunctionName = "SettingsUpdate" +lSettingsPath = "\\".join(os.path.join(os.getcwd(), __file__).split("\\")[:-1]) +for lModuleFilePathItem in lSettingsUpdateFilePathList: # Import defs with try catch + try: # Try to init - go next if error and log in logger + lModuleName = lModuleFilePathItem[0:-3] + lFileFullPath = os.path.join(lSettingsPath, lModuleFilePathItem) + lTechSpecification = importlib.util.spec_from_file_location(lModuleName, lFileFullPath) + lTechModuleFromSpec = importlib.util.module_from_spec(lTechSpecification) + lTechSpecificationModuleLoader = lTechSpecification.loader.exec_module(lTechModuleFromSpec) + if lSubmoduleFunctionName in dir(lTechModuleFromSpec): + # Run SettingUpdate function in submodule + getattr(lTechModuleFromSpec, lSubmoduleFunctionName)(gSettingsDict) + except Exception as e: + if lL: lL.exception(f"Error when init .py file in orchestrator '{lModuleFilePathItem}'. Exception is below:") + +# Turn on backward compatibility +BackwardCompatibility.Update(inGSettings= gSettingsDict) #Инициализация сервера lThreadServer = Server.RobotDaemonServer("ServerThread", gSettingsDict) lThreadServer.start() if lL: lL.info("Web server has been started") #Logging +# Init the RobotScreenActive in another thread +lRobotScreenActiveThread = threading.Thread(target= Monitor.CheckScreen) +lRobotScreenActiveThread.daemon = True # Run the thread in daemon mode. +lRobotScreenActiveThread.start() # Start the thread execution. +if lL: lL.info("Robot Screen active has been started") #Logging + # Init the RobotRDPActive in another thread lRobotRDPActiveThread = threading.Thread(target= RobotRDPActive.RobotRDPActive, kwargs={"inGSettings":gSettingsDict}) lRobotRDPActiveThread.daemon = True # Run the thread in daemon mode. lRobotRDPActiveThread.start() # Start the thread execution. if lL: lL.info("Robot RDP active has been started") #Logging +# Init autocleaner in another thread +lAutocleanerThread = threading.Thread(target= GSettingsAutocleaner, kwargs={"inGSettings":gSettingsDict}) +lAutocleanerThread.daemon = True # Run the thread in daemon mode. +lAutocleanerThread.start() # Start the thread execution. +if lL: lL.info("Autocleaner thread has been started") #Logging + # Orchestrator start activity if lL: lL.info("Orchestrator start activity run") #Logging for lActivityItem in gSettingsDict["OrchestratorStart"]["ActivityList"]: @@ -79,7 +145,7 @@ while True: if lItem["ActivityEndDateTime"] and lCurrentDateTime<=lItem["ActivityEndDateTime"]: pass # Activity is actual - do not delete now - else: + else: # remove the activity - not actual lDaemonActivityLogDict.pop(lIndex,None) lIterationLastDateTime = lDaemonLastDateTime # Get current datetime before iterator (need for iterate all activities in loop) @@ -92,7 +158,7 @@ while True: else: lGUID = str(uuid.uuid4()) lItem["GUID"]=lGUID - + #Проверка дней недели, в рамках которых можно запускать активность lItemWeekdayList=lItem.get("WeekdayList", [0, 1, 2, 3, 4, 5, 6]) if lCurrentDateTime.weekday() in lItemWeekdayList: diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Processor.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Processor.py index 18f51448..2e64edb8 100644 --- a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Processor.py +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Processor.py @@ -23,6 +23,9 @@ import psutil # "Type": "OrchestratorRestart" # }, # { +# "Type": "OrchestratorSessionSave" +# }, +# { # "Type": "GlobalDictKeyListValueSet", # "KeyList": ["key1","key2",...], # "Value": @@ -83,6 +86,7 @@ gSettingsDict = None def Activity(inActivity): #Глобальная переменная - глобальный словарь унаследованный от Settings.py global gSettingsDict + lL = gSettingsDict["Logger"] # Alias for logger #Alias (compatibility) lItem = inActivity lCurrentDateTime = datetime.datetime.now() @@ -112,10 +116,27 @@ def Activity(inActivity): #Обработка команды OrchestratorRestart ########################################################### if lItem["Type"]=="OrchestratorRestart": + # Dump RDP List in file json + lFile = open("_SessionLast_RDPList.json", "w", encoding="utf-8") + lFile.write(json.dumps(gSettingsDict["RobotRDPActive"]["RDPList"])) # dump json to file + lFile.close() # Close the file + if lL: lL.info(f"Orchestrator has dump the RDP list before the restart. The RDP List is {gSettingsDict['RobotRDPActive']['RDPList']}. Do restart") + # Restart session os.execl(sys.executable, os.path.abspath(__file__), *sys.argv) lItem["Result"] = True sys.exit(0) ########################################################### + # Обработка команды OrchestratorSessionSave + ########################################################### + if lItem["Type"] == "OrchestratorSessionSave": + # Dump RDP List in file json + lFile = open("_SessionLast_RDPList.json", "w", encoding="utf-8") + lFile.write(json.dumps(gSettingsDict["RobotRDPActive"]["RDPList"])) # dump json to file + lFile.close() # Close the file + if lL: lL.info( + f"Orchestrator has dump the RDP list before the restart. The RDP List is {gSettingsDict['RobotRDPActive']['RDPList']}") + lItem["Result"] = True + ########################################################### #Обработка команды GlobalDictKeyListValueSet ########################################################### if lItem["Type"]=="GlobalDictKeyListValueSet": @@ -231,7 +252,7 @@ def Activity(inActivity): lFunction=getattr(lModule,lItem["FunctionName"]) lItem["Result"]=lFunction(*lItem.get("ArgList",[]),**lItem.get("ArgDict",{})) except Exception as e: - logging.exception("Loop activity error: module/function not founded") + if lL: lL.exception("Loop activity error: module/function not founded") ################################# # Windows logon ################################# diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/RobotRDPActive/RobotRDPActive.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/RobotRDPActive/RobotRDPActive.py index 8f8c3029..34add348 100644 --- a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/RobotRDPActive/RobotRDPActive.py +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/RobotRDPActive/RobotRDPActive.py @@ -17,9 +17,10 @@ def RobotRDPActive(inGSettings): ######## Init the RDP List for lRDPSessionKeyStrItem in mGSettingsRDPActiveDict["RDPList"]: lConfigurationItem = mGSettingsRDPActiveDict["RDPList"][lRDPSessionKeyStrItem] - lConfigurationItem["SessionIsWindowExistBool"] = False # Flag that session is not started - lConfigurationItem["SessionIsWindowResponsibleBool"] = False # Flag that session is not started - lConfigurationItem["SessionHex"] = " 77777sdfsdf77777dsfdfsf77777777" # Flag that session is not started + if lConfigurationItem["SessionHex"] is None or lConfigurationItem["SessionHex"] == "": # Minor fix - need for restore existed RDP sessions + lConfigurationItem["SessionIsWindowExistBool"] = False # Flag that session is not started + lConfigurationItem["SessionIsWindowResponsibleBool"] = False # Flag that session is not started + lConfigurationItem["SessionHex"] = " 77777sdfsdf77777dsfdfsf77777777" # Flag that session is not started ########## # Run monitor - main loop # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/RobotScreenActive/ConsoleStart.bat b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/RobotScreenActive/ConsoleStart.bat new file mode 100644 index 00000000..c9dffba5 --- /dev/null +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/RobotScreenActive/ConsoleStart.bat @@ -0,0 +1,3 @@ +for /f "skip=1 tokens=3" %%s in ('query user %USERNAME%') do ( + %windir%\System32\tscon.exe %%s /dest:console +) \ No newline at end of file diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/RobotScreenActive/Monitor.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/RobotScreenActive/Monitor.py new file mode 100644 index 00000000..50683680 --- /dev/null +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/RobotScreenActive/Monitor.py @@ -0,0 +1,14 @@ +import time #lib to create delay +from . import Screen # module to detect screen exists +#Check screen every 1 second +def CheckScreen(inIntervalSeconds=1): + while True: + #Check if screen exist + if not Screen.Exists(): + #Send os command to create console version (base screen) + Screen.ConsoleScreenBase() + #Delay to create console screen + time.sleep(2) + #Delay + time.sleep(inIntervalSeconds) + return None \ No newline at end of file diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/RobotScreenActive/Screen.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/RobotScreenActive/Screen.py new file mode 100644 index 00000000..1d5ffecc --- /dev/null +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/RobotScreenActive/Screen.py @@ -0,0 +1,20 @@ +from PIL import ImageGrab +import os # to execute cmd commands +#Check if screen is exists +def Exists(): + #Try to get 1 px from screen + try: + #Take 1 px + ImageGrab.grab(bbox=(0,0,1,1)) + #Screen is exists - return True + return True + #Catch exception + except Exception: + #Screen does not exists - return false + return False +#Make console session +def ConsoleScreenBase(): + #Get script folder path + lFolderPath = "/".join(__file__.split("\\")[:-1]) + #Send command to cmd + os.system(os.path.join(lFolderPath,"ConsoleStart.bat")) \ No newline at end of file diff --git a/v1.1.13 b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/RobotScreenActive/__init__.py similarity index 100% rename from v1.1.13 rename to Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/RobotScreenActive/__init__.py diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/RobotScreenActive/__main__.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/RobotScreenActive/__main__.py new file mode 100644 index 00000000..e871045a --- /dev/null +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/RobotScreenActive/__main__.py @@ -0,0 +1,16 @@ +#Run example +#cd %~dp0..\..\Sources +#..\Resources\WPy64-3720\python-3.7.2.amd64\python.exe -m pyOpenRPA.Tools.RobotScreenActive +#pause >nul +#Import parent folder to import current / other packages +######################################################### +import sys +import subprocess #start process async +import os #path, run, remove +import time #timer +import importlib +#lFolderPath = "\\".join(__file__.split("\\")[:-4]) +lFolderPath = "/".join(__file__.split("/")[:-4]) +sys.path.insert(0, lFolderPath) +from pyOpenRPA.Tools.RobotScreenActive import Monitor +Monitor.CheckScreen() \ No newline at end of file diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Server.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Server.py index 6780730c..44af44f3 100644 --- a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Server.py +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Server.py @@ -467,7 +467,7 @@ class ThreadedHTTPServer(ThreadingMixIn, HTTPServer): daemon_threads = True """Handle requests in a separate thread.""" def finish_request(self, request, client_address): - request.settimeout(30) + request.settimeout(gSettingsDict["Server"]["RequestTimeoutSecFloat"]) # "super" can not be used because BaseServer is not created from object HTTPServer.finish_request(self, request, client_address) #inGlobalDict diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/ServerSettings.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/ServerSettings.py index 8bba61d8..0f0693d9 100644 --- a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/ServerSettings.py +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/ServerSettings.py @@ -4,6 +4,11 @@ from inspect import signature # For detect count of def args from desktopmagic.screengrab_win32 import ( getDisplayRects, saveScreenToBmp, saveRectToBmp, getScreenAsImage, getRectAsImage, getDisplaysAsImages) +from http import cookies +import uuid # generate UUID4 +import time # sleep functions +import datetime # datetime functions +import threading # Multi-threading # /Orchestrator/RobotRDPActive/ControlPanelDictGet def RobotRDPActive_ControlPanelDictGet(inRequest,inGlobalDict): @@ -27,10 +32,88 @@ def RobotRDPActive_ControlPanelDictGet(inRequest,inGlobalDict): # Write content as utf-8 data inResponseDict["Body"] = bytes(message, "utf8") +# def to check control panels for selected session +def Monitor_ControlPanelDictGet_SessionCheckInit(inRequest,inGlobalDict): + lL = inGlobalDict["Logger"] # Alias for logger + lLifetimeSecFloat = inGlobalDict["Client"]["Session"]["LifetimeSecFloat"] + lLifetimeRequestSecFloat = inGlobalDict["Client"]["Session"]["LifetimeRequestSecFloat"] + lControlPanelRefreshIntervalSecFloat = inGlobalDict["Client"]["Session"]["ControlPanelRefreshIntervalSecFloat"] + lCookieSessionGUIDStr = None # generate the new GUID + # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # + # Technicaldef - interval check control panels + check actuality of the session by the datetime + def TechnicalCheck(): + lItemValue = inGlobalDict["Client"]["Session"]["TechnicalSessionGUIDCache"][lCookieSessionGUIDStr] + # Lifetime is ok - check control panel + lDatasetCurrentBytes = Monitor_ControlPanelDictGet(inRequest,inGlobalDict) # Call the control panel + if lDatasetCurrentBytes != lItemValue["DatasetLast"]["ControlPanel"]["Data"]: # Check if dataset is changed + lItemValue["DatasetLast"]["ControlPanel"]["Data"] = lDatasetCurrentBytes # Set new datset + lItemValue["DatasetLast"]["ControlPanel"]["ReturnBool"] = True # Set flag to return the data + # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # + # Technicaldef - Create new session struct + def TechnicalSessionNew(inSessionGUIDStr): + lCookieSessionGUIDStr = inSessionGUIDStr # Generate the new GUID + lSessionNew = { # Session with some GUID str. On client session guid stored in cookie "SessionGUIDStr" + "InitDatetime": datetime.datetime.now(), # Datetime when session GUID was created + "DatasetLast": { + "ControlPanel": { + "Data": None, # Struct to check with new iterations. None if starts + "ReturnBool": False # flag to return, close request and return data as json + } + }, + "ClientRequestHandler": inRequest, # Last client request handler + "UserADStr": inRequest.OpenRPA["User"], # User, who connect. None if user is not exists + "DomainADStr": inRequest.OpenRPA["Domain"], # Domain of the user who connect. None if user is not exists + } + inGlobalDict["Client"]["Session"]["TechnicalSessionGUIDCache"][lCookieSessionGUIDStr] = lSessionNew # Set new session in dict + inRequest.OpenRPAResponseDict["SetCookies"]["SessionGUIDStr"] = lCookieSessionGUIDStr # Set SessionGUIDStr in cookies + if lL: lL.info(f"New session GUID is created. GUID {lCookieSessionGUIDStr}") + return lCookieSessionGUIDStr + # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # + lCreateNewSessionBool = False # Flag to create new session structure + # step 1 - get cookie SessionGUIDStr + lSessionGUIDStr = inRequest.headers.get("SessionGUIDStr", None) + if lSessionGUIDStr is not None: # Check if GUID session is ok + lCookieSessionGUIDStr = lSessionGUIDStr # Get the existing GUID + if lSessionGUIDStr not in inGlobalDict["Client"]["Session"]["TechnicalSessionGUIDCache"]: + lCookieSessionGUIDStr= TechnicalSessionNew(inSessionGUIDStr = lSessionGUIDStr) # Create new session + else: # Update the datetime of the request session + inGlobalDict["Client"]["Session"]["TechnicalSessionGUIDCache"][lCookieSessionGUIDStr]["InitDatetime"]=datetime.datetime.now() + else: + lCookieSessionGUIDStr = TechnicalSessionNew(inSessionGUIDStr = lSessionGUIDStr) # Create new session + # Init the RobotRDPActive in another thread + #lThreadCheckCPInterval = threading.Thread(target=TechnicalIntervalCheck) + #lThreadCheckCPInterval.daemon = True # Run the thread in daemon mode. + #lThreadCheckCPInterval.start() # Start the thread execution. + + # Step 2 - interval check if data is exist + lTimeStartSecFloat = time.time() + lDoWhileBool = True # Flag to iterate throught the lifetime of the request + while lDoWhileBool: + #print(lTechnicalSessionGUIDCache) + #print(lCookieSessionGUIDStr) + if lCookieSessionGUIDStr in inGlobalDict["Client"]["Session"]["TechnicalSessionGUIDCache"]: + lItemValue = inGlobalDict["Client"]["Session"]["TechnicalSessionGUIDCache"][lCookieSessionGUIDStr] + if (time.time() - lTimeStartSecFloat) >= lLifetimeRequestSecFloat: # Check if lifetime client request is over or has no key + if lL: lL.debug(f"Client request lifetime is over") + lDoWhileBool = False # Stop the iterations + if lDoWhileBool: + TechnicalCheck() # Calculate the CP + if lItemValue["DatasetLast"]["ControlPanel"]["ReturnBool"] == True: # Return data if data flag it True + lDatasetCurrentBytes = lItemValue["DatasetLast"]["ControlPanel"]["Data"] # Set new dataset + inResponseDict = inRequest.OpenRPAResponseDict + inResponseDict["Body"] = lDatasetCurrentBytes + lItemValue["DatasetLast"]["ControlPanel"]["ReturnBool"] = False # Set flag that data was returned + lDoWhileBool = False # Stop the iterations + else: + lCookieSessionGUIDStr = TechnicalSessionNew(inSessionGUIDStr = lCookieSessionGUIDStr) # Create new session + if lDoWhileBool: # Sleep if we wait hte next iteration + time.sleep(lControlPanelRefreshIntervalSecFloat) # Sleep to the next iteration + def Monitor_ControlPanelDictGet(inRequest,inGlobalDict): inResponseDict = inRequest.OpenRPAResponseDict + lL = inGlobalDict["Logger"] # Alias for logger # Create result JSON - lResultJSON = {"RenderRobotList": []} + lResultJSON = {"RenderRobotList": [], "RenderRDPList": []} lRenderFunctionsRobotList = inGlobalDict["ControlPanelDict"]["RobotList"] for lItem in lRenderFunctionsRobotList: lUACBool = True # Check if render function is applicable User Access Rights (UAC) @@ -44,19 +127,34 @@ def Monitor_ControlPanelDictGet(inRequest,inGlobalDict): lItemResultDict = None lDEFSignature = signature(lItem["RenderFunction"]) # Get signature of the def lDEFARGLen = len(lDEFSignature.parameters.keys()) # get count of the def args - if lDEFARGLen == 1: # def (inGSettings) - lItemResultDict = lItem["RenderFunction"](inGlobalDict) - elif lDEFARGLen == 2: # def (inRequest, inGSettings) - lItemResultDict = lItem["RenderFunction"](inRequest, inGlobalDict) - elif lDEFARGLen == 0: # def () - lItemResultDict = lItem["RenderFunction"]() - # RunFunction - lResultJSON["RenderRobotList"].append(lItemResultDict) + try: + if lDEFARGLen == 1: # def (inGSettings) + lItemResultDict = lItem["RenderFunction"](inGlobalDict) + elif lDEFARGLen == 2: # def (inRequest, inGSettings) + lItemResultDict = lItem["RenderFunction"](inRequest, inGlobalDict) + elif lDEFARGLen == 0: # def () + lItemResultDict = lItem["RenderFunction"]() + # RunFunction + lResultJSON["RenderRobotList"].append(lItemResultDict) + except Exception as e: + if lL: lL.exception(f"Error in control panel. CP item {lItem}. Exception is below") + # Iterate throught the RDP list + for lRDPSessionKeyStrItem in inGlobalDict["RobotRDPActive"]["RDPList"]: + lRDPConfiguration = inGlobalDict["RobotRDPActive"]["RDPList"][ + lRDPSessionKeyStrItem] # Get the configuration dict + lDataItemDict = {"SessionKeyStr": "", "SessionHexStr": "", "IsFullScreenBool": False, + "IsIgnoredBool": False} # Template + lDataItemDict["SessionKeyStr"] = lRDPSessionKeyStrItem # Session key str + lDataItemDict["SessionHexStr"] = lRDPConfiguration["SessionHex"] # Session Hex + lDataItemDict["IsFullScreenBool"] = True if lRDPSessionKeyStrItem == inGlobalDict["RobotRDPActive"][ + "FullScreenRDPSessionKeyStr"] else False # Check the full screen for rdp window + lDataItemDict["IsIgnoredBool"] = lRDPConfiguration["SessionIsIgnoredBool"] # Is ignored + lResultJSON["RenderRDPList"].append(lDataItemDict) # Send message back to client message = json.dumps(lResultJSON) # Write content as utf-8 data - inResponseDict["Body"] = bytes(message, "utf8") - + #inResponseDict["Body"] = bytes(message, "utf8") + return bytes(message, "utf8") # UserAccess get rights hierarchy dict in json def UserRoleHierarchyGet(inRequest,inGlobalDict): inResponseDict = inRequest.OpenRPAResponseDict @@ -101,6 +199,7 @@ def SettingsUpdate(inGlobalConfiguration): #} #Orchestrator basic dependencies {"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": "/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.js", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Semantic-UI-CSS-master\\semantic.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"}, @@ -108,9 +207,9 @@ def SettingsUpdate(inGlobalConfiguration): {"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": "/favicon.ico", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "Web\\favicon.ico"), "ResponseContentType": "image/x-icon"}, {"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": "/Monitor/ControlPanelDictGet", "MatchType": "Equal", "ResponseDefRequestGlobal": Monitor_ControlPanelDictGet, "ResponseContentType": "application/json"}, + {"Method": "GET", "URL": "/Monitor/ControlPanelDictGet", "MatchType": "Equal", "ResponseDefRequestGlobal": Monitor_ControlPanelDictGet_SessionCheckInit, "ResponseContentType": "application/json"}, {"Method": "GET", "URL": "/GetScreenshot", "MatchType": "BeginWith", "ResponseDefRequestGlobal": GetScreenshot, "ResponseContentType": "image/png"}, - {"Method": "GET", "URL": "/Orchestrator/RobotRDPActive/ControlPanelDictGet", "MatchType": "Equal","ResponseDefRequestGlobal": RobotRDPActive_ControlPanelDictGet, "ResponseContentType": "application/json"}, + {"Method": "GET", "URL": "/pyOpenRPA_logo.png", "MatchType": "Equal", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\pyOpenRPA_logo.png"), "ResponseContentType": "image/png"}, {"Method": "POST", "URL": "/Orchestrator/UserRoleHierarchyGet", "MatchType": "Equal","ResponseDefRequestGlobal": UserRoleHierarchyGet, "ResponseContentType": "application/json"} ] inGlobalConfiguration["Server"]["URLList"]=inGlobalConfiguration["Server"]["URLList"]+lURLList diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Web/Index.js b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Web/Index.js new file mode 100644 index 00000000..56c80ba0 --- /dev/null +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Web/Index.js @@ -0,0 +1,696 @@ +var mGlobal={} +window.onload=function() { + //document.cookie = "SessionGUIDStr=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;"; + //Render existing data + //mGlobal.Monitor.fControlPanelRefresh_TechnicalRender() +} +$(document).ready(function() { + document.cookie = "SessionGUIDStr=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;"; + console.log("Cookie is deleted") + // fix main menu to page on passing + $('.main.menu').visibility({ + type: 'fixed' + }); + $('.overlay').visibility({ + type: 'fixed', + offset: 80 + }); + + // lazy load images + $('.image').visibility({ + type: 'image', + transition: 'vertical flip in', + duration: 500 + }); + + // show dropdown on hover + $('.main.menu .ui.dropdown').dropdown({ + on: 'hover' + }); + function clone(obj) { + var copy; + + // Handle the 3 simple types, and null or undefined + if (null == obj || "object" != typeof obj) return obj; + + // Handle Date + if (obj instanceof Date) { + copy = new Date(); + copy.setTime(obj.getTime()); + return copy; + } + + // Handle Array + if (obj instanceof Array) { + copy = []; + for (var i = 0, len = obj.length; i < len; i++) { + copy[i] = clone(obj[i]); + } + return copy; + } + + // Handle Object + if (obj instanceof Object) { + copy = {}; + for (var attr in obj) { + if (obj.hasOwnProperty(attr)) copy[attr] = clone(obj[attr]); + } + return copy; + } + throw new Error("Unable to copy obj! Its type isn't supported."); + } + //For data storage key + mGlobal["DataStorage"] = {} + // Clear the session cookie + + String.prototype.replaceAll = function(search, replace){ + return this.split(search).join(replace); + } + mGlobal.GeneralGenerateHTMLCodeHandlebars=function(inInnerTemplateSelector,inData) { + lHTMLTemplate=$(inInnerTemplateSelector)[0].innerHTML + //console.log(lHTMLTemplate) + //Компиляция + var template = Handlebars.compile(lHTMLTemplate); + //Вставка данных + var lHTMLResult = template(inData); + return lHTMLResult + } + mGlobal.GeneralGenerateHTMLCode=function(inTemplateHTMLSelector,inItemDictionary,inKeywordPrefix="::",inKeywordPostfix="::") { + ///Получить заготовку + lTemplateHTMLCode=$(inTemplateHTMLSelector)[0].outerHTML + ///Определить ключь экранирования специальных ключевых слов + ///Выполнить циклические замены, если там есть пожходящие ключи + lResultHTMLCode=lTemplateHTMLCode + for(var lKey in inItemDictionary) { + lHTMLKey=inKeywordPrefix+lKey+inKeywordPostfix; + lResultHTMLCode=lResultHTMLCode.replaceAll(lHTMLKey,inItemDictionary[lKey]) + } + ///Вернуть результат + return lResultHTMLCode + } + ////////////////////////// + /////Info JS module + ////////////////////////// + mGlobal.Info={}; + + mGlobal.Info.TableActivityLogScheduleListRefresh=function() { + + } + ////////////////////////// + /////Controller JS module + ////////////////////////// + mGlobal.Controller={}; + + mGlobal.Controller.CMDRunText=function(inCMDText) { + ///Подготовить конфигурацию + lData = [ + {"Type":"CMDStart", "Command": inCMDText} + ] + ///Обнулить таблицу + $.ajax({ + type: "POST", + url: 'Utils/Processor', + data: JSON.stringify(lData), + success: + function(lData,l2,l3){}, + dataType: "text" + }); + } + mGlobal.Controller.CMDRun=function() { + ///Обнулить таблицу + lCMDCode=$(".openrpa-controller-cmd-run-input")[0].value + ///Подготовить конфигурацию + lData = [ + {"Type":"CMDStart", "Command": lCMDCode } + ] + $.ajax({ + type: "POST", + url: 'Utils/Processor', + data: JSON.stringify(lData), + success: + function(lData,l2,l3) + { + var lResponseJSON=JSON.parse(lData) + ///Отправить запрос на формирование таблицы + //lHTMLCode=console.log("CMDRun result: "+lResponseJSON[0].result) + }, + dataType: "text" + }); + } + mGlobal.Controller.CMDRunGUILogout=function() { + ///Обнулить таблицу + lCMDCode="for /f \"skip=1 tokens=2\" %s in ('query user %USERNAME%') do (tscon \\dest:console)" + //lCMDCode = lCMDCode.replace(/\\n/g, "\\n") + // .replace(/\\'/g, "\\'") + // .replace(/\\"/g, '\\"') + // .replace(/\\&/g, "\\&") + // .replace(/\\r/g, "\\r") + // .replace(/\\t/g, "\\t") + // .replace(/\\b/g, "\\b") + // .replace(/\\f/g, "\\f") + // .replace('"', "\\\""); + ///Подготовить конфигурацию + lData = [ + {"Type":"CMDStart", "Command": lCMDCode } + ] + $.ajax({ + type: "POST", + url: 'Utils/Processor', + data: JSON.stringify(lData), + success: + function(lData,l2,l3) + { + var lResponseJSON=JSON.parse(lData) + ///Отправить запрос на формирование таблицы + //lHTMLCode=console.log("CMDRun result: "+lResponseJSON[0].result) + }, + dataType: "text" + }); + } + ///Restart PC + mGlobal.Controller.PCRestart = function () { + mGlobal.Controller.CMDRunText("shutdown -r") + } + ///Orchestrator save session + mGlobal.Controller.OrchestratorSessionSave=function() { + ///Подготовить конфигурацию + lData = [ + {"Type":"OrchestratorSessionSave"} + ] + $.ajax({ + type: "POST", + url: 'Utils/Processor', + data: JSON.stringify(lData), + success: + function(lData,l2,l3) + { + var lResponseJSON=JSON.parse(lData) + }, + dataType: "text" + }); + } + ///Перезагрузить Orchestrator + mGlobal.Controller.OrchestratorRestart=function() { + ///Подготовить конфигурацию + lData = [ + {"Type":"OrchestratorRestart"} + ] + $.ajax({ + type: "POST", + url: 'Utils/Processor', + data: JSON.stringify(lData), + success: + function(lData,l2,l3) + { + var lResponseJSON=JSON.parse(lData) + }, + dataType: "text" + }); + } + mGlobal.Controller.OrchestratorGITPullRestart = function() { + mGlobal.Controller.OrchestratorSessionSave() //Save current RDP list session + mGlobal.Controller.CMDRunText("timeout 3 & taskkill /f /im OpenRPA_Orchestrator.exe & timeout 2 & cd "+mGlobal.WorkingDirectoryPathStr+" & git reset --hard & git pull & pyOpenRPA.Orchestrator_x64_administrator_startup.cmd"); + } + ////////////////////////// + /////Monitor JS module + ////////////////////////// + mGlobal.Monitor={}; + mGlobal.Monitor.ScreenshotModal={}; + mGlobal.Monitor.GenerateUniqueID=function(inPrefix="tempUID=") { + return inPrefix+Math.round(Math.random()*1000)+"-"+Math.round(Math.random()*10000)+"-"+Math.round(Math.random()*1000) + } + //inHostURI: http://localhost:8081 + mGlobal.Monitor.ScreenshotModal.Show=function(inHostURI=" ") { + $('.ui.modal.daemon-screenshot').modal('show'); + + //Функция обновления картинки + lScreenshotUpdate=function() { + lScreenshotSrc=inHostURI+"/GetScreenshot?"+mGlobal.Monitor.GenerateUniqueID() + $(".daemon-screenshot img").attr('src', lScreenshotSrc); + } + + mGlobal.Monitor.ScreenshotModal.timerId=setInterval(lScreenshotUpdate,1500) + } + mGlobal.Monitor.ScreenshotModal.Close=function() { + clearInterval(mGlobal.Monitor.ScreenshotModal.timerId); + } + ///Monitor + mGlobal.Monitor.DaemonList={} + mGlobal.Monitor.DaemonList.fRefreshTable=function() { + ///Загрузка данных + $.ajax({ + type: "GET", + url: 'Monitor/JSONDaemonListGet', + data: '', + success: + function(lData,l2,l3) + { + var lResponseJSON=JSON.parse(lData) + ///Сформировать HTML код новой таблицы + lHTMLCode=mGlobal.GeneralGenerateHTMLCodeHandlebars(".openrpa-hidden-monitor-table-general",lResponseJSON) + ///Очистить дерево + //mGlobal.ElementTree.fClear(); + ///Прогрузить новую таблицу + $(".openrpa-monitor").html(lHTMLCode) + }, + dataType: "text" + }); + } + //////////////////////////////// + ///////Control panel + /////////////////////////////// + ///Refresh control panel + function sleep(ms) { + ms += new Date().getTime(); + while (new Date() < ms){} + } + function uuidv4() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + }); + } + mGlobal.SessionGUIDStr = uuidv4() // Generate uuid4 of the session + //console.log(uuidv4()); + mGlobal.RobotRDPActive = {} + mGlobal.Monitor.fControlPanelRefresh_TechnicalRender = function() + { + lResponseJSON = mGlobal.Monitor.mDatasetLast + if (lResponseJSON!= null) { + ///Escape onclick + /// RenderRobotList + lResponseJSON["RenderRobotList"].forEach( + function(lItem){ + if ('FooterButtonX2List' in lItem) { + /// FooterButtonX2List + lItem["FooterButtonX2List"].forEach( + function(lItem2){ + if ('OnClick' in lItem) { + lOnClickEscaped = lItem["OnClick"]; + lOnClickEscaped = lOnClickEscaped.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """).replace(/'/g, "'"); + lItem["OnClick"] = lOnClickEscaped; + } + } + ); + /// FooterButtonX1List + lItem["FooterButtonX1List"].forEach( + function(lItem2){ + if ('OnClick' in lItem) { + lOnClickEscaped = lItem["OnClick"]; + lOnClickEscaped = lOnClickEscaped.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """).replace(/'/g, "'"); + lItem["OnClick"] = lOnClickEscaped; + } + } + ); + } + } + ); + ////////////////////////////////////////////////////////// + ///Сформировать HTML код новой таблицы - контрольная панель + lHTMLCode=mGlobal.GeneralGenerateHTMLCodeHandlebars(".openrpa-hidden-control-panel",lResponseJSON) + //Присвоить ответ в mGlobal.Monitor.mResponseList + mGlobal.Monitor.mResponseList = lResponseJSON + ///Set result in mGlobal.DataStorage + lResponseJSON["RenderRobotList"].forEach( + function(lItem){ + if ('DataStorageKey' in lItem) { + mGlobal["DataStorage"][lItem['DataStorageKey']]=lItem + } + } + ) + ///Прогрузить новую таблицу + $(".openrpa-control-panel").html(lHTMLCode) + //////////////////////////////////////////////////// + ///Сформировать HTML код новой таблицы - список RDP + lHTMLCode=mGlobal.GeneralGenerateHTMLCodeHandlebars(".openrpa-hidden-robotrdpactive-control-panel",lResponseJSON) + //Присвоить ответ в mGlobal.RobotRDPActive.mResponseList + mGlobal.RobotRDPActive.mResponseList = lResponseJSON + ///Прогрузить новую таблицу + $(".openrpa-robotrdpactive-control-panel").html(lHTMLCode) + ///Очистить дерево + //mGlobal.ElementTree.fClear(); + } + } + mGlobal.Monitor.mDatasetLast = null + mGlobal.Monitor.fControlPanelRefresh=function() { + try { + //var XHR = new XMLHttpRequest(); + //XHR.setRequestHeader("Cookies",document.cookie) + ///Загрузка данных + //console.log("Request is sent") + //console.log(document.cookie) + $.ajax({ + type: "GET", + headers: {"SessionGUIDStr":mGlobal.SessionGUIDStr}, + url: 'Monitor/ControlPanelDictGet', + data: '', + //cache: false, + //xhr: XHR, + success: function(lData,l2,l3) { + try { + var lResponseJSON=JSON.parse(lData) + mGlobal.Monitor.mDatasetLast = lResponseJSON + mGlobal.Monitor.fControlPanelRefresh_TechnicalRender() + } + catch(error) { + } + mGlobal.Monitor.fControlPanelRefresh() // recursive + }, + dataType: "text", + error: function(jqXHR, textStatus, errorThrown ) { + sleep(3000) + mGlobal.Monitor.fControlPanelRefresh() // recursive + } + }); + } + catch(error) { + sleep(3000) + mGlobal.Monitor.fControlPanelRefresh() // recursive + } + //mGlobal.Monitor.fControlPanelRefresh() // recursive + } + mGlobal.Monitor.fControlPanelRefresh() + mGlobal.Test=function() { + ///Обнулить таблицу + lData = [ + { + "Type":"GlobalDictKeyListValueSet", + "key_list":["Storage","Robot_R01"], + "value":{ + "RunDateTimeString":"Test1", + "StepCurrentName":"Test2", + "StepCurrentDuration":"Test3" + } + } + ] + $.ajax({ + type: "POST", + url: 'Utils/Processor', + data: JSON.stringify(lData), + success: + function(lData,l2,l3) + { + //console.log(lData) + }, + dataType: "text" + }); + } + /////////////////////////////// + ///Processor functions + /////////////////////////////// + mGlobal.Processor = {} + mGlobal.Processor.ServerValueAppend = function(inKeyList,inValue) { + lData = [ + { + "Type":"GlobalDictKeyListValueAppend", + "KeyList": inKeyList, + "Value": inValue + } + ] + ///Обнулить таблицу + $('.ui.modal.basic .content').html(""); + $.ajax({ + type: "POST", + url: 'Utils/Processor', + data: JSON.stringify(lData), + success: + function(lData,l2,l3) + { + var lResponseJSON=JSON.parse(lData) + ///TODO Show error if exist error + }, + dataType: "text" + }); + } + mGlobal.Processor.ServerValueSet = function(inKeyList,inValue) { + lData = [ + { + "Type":"GlobalDictKeyListValueSet", + "KeyList": inKeyList, + "Value": inValue + } + ] + ///Обнулить таблицу + $('.ui.modal.basic .content').html(""); + $.ajax({ + type: "POST", + url: 'Utils/Processor', + data: JSON.stringify(lData), + success: + function(lData,l2,l3) + { + var lResponseJSON=JSON.parse(lData) + ///TODO Show error if exist error + }, + dataType: "text" + }); + } + mGlobal.Processor.ServerValueOperatorPlus = function(inKeyList,inValue) { + lData = [ + { + "Type":"GlobalDictKeyListValueOperator+", + "KeyList": inKeyList, + "Value": inValue + } + ] + ///Обнулить таблицу + $('.ui.modal.basic .content').html(""); + $.ajax({ + type: "POST", + url: 'Utils/Processor', + data: JSON.stringify(lData), + success: + function(lData,l2,l3) + { + var lResponseJSON=JSON.parse(lData) + ///TODO Show error if exist error + }, + dataType: "text" + }); + } + mGlobal.Processor.Send = function(inData) { + lData = inData + $.ajax({ + type: "POST", + url: 'Utils/Processor', + data: JSON.stringify(lData), + success: + function(lData,l2,l3) + { + var lResponseJSON=JSON.parse(lData) + ///TODO Show error if exist error + }, + dataType: "text" + }); + } + mGlobal.Server= {} + mGlobal.Server.JSONGet=function(inMethod, inURL, inDataJSON, inCallback) + { + $.ajax({ + type: inMethod, + url: inURL, + data: JSON.stringify(inDataJSON), + success: + function(lData,l2,l3) + { + var lResponseJSON=JSON.parse(lData) + inCallback(lResponseJSON) + }, + dataType: "text" + }); + } + + ///////////////// + ///Modal + /////////////////// + mGlobal.Modal={} + ///////////////////////////////////////////////////// + mGlobal.Modal.TableFilter={} + mGlobal.Modal.TableFilter.Show=function(inJSON) { + //{ + // "Title":"", + // "Headers":["Header1","Header2"], + // "Rows": [["Cell1","Cell2"],["Cell2-1","Cell2-2"]], + // "FilterOnKeyUp": "" //Fill here in function + //} + //Set js handler to Search field + inJSON["FilterOnKeyUp"]="mGlobal.Modal.TableFilter.FilterUpdate(this.value);" + ///Set value + mGlobal.Modal.TableFilter.mDataJSON = inJSON + //Render HTML + lHTMLCode=mGlobal.GeneralGenerateHTMLCodeHandlebars(".openrpa-handlebar-template-table-filter",inJSON); + ///Установить HTML код + $('.ui.modal.basic .content').html(lHTMLCode); + $('.ui.modal.basic').modal('show'); + //DO widest modal for table with scroll x + $("div.ui.basic.modal.transition.visible.active.scrolling")[0].style["width"]="1300px" + $("div.ui.basic.modal.transition.visible.active.scrolling")[0].style["overflow"]="scroll" + } + //Service function + mGlobal.Modal.TableFilter.FilterUpdate=function(inFilterValue) { + //Get JSON, apply filter, clone data + lDataJSON = clone(mGlobal.Modal.TableFilter.mDataJSON) + delete lDataJSON["Rows"] + lDataJSON["Rows"]=[] + //Filter code [any occurence in the row is ok for push! ] + mGlobal.Modal.TableFilter.mDataJSON["Rows"].forEach( + function(inElement) { + lFlagElementAppend = false + inElement.forEach( + function(inElement2) { + if (String(inElement2).includes(inFilterValue)) { + lFlagElementAppend = true + } + } + ) + if (lFlagElementAppend) { + lDataJSON["Rows"].push(inElement) + } + } + ) + //Clear Filter Title property (fixed in html) + delete lDataJSON["FilterOnKeyUp"] + delete lDataJSON["Title"] + //Search the table element [replace only table html] + lElement = $('.ui.modals.active .content table.table')[0] + lElementParentElement = lElement.parentNode + lElement.parentNode.removeChild(lElement); + //Render HTML + lHTMLCode=mGlobal.GeneralGenerateHTMLCodeHandlebars(".openrpa-handlebar-template-table-filter",lDataJSON); + ///Установить HTML код + lElementParentElement.insertAdjacentHTML("beforeend",lHTMLCode); + } + ///////////////////////////////////////////////////////////// + mGlobal.Modal.ListFilter={} + mGlobal.Modal.ListFilter.Show=function(inJSON) { + //{ + // "Title":"", + // "List":[{"Header":"","Description":""}], + // "FilterOnKeyUp": "" //Fill here in function + //} + //Set js handler to Search field + inJSON["FilterOnKeyUp"]="mGlobal.Modal.ListFilter.FilterUpdate(this.value);" + ///Set value + mGlobal.Modal.ListFilter.mDataJSON = inJSON + //Render HTML + lHTMLCode=mGlobal.GeneralGenerateHTMLCodeHandlebars(".openrpa-handlebar-template-list-filter",inJSON); + ///Установить HTML код + $('.ui.modal.basic .content').html(lHTMLCode); + $('.ui.modal.basic').modal('show'); + } + //Service function + mGlobal.Modal.ListFilter.FilterUpdate=function(inFilterValue) { + //Get JSON, apply filter, clone data + lDataJSON = clone(mGlobal.Modal.ListFilter.mDataJSON) + delete lDataJSON["List"] + lDataJSON["List"]=[] + //Filter code [any occurence in the row is ok for push! ] + mGlobal.Modal.ListFilter.mDataJSON["List"].forEach( + function(inElement) { + lFlagElementAppend = false + if (String(inElement["Header"]).includes(inFilterValue)) { + lFlagElementAppend = true + } + if (String(inElement["Description"]).includes(inFilterValue)) { + lFlagElementAppend = true + } + if (lFlagElementAppend) { + lDataJSON["List"].push(inElement) + } + } + ) + //Clear Filter Title property (fixed in html) + delete lDataJSON["FilterOnKeyUp"] + delete lDataJSON["Title"] + //Search the table element [replace only table html] + lElement = $('.ui.modals.active .content div.ui.inverted.segment')[0] + lElementParentElement = lElement.parentNode + lElement.parentNode.removeChild(lElement); + //Render HTML + lHTMLCode=mGlobal.GeneralGenerateHTMLCodeHandlebars(".openrpa-handlebar-template-list-filter",lDataJSON); + ///Установить HTML код + lElementParentElement.insertAdjacentHTML("beforeend",lHTMLCode); + } + mGlobal.UserRoleHierarchyDict = null // Put here the user role hierarchy + // UAC Ask + mGlobal.UserRoleAsk=function(inList) { + var lResult = true; // Init flag + var lRoleHierarchyDict = mGlobal.UserRoleHierarchyDict; // get the Hierarchy + // Try to get value from key list + var lKeyValue = lRoleHierarchyDict; // Init the base + var lListLength = inList.length; + for (var i = 0; i 0) { // false - if Dict has some elements + lResult = false; // Set the False Flag + } else { + lResult = true; // Set the true flag + } + break; // Stop the loop + } + } else { // Has element with no detalization - return true + lResult = true; // Set the flag + break; // Close the loop + } + } + return lResult; // Return the result + } + // Check user roles and update the Orchestrator UI + mGlobal.UserRoleUpdate=function() { + $.ajax({ + type: "POST", + url: 'Orchestrator/UserRoleHierarchyGet', + data: "", + success: + function(lData,l2,l3) + { + var lUACAsk = mGlobal.UserRoleAsk // Alias + var lResponseDict=JSON.parse(lData) + mGlobal.UserRoleHierarchyDict = lResponseDict // set the user role hierarchy + //Turn on the Lookmachine screenshot button + if (lUACAsk(["Orchestrator","Controls","LookMachineScreenshots"])) { + $(".openrpa-control-lookmachinescreenshot").show() //Show button + } + //Turn on the restart orchestrator button + if (lUACAsk(["Orchestrator","Controls","RestartOrchestrator"])) { + $(".openrpa-control-restartorchestrator").show() //Show button + } + //Turn on the rdp session list + if (lUACAsk(["Orchestrator","RDPActive","ListRead"])) { + $(".openrpa-rdpactive-title").show() //Show section + $(".openrpa-robotrdpactive-control-panel-general").show() //Show section + } + }, + dataType: "text" + }); + } + mGlobal.UserRoleUpdate() // Cal the update User Roles function + // Orchestrator model + mGlobal.WorkingDirectoryPathStr = null + mGlobal.OrchestratorModelUpdate=function() { + lData = [ + { + "Type": "GlobalDictKeyListValueGet", + "KeyList": ["Server","WorkingDirectoryPathStr"] + } + ] + $.ajax({ + type: "POST", + url: 'Utils/Processor', + data: JSON.stringify(lData), + success: + function(lData,l2,l3) + { + var lUACAsk = mGlobal.UserRoleAsk // Alias + var lResponseList=JSON.parse(lData) + mGlobal.WorkingDirectoryPathStr = lResponseList[0]["Result"] + }, + dataType: "text" + }); + } + mGlobal.OrchestratorModelUpdate() // Cal the update orchestrator model +}); \ No newline at end of file diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Web/Index.xhtml b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Web/Index.xhtml index 7e51d4c4..bf4274db 100644 --- a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Web/Index.xhtml +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Web/Index.xhtml @@ -2,669 +2,14 @@ - OpenRPA + pyOpenRPA Orchestrator - +