parent
83e5fa8b12
commit
55f7d8e023
@ -0,0 +1 @@
|
|||||||
|
pip
|
@ -0,0 +1,344 @@
|
|||||||
|
pyOpenRPA-1.2.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
||||||
|
pyOpenRPA-1.2.0.dist-info/METADATA,sha256=abfVMx4Zr9fZV4pw6SslvpUpAg-qJPV39s_8Phx4RNo,3351
|
||||||
|
pyOpenRPA-1.2.0.dist-info/RECORD,,
|
||||||
|
pyOpenRPA-1.2.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||||
|
pyOpenRPA-1.2.0.dist-info/WHEEL,sha256=qB97nP5e4MrOsXW5bIU5cUn_KSVr10EV0l-GCHG9qNs,97
|
||||||
|
pyOpenRPA-1.2.0.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=Ee72BuVpmXgoNTUInqAj1xVdC4JoWCQ0d0lTlijKyuA,1225
|
||||||
|
pyOpenRPA/Agent/O2A.py,sha256=IONoht1jb2b7JFT5syelVPq88z7TTLPZjcdH7SrR7rk,2612
|
||||||
|
pyOpenRPA/Agent/Processor.py,sha256=FtU7IGIev2_po_fkJTH2KNYZap6IVFODM30qiqBNsm4,4146
|
||||||
|
pyOpenRPA/Agent/__Agent__.py,sha256=VxQsuyItFvgXaDKahEKbG6hGgmpNGJFHRTYGGdP7J-A,4916
|
||||||
|
pyOpenRPA/Agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||||
|
pyOpenRPA/Agent/__pycache__/A2O.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Agent/__pycache__/O2A.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Agent/__pycache__/Processor.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Agent/__pycache__/__Agent__.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Agent/__pycache__/__init__.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Agent/readme.md,sha256=QF_Bnv204OK3t1JUEhjfICkxFmSdX6bvaRl_HI6lH9I,19
|
||||||
|
pyOpenRPA/Info.md,sha256=u4Nv-PjniSF0Zlbtr6jEJX2vblK3_1zhSLNUgOdtDaA,85
|
||||||
|
pyOpenRPA/Orchestrator/BackwardCompatibility.py,sha256=lzV3kinWlde5Fs4tBYqyKWetBLM4yEo6nbXmLC-fFaA,30159
|
||||||
|
pyOpenRPA/Orchestrator/ControlPanel.py,sha256=OzS8HjG__8OZgqhajr8L8owyugXPuSLWHLtXuKdEP78,103
|
||||||
|
pyOpenRPA/Orchestrator/Core.py,sha256=Q0n05GuySXDPy3V7qeYQON0kYEyWogZWhYevSjY4q2s,189
|
||||||
|
pyOpenRPA/Orchestrator/Processor.py,sha256=8T10Qos4_GT7Qvhh8q59JPCuUyHbic087y_xBK9lM_4,6645
|
||||||
|
pyOpenRPA/Orchestrator/ProcessorOld.py,sha256=Vh5zLRpWWf-vt9CCYI8nDY7oaefiufnu6Pnl4tp27pY,13749
|
||||||
|
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=CMZcyyc0hcaXn2Vkd4sbd26hWXNZpVZtH7Wx4T7VB5I,27765
|
||||||
|
pyOpenRPA/Orchestrator/RobotRDPActive/ConnectorExceptions.py,sha256=wwH9JOoMFFxDKQ7IyNyh1OkFkZ23o1cD8Jm3n31ycII,657
|
||||||
|
pyOpenRPA/Orchestrator/RobotRDPActive/Processor.py,sha256=AQ_u9QVSLpce9hhSacm3UT98bErc636MXza4Q6mHsSc,12264
|
||||||
|
pyOpenRPA/Orchestrator/RobotRDPActive/RobotRDPActive.py,sha256=pbffSPsUzzaFMevNQ0P24NA0cdJg9KwtyHscnWYQc_M,10769
|
||||||
|
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
|
||||||
|
pyOpenRPA/Orchestrator/RobotRDPActive/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||||
|
pyOpenRPA/Orchestrator/RobotRDPActive/__main__.py,sha256=z9PaUK4_nBiGd0YJdYVHV_rFx6VjZaxrrmKxSyoTFwY,2508
|
||||||
|
pyOpenRPA/Orchestrator/RobotRDPActive/__pycache__/CMDStr.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/RobotRDPActive/__pycache__/Clipboard.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/RobotRDPActive/__pycache__/Connector.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/RobotRDPActive/__pycache__/ConnectorExceptions.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/RobotRDPActive/__pycache__/Processor.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/RobotRDPActive/__pycache__/RobotRDPActive.cpython-37.pyc,,
|
||||||
|
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/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=mx4AXf5xEoi9LLKgrJ4s0h20ElcBmsntzZbI99LfboU,28462
|
||||||
|
pyOpenRPA/Orchestrator/ServerSettings.py,sha256=TZMoxB090UkNOCQ3ve0KBcrdM7YH6LTFz3ErVU42wTQ,28499
|
||||||
|
pyOpenRPA/Orchestrator/SettingsTemplate.py,sha256=p7J8xXSN6xdyMTd-OrkTu7JQGLn6t7tJpPp2CPybA-w,19955
|
||||||
|
pyOpenRPA/Orchestrator/Timer.py,sha256=HvYtEeH2Q5WVVjgds9XaBpWRmvZgwgBXurJDdVVq_T0,2097
|
||||||
|
pyOpenRPA/Orchestrator/Utils/LoggerHandlerDumpLogList.py,sha256=hD47TiOuKR-G8IWu9lJD2kG28qlH7YZV63i3qv1N5Dk,681
|
||||||
|
pyOpenRPA/Orchestrator/Utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||||
|
pyOpenRPA/Orchestrator/Utils/__pycache__/LoggerHandlerDumpLogList.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/Utils/__pycache__/__init__.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/Web/Basic.py,sha256=UUiV3Rp__i8EVADK-SvIhlVmLzOzW4gpCq1eBpqU4cA,6482
|
||||||
|
pyOpenRPA/Orchestrator/Web/Index.js,sha256=DtvpHDBT3_XvJpdKUREpGT1NR3lKdBs9ER4HPvlfwhE,39036
|
||||||
|
pyOpenRPA/Orchestrator/Web/Index.xhtml,sha256=a4N_reLA6_Zb2KXiL73a7cWtJwO0W0Dr5lZ-RpUwuI0,16428
|
||||||
|
pyOpenRPA/Orchestrator/Web/__pycache__/Basic.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/Web/favicon.ico,sha256=6S8XwSQ_3FXPpaX6zYkf8uUewVXO9bHnrrDHEoWrEgw,112922
|
||||||
|
pyOpenRPA/Orchestrator/__Orchestrator__.py,sha256=QSbaJT1U5L3UE_yNBsPzqJfwdy6Xycb8Tvf6r8OUbSQ,90464
|
||||||
|
pyOpenRPA/Orchestrator/__init__.py,sha256=f1RFDzOkL3IVorCtqogjGdXYPtHH-P-y-5CqT7PGy7A,183
|
||||||
|
pyOpenRPA/Orchestrator/__main__.py,sha256=czJrc7_57WiO3EPIYfPeF_LG3pZsQVmuAYgbl_YXcVU,273
|
||||||
|
pyOpenRPA/Orchestrator/__pycache__/BackwardCompatibility.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/__pycache__/ControlPanel.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/__pycache__/Core.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/__pycache__/Processor.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/__pycache__/ProcessorOld.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/__pycache__/Server.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/__pycache__/ServerSettings.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/__pycache__/SettingsTemplate.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/__pycache__/Timer.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/__pycache__/__Orchestrator__.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/__pycache__/__init__.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/__pycache__/__main__.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/README.md,sha256=e2hKh7Tx6DAsX6jY_hBDhguL1L2Wiv6iugDB5otMzIA,2293
|
||||||
|
pyOpenRPA/Resources/Web/Google/LatoItalic.css,sha256=pB6OZ6F2VsaqkL-g5hW-wE_T0m9H_NltzmzjX-XAKDk,3112
|
||||||
|
pyOpenRPA/Resources/Web/Handlebars/handlebars-v4.1.2.js,sha256=h6O4BrhyPtJspLDEQwogC53uHFRozuBpxvN2S4tJHE8,171994
|
||||||
|
pyOpenRPA/Resources/Web/JsRender/jsrender.min.js,sha256=00hs6PwCiAfN_gatFdLofj3yBf8ue5Z7jCXX_th2FFg,25927
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/.versions,sha256=gGkuqPk07gAhjnNJVjVR_BA4SSBzqazbY8eEpddH01U,72
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/LICENSE,sha256=ifWbZZ0piwisfkIil1gacnBMxNnAHa7yCn1etItX1Y4,1102
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/README.md,sha256=oITQ5k-7jxoYAAQpzAXFROqgcnGzPrTd7GqkZSGqKW8,448
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/accordion.css,sha256=UC6U37i_pXBVMlUmFMLi1S8FIhFycJjAePP-hRGKzQM,8971
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/accordion.js,sha256=6cCQ6FlT1bM_QA4OpA_vfMljasKU1foGszlAIyhWi3A,20790
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/accordion.min.css,sha256=u9_5Zru9uMTtrXZpdfLawT_kJ5LFcmrMFr1QWXfDqwA,6955
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/accordion.min.js,sha256=kt0Dfi-mrxAU-iYsfDrkROHrb55Hi0lVWC7MT46_xnU,7100
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/ad.css,sha256=CiW55EUiruW1Tp0jrz2yDvQ8jYxDVMDmVcROV5_eBzo,4176
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/ad.min.css,sha256=7D7QYK0TBRyE4dN3SYXD_owb0j8UXywfPKzab2e743I,2066
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/api.js,sha256=Vjx6JZpe0iVJ6t8gp3TO3UjIyZkNBPN-taCS8MWwvJI,40952
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/api.min.js,sha256=und4HgOg2CxzBcqdJOvcT9LfJx0Hf9xQmEO_u7r1Ync,14594
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/breadcrumb.css,sha256=SJD_Mmi9BUmGXVhCXlIM1ei93yJVreQx0FAT68_t01w,2166
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/breadcrumb.min.css,sha256=-40OBPSbvydFFq9P3XPydeyWOrsh8g600mK9HXNoLnI,1192
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/button.css,sha256=wdCjDbx3M-jkpA7whQetZvX3ZE7wyBwRlCbcTVXKobc,116361
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/button.min.css,sha256=37bmMDGVPsjpcyAe7GqWsqv3UpsPTvlE5AiCVtT5NxY,90207
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/card.css,sha256=0oHZ2Qh74uybsgxLhP2ag_kQGTyOx3Kbzsjs6LvARzI,25330
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/card.min.css,sha256=anR2MHuWyx-iEc6wsI5nBMWnboFRqvOT7r-KOrKK-BQ,17410
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/checkbox.css,sha256=5u4dyQfH-wpdFbakv5CV4uIhWbBb2Tge0ZC5-tA2dX8,17473
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/checkbox.js,sha256=s-cRpbhGBxHgpnZdU3yFZciSW4n1QuruHjkX6gCyqT0,26912
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/checkbox.min.css,sha256=cy6WFzeIQ_5hHE7LEFxAK8yfR_zdfjoEubGRy1wCLv4,12727
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/checkbox.min.js,sha256=mlvPY4Gm-w6mgnAZ2GVMiBo5UDU7x_vaxKA5VRxdjR4,11369
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/colorize.js,sha256=imQdcIH6qpozSWEYeIpilPOfKHOJbD6V9RuKOC7yyEE,8710
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/colorize.min.js,sha256=oUDFJRLSaINMaJIZmuzYttfcMgkb7I6CpuEJ6bMfAVI,3270
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/comment.css,sha256=WAotERTFZQyxKNDJiSLlreq5KVja4xNM_bXUeG7NyVQ,5120
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/comment.min.css,sha256=JYlEkH8IupEqfItr2N9WZaNYkyF6rX2bnP6Y8ktXdCU,2945
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/container.css,sha256=bzDnWjcw404DoiHuz6-3iMRmbzJePDPgUGHcx3nFAuU,3099
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/container.min.css,sha256=VizQkNfO7_OANkM37_7xKxHQPEcUTBRuj3R_xkaULO8,1925
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/dimmer.css,sha256=xKjQ9JWKG6zlrjyB5zECQc5vLZ7uCg7S5X-aUNKh6b8,5559
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/dimmer.js,sha256=TuB9IPn4wx2n47nRVYf9CKvLotDL9d7gQcNArXupiRU,22303
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/dimmer.min.css,sha256=-MBET9URQztSrMHpKaB8oyTckkm-lXisQbuxqd2UyOk,3517
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/dimmer.min.js,sha256=4jCyaIQIKQX4zzzvspDqEvUmsPnpkr5lFuDOvKR_Wbo,8071
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/divider.css,sha256=a_0UrPhzoGJZZd8PBDgc5C0utGbzM6hjZbkDyy4pzfw,8034
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/divider.min.css,sha256=2XcokR56EPJZJh0ofnGgp-QPx2VpHYzDcdZdtR08uBs,6097
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/dropdown.css,sha256=rJfAK26TU_FrVEYQxX1iWS4Z91SORlfnM128BfpI1II,37420
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/dropdown.js,sha256=KnpOJhLPr4nCvh6M4qxqs8Y8lPGNZgLK6jZcGWrYzHo,145962
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/dropdown.min.css,sha256=7Lwg8bz5Df_7YZ6D-ywoa01hT3IkqC09ZKBKtGe6gow,25679
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/dropdown.min.js,sha256=uEocYy6a0MpPLLHtYV7QAGdOeMRwE0Am2WtnOg_hBfM,50895
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/embed.css,sha256=19QhoCUbplkH_W5a7ejlpO6PoqSEFVA1xdHvaZp98yw,3169
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/embed.js,sha256=O3znHvAxO5xYlwzn4y3lQDde_iTdy29iUAmPqNfg4-0,20926
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/embed.min.css,sha256=SHH3TOGQhg1d5mrYCZeko1qvN3_NoETWQzBmfGUOpjc,1836
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/embed.min.js,sha256=QN4vIzPRpT4BFVPyA702nPG8nZKWfM-HygoF9jPBDJA,7728
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/feed.css,sha256=aFj6fLvIPQfeRxyKu_TlLKeUcwmI5GwOR7pY1Lb0JKM,5845
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/feed.min.css,sha256=-l8OBrtbhQi-fhQLHwA0cut_JWOuRWc44I0KpPxUx_M,3590
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/flag.css,sha256=rvyaZDdUGBPNuvOE8lzpW-Z4q3LYkJi8T99JlN1aF3E,22423
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/flag.min.css,sha256=WX74cISnDHD9kiyzCAiXiUWfnmv6cwdmBXgXtA5TUuw,18577
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/form.css,sha256=oNyqIev2BGrxigiMt72unbkne8-OWJ6UtaUGM4XZ9Y4,29092
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/form.js,sha256=FCxhpdJMgA6H88ka82b0jcqg-a8S53T0sVVbS_chLPA,57618
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/form.min.css,sha256=BmOkPn-zjy4WbHvcIvm18Vq0nhJjwADEBxvsLqX0sXg,21568
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/form.min.js,sha256=fK_KHBgbjblWL2-hRtohUzj6b12XWi6pVujkG1Ru9-w,20458
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/grid.css,sha256=I35Jh57rWCJoLMuJYXksccmBzc6V1XC1Mi_na_oAp84,73036
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/grid.min.css,sha256=5iW6X6_QT_7PgFBce4OTfLOOaSoovOoOb2U8w1yZDtc,57335
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/header.css,sha256=32EgHb7XmTT_AWH7Nr08PjXP2op-xhwlSqSIThcZKmY,13499
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/header.min.css,sha256=hHgAxfAsLFDPcyU6T6cRE_M6R-4rKEfPX5kOHVyJNes,8872
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/icon.css,sha256=CHLhcJDvnks69dz2lyZC0idfGnPFx4qdKA82Hm_bEDo,86945
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/icon.min.css,sha256=4opKQbtTAtsuIkfkEMuIA3eD3T4m1X3mfiCVTS6x2_A,67019
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/image.css,sha256=eZLe0mOsWAJETFvjXHlZXAnSY87SGQlRDJna2_EZ67U,5676
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/image.min.css,sha256=eXzqGHi6p4yiYGCiYPOcGXYbKeQtA0Df_w0gN88KCD0,3727
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/input.css,sha256=lYFTBK5TuWVaB2LSwjdl83iM9l4rn7jPwoFcEfvHQR8,12699
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/input.min.css,sha256=4ouF0Y10UKjiT6iJlHxD5aOe8WljYoAxPqpiy7iEdSw,8692
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/item.css,sha256=O1HR21E9wHtGxCmsqxcEc_65R6Ln3mOvImRwYMQso1g,9753
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/item.min.css,sha256=JRycvfshgviiiwTeAKUj0iPOov4-Uwaue3fTqaY_e5s,5985
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/label.css,sha256=9tLlAtf1Y3NSngCdO1DZ5YcRW_bu2dUKYUAXHPXm2hQ,28382
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/label.min.css,sha256=lzompqItwR2t_PJowmd07tg8QUPAb6yj58N9TwuNS6I,20005
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/list.css,sha256=CI9lvTBhVzN64aRNjJIwhG6bhKydfIbk_RdYQiaAYwE,22486
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/list.min.css,sha256=uXVJMLBcGUe7MZETm-CQO5LMhIbTFxajYZRBFTCTftY,16094
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/loader.css,sha256=Yz3gBB1JS-86XzSzztcNLE24ViO7UnP15A4M4hrFZUY,7128
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/loader.min.css,sha256=XtALKS7EZswkHXCCOthbxsuu36_tpZbqh-LMT1gaRAg,4702
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/menu.css,sha256=aOYMc10qx8D7fVQ7R83XXUkbrrFExpWkWc6ZnECfOJ4,45279
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/menu.min.css,sha256=cRSLOaiPiyfTQ4B4HT1OCF_2CWNzGcPO9Nns6Jrf4hg,31506
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/message.css,sha256=baLR2EbwIWTGTSvNc9qb2FmcWBeZHM3W0kBNvEdxZZU,12466
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/message.min.css,sha256=_plszMa027XkVjjehCTWxgIAftsTT1alP5I6EYfoVMI,8354
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/modal.css,sha256=86mR_k66q9mOP7jwLV6J4iRW1a06eSyQ6tcoZpUlHf8,12800
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/modal.js,sha256=ACX5Za25KIugyXD7eFndkqa18n7LHjZrBkWSpLs8uqQ,33442
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/modal.min.css,sha256=2GGe09HtCS6k__kprnoTwPMNu2CFCjEpaLQ2NBMLua8,8012
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/modal.min.js,sha256=8POmd6680Gev-MdgKbVOHP-9lm-9WB1AVyuLf2WRcxc,12701
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/nag.css,sha256=3Pz6rq1vWHNvB7UHhGFMPYvrP7VZP_pTM4PlwthnviI,2727
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/nag.js,sha256=KuXGvpOopM0i7syRO2cLSXrJ5I7AjwW3m7JMJLfGuN4,15553
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/nag.min.css,sha256=ohX1Du58QE8pgiBVEzmlhuT2rERTdxY4sasod_53NV4,1483
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/nag.min.js,sha256=UN_1Vcu3C_zxEatS7UZKw1x2blSyihZT2F1cmq7UZOk,5696
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/placeholder.css,sha256=ihZF0mK6texbUk_qWnqHqoZ0scXyDhHy-tr77Wougwg,5938
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/placeholder.min.css,sha256=UIFHVCJ1agMPhpUv-aqm6GeN3EmqUv5vClMm_5LEpuM,4452
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/popup.css,sha256=EitCUPKebavrCN6zwsWGZKfKCNjRJhaEGf6dJlCim7g,17407
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/popup.js,sha256=kzErFmfWsOMKZH-mbyLXQpJo_ajderu7pnq_faA7teM,52273
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/popup.min.css,sha256=YlUBHRAaq5FwMcI2g3DQtgcmxmRNG1rEZaGK2LCgVZ0,12032
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/popup.min.js,sha256=VvJYDjsOSD6VaYYZhuQYiPOpBbpRnmaddxVd6shZ9mU,18630
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/progress.css,sha256=p2R5CYj1cVgj0mT7XTBcKKky02140m4A-PumSFirAqc,10669
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/progress.js,sha256=uAQsAqW_DWnH0hK5dC0MVBBwuDyyu8UNolLxO0OSCfs,31204
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/progress.min.css,sha256=JtEqDPto1ZJiE-6k_WoZnzlhFUgwLJqH6VowDWGRez4,7422
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/progress.min.js,sha256=B676J_Jywi6IJ9e_E62nmk7Gn9KDkRQc7RfcIBKPQcI,12331
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/rail.css,sha256=XUZeNKRfoqs2bRnKz49lJU8ufQ625eFrtL7IxXLzBD0,2646
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/rail.min.css,sha256=4rrNcI5NVX845Bc9aBTWjwjg7tnakWuMHl8zWK-ucmE,1453
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/rating.css,sha256=E_jbykfZK88UZ6kKhL0T8mqn29mzefpwNzCDZEkIyKE,20696
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/rating.js,sha256=rxHeOv-TB5-ViM9hOfODUZMGqWUMNyPvIVIov306LuQ,14869
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/rating.min.css,sha256=4coaKkBwUtNfJL53qHC_TzTE7BmLMuVxDu_Z3gGOs7Q,18393
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/rating.min.js,sha256=jprk9qns6QqU1UWGtHMwug9A_ls7tVMV8p2mueJlj74,5354
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/reset.css,sha256=ygW8luaW-MLjYb6fFQYl0HBo4w-P9zwYkVZLpFOMFh0,9123
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/reset.min.css,sha256=Cm0OrnD_mnGgt3DPmGhhNLeNUAfYfQlCX2uCK7TG_o8,2822
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/reveal.css,sha256=33mQj7j0sprB4_0PrBqMJXxyXXFs4eP2rKoraaht8e8,8177
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/reveal.min.css,sha256=cHuyo1zDTWJH9C1f1GPtKHwuTzA_IUSFAfTH3q5yoME,5784
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/search.css,sha256=XN5UApUr9lkI_R-ThVSHhNM3UEMEvl8Z6LAYhFABPKw,10377
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/search.js,sha256=bm3TK1__R62sMnnTL_haoNAZiWbua0IGEgwfdQRpuRo,51211
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/search.min.css,sha256=HONcBrv7-3sDkmJ9Zwh8KYXWyy_fUw_MjDjhNMtU7hU,6891
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/search.min.js,sha256=gkqnhj5TvM_vwvHKAb4zBC7uL6mndcAlK6CEv5iEUwg,17622
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/segment.css,sha256=FERuSI78q9zgv_iWxHnXIbSnJDsgNKaLh8IgThCD9OM,20063
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/segment.min.css,sha256=zLmNnl__Po9TAZWlayMZpH_DpZXhaHXTcSa8KGeRxMs,13763
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/shape.css,sha256=5sbfPkJ2vSJEo7Ht21qKtfupKDnPdYtwpxkszIHwqsY,3865
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/shape.js,sha256=6D_QO1uZyRzcGRxxaCGP4zRTcnHH-rF11XSDj8fsVn0,29873
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/shape.min.css,sha256=7KDwgqAZXncDCzulBQT3C9UcI_kopiPdoSF2NxpJQWE,2521
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/shape.min.js,sha256=Njt3jnaL2VeRaG0rRHt2niY7YXHeD4Z_fj17tN2syLU,10803
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/sidebar.css,sha256=pboKxonzco97CJSpXvUG9Bj65PyqdlTlmi8C_XNQcJI,15757
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/sidebar.js,sha256=-nippst3RqSK6cFS0b1VQIhhZ7x455Oq5vpvjxdFOhc,34488
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/sidebar.min.css,sha256=FxNmgO-xW6HZ8kqkaDpzZG2GGTYYvBIkhHFsPPUx8f8,10726
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/sidebar.min.js,sha256=LxCRzL8rRPXulWQPWkMgncUHL0hBU4IHsuNOVzIMi3I,13466
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/site.css,sha256=tpW_cbiDbTbWVk1ECO4bnddYLlytmUgArSW1Jx3x9DU,3918
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/site.js,sha256=-yF4ejA2WwzIujQ1y9b-i6dxpRYCE8lCSU76CQ9hZhw,14604
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/site.min.css,sha256=AYTFsBcTjn7JH9tBf1s3S68Fxr83IHQf5t5FpD0vGcw,2452
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/site.min.js,sha256=f-45BTFplAj5X_I64VjaIAqTulT6dVhF-rHvOG8pZpM,6066
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/state.js,sha256=rdhOQ83U-t08-IE-ZL7qwiJ_2NPtm0E--BfFJVRylSY,21498
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/state.min.js,sha256=sgXcJIgGI3ymppa7VewFhV3g4rnB_D55Yvoo-QX4Whw,7804
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/statistic.css,sha256=zC6fj8Mg8giRj0rcaq1GVcAfmdLfb0QYgBx_B-7bXlE,13221
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/statistic.min.css,sha256=Nbx1qdI_NIb-YBfRIMcmKn-IdY5OmUdd8gNIGgA2TCs,9594
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/step.css,sha256=3dgzVkMcFYJKP_UPk7quva4L7GLD6sln1aroRZlrcw8,23555
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/step.min.css,sha256=hifahh65UcRx9Cux-rpwi5pTJImD83BlfH1qbkiaWCI,19188
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/sticky.css,sha256=eOSA5O3_qugssoDgdTovRNvNMe0kEWqQz1yQGJFZCQM,1288
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/sticky.js,sha256=kHIMXTF2Wj8DYTaDRRqQ9ZVNUTOjDbBF84Dwm4tFYaM,31814
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/sticky.min.css,sha256=SYOFZjW67UWxBsrtAfD4g0Tvf6CnltYw_IN0VemK2hU,607
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/sticky.min.js,sha256=fu91ThJa6qnZoQAGTpxUw5Q1UN7d2Y_KHS0kjoteWCw,11854
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/tab.css,sha256=aX-PA0rhwxK3q6l3A3przKBvFAQ9LkhlDV3mETbQR98,1865
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/tab.js,sha256=xvNcoJnirQ1TJgVMy_8_AARTIveekx3bgoXNLc-FhC0,33771
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/tab.min.css,sha256=vTnhMR4q6W1dLyB3QYdtwRWnl2XLdtFA0I3kSnZH_EY,1075
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/tab.min.js,sha256=MgUTbr8RHTNylv3wIeBmCec-mS1iL9IJW7Y0NahYmrs,11487
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/table.css,sha256=omOnJC5bkklgjC6vJgTYJae-wbp3MSIu-mUM0gc5Q-o,25536
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/table.min.css,sha256=ODiMJS5bcTBrVMu-BtZytuSNpu3wHtILDb8no5BLNhw,18015
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/transition.css,sha256=XMKp0LQFx2Ec2oOjFuAPJik8VrDUgysP4TNOJH3Rzuw,49176
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/transition.js,sha256=sccxnC8Z9hx9lzlJLPYQ9E5FHETVYEVaA1uIQaA7ubU,36076
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/transition.min.css,sha256=cty1gaoozlRlEnqcQir7t93a7sOy2uCLp0c4jyBLWwA,33525
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/transition.min.js,sha256=k30cmb6hiQ_LGKpX2AcllUduUJ0kA4DKKStgUxkGQzM,13010
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/video.css,sha256=R9cpZZmFTZ70NmFVp7XhHOXaoZ3iodK1WlxGrisY7Tw,2346
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/video.js,sha256=Si_eMYc42BiLyyl4ur4u7K17kyw9biw-eAtbidaQH0c,16252
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/video.min.css,sha256=0MWKfR7_d_meresYhKG49N4ikgDL9YKvdj4ffNqhti0,1328
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/video.min.js,sha256=f7uHgbRqRCqHKBJm7CB31wMMnTjYHPmYaLi1D2i9QfI,6090
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/visibility.js,sha256=p_2kDyoT-GlUY_iLWH8RCRtSl-zunZ1oNx3dJwvyKbA,44180
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/visibility.min.js,sha256=Th3QlAMxD5M2RJ9nNOvuxJZCgZIlavx5-51jABKTs2A,16294
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/visit.js,sha256=9DsUmsPzmp3XD1pplmIeV5tNIeqEHMml5hcr3omsBJw,16142
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/visit.min.js,sha256=bT8zWI7mcAwX-Fyt67gogo3u_IT7q8uimamY5Vhk3eU,5887
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/package.js,sha256=BHq6qGCSMdDXDGJxZ4zxnKaREbFM2un2VqCkydrBTf0,774
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/package.json,sha256=Sy3ZVA4SxFzecOO88h1IVAnBiuDpRtXiUg6ME_YArI0,524
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/semantic.css,sha256=aje_ma2N_7VT1k2QTOLeqr3SfQ3Cr-7vB05D2-uo-YQ,869203
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/semantic.js,sha256=t-thIOFbQol3-vcB3C7kRbS49jG2_LC5dEp7NLxBpuA,759089
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/semantic.min.css,sha256=f5Dpq5VRrbzn8POovxN9HR3S7LhHQIAiCKYz4PB4ZZA,628934
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/semantic.min.js,sha256=69cT25pJVUmAyniwWMglXlEOEeZYuhmD8Hbj58gCS7Y,275740
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/brand-icons.eot,sha256=0CPFX94iBJXxOoe3KZXg35jI0ok1dymdGZ2lu_W0_gI,98640
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/brand-icons.svg,sha256=IcTTApw6luFW48z0iPvWxbD_LpBQYBaIN5LGFInrfpU,508636
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/brand-icons.ttf,sha256=QuNp3Iw3KXO6d6gmti0seiBwUyMT34MqIyiN23aXQVg,98404
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/brand-icons.woff,sha256=n6_Ww-e_wUXbQqkG5fpo_mpvlyIfAT0-gz_DIxuZLEQ,63728
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/brand-icons.woff2,sha256=59TVNAu-V6Adj3mSFC4nY9Q41Xg4kMdnSDBu6_oFamk,54488
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/icons.eot,sha256=i04bhH4iIz1PRn00-u_nvL_rzm-pu77lYMRc2JSGh1E,106004
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/icons.otf,sha256=vcXQufOXvoPohsdLAUHRlUqkOEs1nc5JgpmUxKLh978,93888
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/icons.svg,sha256=GzY2PC_CxigjA7ao5Pm45c8-mD38cSHKeoiagKC-kA4,392355
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/icons.ttf,sha256=y3-B9UL1xBiju7mtP5--eEFR0TsEzsUOzt7GATMko9o,105784
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/icons.woff,sha256=lbakhA-HEeyrQnvCNuuGCY235ceCuvsTnIwwgFql_-E,50524
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/icons.woff2,sha256=Q0RmtZVFqKHKxt2zgZfNxrNZlamMPzgS-4jWGxwwDdM,40148
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/outline-icons.eot,sha256=RTf6BjQO5iwmTp16TYqryrPee9osXMM0AQ9GtoMQb8s,31156
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/outline-icons.svg,sha256=T4_RcS28l2Pa57YNTH3ryg_433tFrdN6pDBt0iGL1zE,107567
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/outline-icons.ttf,sha256=Zxchcur85FY3JeZhBD1duFS4Z2ip6L05dY2-gcR5aTU,30928
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/outline-icons.woff,sha256=S8NZwnBXs-0LrKZtbFNJpdSmBQlvvHh1Bhui2Ro9bQU,14712
|
||||||
|
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
|
||||||
|
pyOpenRPA/Robot/SettingsTemplate.py,sha256=Rp5XPeV2I4tCS2uf4Zkqm_ERJ6pZMg4-e5_lMqGJYLk,1453
|
||||||
|
pyOpenRPA/Robot/Test.py,sha256=qXr990nXiFZX5SNv6QN9GLb_U4HZRmJnbZR2qSnwilY,2878
|
||||||
|
pyOpenRPA/Robot/UIDesktop.py,sha256=wjBDHb9q-kmZoDCV3ai1bLBqR_EVVY88jeDNHFxmF8g,82804
|
||||||
|
pyOpenRPA/Robot/Utils/JSONNormalize.py,sha256=aIuVzuZDazhxkCOzoOjfhHVz66mp2FWdfPv5E7KWF5Y,3890
|
||||||
|
pyOpenRPA/Robot/Utils/ProcessBitness.py,sha256=WlKL-DklGaoTnchtapOTM_ydxSB4yOeo9lcG3zr2VME,4524
|
||||||
|
pyOpenRPA/Robot/Utils/ProcessCommunicator.py,sha256=8GfmLnOvAdosmt7YNT86uEV9cjhKippssCX62wOMJwM,8039
|
||||||
|
pyOpenRPA/Robot/Utils/TimerRepeat.py,sha256=_kTct3X9SIEvS3DKM5bGNnjRBVJasmMFZntQaVbPX_E,961
|
||||||
|
pyOpenRPA/Robot/Utils/ValueVerify.py,sha256=ObskxU4fOMoCGw74_nzYt6-a5jjrAckb3sdBLYyhYxY,777
|
||||||
|
pyOpenRPA/Robot/Utils/__init__.py,sha256=pHlSQGRFKmn5RCTHIf-3a2ooA9T2xNOWridckynP7W4,28
|
||||||
|
pyOpenRPA/Robot/Utils/__pycache__/JSONNormalize.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Robot/Utils/__pycache__/ProcessBitness.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Robot/Utils/__pycache__/ProcessCommunicator.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Robot/Utils/__pycache__/TimerRepeat.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Robot/Utils/__pycache__/ValueVerify.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Robot/Utils/__pycache__/__init__.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Robot/Window.py,sha256=UJl-sg4RvvJ35aG9jZOzqGVwE15XK7qPHqoOBD13xFk,431
|
||||||
|
pyOpenRPA/Robot/__init__.py,sha256=L-5tPm6evytGWOzlqIq-2oiIhmQnruaxwIstyyaMkVI,253
|
||||||
|
pyOpenRPA/Robot/__main__.py,sha256=l6II8JuXCsnVOcfs6-2jvogKYTVhbfj3Jl2ld3OIP7s,1992
|
||||||
|
pyOpenRPA/Robot/__pycache__/Clipboard.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Robot/__pycache__/OrchestratorConnector.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Robot/__pycache__/SettingsTemplate.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Robot/__pycache__/Test.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Robot/__pycache__/UIDesktop.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Robot/__pycache__/Window.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Robot/__pycache__/__init__.cpython-37.pyc,,
|
||||||
|
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=_BXQjAMHew2fRWloXdqPOmYHX6i6C8ELPsW1TZNvjz4,8618
|
||||||
|
pyOpenRPA/Studio/ValueVerify.py,sha256=ObskxU4fOMoCGw74_nzYt6-a5jjrAckb3sdBLYyhYxY,777
|
||||||
|
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,,
|
||||||
|
pyOpenRPA/Studio/__pycache__/ProcessCommunicator.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Studio/__pycache__/RobotConnector.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Studio/__pycache__/Studio.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Studio/__pycache__/ValueVerify.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Studio/__pycache__/__init__.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Studio/__pycache__/__main__.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Tools/RobotDB/ExcelCom.py,sha256=hp0dvXOEC7Au00ueh7pqxkdixV-PC-km7tCt-wRunYs,343
|
||||||
|
pyOpenRPA/Tools/RobotDB/HowToUse,sha256=TUXPZAFcse-PSlKFM6jcaYuuZZEmXOSSvgeqrbmIDoc,1473
|
||||||
|
pyOpenRPA/Tools/RobotDB/RobotDB.py,sha256=qtGu8PS2atd0L8taCNpk-08Qpxp8Qz1lqwAcBkyLFLM,1655
|
||||||
|
pyOpenRPA/Tools/RobotDB/Server.py,sha256=rjW9Sg-j9P8pFQD66Uih-rke6-f6sCulinwi4_W-3mc,19933
|
||||||
|
pyOpenRPA/Tools/RobotDB/ServerSettings.py,sha256=5p9JwrpKHh68oVHIWazTajB6AOfzeapARbvGcJOFmNc,7406
|
||||||
|
pyOpenRPA/Tools/RobotDB/__init__.py,sha256=qVH8fEPgXk54rmy-ol0PnT8GF5OlGE0a8mExwJ4tFqY,124
|
||||||
|
pyOpenRPA/Tools/RobotDB/__main__.py,sha256=w9sXIF4r_PeWJjHJutTuH8DSYpXxpgcAN0KUOjiJ6PI,140
|
||||||
|
pyOpenRPA/Tools/RobotDB/__pycache__/ExcelCom.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Tools/RobotDB/__pycache__/RobotDB.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Tools/RobotDB/__pycache__/Server.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Tools/RobotDB/__pycache__/ServerSettings.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Tools/RobotDB/__pycache__/__init__.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Tools/RobotDB/__pycache__/__main__.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Tools/RobotScreenActive/ConsoleStart.bat,sha256=_HNadUKHOYI5y6foG3srh8wjSzhX33xaKNylFtDjOJk,114
|
||||||
|
pyOpenRPA/Tools/RobotScreenActive/Monitor.py,sha256=TV-YisVqa_uGiyJLG9oK4u-5aDjGiFYZFh1dPjOgYc8,492
|
||||||
|
pyOpenRPA/Tools/RobotScreenActive/Screen.py,sha256=VnYcvCVymrD35l2J4ln_tlVn7CilZhxE4Ggw9P-OhIw,606
|
||||||
|
pyOpenRPA/Tools/RobotScreenActive/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||||
|
pyOpenRPA/Tools/RobotScreenActive/__main__.py,sha256=JASxDDVKWUU7DAbDkRrGTrPk-P7LZchTZFh8usp6b4U,593
|
||||||
|
pyOpenRPA/Tools/RobotScreenActive/__pycache__/Monitor.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Tools/RobotScreenActive/__pycache__/Screen.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Tools/RobotScreenActive/__pycache__/__init__.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Tools/RobotScreenActive/__pycache__/__main__.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Tools/SafeSource/Crypter.py,sha256=VRrE5-oQxQtvMEPHM1lMXp2CKnceNBmIWJnsJoJkaVE,3616
|
||||||
|
pyOpenRPA/Tools/SafeSource/DistrCreate.py,sha256=-_8BTle57LBKVknnB_3af-LghxrRmRGfRNu08CLNIvY,3232
|
||||||
|
pyOpenRPA/Tools/SafeSource/DistrRun.py,sha256=zwUh6Jy-rDAZHV6fcTUMupkukojntFMroHJHMsNQgrE,9637
|
||||||
|
pyOpenRPA/Tools/SafeSource/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||||
|
pyOpenRPA/Tools/SafeSource/__main__.py,sha256=g5aYWnuUZoM2jDX2mSIl9tRAJg05tu5VxD2rGJWcACg,649
|
||||||
|
pyOpenRPA/Tools/SafeSource/__pycache__/Crypter.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Tools/SafeSource/__pycache__/DistrCreate.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Tools/SafeSource/__pycache__/__init__.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Tools/SafeSource/__pycache__/__main__.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Tools/Terminator.py,sha256=VcjX3gFXiCGu3MMCidhrTNsmC9wsAqfjRJdTSU9fLnU,2178
|
||||||
|
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=iosI4OeOIbrI3Van5znqBmnHjqynRxn8OXqujhKpiKY,174
|
||||||
|
pyOpenRPA/__pycache__/__init__.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/test.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@ -0,0 +1,5 @@
|
|||||||
|
Wheel-Version: 1.0
|
||||||
|
Generator: bdist_wheel (0.33.1)
|
||||||
|
Root-Is-Purelib: true
|
||||||
|
Tag: py3-none-any
|
||||||
|
|
@ -0,0 +1 @@
|
|||||||
|
pyOpenRPA
|
@ -0,0 +1,27 @@
|
|||||||
|
import requests, time
|
||||||
|
# A2O - Data flow Agent to Orchestrator
|
||||||
|
|
||||||
|
# f"{lProtocolStr}://{lHostStr}:{lPortInt}/pyOpenRPA/Agent/A2O"
|
||||||
|
# Request BODY:
|
||||||
|
# { "HostNameUpperStr": "", "UserUpperStr": "", "LogList":[]}
|
||||||
|
# Response BODY:
|
||||||
|
# {}
|
||||||
|
|
||||||
|
# Send logs to orchestrator
|
||||||
|
def _A2ODataSend(inGSettings, inDataDict):
|
||||||
|
lL = inGSettings["Logger"]
|
||||||
|
# Send request to the orchestrator server
|
||||||
|
try:
|
||||||
|
lProtocolStr= "https" if inGSettings["OrchestratorDict"]["IsHTTPSBool"] else "http"
|
||||||
|
lHostStr = inGSettings["OrchestratorDict"]["HostStr"]
|
||||||
|
lPortInt = inGSettings["OrchestratorDict"]["PortInt"]
|
||||||
|
lURLStr=f"{lProtocolStr}://{lHostStr}:{lPortInt}/pyOpenRPA/Agent/A2O"
|
||||||
|
lResponse = requests.post(url= lURLStr, cookies = {"AuthToken":inGSettings["OrchestratorDict"]["SuperTokenStr"]}, json=inDataDict)
|
||||||
|
except Exception as e:
|
||||||
|
if lL: lL.exception(f"A2O Error handler.")
|
||||||
|
|
||||||
|
|
||||||
|
# Send some logs to orchestrator
|
||||||
|
def LogListSend(inGSettings, inLogList):
|
||||||
|
lDataDict = { "HostNameUpperStr": inGSettings["AgentDict"]["HostNameUpperStr"], "UserUpperStr": inGSettings["AgentDict"]["UserUpperStr"], "LogList": inLogList}
|
||||||
|
_A2ODataSend(inGSettings=inGSettings, inDataDict=lDataDict)
|
@ -0,0 +1,41 @@
|
|||||||
|
import requests, time
|
||||||
|
# O2A - Data flow Orchestrator to Agent
|
||||||
|
|
||||||
|
# f"{lProtocolStr}://{lHostStr}:{lPortInt}/pyOpenRPA/Agent/O2A"
|
||||||
|
# Request BODY:
|
||||||
|
# { "HostNameUpperStr": "", "UserUpperStr": "" }
|
||||||
|
# Response BODY:
|
||||||
|
# QUEUE ITEM
|
||||||
|
# # {
|
||||||
|
# # "Def":"DefAliasTest", # def link or def alias (look gSettings["Processor"]["AliasDefDict"])
|
||||||
|
# # "ArgList":[1,2,3], # Args list
|
||||||
|
# # "ArgDict":{"ttt":1,"222":2,"dsd":3} # Args dictionary
|
||||||
|
# # "ArgGSettings": # Name of GSettings attribute: str (ArgDict) or index (for ArgList)
|
||||||
|
# # "ArgLogger": None # Name of GSettings attribute: str (ArgDict) or index (for ArgList)
|
||||||
|
# # },
|
||||||
|
|
||||||
|
def O2A_Loop(inGSettings):
|
||||||
|
lL = inGSettings["Logger"]
|
||||||
|
while inGSettings["O2ADict"]["IsOnlineBool"]:
|
||||||
|
# Send request to the orchestrator server
|
||||||
|
try:
|
||||||
|
lProtocolStr= "https" if inGSettings["OrchestratorDict"]["IsHTTPSBool"] else "http"
|
||||||
|
lHostStr = inGSettings["OrchestratorDict"]["HostStr"]
|
||||||
|
lPortInt = inGSettings["OrchestratorDict"]["PortInt"]
|
||||||
|
lURLStr=f"{lProtocolStr}://{lHostStr}:{lPortInt}/pyOpenRPA/Agent/O2A"
|
||||||
|
lDataDict = { "HostNameUpperStr": inGSettings["AgentDict"]["HostNameUpperStr"], "UserUpperStr": inGSettings["AgentDict"]["UserUpperStr"]}
|
||||||
|
lResponse = requests.post(url= lURLStr, cookies = {"AuthToken":inGSettings["OrchestratorDict"]["SuperTokenStr"]}, json=lDataDict)
|
||||||
|
if lResponse.status_code != 200:
|
||||||
|
if lL: lL.warning(f"Agent can not connect to Orchestrator. Below the response from the orchestrator:{lResponse}")
|
||||||
|
time.sleep(inGSettings["O2ADict"]["RetryTimeoutSecFloat"])
|
||||||
|
else:
|
||||||
|
lQueueItem = lResponse.json() # Try to get JSON
|
||||||
|
# Append QUEUE item in ProcessorDict > ActivityList
|
||||||
|
inGSettings["ProcessorDict"]["ActivityList"].append(lQueueItem)
|
||||||
|
if lL: lL.debug(f"ActivityItem was recieved from orchestrator: {lQueueItem}");
|
||||||
|
except Exception as e:
|
||||||
|
if lL: lL.exception(f"A2O Error handler. Sleep for {inGSettings['A2ODict']['RetryTimeoutSecFloat']} s.")
|
||||||
|
time.sleep(inGSettings["O2ADict"]["RetryTimeoutSecFloat"])
|
||||||
|
except requests.exceptions.ConnectionError as e:
|
||||||
|
if lL: lL.error(f"A2O Connection error - orchestrator is not available. Sleep for {inGSettings['A2ODict']['RetryTimeoutSecFloat']} s.")
|
||||||
|
time.sleep(inGSettings["O2ADict"]["RetryTimeoutSecFloat"])
|
@ -0,0 +1,65 @@
|
|||||||
|
# 1.2.0 - general processor - contains old orchestrator processor + RDPActive processor
|
||||||
|
import time, copy, threading
|
||||||
|
# Run processor synchronious
|
||||||
|
def ProcessorRunSync(inGSettings):
|
||||||
|
"""
|
||||||
|
"ProcessorDict": { # Has been changed. New general processor (one threaded) v.1.2.0
|
||||||
|
"ActivityList": [ # List of the activities
|
||||||
|
# {
|
||||||
|
# "Def":"DefAliasTest", # def link or def alias (look gSettings["Processor"]["AliasDefDict"])
|
||||||
|
# "ArgList":[1,2,3], # Args list
|
||||||
|
# "ArgDict":{"ttt":1,"222":2,"dsd":3}, # Args dictionary
|
||||||
|
# "ArgGSettings": None # Name of GSettings attribute: str (ArgDict) or index (for ArgList)
|
||||||
|
# "ArgLogger": None # Name of GSettings attribute: str (ArgDict) or index (for ArgList)
|
||||||
|
# },
|
||||||
|
],
|
||||||
|
"AliasDefDict": {}, # Storage for def with Str alias. To use it see pyOpenRPA.Orchestrator.ControlPanel
|
||||||
|
"CheckIntervalSecFloat": 1.0 # Interval for check gSettings in ProcessorDict > ActivityList
|
||||||
|
"ExecuteBool": True # Flag to execute thread processor
|
||||||
|
"""
|
||||||
|
lL = inGSettings["Logger"] # Logger alias
|
||||||
|
inGSettings["ProcessorDict"]["ThreadIdInt"] = threading.get_ident() # fill Processor thread id
|
||||||
|
while inGSettings["ProcessorDict"]["ExecuteBool"]:
|
||||||
|
lActivityList = inGSettings["ProcessorDict"]["ActivityList"] # Alias
|
||||||
|
if len(lActivityList)>0:
|
||||||
|
if lL: lL.debug(f'Processor ActivityList len: {len(lActivityList)}')
|
||||||
|
lActivityItem = inGSettings["ProcessorDict"]["ActivityList"].pop(0) # Extract the first item from processor queue
|
||||||
|
ActivityListExecute(inGSettings = inGSettings, inActivityList = [lActivityItem]) # execute the activity item
|
||||||
|
else:
|
||||||
|
time.sleep(inGSettings["ProcessorDict"]["CheckIntervalSecFloat"]) # Sleep when list is empty
|
||||||
|
|
||||||
|
# Execute ActivityItem list
|
||||||
|
# return the def result
|
||||||
|
def ActivityListExecute(inGSettings, inActivityList):
|
||||||
|
lL = inGSettings["Logger"] # Logger alias
|
||||||
|
lResultList = [] # init the result list
|
||||||
|
for lActivityItem in inActivityList: # Iterate throught the activity list
|
||||||
|
lDef = None # Def variable
|
||||||
|
if callable(lActivityItem["Def"]): # CHeck if def is callable
|
||||||
|
lDef = lActivityItem["Def"] # Get the def
|
||||||
|
else: # Is not callable - check alias
|
||||||
|
lDef = inGSettings["ProcessorDict"]["AliasDefDict"].get(lActivityItem["Def"], None) # get def if def key in Alias def storage
|
||||||
|
#gSettings
|
||||||
|
lGSettingsDictKey = lActivityItem.pop("ArgGSettings",None)
|
||||||
|
# # Prepare arg dict - gSettings
|
||||||
|
if type(lGSettingsDictKey) is str: # check if gSetting key is in ArgDict
|
||||||
|
lActivityItem["ArgDict"][lGSettingsDictKey] = inGSettings # Set the gSettings in dict
|
||||||
|
# # Prepare arg list
|
||||||
|
elif type(lGSettingsDictKey) is int: # check if gSetting key is in ArgDict
|
||||||
|
lActivityItem["ArgList"].insert(lGSettingsDictKey,inGSettings)# Set the gSettings in list by the index
|
||||||
|
#Logger
|
||||||
|
lLoggerDictKey = lActivityItem.pop("ArgLogger",None)
|
||||||
|
# # Prepare arg dict - gSettings
|
||||||
|
if type(lLoggerDictKey) is str: # check if gSetting key is in ArgDict
|
||||||
|
lActivityItem["ArgDict"][lLoggerDictKey] = lL # Set the lLogger in dict
|
||||||
|
# # Prepare arg list
|
||||||
|
elif type(lLoggerDictKey) is int: # check if gSetting key is in ArgDict
|
||||||
|
lActivityItem["ArgList"].insert(lLoggerDictKey,lL)# Set the lLogger in list by the index
|
||||||
|
|
||||||
|
try: # try to run function from Processor.py
|
||||||
|
lActivityItemResult = lDef(*lActivityItem["ArgList"], **lActivityItem["ArgDict"])
|
||||||
|
lResultList.append(lActivityItemResult) # return the result
|
||||||
|
except Exception as e:
|
||||||
|
if lL: lL.exception(f"Processor.ActivityListExecute: Exception in def execution - activity will be ignored. Activity item: {lActivityItem}") # Logging
|
||||||
|
lResultList.append(e) # return the generated exception
|
||||||
|
return lResultList # return the result list
|
@ -0,0 +1,97 @@
|
|||||||
|
import threading, socket, getpass, sys, uuid, subprocess, base64
|
||||||
|
from . import O2A, A2O # Data flow Orchestrator To Agent
|
||||||
|
from . import Processor # Processor Queue
|
||||||
|
|
||||||
|
# Create binary file by the base64 string (safe for JSON transmition)
|
||||||
|
def OSFileBinaryDataBase64StrCreate(inFilePathStr, inFileDataBase64Str,inGSettings = None):
|
||||||
|
""" Create binary file by the base64 string (safe for JSON transmition)"""
|
||||||
|
lFile = open(inFilePathStr, "wb")
|
||||||
|
lFile.write(base64.b64decode(inFileDataBase64Str))
|
||||||
|
lFile.close()
|
||||||
|
lL = inGSettings.get("Logger", None) if type(inGSettings) is dict else None
|
||||||
|
lMessageStr = f"AGENT Binary file {inFilePathStr} has been created."
|
||||||
|
if lL: lL.info(lMessageStr)
|
||||||
|
A2O.LogListSend(inGSettings=inGSettings, inLogList=[lMessageStr])
|
||||||
|
|
||||||
|
# Create text file by the string
|
||||||
|
def OSFileTextDataStrCreate(inFilePathStr, inFileDataStr, inEncodingStr = "utf-8",inGSettings = None):
|
||||||
|
lFile = open(inFilePathStr, "w", encoding=inEncodingStr)
|
||||||
|
lFile.write(inFileDataStr)
|
||||||
|
lFile.close()
|
||||||
|
lL = inGSettings.get("Logger", None) if type(inGSettings) is dict else None
|
||||||
|
lMessageStr = f"AGENT Text file {inFilePathStr} has been created."
|
||||||
|
if lL: lL.info(lMessageStr)
|
||||||
|
A2O.LogListSend(inGSettings=inGSettings, inLogList=[lMessageStr])
|
||||||
|
|
||||||
|
# Send CMD to OS. Result return to log + Orchestrator by the A2O connection
|
||||||
|
def OSCMD(inCMDStr, inRunAsyncBool=True, inGSettings = None):
|
||||||
|
lResultStr = ""
|
||||||
|
# Subdef to listen OS result
|
||||||
|
def _CMDRunAndListenLogs(inCMDStr, inGSettings = None):
|
||||||
|
lL = inGSettings.get("Logger",None) if type(inGSettings) is dict else None
|
||||||
|
lResultStr = ""
|
||||||
|
lOSCMDKeyStr = str(uuid.uuid4())[0:4].upper()
|
||||||
|
lCMDProcess = subprocess.Popen(f'cmd /c {inCMDStr}', stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
||||||
|
lListenBool = True
|
||||||
|
lMessageStr = f"{lOSCMDKeyStr}: # # # # AGENT CMD Process has been STARTED # # # # "
|
||||||
|
if lL: lL.info(lMessageStr)
|
||||||
|
A2O.LogListSend(inGSettings=inGSettings,inLogList=[lMessageStr])
|
||||||
|
lMessageStr = f"{lOSCMDKeyStr}: {inCMDStr}"
|
||||||
|
if lL: lL.info(lMessageStr)
|
||||||
|
A2O.LogListSend(inGSettings=inGSettings, inLogList=[lMessageStr])
|
||||||
|
while lListenBool:
|
||||||
|
lOutputLineBytes = lCMDProcess.stdout.readline()
|
||||||
|
if lOutputLineBytes == b"":
|
||||||
|
lListenBool = False
|
||||||
|
lStr = lOutputLineBytes.decode('cp866')
|
||||||
|
if lStr.endswith("\n"): lStr = lStr[:-1]
|
||||||
|
lMessageStr = f"{lOSCMDKeyStr}: {lStr}"
|
||||||
|
if lL: lL.info(lMessageStr)
|
||||||
|
A2O.LogListSend(inGSettings=inGSettings, inLogList=[lMessageStr])
|
||||||
|
lResultStr+=lStr
|
||||||
|
lMessageStr = f"{lOSCMDKeyStr}: # # # # AGENT CMD Process has been FINISHED # # # # "
|
||||||
|
if lL: lL.info(lMessageStr)
|
||||||
|
A2O.LogListSend(inGSettings=inGSettings, inLogList=[lMessageStr])
|
||||||
|
return lResultStr
|
||||||
|
# New call
|
||||||
|
if inRunAsyncBool:
|
||||||
|
lThread = threading.Thread(target=_CMDRunAndListenLogs, kwargs={"inCMDStr":inCMDStr, "inGSettings":inGSettings})
|
||||||
|
lThread.start()
|
||||||
|
lResultStr="ActivityList has been started in async mode - no output is available here."
|
||||||
|
else:
|
||||||
|
lResultStr = _CMDRunAndListenLogs(inCMDStr=inCMDStr, inGSettings=inGSettings)
|
||||||
|
#lCMDCode = "cmd /c " + inCMDStr
|
||||||
|
#subprocess.Popen(lCMDCode)
|
||||||
|
#lResultCMDRun = 1 # os.system(lCMDCode)
|
||||||
|
return lResultStr
|
||||||
|
|
||||||
|
|
||||||
|
# Main def
|
||||||
|
def Agent(inGSettings):
|
||||||
|
lL = inGSettings["Logger"]
|
||||||
|
|
||||||
|
# Append Orchestrator def to ProcessorDictAlias
|
||||||
|
lModule = sys.modules[__name__]
|
||||||
|
lModuleDefList = dir(lModule)
|
||||||
|
for lItemDefNameStr in lModuleDefList:
|
||||||
|
# Dont append alias for defs Agent
|
||||||
|
if lItemDefNameStr not in ["Agent"]:
|
||||||
|
lItemDef = getattr(lModule,lItemDefNameStr)
|
||||||
|
if callable(lItemDef): inGSettings["ProcessorDict"]["AliasDefDict"][lItemDefNameStr]=lItemDef
|
||||||
|
|
||||||
|
# Detect Machine host name and username
|
||||||
|
inGSettings["AgentDict"]["HostNameUpperStr"] = socket.gethostname().upper()
|
||||||
|
inGSettings["AgentDict"]["UserUpperStr"] = getpass.getuser().upper()
|
||||||
|
|
||||||
|
# Processor thread
|
||||||
|
lProcessorThread = threading.Thread(target= Processor.ProcessorRunSync, kwargs={"inGSettings":inGSettings})
|
||||||
|
lProcessorThread.daemon = True # Run the thread in daemon mode.
|
||||||
|
lProcessorThread.start() # Start the thread execution.
|
||||||
|
if lL: lL.info("Processor has been started (ProcessorDict)") #Logging
|
||||||
|
|
||||||
|
# Start thread to wait data from Orchestrator (O2A)
|
||||||
|
lO2AThread = threading.Thread(target=O2A.O2A_Loop, kwargs={"inGSettings":inGSettings})
|
||||||
|
lO2AThread.start()
|
||||||
|
|
||||||
|
# Send log that Agent has been started
|
||||||
|
A2O.LogListSend(inGSettings=inGSettings, inLogList=[f'Host: {inGSettings["AgentDict"]["HostNameUpperStr"]}, User: {inGSettings["AgentDict"]["UserUpperStr"]}, Agent has been started.'])
|
@ -0,0 +1,2 @@
|
|||||||
|
# TEST
|
||||||
|
Hello world
|
@ -0,0 +1,2 @@
|
|||||||
|
# Defs to use in ControlPanel files to render panels (busines users + technical user manipulations)
|
||||||
|
|
@ -0,0 +1,5 @@
|
|||||||
|
import threading
|
||||||
|
|
||||||
|
# Check if current execution is in Processor thread
|
||||||
|
def IsProcessorThread(inGSettings):
|
||||||
|
return inGSettings["ProcessorDict"]["ThreadIdInt"] == threading.get_ident()
|
@ -0,0 +1,322 @@
|
|||||||
|
import datetime
|
||||||
|
import http.client
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import subprocess
|
||||||
|
import importlib
|
||||||
|
import psutil
|
||||||
|
from . import BackwardCompatibility # Use backward compatibility to goes to the new processor
|
||||||
|
from . import Processor # Use new processor
|
||||||
|
import copy
|
||||||
|
#Input arg
|
||||||
|
# [
|
||||||
|
# {
|
||||||
|
# "Type": <RemoteMachineProcessingRun>,
|
||||||
|
# host: <localhost>,
|
||||||
|
# port: <port>,
|
||||||
|
# bodyObject: <object dict, int, str, list>
|
||||||
|
# },
|
||||||
|
# -----BELOW IS UPDATED----------------
|
||||||
|
# {
|
||||||
|
# "Type": "CMDStart",
|
||||||
|
# "Command": ""
|
||||||
|
# },
|
||||||
|
# -----BELOW IS UPDATED----------------
|
||||||
|
# {
|
||||||
|
# "Type": "OrchestratorRestart"
|
||||||
|
# },
|
||||||
|
# -----BELOW IS UPDATED----------------
|
||||||
|
# {
|
||||||
|
# "Type": "OrchestratorSessionSave"
|
||||||
|
# },
|
||||||
|
# -----BELOW IS UPDATED----------------
|
||||||
|
# {
|
||||||
|
# "Type": "GlobalDictKeyListValueSet",
|
||||||
|
# "KeyList": ["key1","key2",...],
|
||||||
|
# "Value": <List, Dict, String, int>
|
||||||
|
# },
|
||||||
|
# -----BELOW IS UPDATED----------------
|
||||||
|
# {
|
||||||
|
# "Type": "GlobalDictKeyListValueAppend",
|
||||||
|
# "KeyList": ["key1","key2",...],
|
||||||
|
# "Value": <List, Dict, String, int>
|
||||||
|
# },
|
||||||
|
# -----BELOW IS UPDATED----------------
|
||||||
|
# {
|
||||||
|
# "Type": "GlobalDictKeyListValueOperator+",
|
||||||
|
# "KeyList": ["key1","key2",...],
|
||||||
|
# "Value": <List, Dict, String, int>
|
||||||
|
# },
|
||||||
|
# -----BELOW IS UPDATED----------------
|
||||||
|
# {
|
||||||
|
# "Type": "GlobalDictKeyListValueGet",
|
||||||
|
# "KeyList": ["key1","key2",...]
|
||||||
|
# },
|
||||||
|
# -----BELOW IS UPDATED----------------
|
||||||
|
# {
|
||||||
|
# "Type":"ProcessStart",
|
||||||
|
# "Path":"",
|
||||||
|
# "ArgList":[]
|
||||||
|
# },
|
||||||
|
# -----BELOW IS UPDATED----------------
|
||||||
|
# {
|
||||||
|
# "Type":"ProcessStartIfTurnedOff",
|
||||||
|
# "CheckTaskName":"", #Check if current task name is not active (then start process),
|
||||||
|
# "Path":"",
|
||||||
|
# "ArgList":[]
|
||||||
|
# },
|
||||||
|
# -----BELOW IS UPDATED----------------
|
||||||
|
# {
|
||||||
|
# "Type":"ProcessStop",
|
||||||
|
# "Name":"",
|
||||||
|
# "FlagForce":True,
|
||||||
|
# "User":"" #Empty - all users, user or %username%
|
||||||
|
# },
|
||||||
|
# -----BELOW IS UPDATED----------------
|
||||||
|
# {
|
||||||
|
# "Type":"PythonStart",
|
||||||
|
# "ModuleName":"",
|
||||||
|
# "FunctionName":"",
|
||||||
|
# "ArgList":[],
|
||||||
|
# "ArgDict":{}
|
||||||
|
# },
|
||||||
|
# -----BELOW IS UPDATED----------------
|
||||||
|
# {
|
||||||
|
# "Type":"WindowsLogon",
|
||||||
|
# "Domain":"",
|
||||||
|
# "User":"",
|
||||||
|
# "Password":""
|
||||||
|
# # Return "Result": True - user is logged on, False - user is not logged on
|
||||||
|
# }
|
||||||
|
# ]
|
||||||
|
##################################
|
||||||
|
#Output result
|
||||||
|
# <input arg> with attributes:
|
||||||
|
# "DateTimeUTCStringStart"
|
||||||
|
# "DateTimeUTCStringStop"
|
||||||
|
# "Result"
|
||||||
|
gSettingsDict = None
|
||||||
|
def Activity(inActivity):
|
||||||
|
lItem = copy.deepcopy(inActivity)
|
||||||
|
global gSettingsDict
|
||||||
|
# Update 2020.10 - go to the new processor
|
||||||
|
lActivityNew = BackwardCompatibility.v1_2_0_ProcessorOld2NewActivityDict(inActivityOld=inActivity)
|
||||||
|
# Append new activity in list
|
||||||
|
lItem["Result"] = Processor.ActivityListExecute(inGSettings = gSettingsDict, inActivityList = [lActivityNew])[0]
|
||||||
|
"""
|
||||||
|
#Глобальная переменная - глобальный словарь унаследованный от Settings.py
|
||||||
|
lL = gSettingsDict["Logger"] # Alias for logger
|
||||||
|
#Alias (compatibility)
|
||||||
|
lItem = inActivity
|
||||||
|
lCurrentDateTime = datetime.datetime.now()
|
||||||
|
###########################################################
|
||||||
|
#Обработка запроса на отправку команды на удаленную машину
|
||||||
|
###########################################################
|
||||||
|
if lItem["Type"]=="RemoteMachineProcessingRun":
|
||||||
|
lHTTPConnection = http.client.HTTPConnection(lItem["host"], lItem["port"], timeout=5)
|
||||||
|
try:
|
||||||
|
lHTTPConnection.request("POST","/ProcessingRun",json.dumps(lItem["bodyObject"]))
|
||||||
|
except Exception as e:
|
||||||
|
#Объединение словарей
|
||||||
|
lItem["Result"] = {"State":"disconnected","ExceptionString":str(e)}
|
||||||
|
else:
|
||||||
|
lHTTPResponse=lHTTPConnection.getresponse()
|
||||||
|
lHTTPResponseByteArray=lHTTPResponse.read()
|
||||||
|
lItem["Result"] = json.loads(lHTTPResponseByteArray.decode('utf8'))
|
||||||
|
###########################################################
|
||||||
|
#Обработка команды CMDStart
|
||||||
|
###########################################################
|
||||||
|
if lItem["Type"]=="CMDStart":
|
||||||
|
lCMDCode="cmd /c "+lItem["Command"]
|
||||||
|
subprocess.Popen(lCMDCode)
|
||||||
|
lResultCMDRun=1#os.system(lCMDCode)
|
||||||
|
lItem["Result"] = str(lResultCMDRun)
|
||||||
|
###########################################################
|
||||||
|
#Обработка команды 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":
|
||||||
|
lDict = gSettingsDict
|
||||||
|
for lItem2 in lItem["KeyList"][:-1]:
|
||||||
|
#Check if key - value exists
|
||||||
|
if lItem2 in lDict:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
lDict[lItem2]={}
|
||||||
|
lDict=lDict[lItem2]
|
||||||
|
#Set value
|
||||||
|
lDict[lItem["KeyList"][-1]]=lItem["Value"]
|
||||||
|
lItem["Result"] = True
|
||||||
|
###########################################################
|
||||||
|
# Обработка команды GlobalDictKeyListValueAppend
|
||||||
|
###########################################################
|
||||||
|
if lItem["Type"] == "GlobalDictKeyListValueAppend":
|
||||||
|
lDict = gSettingsDict
|
||||||
|
for lItem2 in lItem["KeyList"][:-1]:
|
||||||
|
# Check if key - value exists
|
||||||
|
if lItem2 in lDict:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
lDict[lItem2] = {}
|
||||||
|
lDict = lDict[lItem2]
|
||||||
|
# Set value
|
||||||
|
lDict[lItem["KeyList"][-1]].append(lItem["Value"])
|
||||||
|
lItem["Result"] = True
|
||||||
|
###########################################################
|
||||||
|
# Обработка команды GlobalDictKeyListValueOperator+
|
||||||
|
###########################################################
|
||||||
|
if lItem["Type"] == "GlobalDictKeyListValueOperator+":
|
||||||
|
lDict = gSettingsDict
|
||||||
|
for lItem2 in lItem["KeyList"][:-1]:
|
||||||
|
# Check if key - value exists
|
||||||
|
if lItem2 in lDict:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
lDict[lItem2] = {}
|
||||||
|
lDict = lDict[lItem2]
|
||||||
|
# Set value
|
||||||
|
lDict[lItem["KeyList"][-1]]+=lItem["Value"]
|
||||||
|
lItem["Result"] = True
|
||||||
|
###########################################################
|
||||||
|
#Обработка команды GlobalDictKeyListValueGet
|
||||||
|
###########################################################
|
||||||
|
if lItem["Type"]=="GlobalDictKeyListValueGet":
|
||||||
|
lDict = gSettingsDict
|
||||||
|
for lItem2 in lItem["KeyList"][:-1]:
|
||||||
|
#Check if key - value exists
|
||||||
|
if lItem2 in lDict:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
lDict[lItem2]={}
|
||||||
|
lDict=lDict[lItem2]
|
||||||
|
#Return value
|
||||||
|
lItem["Result"]=lDict.get(lItem["KeyList"][-1],None)
|
||||||
|
#####################################
|
||||||
|
#ProcessStart
|
||||||
|
#####################################
|
||||||
|
if lItem["Type"]=="ProcessStart":
|
||||||
|
#Вид активности - запуск процесса
|
||||||
|
#Запись в массив отработанных активностей
|
||||||
|
#Запустить процесс
|
||||||
|
lItemArgs=[lItem["Path"]]
|
||||||
|
lItemArgs.extend(lItem["ArgList"])
|
||||||
|
subprocess.Popen(lItemArgs,shell=True)
|
||||||
|
#####################################
|
||||||
|
#ProcessStartIfTurnedOff
|
||||||
|
#####################################
|
||||||
|
if lItem["Type"]=="ProcessStartIfTurnedOff":
|
||||||
|
#Check if process running
|
||||||
|
#remove .exe from Taskname if exists
|
||||||
|
lCheckTaskName = lItem["CheckTaskName"]
|
||||||
|
if len(lCheckTaskName)>4:
|
||||||
|
if lCheckTaskName[-4:].upper() != ".EXE":
|
||||||
|
lCheckTaskName = lCheckTaskName+".exe"
|
||||||
|
else:
|
||||||
|
lCheckTaskName = lCheckTaskName+".exe"
|
||||||
|
#Check if process exist
|
||||||
|
if not CheckIfProcessRunning(lCheckTaskName):
|
||||||
|
#Вид активности - запуск процесса
|
||||||
|
#Запись в массив отработанных активностей
|
||||||
|
#Запустить процесс
|
||||||
|
lItemArgs=[lItem["Path"]]
|
||||||
|
lItemArgs.extend(lItem["ArgList"])
|
||||||
|
subprocess.Popen(lItemArgs,shell=True)
|
||||||
|
#################################
|
||||||
|
#ProcessStop
|
||||||
|
#################################
|
||||||
|
if lItem["Type"]=="ProcessStop":
|
||||||
|
#Вид активности - остановка процесса
|
||||||
|
#часовой пояс пока не учитываем
|
||||||
|
#Сформировать команду на завершение
|
||||||
|
lActivityCloseCommand='taskkill /im '+lItem["Name"]
|
||||||
|
#TODO Сделать безопасную обработку,если параметра нет в конфигурации
|
||||||
|
if lItem.get('FlagForce',False):
|
||||||
|
lActivityCloseCommand+=" /F"
|
||||||
|
#Завершить процессы только текущего пользоваиеля
|
||||||
|
if lItem.get('User',"")!="":
|
||||||
|
lActivityCloseCommand+=f' /fi "username eq {lItem["User"]}"'
|
||||||
|
#Завершить процесс
|
||||||
|
os.system(lActivityCloseCommand)
|
||||||
|
#################################
|
||||||
|
#PythonStart
|
||||||
|
#################################
|
||||||
|
if lItem["Type"]=="PythonStart":
|
||||||
|
try:
|
||||||
|
#Подключить модуль для вызова
|
||||||
|
lModule=importlib.import_module(lItem["ModuleName"])
|
||||||
|
#Найти функцию
|
||||||
|
lFunction=getattr(lModule,lItem["FunctionName"])
|
||||||
|
lItem["Result"]=lFunction(*lItem.get("ArgList",[]),**lItem.get("ArgDict",{}))
|
||||||
|
except Exception as e:
|
||||||
|
if lL: lL.exception("Loop activity error: module/function not founded")
|
||||||
|
#################################
|
||||||
|
# Windows logon
|
||||||
|
#################################
|
||||||
|
if lItem["Type"] == "WindowsLogon":
|
||||||
|
import win32security
|
||||||
|
try:
|
||||||
|
hUser = win32security.LogonUser(
|
||||||
|
lItem["User"],
|
||||||
|
lItem["Domain"],
|
||||||
|
lItem["Password"],
|
||||||
|
win32security.LOGON32_LOGON_NETWORK,
|
||||||
|
win32security.LOGON32_PROVIDER_DEFAULT
|
||||||
|
)
|
||||||
|
except win32security.error:
|
||||||
|
lItem["Result"] = False
|
||||||
|
else:
|
||||||
|
lItem["Result"] = True
|
||||||
|
###################################
|
||||||
|
"""
|
||||||
|
#Вернуть результат
|
||||||
|
return lItem
|
||||||
|
|
||||||
|
def ActivityListOrDict(inActivityListOrDict):
|
||||||
|
#Check arg type (list or dict)
|
||||||
|
if type(inActivityListOrDict)==list:
|
||||||
|
#List activity
|
||||||
|
lResult=[]
|
||||||
|
for lItem in inActivityListOrDict:
|
||||||
|
lResult.append(Activity(lItem))
|
||||||
|
return lResult
|
||||||
|
if type(inActivityListOrDict)==dict:
|
||||||
|
#Dict activity
|
||||||
|
return Activity(inActivityListOrDict)
|
||||||
|
|
||||||
|
def CheckIfProcessRunning(processName):
|
||||||
|
'''
|
||||||
|
Check if there is any running process that contains the given name processName.
|
||||||
|
'''
|
||||||
|
#Iterate over the all the running process
|
||||||
|
for proc in psutil.process_iter():
|
||||||
|
try:
|
||||||
|
# Check if process name contains the given name string.
|
||||||
|
if processName.lower() in proc.name().lower():
|
||||||
|
return True
|
||||||
|
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
|
||||||
|
pass
|
||||||
|
return False;
|
@ -0,0 +1,364 @@
|
|||||||
|
import os, logging, datetime, sys
|
||||||
|
|
||||||
|
# Technical def - return GSettings structure with examples
|
||||||
|
def __Create__():
|
||||||
|
return {
|
||||||
|
"VersionStr": None, # Will be filled in orchestrator,
|
||||||
|
"Autocleaner": {
|
||||||
|
# Some gurbage is collecting in g settings. So you can configure autocleaner to periodically clear gSettings
|
||||||
|
"IntervalSecFloat": 3600.0, # Sec float to periodically clear gsettings
|
||||||
|
},
|
||||||
|
"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
|
||||||
|
# }
|
||||||
|
},
|
||||||
|
},
|
||||||
|
# # # # # # Client... # # # # # # # #
|
||||||
|
"DumpLogListRefreshIntervalSecFloat": 3.0, # Duration between updates for the Client
|
||||||
|
"DumpLogListCountInt": 100, # Set the max row for the dump
|
||||||
|
"DumpLogList": [], # Will be filled automatically
|
||||||
|
"DumpLogListHashStr": None, # Will be filled automatically
|
||||||
|
# # # # # # # # # # # # # # # # # #
|
||||||
|
},
|
||||||
|
"ServerDict": {
|
||||||
|
"WorkingDirectoryPathStr": None, # Will be filled automatically
|
||||||
|
"RequestTimeoutSecFloat": 300, # Time to handle request in seconds
|
||||||
|
"ListenPort_": "Порт, по которому можно подключиться к демону",
|
||||||
|
"ListenPort": 80,
|
||||||
|
"ListenURLList": [
|
||||||
|
{
|
||||||
|
"Description": "Local machine test",
|
||||||
|
"URL_": "Сетевое расположение сервера демона",
|
||||||
|
"URL": ""
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"AccessUsers": { # Default - all URL is blocked
|
||||||
|
"FlagCredentialsAsk": True, # Turn on Authentication
|
||||||
|
"RuleDomainUserDict": {
|
||||||
|
# ("DOMAIN", "USER"): { !!!!! only in upper case !!!!
|
||||||
|
# "MethodMatchURLBeforeList": [
|
||||||
|
# {
|
||||||
|
# "Method":"GET|POST",
|
||||||
|
# "MatchType":"BeginWith|Contains|Equal|EqualCase",
|
||||||
|
# "URL":"",
|
||||||
|
# "FlagAccessDefRequestGlobalAuthenticate": None, #Return bool
|
||||||
|
# "FlagAccess": True
|
||||||
|
# }
|
||||||
|
# ],
|
||||||
|
# "ControlPanelKeyAllowedList":[], # If empty - all is allowed
|
||||||
|
# "RoleHierarchyAllowedDict": {
|
||||||
|
# "Orchestrator":{
|
||||||
|
# "Controls": {
|
||||||
|
# "RestartOrchestrator": {}, # Feature to restart orchestrator on virtual machine
|
||||||
|
# "LookMachineScreenshots": {} # Feature to look machina screenshots
|
||||||
|
# },
|
||||||
|
# "RDPActive": { # Robot RDP active module
|
||||||
|
# "ListRead": {} # Access to read RDP session list
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
},
|
||||||
|
"RuleMethodMatchURLBeforeList": [ # General MethodMatchURL list (no domain/user)
|
||||||
|
# {
|
||||||
|
# "Method":"GET|POST",
|
||||||
|
# "MatchType":"BeginWith|Contains|Equal|EqualCase",
|
||||||
|
# "URL":"",
|
||||||
|
# "FlagAccessDefRequestGlobalAuthenticate": None, #Return bool
|
||||||
|
# "FlagAccess": True
|
||||||
|
# }
|
||||||
|
],
|
||||||
|
"AuthTokensDict": {
|
||||||
|
# "<AuthToken>":{"User":"", "Domain":"", "TokenDatetime":<Datetime>, "FlagDoNotExpire":True}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"URLList": [ # List of available URLs with the orchestrator server
|
||||||
|
# {
|
||||||
|
# "Method":"GET|POST",
|
||||||
|
# "URL": "/index", #URL of the request
|
||||||
|
# "MatchType": "", #"BeginWith|Contains|Equal|EqualCase",
|
||||||
|
# "ResponseFilePath": "", #Absolute or relative path
|
||||||
|
# "ResponseFolderPath": "", #Absolute or relative path
|
||||||
|
# "ResponseContentType": "", #HTTP Content-type
|
||||||
|
# "ResponseDefRequestGlobal": None #Function with str result
|
||||||
|
# }
|
||||||
|
{
|
||||||
|
"Method": "GET",
|
||||||
|
"URL": "/test/", # URL of the request
|
||||||
|
"MatchType": "BeginWith", # "BeginWith|Contains|Equal|EqualCase",
|
||||||
|
# "ResponseFilePath": "", #Absolute or relative path
|
||||||
|
"ResponseFolderPath": "C:\Abs\Archive\scopeSrcUL\OpenRPA\Orchestrator\Settings",
|
||||||
|
# Absolute or relative path
|
||||||
|
# "ResponseContentType": "", #HTTP Content-type
|
||||||
|
# "ResponseDefRequestGlobal": None #Function with str result
|
||||||
|
}
|
||||||
|
],
|
||||||
|
|
||||||
|
},
|
||||||
|
"OrchestratorStart": {
|
||||||
|
"DefSettingsUpdatePathList": [],
|
||||||
|
# List of the .py files which should be loaded before init the algorythms
|
||||||
|
"ActivityList": [
|
||||||
|
# {
|
||||||
|
# "Type": "ProcessStop", #Activity type
|
||||||
|
# "Name": "OpenRPARobotDaemon.exe", #Process name
|
||||||
|
# "FlagForce": True, #Force process close
|
||||||
|
# "User": "%username%" #Empty, user or %username%
|
||||||
|
# },
|
||||||
|
# {
|
||||||
|
# "Type": "ProcessStartIfTurnedOff", #Activity type
|
||||||
|
# "CheckTaskName": "notepad.exe", #Python function module name
|
||||||
|
# "Path": "notepad", #Python function name
|
||||||
|
# "ArgList": [] #Input python function args
|
||||||
|
# },
|
||||||
|
# {
|
||||||
|
# "Type": "RDPSessionConnect", #Activity type - start/connect RDP Session
|
||||||
|
# "RDPSessionKeyStr": "notepad.exe", #Python function module name
|
||||||
|
# "RDPConfigurationDict": {}
|
||||||
|
# },
|
||||||
|
# {
|
||||||
|
# "Type": "RDPSessionLogoff", #Activity type - logoff RDP Session
|
||||||
|
# "RDPSessionKeyStr": "notepad.exe", #Python function module name
|
||||||
|
# },
|
||||||
|
# {
|
||||||
|
# "Type": "RDPSessionDisconnect", #Activity type - disconnect the RDP Session without logoff
|
||||||
|
# "RDPSessionKeyStr": "notepad.exe", #Python function module name
|
||||||
|
# },
|
||||||
|
# {
|
||||||
|
# "Type": "RDPSessionFileSend", #Activity type - send file to RDP session
|
||||||
|
# ...
|
||||||
|
# },
|
||||||
|
# {
|
||||||
|
# "Type": "RDPSessionFileRecieve", #Activity type - recieve file from rdp session
|
||||||
|
# ...
|
||||||
|
# },
|
||||||
|
# {
|
||||||
|
# "Type": "RDPSessionProcessStart", #Activity type -
|
||||||
|
# ...
|
||||||
|
# },
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"SchedulerDict": {
|
||||||
|
"CheckIntervalSecFloat": 5.0, # Check interval in seconds
|
||||||
|
"ActivityTimeList": [
|
||||||
|
# {
|
||||||
|
# "TimeHH:MMStr": "22:23", # Time [HH:MM] to trigger activity
|
||||||
|
# "WeekdayList": [0, 1, 2, 3, 4, 5, 6], #List of the weekday index when activity is applicable, Default [0,1,2,3,4,5,6]
|
||||||
|
# "ActivityList": [
|
||||||
|
# {
|
||||||
|
# "Type": "ProcessStart", # Activity type
|
||||||
|
# "Path": "start", # Executable file path
|
||||||
|
# "ArgList": ["cmd.exe", "/c", "PIPUpgrade.cmd"] # List of the arguments
|
||||||
|
# }
|
||||||
|
# ],
|
||||||
|
# "GUID": None # Will be filled in Orchestrator automatically - is needed for detect activity completion
|
||||||
|
# },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
"ProcessorDict": { # Has been changed. New general processor (one threaded) v.1.2.0
|
||||||
|
"ActivityList": [ # List of the activities
|
||||||
|
# {
|
||||||
|
# "Def":"DefAliasTest", # def link or def alias (look gSettings["Processor"]["AliasDefDict"])
|
||||||
|
# "ArgList":[1,2,3], # Args list
|
||||||
|
# "ArgDict":{"ttt":1,"222":2,"dsd":3} # Args dictionary
|
||||||
|
# "ArgGSettings": # Name of GSettings attribute: str (ArgDict) or index (for ArgList)
|
||||||
|
# "ArgLogger": None # Name of GSettings attribute: str (ArgDict) or index (for ArgList)
|
||||||
|
# },
|
||||||
|
],
|
||||||
|
"AliasDefDict": {}, # Storage for def with Str alias. To use it see pyOpenRPA.Orchestrator.ControlPanel
|
||||||
|
"CheckIntervalSecFloat": 1.0, # Interval for check gSettings in ProcessorDict > ActivityList
|
||||||
|
"ExecuteBool": True, # Flag to execute thread processor
|
||||||
|
"ThreadIdInt": None # Technical field - will be setup when processor init
|
||||||
|
},
|
||||||
|
"ControlPanelDict": { # Old structure > CPDict
|
||||||
|
"RefreshSeconds": 5, # deprecated parameter
|
||||||
|
"RobotList": [
|
||||||
|
#{
|
||||||
|
# "RenderFunction": RenderRobotR01,
|
||||||
|
# "KeyStr": "TestControlPanelKey"
|
||||||
|
#}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"CPDict": {
|
||||||
|
# "CPKey": {"HTMLRenderDef":None, "JSONGeneratorDef":None, "JSInitGeneratorDef":None}
|
||||||
|
},
|
||||||
|
# # # # # # # # # # # # # #
|
||||||
|
"RobotRDPActive": {
|
||||||
|
"RDPList": {
|
||||||
|
# "RDPSessionKey":{
|
||||||
|
# "Host": "77.77.22.22", # Host address
|
||||||
|
# "Port": "3389", # RDP Port
|
||||||
|
# "Login": "test", # Login
|
||||||
|
# "Password": "test", # Password
|
||||||
|
# "Screen": {
|
||||||
|
# "Width": 1680, # Width of the remote desktop in pixels
|
||||||
|
# "Height": 1050, # Height of the remote desktop in pixels
|
||||||
|
# # "640x480" or "1680x1050" or "FullScreen". If Resolution not exists set full screen
|
||||||
|
# "FlagUseAllMonitors": False, # True or False
|
||||||
|
# "DepthBit": "32" # "32" or "24" or "16" or "15"
|
||||||
|
# },
|
||||||
|
# "SharedDriveList": ["c"], # List of the Root sesion hard drives
|
||||||
|
# ###### Will updated in program ############
|
||||||
|
# "SessionHex": "", # Hex is created when robot runs
|
||||||
|
# "SessionIsWindowExistBool": False, # Flag if the RDP window is exist, old name "FlagSessionIsActive". Check every n seconds
|
||||||
|
# "SessionIsWindowResponsibleBool": False, # Flag if RDP window is responsible (recieve commands). Check every nn seconds. If window is Responsible - window is Exist too
|
||||||
|
# "SessionIsIgnoredBool": False # Flag to ignore RDP window False - dont ignore, True - ignore
|
||||||
|
# }
|
||||||
|
},
|
||||||
|
"ResponsibilityCheckIntervalSec": None,
|
||||||
|
# Seconds interval when Robot check the RDP responsibility. if None - dont check
|
||||||
|
"FullScreenRDPSessionKeyStr": None,
|
||||||
|
# RDPSessionKeyStr of the current session which is full screened, None is no session in fullscreen
|
||||||
|
"ActivityList": [
|
||||||
|
# Technical Activity list for RobotRDPActive thread - equal to Main activity list, apply only RDP activity
|
||||||
|
# {
|
||||||
|
# "DefNameStr":"test", # Function name in RobotRDPActive.Processor
|
||||||
|
# "ArgList":[1,2,3], # Args list
|
||||||
|
# "ArgDict":{"ttt":1,"222":2,"dsd":3} # Args dictionary
|
||||||
|
# },
|
||||||
|
# {
|
||||||
|
# "DefNameStr": "RDPSessionConnect", # Function name in RobotRDPActive.Processor
|
||||||
|
# "ArgList": [], # Args list
|
||||||
|
# "ArgDict": {"inRDPSessionKeyStr": "TestRDP", "inHostStr": "77.44.33.22", "inPortStr": "3389",
|
||||||
|
# "inLoginStr": "login", "inPasswordStr": "pass"} # Args dictionary
|
||||||
|
# },
|
||||||
|
# {
|
||||||
|
# "DefNameStr": "RDPSessionDisconnect", # Disconnect the RDP session without logoff. Function name in RobotRDPActive.Processor
|
||||||
|
# "ArgList": [], # Args list
|
||||||
|
# "ArgDict": {"inRDPSessionKeyStr": "TestRDP"}
|
||||||
|
# },
|
||||||
|
# {
|
||||||
|
# "DefNameStr": "RDPSessionReconnect", # Disconnect the RDP session without logoff. Function name in RobotRDPActive.Processor
|
||||||
|
# "ArgList": [], # Args list
|
||||||
|
# "ArgDict": {"inRDPSessionKeyStr": "TestRDP"}
|
||||||
|
# }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
# # # # # # # # # # # # # #
|
||||||
|
"FileManager": {
|
||||||
|
"FileURLFilePathDict_help": "https://localhost:8081/filemanager/<file URL>. All FileURL s must be set in lowercase",
|
||||||
|
"FileURLFilePathDict": {
|
||||||
|
#"r01/report.xlsx": "C:\\RPA\\R01_IntegrationOrderOut\\Data\\Reestr_otgruzok.xlsx"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Logger": logging.getLogger("Orchestrator"),
|
||||||
|
"Storage": {
|
||||||
|
"Robot_R01_help": "Robot data storage in orchestrator env",
|
||||||
|
"Robot_R01": {},
|
||||||
|
"R01_OrchestratorToRobot": {"Test2": "Test2"}
|
||||||
|
},
|
||||||
|
"AgentDict": { # Will be filled when program runs
|
||||||
|
#("HostNameUpperStr", "UserUpperStr"): { "IsListenBool": True, "QueueList": [] }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create full configuration for
|
||||||
|
def __AgentDictItemCreate__():
|
||||||
|
return {"IsListenBool":False, "ConnectionCountInt":0, "ConnectionFirstQueueItemCountInt":0, "ActivityList":[]}
|
||||||
|
# Create full configuration for
|
||||||
|
def __UACClientAdminCreate__():
|
||||||
|
lResultDict = {
|
||||||
|
"pyOpenRPADict":{
|
||||||
|
"CPKeyDict":{ # Empty dict - all access
|
||||||
|
# "CPKeyStr"{
|
||||||
|
# }
|
||||||
|
},
|
||||||
|
"RDPKeyDict":{ # Empty dict - all access
|
||||||
|
#"RDPKeyStr"{
|
||||||
|
# "FullscreenBool": True,
|
||||||
|
# "IgnoreBool":True,
|
||||||
|
# "ReconnectBool": True
|
||||||
|
# "NothingBool": True # USe option if you dont want to give some access to the RDP controls
|
||||||
|
# }
|
||||||
|
},
|
||||||
|
"AgentKeyDict": { # Empty dict - all access
|
||||||
|
# "AgentKeyStr"{
|
||||||
|
# }
|
||||||
|
},
|
||||||
|
"AdminDict":{ # Empty dict - all access
|
||||||
|
"LogViewerBool":True, # Show log viewer on the web page
|
||||||
|
"CMDInputBool":True, # Execute CMD on the server side and result to the logs
|
||||||
|
"ScreenshotViewerBool":True, # Show button to look screenshots
|
||||||
|
"RestartOrchestratorBool": True, # Restart orchestrator activity
|
||||||
|
"RestartOrchestratorGITPullBool": True, # Turn off (RDP remember) orc + git pull + Turn on (rdp remember)
|
||||||
|
"RestartPCBool": True, # Send CMD to restart pc
|
||||||
|
"NothingBool":True # USe option if you dont want to give some access to the RDP controls
|
||||||
|
},
|
||||||
|
"ActivityDict": { # Empty dict - all access
|
||||||
|
"ActivityListExecuteBool": True, # Execute activity at the current thread
|
||||||
|
"ActivityListAppendProcessorQueueBool": True # Append activity to the processor queue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return lResultDict
|
||||||
|
|
||||||
|
|
||||||
|
# Init the log dump to WEB
|
||||||
|
# import pdb; pdb.set_trace()
|
||||||
|
############################################
|
||||||
|
def LoggerDumpLogHandlerAdd(inLogger, inGSettingsClientDict):
|
||||||
|
lL = inLogger
|
||||||
|
if len(lL.handlers) == 0:
|
||||||
|
mRobotLoggerFormatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
|
||||||
|
else:
|
||||||
|
mRobotLoggerFormatter = lL.handlers[0].formatter
|
||||||
|
mHandlerDumpLogList = LoggerHandlerDumpLogList.LoggerHandlerDumpLogList(inDict=inGSettingsClientDict,
|
||||||
|
inKeyStr="DumpLogList", inHashKeyStr="DumpLogListHashStr", inRowCountInt=inGSettingsClientDict[
|
||||||
|
"DumpLogListCountInt"])
|
||||||
|
mHandlerDumpLogList.setFormatter(mRobotLoggerFormatter)
|
||||||
|
lL.addHandler(mHandlerDumpLogList)
|
||||||
|
|
||||||
|
# inModeStr:
|
||||||
|
# "BASIC" - create standart configuration
|
||||||
|
from pyOpenRPA.Orchestrator.Utils import LoggerHandlerDumpLogList
|
||||||
|
def Create(inModeStr="BASIC"):
|
||||||
|
if inModeStr=="BASIC":
|
||||||
|
lResult = __Create__() # Create settings
|
||||||
|
# Создать файл логирования
|
||||||
|
# add filemode="w" to overwrite
|
||||||
|
if not os.path.exists("Reports"):
|
||||||
|
os.makedirs("Reports")
|
||||||
|
##########################
|
||||||
|
# Подготовка логгера Robot
|
||||||
|
#########################
|
||||||
|
mRobotLogger = lResult["Logger"]
|
||||||
|
mRobotLogger.setLevel(logging.INFO)
|
||||||
|
# create the logging file handler
|
||||||
|
mRobotLoggerFH = logging.FileHandler(
|
||||||
|
"Reports\\" + datetime.datetime.now().strftime("%Y_%m_%d") + ".log")
|
||||||
|
mRobotLoggerFormatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
|
||||||
|
mRobotLoggerFH.setFormatter(mRobotLoggerFormatter)
|
||||||
|
# add handler to logger object
|
||||||
|
mRobotLogger.addHandler(mRobotLoggerFH)
|
||||||
|
####################Add console output
|
||||||
|
handler = logging.StreamHandler(sys.stdout)
|
||||||
|
handler.setFormatter(mRobotLoggerFormatter)
|
||||||
|
mRobotLogger.addHandler(handler)
|
||||||
|
############################################
|
||||||
|
LoggerDumpLogHandlerAdd(inLogger=mRobotLogger, inGSettingsClientDict=lResult["Client"])
|
||||||
|
#mHandlerDumpLogList = LoggerHandlerDumpLogList.LoggerHandlerDumpLogList(inDict=lResult["Client"],
|
||||||
|
# inKeyStr="DumpLogList",
|
||||||
|
# inHashKeyStr="DumpLogListHashStr",
|
||||||
|
# inRowCountInt=lResult["Client"][
|
||||||
|
# "DumpLogListCountInt"])
|
||||||
|
#mHandlerDumpLogList.setFormatter(mRobotLoggerFormatter)
|
||||||
|
#mRobotLogger.addHandler(mHandlerDumpLogList)
|
||||||
|
return lResult # return the result dict
|
@ -0,0 +1,16 @@
|
|||||||
|
from logging import StreamHandler
|
||||||
|
|
||||||
|
class LoggerHandlerDumpLogList(StreamHandler):
|
||||||
|
def __init__(self, inDict, inKeyStr, inHashKeyStr, inRowCountInt):
|
||||||
|
StreamHandler.__init__(self)
|
||||||
|
self.Dict = inDict
|
||||||
|
self.KeyStr = inKeyStr
|
||||||
|
self.HashKeyStr = inHashKeyStr
|
||||||
|
self.RowCountInt = inRowCountInt
|
||||||
|
self.Dict[self.HashKeyStr]="0"
|
||||||
|
def emit(self, inRecord):
|
||||||
|
inMessageStr = self.format(inRecord)
|
||||||
|
self.Dict[self.KeyStr].append(inMessageStr)
|
||||||
|
self.Dict[self.HashKeyStr]=str(int(self.Dict[self.HashKeyStr])+1)
|
||||||
|
if len(self.Dict[self.KeyStr])>self.RowCountInt:
|
||||||
|
self.Dict[self.KeyStr].pop(0)
|
@ -0,0 +1,122 @@
|
|||||||
|
import json
|
||||||
|
from .. import __Orchestrator__
|
||||||
|
from .. import Processor
|
||||||
|
# Escape JS to the safe JS for the inline JS in HTML tags ATTENTION! Use it only if want to paste JS into HTML tag - not in <script>
|
||||||
|
# USAGE: JSEscapeForHTMLInline(inJSStr="lTest=\"Hello World\"; alert(\"lTest\")")
|
||||||
|
def JSEscapeForHTMLInline(inJSStr):
|
||||||
|
lResult = inJSStr.replace("\"",""")
|
||||||
|
return lResult
|
||||||
|
|
||||||
|
# Create JS for send activity list/ activity to the processor
|
||||||
|
# USAGE: Orchestrator.Web.Basic.JSProcessorActivityListAdd(inActivityList)
|
||||||
|
def JSProcessorActivityListAdd(inActivityList):
|
||||||
|
Processor.__ActivityListVerify__(inActivityList=inActivityList) # DO VERIFICATION FOR THE inActivityList
|
||||||
|
# Check if no def function is here - if exist - replace to alias
|
||||||
|
for lActivityItem in inActivityList:
|
||||||
|
lDef = lActivityItem["Def"]
|
||||||
|
if callable(lDef): raise Exception(f"pyOpenRPA Exception: You can't send ActivityList with def to JS. Use Def Alias (see Orchestrator.ProcessorAliasDefUpdate)")
|
||||||
|
if type(inActivityList) is not list: inActivityList = [inActivityList]
|
||||||
|
lJSStr = f"""mGlobal.pyOpenRPA.ProcessorQueueAdd({json.dumps(inActivityList)});"""
|
||||||
|
return lJSStr
|
||||||
|
|
||||||
|
# Create JS for execute activity list/ activity permanent
|
||||||
|
# USAGE: Orchestrator.Web.Basic.JSActivityListExecute(inActivityList)
|
||||||
|
def JSActivityListExecute(inActivityList):
|
||||||
|
Processor.__ActivityListVerify__(inActivityList=inActivityList) # DO VERIFICATION FOR THE inActivityList
|
||||||
|
lJSStr = f"""mGlobal.pyOpenRPA.ActivityListExecute({json.dumps(inActivityList)});"""
|
||||||
|
return lJSStr
|
||||||
|
|
||||||
|
# Generate HTML code of the simple URL link by the URL
|
||||||
|
# USAGE: Orchestrator.Web.Basic.HTMLLinkURL(inURLStr="test",inColorStr="orange")
|
||||||
|
# USAGE: Basic.HTMLLinkURL(inURLStr="test",inColorStr="orange")
|
||||||
|
def HTMLLinkURL(inURLStr, inTitleStr=None, inColorStr=None):
|
||||||
|
lCSSStyleStr = ""
|
||||||
|
if not inTitleStr: inTitleStr = inURLStr
|
||||||
|
if inColorStr: lCSSStyleStr=f"style=\"color:{inColorStr}\""
|
||||||
|
lResult=f"<a {lCSSStyleStr} href=\"{inURLStr}\">{inTitleStr}</a>"
|
||||||
|
return lResult
|
||||||
|
|
||||||
|
# Generate HTML code of the simple URL link by the JS when onclick
|
||||||
|
# USAGE: Orchestrator.Web.Basic.HTMLLinkJSOnClick(inJSOnClickStr="",inColorStr="orange")
|
||||||
|
# USAGE: Basic.HTMLLinkJSOnClick(inJSOnClickStr="test",inColorStr="orange")
|
||||||
|
def HTMLLinkJSOnClick(inJSOnClickStr, inTitleStr, inColorStr=None):
|
||||||
|
lCSSStyleStr = ""
|
||||||
|
if inColorStr: lCSSStyleStr=f"style=\"color:{inColorStr}\""
|
||||||
|
inJSOnClickStr= JSEscapeForHTMLInline(inJSStr=inJSOnClickStr) # Escape some symbols for the inline JS
|
||||||
|
lResult=f"<a {lCSSStyleStr} onclick=\"{inJSOnClickStr}\">{inTitleStr}</a>"
|
||||||
|
return lResult
|
||||||
|
|
||||||
|
# Create HTMLLink by the def, argdict, arglist, gsettingsStr, logger Str titleStr, color, (add in processor queue)
|
||||||
|
def HTMLLinkDefProcessor(inGSettings, inDef, inArgDict=None, inArgList=None, inArgGSettingsStr=None, inArgLoggerStr=None, inLinkTitleStr=None, inLinkColorStr=""):
|
||||||
|
lDefAliasStr = inDef
|
||||||
|
if callable(inDef):
|
||||||
|
lDefAliasStr = str(inDef)
|
||||||
|
lDefAliasStr = __Orchestrator__.ProcessorAliasDefUpdate(inGSettings=inGSettings, inDef=inDef, inAliasStr=lDefAliasStr)
|
||||||
|
if inLinkTitleStr is None: inLinkTitleStr = lDefAliasStr
|
||||||
|
lActivityList = [__Orchestrator__.ProcessorActivityItemCreate(inDef=lDefAliasStr,inArgList=inArgList,inArgDict=inArgDict,inArgGSettingsStr=inArgGSettingsStr,inArgLoggerStr=inArgLoggerStr)]
|
||||||
|
lJSStr = JSProcessorActivityListAdd(lActivityList)
|
||||||
|
lHTMLStr = HTMLLinkJSOnClick(inJSOnClickStr=lJSStr,inTitleStr=inLinkTitleStr, inColorStr=inLinkColorStr)
|
||||||
|
return lHTMLStr
|
||||||
|
|
||||||
|
# Create HTMLLink by the def, argdict, arglist, gsettingsStr, logger Str titleStr, color, (execute permanently)
|
||||||
|
def HTMLLinkDefExecute(inGSettings, inDef, inArgDict=None, inArgList=None, inArgGSettingsStr=None, inArgLoggerStr=None, inLinkTitleStr=None, inLinkColorStr=""):
|
||||||
|
lDefAliasStr = inDef
|
||||||
|
if callable(inDef):
|
||||||
|
lDefAliasStr = str(inDef)
|
||||||
|
lDefAliasStr = __Orchestrator__.ProcessorAliasDefUpdate(inGSettings=inGSettings, inDef=inDef, inAliasStr=lDefAliasStr)
|
||||||
|
if inLinkTitleStr is None: inLinkTitleStr = lDefAliasStr
|
||||||
|
lActivityList = [__Orchestrator__.ProcessorActivityItemCreate(inDef=lDefAliasStr,inArgList=inArgList,inArgDict=inArgDict,inArgGSettingsStr=inArgGSettingsStr,inArgLoggerStr=inArgLoggerStr)]
|
||||||
|
lJSStr = JSActivityListExecute(lActivityList)
|
||||||
|
lHTMLStr = HTMLLinkJSOnClick(inJSOnClickStr=lJSStr,inTitleStr=inLinkTitleStr, inColorStr=inLinkColorStr)
|
||||||
|
return lHTMLStr
|
||||||
|
|
||||||
|
# HTML Generator for the CP up to v.1.2.0
|
||||||
|
def HTMLControlPanelBC(inCPDict):
|
||||||
|
# FooterButtonX2List generation
|
||||||
|
lFooterButtonX2Str = ""
|
||||||
|
for lItem in inCPDict["FooterButtonX2List"]:
|
||||||
|
lFooterButtonX2Str+=f'<div class="ui basic {lItem.get("Color","")} button" onclick="{JSEscapeForHTMLInline(lItem.get("OnClick",""))}">{lItem.get("Text","")}</div>'
|
||||||
|
# FooterButtonX1List generation
|
||||||
|
lFooterButtonX1Str = ""
|
||||||
|
for lItem in inCPDict["FooterButtonX1List"]:
|
||||||
|
lFooterButtonX1Str+=f'<div class="ui basic {lItem.get("Color","")} button" onclick="{JSEscapeForHTMLInline(lItem.get("OnClick",""))}">{lItem.get("Text","")}</div>'
|
||||||
|
# BodyKeyValue generation
|
||||||
|
lBodyKeyValueStr = ""
|
||||||
|
for lItem in inCPDict["BodyKeyValueList"]:
|
||||||
|
lBodyKeyValueStr+=f"<li>{lItem['Key']}: {lItem['Value']}</li>"
|
||||||
|
# Generate consolidated string
|
||||||
|
lResultHTMLStr = f"""
|
||||||
|
<div class="card">
|
||||||
|
<div class="content">
|
||||||
|
<div class="right floated mini ui ">
|
||||||
|
{inCPDict['HeaderRightText']}
|
||||||
|
</div>
|
||||||
|
<div class="header">
|
||||||
|
{inCPDict['HeaderLeftText']}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="meta">
|
||||||
|
{inCPDict['SubheaderText']}
|
||||||
|
</div>
|
||||||
|
<div class="description">
|
||||||
|
<ul style="padding-inline-start:16px;margin:0px">
|
||||||
|
{lBodyKeyValueStr}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="extra content">
|
||||||
|
{inCPDict['FooterText']}
|
||||||
|
</div>
|
||||||
|
<div class="extra content">
|
||||||
|
<div class="ui two buttons">
|
||||||
|
{lFooterButtonX2Str}
|
||||||
|
</div>
|
||||||
|
<div class="ui horizontal divider">Add. controls</div>
|
||||||
|
<div class="ui one buttons">
|
||||||
|
{lFooterButtonX1Str}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
"""
|
||||||
|
|
||||||
|
return lResultHTMLStr
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1 @@
|
|||||||
|
pip
|
@ -0,0 +1,344 @@
|
|||||||
|
pyOpenRPA-1.2.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
||||||
|
pyOpenRPA-1.2.0.dist-info/METADATA,sha256=abfVMx4Zr9fZV4pw6SslvpUpAg-qJPV39s_8Phx4RNo,3351
|
||||||
|
pyOpenRPA-1.2.0.dist-info/RECORD,,
|
||||||
|
pyOpenRPA-1.2.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||||
|
pyOpenRPA-1.2.0.dist-info/WHEEL,sha256=qB97nP5e4MrOsXW5bIU5cUn_KSVr10EV0l-GCHG9qNs,97
|
||||||
|
pyOpenRPA-1.2.0.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=Ee72BuVpmXgoNTUInqAj1xVdC4JoWCQ0d0lTlijKyuA,1225
|
||||||
|
pyOpenRPA/Agent/O2A.py,sha256=IONoht1jb2b7JFT5syelVPq88z7TTLPZjcdH7SrR7rk,2612
|
||||||
|
pyOpenRPA/Agent/Processor.py,sha256=FtU7IGIev2_po_fkJTH2KNYZap6IVFODM30qiqBNsm4,4146
|
||||||
|
pyOpenRPA/Agent/__Agent__.py,sha256=VxQsuyItFvgXaDKahEKbG6hGgmpNGJFHRTYGGdP7J-A,4916
|
||||||
|
pyOpenRPA/Agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||||
|
pyOpenRPA/Agent/__pycache__/A2O.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Agent/__pycache__/O2A.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Agent/__pycache__/Processor.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Agent/__pycache__/__Agent__.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Agent/__pycache__/__init__.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Agent/readme.md,sha256=QF_Bnv204OK3t1JUEhjfICkxFmSdX6bvaRl_HI6lH9I,19
|
||||||
|
pyOpenRPA/Info.md,sha256=u4Nv-PjniSF0Zlbtr6jEJX2vblK3_1zhSLNUgOdtDaA,85
|
||||||
|
pyOpenRPA/Orchestrator/BackwardCompatibility.py,sha256=lzV3kinWlde5Fs4tBYqyKWetBLM4yEo6nbXmLC-fFaA,30159
|
||||||
|
pyOpenRPA/Orchestrator/ControlPanel.py,sha256=OzS8HjG__8OZgqhajr8L8owyugXPuSLWHLtXuKdEP78,103
|
||||||
|
pyOpenRPA/Orchestrator/Core.py,sha256=Q0n05GuySXDPy3V7qeYQON0kYEyWogZWhYevSjY4q2s,189
|
||||||
|
pyOpenRPA/Orchestrator/Processor.py,sha256=8T10Qos4_GT7Qvhh8q59JPCuUyHbic087y_xBK9lM_4,6645
|
||||||
|
pyOpenRPA/Orchestrator/ProcessorOld.py,sha256=Vh5zLRpWWf-vt9CCYI8nDY7oaefiufnu6Pnl4tp27pY,13749
|
||||||
|
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=CMZcyyc0hcaXn2Vkd4sbd26hWXNZpVZtH7Wx4T7VB5I,27765
|
||||||
|
pyOpenRPA/Orchestrator/RobotRDPActive/ConnectorExceptions.py,sha256=wwH9JOoMFFxDKQ7IyNyh1OkFkZ23o1cD8Jm3n31ycII,657
|
||||||
|
pyOpenRPA/Orchestrator/RobotRDPActive/Processor.py,sha256=AQ_u9QVSLpce9hhSacm3UT98bErc636MXza4Q6mHsSc,12264
|
||||||
|
pyOpenRPA/Orchestrator/RobotRDPActive/RobotRDPActive.py,sha256=pbffSPsUzzaFMevNQ0P24NA0cdJg9KwtyHscnWYQc_M,10769
|
||||||
|
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
|
||||||
|
pyOpenRPA/Orchestrator/RobotRDPActive/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||||
|
pyOpenRPA/Orchestrator/RobotRDPActive/__main__.py,sha256=z9PaUK4_nBiGd0YJdYVHV_rFx6VjZaxrrmKxSyoTFwY,2508
|
||||||
|
pyOpenRPA/Orchestrator/RobotRDPActive/__pycache__/CMDStr.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/RobotRDPActive/__pycache__/Clipboard.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/RobotRDPActive/__pycache__/Connector.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/RobotRDPActive/__pycache__/ConnectorExceptions.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/RobotRDPActive/__pycache__/Processor.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/RobotRDPActive/__pycache__/RobotRDPActive.cpython-37.pyc,,
|
||||||
|
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/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=mx4AXf5xEoi9LLKgrJ4s0h20ElcBmsntzZbI99LfboU,28462
|
||||||
|
pyOpenRPA/Orchestrator/ServerSettings.py,sha256=TZMoxB090UkNOCQ3ve0KBcrdM7YH6LTFz3ErVU42wTQ,28499
|
||||||
|
pyOpenRPA/Orchestrator/SettingsTemplate.py,sha256=p7J8xXSN6xdyMTd-OrkTu7JQGLn6t7tJpPp2CPybA-w,19955
|
||||||
|
pyOpenRPA/Orchestrator/Timer.py,sha256=HvYtEeH2Q5WVVjgds9XaBpWRmvZgwgBXurJDdVVq_T0,2097
|
||||||
|
pyOpenRPA/Orchestrator/Utils/LoggerHandlerDumpLogList.py,sha256=hD47TiOuKR-G8IWu9lJD2kG28qlH7YZV63i3qv1N5Dk,681
|
||||||
|
pyOpenRPA/Orchestrator/Utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||||
|
pyOpenRPA/Orchestrator/Utils/__pycache__/LoggerHandlerDumpLogList.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/Utils/__pycache__/__init__.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/Web/Basic.py,sha256=UUiV3Rp__i8EVADK-SvIhlVmLzOzW4gpCq1eBpqU4cA,6482
|
||||||
|
pyOpenRPA/Orchestrator/Web/Index.js,sha256=DtvpHDBT3_XvJpdKUREpGT1NR3lKdBs9ER4HPvlfwhE,39036
|
||||||
|
pyOpenRPA/Orchestrator/Web/Index.xhtml,sha256=a4N_reLA6_Zb2KXiL73a7cWtJwO0W0Dr5lZ-RpUwuI0,16428
|
||||||
|
pyOpenRPA/Orchestrator/Web/__pycache__/Basic.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/Web/favicon.ico,sha256=6S8XwSQ_3FXPpaX6zYkf8uUewVXO9bHnrrDHEoWrEgw,112922
|
||||||
|
pyOpenRPA/Orchestrator/__Orchestrator__.py,sha256=QSbaJT1U5L3UE_yNBsPzqJfwdy6Xycb8Tvf6r8OUbSQ,90464
|
||||||
|
pyOpenRPA/Orchestrator/__init__.py,sha256=f1RFDzOkL3IVorCtqogjGdXYPtHH-P-y-5CqT7PGy7A,183
|
||||||
|
pyOpenRPA/Orchestrator/__main__.py,sha256=czJrc7_57WiO3EPIYfPeF_LG3pZsQVmuAYgbl_YXcVU,273
|
||||||
|
pyOpenRPA/Orchestrator/__pycache__/BackwardCompatibility.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/__pycache__/ControlPanel.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/__pycache__/Core.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/__pycache__/Processor.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/__pycache__/ProcessorOld.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/__pycache__/Server.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/__pycache__/ServerSettings.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/__pycache__/SettingsTemplate.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/__pycache__/Timer.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/__pycache__/__Orchestrator__.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/__pycache__/__init__.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Orchestrator/__pycache__/__main__.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/README.md,sha256=e2hKh7Tx6DAsX6jY_hBDhguL1L2Wiv6iugDB5otMzIA,2293
|
||||||
|
pyOpenRPA/Resources/Web/Google/LatoItalic.css,sha256=pB6OZ6F2VsaqkL-g5hW-wE_T0m9H_NltzmzjX-XAKDk,3112
|
||||||
|
pyOpenRPA/Resources/Web/Handlebars/handlebars-v4.1.2.js,sha256=h6O4BrhyPtJspLDEQwogC53uHFRozuBpxvN2S4tJHE8,171994
|
||||||
|
pyOpenRPA/Resources/Web/JsRender/jsrender.min.js,sha256=00hs6PwCiAfN_gatFdLofj3yBf8ue5Z7jCXX_th2FFg,25927
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/.versions,sha256=gGkuqPk07gAhjnNJVjVR_BA4SSBzqazbY8eEpddH01U,72
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/LICENSE,sha256=ifWbZZ0piwisfkIil1gacnBMxNnAHa7yCn1etItX1Y4,1102
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/README.md,sha256=oITQ5k-7jxoYAAQpzAXFROqgcnGzPrTd7GqkZSGqKW8,448
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/accordion.css,sha256=UC6U37i_pXBVMlUmFMLi1S8FIhFycJjAePP-hRGKzQM,8971
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/accordion.js,sha256=6cCQ6FlT1bM_QA4OpA_vfMljasKU1foGszlAIyhWi3A,20790
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/accordion.min.css,sha256=u9_5Zru9uMTtrXZpdfLawT_kJ5LFcmrMFr1QWXfDqwA,6955
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/accordion.min.js,sha256=kt0Dfi-mrxAU-iYsfDrkROHrb55Hi0lVWC7MT46_xnU,7100
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/ad.css,sha256=CiW55EUiruW1Tp0jrz2yDvQ8jYxDVMDmVcROV5_eBzo,4176
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/ad.min.css,sha256=7D7QYK0TBRyE4dN3SYXD_owb0j8UXywfPKzab2e743I,2066
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/api.js,sha256=Vjx6JZpe0iVJ6t8gp3TO3UjIyZkNBPN-taCS8MWwvJI,40952
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/api.min.js,sha256=und4HgOg2CxzBcqdJOvcT9LfJx0Hf9xQmEO_u7r1Ync,14594
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/breadcrumb.css,sha256=SJD_Mmi9BUmGXVhCXlIM1ei93yJVreQx0FAT68_t01w,2166
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/breadcrumb.min.css,sha256=-40OBPSbvydFFq9P3XPydeyWOrsh8g600mK9HXNoLnI,1192
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/button.css,sha256=wdCjDbx3M-jkpA7whQetZvX3ZE7wyBwRlCbcTVXKobc,116361
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/button.min.css,sha256=37bmMDGVPsjpcyAe7GqWsqv3UpsPTvlE5AiCVtT5NxY,90207
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/card.css,sha256=0oHZ2Qh74uybsgxLhP2ag_kQGTyOx3Kbzsjs6LvARzI,25330
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/card.min.css,sha256=anR2MHuWyx-iEc6wsI5nBMWnboFRqvOT7r-KOrKK-BQ,17410
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/checkbox.css,sha256=5u4dyQfH-wpdFbakv5CV4uIhWbBb2Tge0ZC5-tA2dX8,17473
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/checkbox.js,sha256=s-cRpbhGBxHgpnZdU3yFZciSW4n1QuruHjkX6gCyqT0,26912
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/checkbox.min.css,sha256=cy6WFzeIQ_5hHE7LEFxAK8yfR_zdfjoEubGRy1wCLv4,12727
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/checkbox.min.js,sha256=mlvPY4Gm-w6mgnAZ2GVMiBo5UDU7x_vaxKA5VRxdjR4,11369
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/colorize.js,sha256=imQdcIH6qpozSWEYeIpilPOfKHOJbD6V9RuKOC7yyEE,8710
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/colorize.min.js,sha256=oUDFJRLSaINMaJIZmuzYttfcMgkb7I6CpuEJ6bMfAVI,3270
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/comment.css,sha256=WAotERTFZQyxKNDJiSLlreq5KVja4xNM_bXUeG7NyVQ,5120
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/comment.min.css,sha256=JYlEkH8IupEqfItr2N9WZaNYkyF6rX2bnP6Y8ktXdCU,2945
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/container.css,sha256=bzDnWjcw404DoiHuz6-3iMRmbzJePDPgUGHcx3nFAuU,3099
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/container.min.css,sha256=VizQkNfO7_OANkM37_7xKxHQPEcUTBRuj3R_xkaULO8,1925
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/dimmer.css,sha256=xKjQ9JWKG6zlrjyB5zECQc5vLZ7uCg7S5X-aUNKh6b8,5559
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/dimmer.js,sha256=TuB9IPn4wx2n47nRVYf9CKvLotDL9d7gQcNArXupiRU,22303
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/dimmer.min.css,sha256=-MBET9URQztSrMHpKaB8oyTckkm-lXisQbuxqd2UyOk,3517
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/dimmer.min.js,sha256=4jCyaIQIKQX4zzzvspDqEvUmsPnpkr5lFuDOvKR_Wbo,8071
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/divider.css,sha256=a_0UrPhzoGJZZd8PBDgc5C0utGbzM6hjZbkDyy4pzfw,8034
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/divider.min.css,sha256=2XcokR56EPJZJh0ofnGgp-QPx2VpHYzDcdZdtR08uBs,6097
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/dropdown.css,sha256=rJfAK26TU_FrVEYQxX1iWS4Z91SORlfnM128BfpI1II,37420
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/dropdown.js,sha256=KnpOJhLPr4nCvh6M4qxqs8Y8lPGNZgLK6jZcGWrYzHo,145962
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/dropdown.min.css,sha256=7Lwg8bz5Df_7YZ6D-ywoa01hT3IkqC09ZKBKtGe6gow,25679
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/dropdown.min.js,sha256=uEocYy6a0MpPLLHtYV7QAGdOeMRwE0Am2WtnOg_hBfM,50895
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/embed.css,sha256=19QhoCUbplkH_W5a7ejlpO6PoqSEFVA1xdHvaZp98yw,3169
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/embed.js,sha256=O3znHvAxO5xYlwzn4y3lQDde_iTdy29iUAmPqNfg4-0,20926
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/embed.min.css,sha256=SHH3TOGQhg1d5mrYCZeko1qvN3_NoETWQzBmfGUOpjc,1836
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/embed.min.js,sha256=QN4vIzPRpT4BFVPyA702nPG8nZKWfM-HygoF9jPBDJA,7728
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/feed.css,sha256=aFj6fLvIPQfeRxyKu_TlLKeUcwmI5GwOR7pY1Lb0JKM,5845
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/feed.min.css,sha256=-l8OBrtbhQi-fhQLHwA0cut_JWOuRWc44I0KpPxUx_M,3590
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/flag.css,sha256=rvyaZDdUGBPNuvOE8lzpW-Z4q3LYkJi8T99JlN1aF3E,22423
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/flag.min.css,sha256=WX74cISnDHD9kiyzCAiXiUWfnmv6cwdmBXgXtA5TUuw,18577
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/form.css,sha256=oNyqIev2BGrxigiMt72unbkne8-OWJ6UtaUGM4XZ9Y4,29092
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/form.js,sha256=FCxhpdJMgA6H88ka82b0jcqg-a8S53T0sVVbS_chLPA,57618
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/form.min.css,sha256=BmOkPn-zjy4WbHvcIvm18Vq0nhJjwADEBxvsLqX0sXg,21568
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/form.min.js,sha256=fK_KHBgbjblWL2-hRtohUzj6b12XWi6pVujkG1Ru9-w,20458
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/grid.css,sha256=I35Jh57rWCJoLMuJYXksccmBzc6V1XC1Mi_na_oAp84,73036
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/grid.min.css,sha256=5iW6X6_QT_7PgFBce4OTfLOOaSoovOoOb2U8w1yZDtc,57335
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/header.css,sha256=32EgHb7XmTT_AWH7Nr08PjXP2op-xhwlSqSIThcZKmY,13499
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/header.min.css,sha256=hHgAxfAsLFDPcyU6T6cRE_M6R-4rKEfPX5kOHVyJNes,8872
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/icon.css,sha256=CHLhcJDvnks69dz2lyZC0idfGnPFx4qdKA82Hm_bEDo,86945
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/icon.min.css,sha256=4opKQbtTAtsuIkfkEMuIA3eD3T4m1X3mfiCVTS6x2_A,67019
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/image.css,sha256=eZLe0mOsWAJETFvjXHlZXAnSY87SGQlRDJna2_EZ67U,5676
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/image.min.css,sha256=eXzqGHi6p4yiYGCiYPOcGXYbKeQtA0Df_w0gN88KCD0,3727
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/input.css,sha256=lYFTBK5TuWVaB2LSwjdl83iM9l4rn7jPwoFcEfvHQR8,12699
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/input.min.css,sha256=4ouF0Y10UKjiT6iJlHxD5aOe8WljYoAxPqpiy7iEdSw,8692
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/item.css,sha256=O1HR21E9wHtGxCmsqxcEc_65R6Ln3mOvImRwYMQso1g,9753
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/item.min.css,sha256=JRycvfshgviiiwTeAKUj0iPOov4-Uwaue3fTqaY_e5s,5985
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/label.css,sha256=9tLlAtf1Y3NSngCdO1DZ5YcRW_bu2dUKYUAXHPXm2hQ,28382
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/label.min.css,sha256=lzompqItwR2t_PJowmd07tg8QUPAb6yj58N9TwuNS6I,20005
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/list.css,sha256=CI9lvTBhVzN64aRNjJIwhG6bhKydfIbk_RdYQiaAYwE,22486
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/list.min.css,sha256=uXVJMLBcGUe7MZETm-CQO5LMhIbTFxajYZRBFTCTftY,16094
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/loader.css,sha256=Yz3gBB1JS-86XzSzztcNLE24ViO7UnP15A4M4hrFZUY,7128
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/loader.min.css,sha256=XtALKS7EZswkHXCCOthbxsuu36_tpZbqh-LMT1gaRAg,4702
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/menu.css,sha256=aOYMc10qx8D7fVQ7R83XXUkbrrFExpWkWc6ZnECfOJ4,45279
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/menu.min.css,sha256=cRSLOaiPiyfTQ4B4HT1OCF_2CWNzGcPO9Nns6Jrf4hg,31506
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/message.css,sha256=baLR2EbwIWTGTSvNc9qb2FmcWBeZHM3W0kBNvEdxZZU,12466
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/message.min.css,sha256=_plszMa027XkVjjehCTWxgIAftsTT1alP5I6EYfoVMI,8354
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/modal.css,sha256=86mR_k66q9mOP7jwLV6J4iRW1a06eSyQ6tcoZpUlHf8,12800
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/modal.js,sha256=ACX5Za25KIugyXD7eFndkqa18n7LHjZrBkWSpLs8uqQ,33442
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/modal.min.css,sha256=2GGe09HtCS6k__kprnoTwPMNu2CFCjEpaLQ2NBMLua8,8012
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/modal.min.js,sha256=8POmd6680Gev-MdgKbVOHP-9lm-9WB1AVyuLf2WRcxc,12701
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/nag.css,sha256=3Pz6rq1vWHNvB7UHhGFMPYvrP7VZP_pTM4PlwthnviI,2727
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/nag.js,sha256=KuXGvpOopM0i7syRO2cLSXrJ5I7AjwW3m7JMJLfGuN4,15553
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/nag.min.css,sha256=ohX1Du58QE8pgiBVEzmlhuT2rERTdxY4sasod_53NV4,1483
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/nag.min.js,sha256=UN_1Vcu3C_zxEatS7UZKw1x2blSyihZT2F1cmq7UZOk,5696
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/placeholder.css,sha256=ihZF0mK6texbUk_qWnqHqoZ0scXyDhHy-tr77Wougwg,5938
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/placeholder.min.css,sha256=UIFHVCJ1agMPhpUv-aqm6GeN3EmqUv5vClMm_5LEpuM,4452
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/popup.css,sha256=EitCUPKebavrCN6zwsWGZKfKCNjRJhaEGf6dJlCim7g,17407
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/popup.js,sha256=kzErFmfWsOMKZH-mbyLXQpJo_ajderu7pnq_faA7teM,52273
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/popup.min.css,sha256=YlUBHRAaq5FwMcI2g3DQtgcmxmRNG1rEZaGK2LCgVZ0,12032
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/popup.min.js,sha256=VvJYDjsOSD6VaYYZhuQYiPOpBbpRnmaddxVd6shZ9mU,18630
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/progress.css,sha256=p2R5CYj1cVgj0mT7XTBcKKky02140m4A-PumSFirAqc,10669
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/progress.js,sha256=uAQsAqW_DWnH0hK5dC0MVBBwuDyyu8UNolLxO0OSCfs,31204
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/progress.min.css,sha256=JtEqDPto1ZJiE-6k_WoZnzlhFUgwLJqH6VowDWGRez4,7422
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/progress.min.js,sha256=B676J_Jywi6IJ9e_E62nmk7Gn9KDkRQc7RfcIBKPQcI,12331
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/rail.css,sha256=XUZeNKRfoqs2bRnKz49lJU8ufQ625eFrtL7IxXLzBD0,2646
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/rail.min.css,sha256=4rrNcI5NVX845Bc9aBTWjwjg7tnakWuMHl8zWK-ucmE,1453
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/rating.css,sha256=E_jbykfZK88UZ6kKhL0T8mqn29mzefpwNzCDZEkIyKE,20696
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/rating.js,sha256=rxHeOv-TB5-ViM9hOfODUZMGqWUMNyPvIVIov306LuQ,14869
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/rating.min.css,sha256=4coaKkBwUtNfJL53qHC_TzTE7BmLMuVxDu_Z3gGOs7Q,18393
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/rating.min.js,sha256=jprk9qns6QqU1UWGtHMwug9A_ls7tVMV8p2mueJlj74,5354
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/reset.css,sha256=ygW8luaW-MLjYb6fFQYl0HBo4w-P9zwYkVZLpFOMFh0,9123
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/reset.min.css,sha256=Cm0OrnD_mnGgt3DPmGhhNLeNUAfYfQlCX2uCK7TG_o8,2822
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/reveal.css,sha256=33mQj7j0sprB4_0PrBqMJXxyXXFs4eP2rKoraaht8e8,8177
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/reveal.min.css,sha256=cHuyo1zDTWJH9C1f1GPtKHwuTzA_IUSFAfTH3q5yoME,5784
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/search.css,sha256=XN5UApUr9lkI_R-ThVSHhNM3UEMEvl8Z6LAYhFABPKw,10377
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/search.js,sha256=bm3TK1__R62sMnnTL_haoNAZiWbua0IGEgwfdQRpuRo,51211
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/search.min.css,sha256=HONcBrv7-3sDkmJ9Zwh8KYXWyy_fUw_MjDjhNMtU7hU,6891
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/search.min.js,sha256=gkqnhj5TvM_vwvHKAb4zBC7uL6mndcAlK6CEv5iEUwg,17622
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/segment.css,sha256=FERuSI78q9zgv_iWxHnXIbSnJDsgNKaLh8IgThCD9OM,20063
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/segment.min.css,sha256=zLmNnl__Po9TAZWlayMZpH_DpZXhaHXTcSa8KGeRxMs,13763
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/shape.css,sha256=5sbfPkJ2vSJEo7Ht21qKtfupKDnPdYtwpxkszIHwqsY,3865
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/shape.js,sha256=6D_QO1uZyRzcGRxxaCGP4zRTcnHH-rF11XSDj8fsVn0,29873
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/shape.min.css,sha256=7KDwgqAZXncDCzulBQT3C9UcI_kopiPdoSF2NxpJQWE,2521
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/shape.min.js,sha256=Njt3jnaL2VeRaG0rRHt2niY7YXHeD4Z_fj17tN2syLU,10803
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/sidebar.css,sha256=pboKxonzco97CJSpXvUG9Bj65PyqdlTlmi8C_XNQcJI,15757
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/sidebar.js,sha256=-nippst3RqSK6cFS0b1VQIhhZ7x455Oq5vpvjxdFOhc,34488
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/sidebar.min.css,sha256=FxNmgO-xW6HZ8kqkaDpzZG2GGTYYvBIkhHFsPPUx8f8,10726
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/sidebar.min.js,sha256=LxCRzL8rRPXulWQPWkMgncUHL0hBU4IHsuNOVzIMi3I,13466
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/site.css,sha256=tpW_cbiDbTbWVk1ECO4bnddYLlytmUgArSW1Jx3x9DU,3918
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/site.js,sha256=-yF4ejA2WwzIujQ1y9b-i6dxpRYCE8lCSU76CQ9hZhw,14604
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/site.min.css,sha256=AYTFsBcTjn7JH9tBf1s3S68Fxr83IHQf5t5FpD0vGcw,2452
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/site.min.js,sha256=f-45BTFplAj5X_I64VjaIAqTulT6dVhF-rHvOG8pZpM,6066
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/state.js,sha256=rdhOQ83U-t08-IE-ZL7qwiJ_2NPtm0E--BfFJVRylSY,21498
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/state.min.js,sha256=sgXcJIgGI3ymppa7VewFhV3g4rnB_D55Yvoo-QX4Whw,7804
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/statistic.css,sha256=zC6fj8Mg8giRj0rcaq1GVcAfmdLfb0QYgBx_B-7bXlE,13221
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/statistic.min.css,sha256=Nbx1qdI_NIb-YBfRIMcmKn-IdY5OmUdd8gNIGgA2TCs,9594
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/step.css,sha256=3dgzVkMcFYJKP_UPk7quva4L7GLD6sln1aroRZlrcw8,23555
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/step.min.css,sha256=hifahh65UcRx9Cux-rpwi5pTJImD83BlfH1qbkiaWCI,19188
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/sticky.css,sha256=eOSA5O3_qugssoDgdTovRNvNMe0kEWqQz1yQGJFZCQM,1288
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/sticky.js,sha256=kHIMXTF2Wj8DYTaDRRqQ9ZVNUTOjDbBF84Dwm4tFYaM,31814
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/sticky.min.css,sha256=SYOFZjW67UWxBsrtAfD4g0Tvf6CnltYw_IN0VemK2hU,607
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/sticky.min.js,sha256=fu91ThJa6qnZoQAGTpxUw5Q1UN7d2Y_KHS0kjoteWCw,11854
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/tab.css,sha256=aX-PA0rhwxK3q6l3A3przKBvFAQ9LkhlDV3mETbQR98,1865
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/tab.js,sha256=xvNcoJnirQ1TJgVMy_8_AARTIveekx3bgoXNLc-FhC0,33771
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/tab.min.css,sha256=vTnhMR4q6W1dLyB3QYdtwRWnl2XLdtFA0I3kSnZH_EY,1075
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/tab.min.js,sha256=MgUTbr8RHTNylv3wIeBmCec-mS1iL9IJW7Y0NahYmrs,11487
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/table.css,sha256=omOnJC5bkklgjC6vJgTYJae-wbp3MSIu-mUM0gc5Q-o,25536
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/table.min.css,sha256=ODiMJS5bcTBrVMu-BtZytuSNpu3wHtILDb8no5BLNhw,18015
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/transition.css,sha256=XMKp0LQFx2Ec2oOjFuAPJik8VrDUgysP4TNOJH3Rzuw,49176
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/transition.js,sha256=sccxnC8Z9hx9lzlJLPYQ9E5FHETVYEVaA1uIQaA7ubU,36076
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/transition.min.css,sha256=cty1gaoozlRlEnqcQir7t93a7sOy2uCLp0c4jyBLWwA,33525
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/transition.min.js,sha256=k30cmb6hiQ_LGKpX2AcllUduUJ0kA4DKKStgUxkGQzM,13010
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/video.css,sha256=R9cpZZmFTZ70NmFVp7XhHOXaoZ3iodK1WlxGrisY7Tw,2346
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/video.js,sha256=Si_eMYc42BiLyyl4ur4u7K17kyw9biw-eAtbidaQH0c,16252
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/video.min.css,sha256=0MWKfR7_d_meresYhKG49N4ikgDL9YKvdj4ffNqhti0,1328
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/video.min.js,sha256=f7uHgbRqRCqHKBJm7CB31wMMnTjYHPmYaLi1D2i9QfI,6090
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/visibility.js,sha256=p_2kDyoT-GlUY_iLWH8RCRtSl-zunZ1oNx3dJwvyKbA,44180
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/visibility.min.js,sha256=Th3QlAMxD5M2RJ9nNOvuxJZCgZIlavx5-51jABKTs2A,16294
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/visit.js,sha256=9DsUmsPzmp3XD1pplmIeV5tNIeqEHMml5hcr3omsBJw,16142
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/visit.min.js,sha256=bT8zWI7mcAwX-Fyt67gogo3u_IT7q8uimamY5Vhk3eU,5887
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/package.js,sha256=BHq6qGCSMdDXDGJxZ4zxnKaREbFM2un2VqCkydrBTf0,774
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/package.json,sha256=Sy3ZVA4SxFzecOO88h1IVAnBiuDpRtXiUg6ME_YArI0,524
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/semantic.css,sha256=aje_ma2N_7VT1k2QTOLeqr3SfQ3Cr-7vB05D2-uo-YQ,869203
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/semantic.js,sha256=t-thIOFbQol3-vcB3C7kRbS49jG2_LC5dEp7NLxBpuA,759089
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/semantic.min.css,sha256=f5Dpq5VRrbzn8POovxN9HR3S7LhHQIAiCKYz4PB4ZZA,628934
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/semantic.min.js,sha256=69cT25pJVUmAyniwWMglXlEOEeZYuhmD8Hbj58gCS7Y,275740
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/brand-icons.eot,sha256=0CPFX94iBJXxOoe3KZXg35jI0ok1dymdGZ2lu_W0_gI,98640
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/brand-icons.svg,sha256=IcTTApw6luFW48z0iPvWxbD_LpBQYBaIN5LGFInrfpU,508636
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/brand-icons.ttf,sha256=QuNp3Iw3KXO6d6gmti0seiBwUyMT34MqIyiN23aXQVg,98404
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/brand-icons.woff,sha256=n6_Ww-e_wUXbQqkG5fpo_mpvlyIfAT0-gz_DIxuZLEQ,63728
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/brand-icons.woff2,sha256=59TVNAu-V6Adj3mSFC4nY9Q41Xg4kMdnSDBu6_oFamk,54488
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/icons.eot,sha256=i04bhH4iIz1PRn00-u_nvL_rzm-pu77lYMRc2JSGh1E,106004
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/icons.otf,sha256=vcXQufOXvoPohsdLAUHRlUqkOEs1nc5JgpmUxKLh978,93888
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/icons.svg,sha256=GzY2PC_CxigjA7ao5Pm45c8-mD38cSHKeoiagKC-kA4,392355
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/icons.ttf,sha256=y3-B9UL1xBiju7mtP5--eEFR0TsEzsUOzt7GATMko9o,105784
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/icons.woff,sha256=lbakhA-HEeyrQnvCNuuGCY235ceCuvsTnIwwgFql_-E,50524
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/icons.woff2,sha256=Q0RmtZVFqKHKxt2zgZfNxrNZlamMPzgS-4jWGxwwDdM,40148
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/outline-icons.eot,sha256=RTf6BjQO5iwmTp16TYqryrPee9osXMM0AQ9GtoMQb8s,31156
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/outline-icons.svg,sha256=T4_RcS28l2Pa57YNTH3ryg_433tFrdN6pDBt0iGL1zE,107567
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/outline-icons.ttf,sha256=Zxchcur85FY3JeZhBD1duFS4Z2ip6L05dY2-gcR5aTU,30928
|
||||||
|
pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/outline-icons.woff,sha256=S8NZwnBXs-0LrKZtbFNJpdSmBQlvvHh1Bhui2Ro9bQU,14712
|
||||||
|
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
|
||||||
|
pyOpenRPA/Robot/SettingsTemplate.py,sha256=Rp5XPeV2I4tCS2uf4Zkqm_ERJ6pZMg4-e5_lMqGJYLk,1453
|
||||||
|
pyOpenRPA/Robot/Test.py,sha256=qXr990nXiFZX5SNv6QN9GLb_U4HZRmJnbZR2qSnwilY,2878
|
||||||
|
pyOpenRPA/Robot/UIDesktop.py,sha256=wjBDHb9q-kmZoDCV3ai1bLBqR_EVVY88jeDNHFxmF8g,82804
|
||||||
|
pyOpenRPA/Robot/Utils/JSONNormalize.py,sha256=aIuVzuZDazhxkCOzoOjfhHVz66mp2FWdfPv5E7KWF5Y,3890
|
||||||
|
pyOpenRPA/Robot/Utils/ProcessBitness.py,sha256=WlKL-DklGaoTnchtapOTM_ydxSB4yOeo9lcG3zr2VME,4524
|
||||||
|
pyOpenRPA/Robot/Utils/ProcessCommunicator.py,sha256=8GfmLnOvAdosmt7YNT86uEV9cjhKippssCX62wOMJwM,8039
|
||||||
|
pyOpenRPA/Robot/Utils/TimerRepeat.py,sha256=_kTct3X9SIEvS3DKM5bGNnjRBVJasmMFZntQaVbPX_E,961
|
||||||
|
pyOpenRPA/Robot/Utils/ValueVerify.py,sha256=ObskxU4fOMoCGw74_nzYt6-a5jjrAckb3sdBLYyhYxY,777
|
||||||
|
pyOpenRPA/Robot/Utils/__init__.py,sha256=pHlSQGRFKmn5RCTHIf-3a2ooA9T2xNOWridckynP7W4,28
|
||||||
|
pyOpenRPA/Robot/Utils/__pycache__/JSONNormalize.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Robot/Utils/__pycache__/ProcessBitness.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Robot/Utils/__pycache__/ProcessCommunicator.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Robot/Utils/__pycache__/TimerRepeat.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Robot/Utils/__pycache__/ValueVerify.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Robot/Utils/__pycache__/__init__.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Robot/Window.py,sha256=UJl-sg4RvvJ35aG9jZOzqGVwE15XK7qPHqoOBD13xFk,431
|
||||||
|
pyOpenRPA/Robot/__init__.py,sha256=L-5tPm6evytGWOzlqIq-2oiIhmQnruaxwIstyyaMkVI,253
|
||||||
|
pyOpenRPA/Robot/__main__.py,sha256=l6II8JuXCsnVOcfs6-2jvogKYTVhbfj3Jl2ld3OIP7s,1992
|
||||||
|
pyOpenRPA/Robot/__pycache__/Clipboard.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Robot/__pycache__/OrchestratorConnector.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Robot/__pycache__/SettingsTemplate.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Robot/__pycache__/Test.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Robot/__pycache__/UIDesktop.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Robot/__pycache__/Window.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Robot/__pycache__/__init__.cpython-37.pyc,,
|
||||||
|
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=_BXQjAMHew2fRWloXdqPOmYHX6i6C8ELPsW1TZNvjz4,8618
|
||||||
|
pyOpenRPA/Studio/ValueVerify.py,sha256=ObskxU4fOMoCGw74_nzYt6-a5jjrAckb3sdBLYyhYxY,777
|
||||||
|
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,,
|
||||||
|
pyOpenRPA/Studio/__pycache__/ProcessCommunicator.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Studio/__pycache__/RobotConnector.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Studio/__pycache__/Studio.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Studio/__pycache__/ValueVerify.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Studio/__pycache__/__init__.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Studio/__pycache__/__main__.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Tools/RobotDB/ExcelCom.py,sha256=hp0dvXOEC7Au00ueh7pqxkdixV-PC-km7tCt-wRunYs,343
|
||||||
|
pyOpenRPA/Tools/RobotDB/HowToUse,sha256=TUXPZAFcse-PSlKFM6jcaYuuZZEmXOSSvgeqrbmIDoc,1473
|
||||||
|
pyOpenRPA/Tools/RobotDB/RobotDB.py,sha256=qtGu8PS2atd0L8taCNpk-08Qpxp8Qz1lqwAcBkyLFLM,1655
|
||||||
|
pyOpenRPA/Tools/RobotDB/Server.py,sha256=rjW9Sg-j9P8pFQD66Uih-rke6-f6sCulinwi4_W-3mc,19933
|
||||||
|
pyOpenRPA/Tools/RobotDB/ServerSettings.py,sha256=5p9JwrpKHh68oVHIWazTajB6AOfzeapARbvGcJOFmNc,7406
|
||||||
|
pyOpenRPA/Tools/RobotDB/__init__.py,sha256=qVH8fEPgXk54rmy-ol0PnT8GF5OlGE0a8mExwJ4tFqY,124
|
||||||
|
pyOpenRPA/Tools/RobotDB/__main__.py,sha256=w9sXIF4r_PeWJjHJutTuH8DSYpXxpgcAN0KUOjiJ6PI,140
|
||||||
|
pyOpenRPA/Tools/RobotDB/__pycache__/ExcelCom.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Tools/RobotDB/__pycache__/RobotDB.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Tools/RobotDB/__pycache__/Server.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Tools/RobotDB/__pycache__/ServerSettings.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Tools/RobotDB/__pycache__/__init__.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Tools/RobotDB/__pycache__/__main__.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Tools/RobotScreenActive/ConsoleStart.bat,sha256=_HNadUKHOYI5y6foG3srh8wjSzhX33xaKNylFtDjOJk,114
|
||||||
|
pyOpenRPA/Tools/RobotScreenActive/Monitor.py,sha256=TV-YisVqa_uGiyJLG9oK4u-5aDjGiFYZFh1dPjOgYc8,492
|
||||||
|
pyOpenRPA/Tools/RobotScreenActive/Screen.py,sha256=VnYcvCVymrD35l2J4ln_tlVn7CilZhxE4Ggw9P-OhIw,606
|
||||||
|
pyOpenRPA/Tools/RobotScreenActive/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||||
|
pyOpenRPA/Tools/RobotScreenActive/__main__.py,sha256=JASxDDVKWUU7DAbDkRrGTrPk-P7LZchTZFh8usp6b4U,593
|
||||||
|
pyOpenRPA/Tools/RobotScreenActive/__pycache__/Monitor.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Tools/RobotScreenActive/__pycache__/Screen.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Tools/RobotScreenActive/__pycache__/__init__.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Tools/RobotScreenActive/__pycache__/__main__.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Tools/SafeSource/Crypter.py,sha256=VRrE5-oQxQtvMEPHM1lMXp2CKnceNBmIWJnsJoJkaVE,3616
|
||||||
|
pyOpenRPA/Tools/SafeSource/DistrCreate.py,sha256=-_8BTle57LBKVknnB_3af-LghxrRmRGfRNu08CLNIvY,3232
|
||||||
|
pyOpenRPA/Tools/SafeSource/DistrRun.py,sha256=zwUh6Jy-rDAZHV6fcTUMupkukojntFMroHJHMsNQgrE,9637
|
||||||
|
pyOpenRPA/Tools/SafeSource/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||||
|
pyOpenRPA/Tools/SafeSource/__main__.py,sha256=g5aYWnuUZoM2jDX2mSIl9tRAJg05tu5VxD2rGJWcACg,649
|
||||||
|
pyOpenRPA/Tools/SafeSource/__pycache__/Crypter.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Tools/SafeSource/__pycache__/DistrCreate.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Tools/SafeSource/__pycache__/__init__.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Tools/SafeSource/__pycache__/__main__.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/Tools/Terminator.py,sha256=VcjX3gFXiCGu3MMCidhrTNsmC9wsAqfjRJdTSU9fLnU,2178
|
||||||
|
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=iosI4OeOIbrI3Van5znqBmnHjqynRxn8OXqujhKpiKY,174
|
||||||
|
pyOpenRPA/__pycache__/__init__.cpython-37.pyc,,
|
||||||
|
pyOpenRPA/test.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@ -0,0 +1,5 @@
|
|||||||
|
Wheel-Version: 1.0
|
||||||
|
Generator: bdist_wheel (0.33.1)
|
||||||
|
Root-Is-Purelib: true
|
||||||
|
Tag: py3-none-any
|
||||||
|
|
@ -0,0 +1 @@
|
|||||||
|
pyOpenRPA
|
@ -0,0 +1,27 @@
|
|||||||
|
import requests, time
|
||||||
|
# A2O - Data flow Agent to Orchestrator
|
||||||
|
|
||||||
|
# f"{lProtocolStr}://{lHostStr}:{lPortInt}/pyOpenRPA/Agent/A2O"
|
||||||
|
# Request BODY:
|
||||||
|
# { "HostNameUpperStr": "", "UserUpperStr": "", "LogList":[]}
|
||||||
|
# Response BODY:
|
||||||
|
# {}
|
||||||
|
|
||||||
|
# Send logs to orchestrator
|
||||||
|
def _A2ODataSend(inGSettings, inDataDict):
|
||||||
|
lL = inGSettings["Logger"]
|
||||||
|
# Send request to the orchestrator server
|
||||||
|
try:
|
||||||
|
lProtocolStr= "https" if inGSettings["OrchestratorDict"]["IsHTTPSBool"] else "http"
|
||||||
|
lHostStr = inGSettings["OrchestratorDict"]["HostStr"]
|
||||||
|
lPortInt = inGSettings["OrchestratorDict"]["PortInt"]
|
||||||
|
lURLStr=f"{lProtocolStr}://{lHostStr}:{lPortInt}/pyOpenRPA/Agent/A2O"
|
||||||
|
lResponse = requests.post(url= lURLStr, cookies = {"AuthToken":inGSettings["OrchestratorDict"]["SuperTokenStr"]}, json=inDataDict)
|
||||||
|
except Exception as e:
|
||||||
|
if lL: lL.exception(f"A2O Error handler.")
|
||||||
|
|
||||||
|
|
||||||
|
# Send some logs to orchestrator
|
||||||
|
def LogListSend(inGSettings, inLogList):
|
||||||
|
lDataDict = { "HostNameUpperStr": inGSettings["AgentDict"]["HostNameUpperStr"], "UserUpperStr": inGSettings["AgentDict"]["UserUpperStr"], "LogList": inLogList}
|
||||||
|
_A2ODataSend(inGSettings=inGSettings, inDataDict=lDataDict)
|
@ -0,0 +1,41 @@
|
|||||||
|
import requests, time
|
||||||
|
# O2A - Data flow Orchestrator to Agent
|
||||||
|
|
||||||
|
# f"{lProtocolStr}://{lHostStr}:{lPortInt}/pyOpenRPA/Agent/O2A"
|
||||||
|
# Request BODY:
|
||||||
|
# { "HostNameUpperStr": "", "UserUpperStr": "" }
|
||||||
|
# Response BODY:
|
||||||
|
# QUEUE ITEM
|
||||||
|
# # {
|
||||||
|
# # "Def":"DefAliasTest", # def link or def alias (look gSettings["Processor"]["AliasDefDict"])
|
||||||
|
# # "ArgList":[1,2,3], # Args list
|
||||||
|
# # "ArgDict":{"ttt":1,"222":2,"dsd":3} # Args dictionary
|
||||||
|
# # "ArgGSettings": # Name of GSettings attribute: str (ArgDict) or index (for ArgList)
|
||||||
|
# # "ArgLogger": None # Name of GSettings attribute: str (ArgDict) or index (for ArgList)
|
||||||
|
# # },
|
||||||
|
|
||||||
|
def O2A_Loop(inGSettings):
|
||||||
|
lL = inGSettings["Logger"]
|
||||||
|
while inGSettings["O2ADict"]["IsOnlineBool"]:
|
||||||
|
# Send request to the orchestrator server
|
||||||
|
try:
|
||||||
|
lProtocolStr= "https" if inGSettings["OrchestratorDict"]["IsHTTPSBool"] else "http"
|
||||||
|
lHostStr = inGSettings["OrchestratorDict"]["HostStr"]
|
||||||
|
lPortInt = inGSettings["OrchestratorDict"]["PortInt"]
|
||||||
|
lURLStr=f"{lProtocolStr}://{lHostStr}:{lPortInt}/pyOpenRPA/Agent/O2A"
|
||||||
|
lDataDict = { "HostNameUpperStr": inGSettings["AgentDict"]["HostNameUpperStr"], "UserUpperStr": inGSettings["AgentDict"]["UserUpperStr"]}
|
||||||
|
lResponse = requests.post(url= lURLStr, cookies = {"AuthToken":inGSettings["OrchestratorDict"]["SuperTokenStr"]}, json=lDataDict)
|
||||||
|
if lResponse.status_code != 200:
|
||||||
|
if lL: lL.warning(f"Agent can not connect to Orchestrator. Below the response from the orchestrator:{lResponse}")
|
||||||
|
time.sleep(inGSettings["O2ADict"]["RetryTimeoutSecFloat"])
|
||||||
|
else:
|
||||||
|
lQueueItem = lResponse.json() # Try to get JSON
|
||||||
|
# Append QUEUE item in ProcessorDict > ActivityList
|
||||||
|
inGSettings["ProcessorDict"]["ActivityList"].append(lQueueItem)
|
||||||
|
if lL: lL.debug(f"ActivityItem was recieved from orchestrator: {lQueueItem}");
|
||||||
|
except Exception as e:
|
||||||
|
if lL: lL.exception(f"A2O Error handler. Sleep for {inGSettings['A2ODict']['RetryTimeoutSecFloat']} s.")
|
||||||
|
time.sleep(inGSettings["O2ADict"]["RetryTimeoutSecFloat"])
|
||||||
|
except requests.exceptions.ConnectionError as e:
|
||||||
|
if lL: lL.error(f"A2O Connection error - orchestrator is not available. Sleep for {inGSettings['A2ODict']['RetryTimeoutSecFloat']} s.")
|
||||||
|
time.sleep(inGSettings["O2ADict"]["RetryTimeoutSecFloat"])
|
@ -0,0 +1,65 @@
|
|||||||
|
# 1.2.0 - general processor - contains old orchestrator processor + RDPActive processor
|
||||||
|
import time, copy, threading
|
||||||
|
# Run processor synchronious
|
||||||
|
def ProcessorRunSync(inGSettings):
|
||||||
|
"""
|
||||||
|
"ProcessorDict": { # Has been changed. New general processor (one threaded) v.1.2.0
|
||||||
|
"ActivityList": [ # List of the activities
|
||||||
|
# {
|
||||||
|
# "Def":"DefAliasTest", # def link or def alias (look gSettings["Processor"]["AliasDefDict"])
|
||||||
|
# "ArgList":[1,2,3], # Args list
|
||||||
|
# "ArgDict":{"ttt":1,"222":2,"dsd":3}, # Args dictionary
|
||||||
|
# "ArgGSettings": None # Name of GSettings attribute: str (ArgDict) or index (for ArgList)
|
||||||
|
# "ArgLogger": None # Name of GSettings attribute: str (ArgDict) or index (for ArgList)
|
||||||
|
# },
|
||||||
|
],
|
||||||
|
"AliasDefDict": {}, # Storage for def with Str alias. To use it see pyOpenRPA.Orchestrator.ControlPanel
|
||||||
|
"CheckIntervalSecFloat": 1.0 # Interval for check gSettings in ProcessorDict > ActivityList
|
||||||
|
"ExecuteBool": True # Flag to execute thread processor
|
||||||
|
"""
|
||||||
|
lL = inGSettings["Logger"] # Logger alias
|
||||||
|
inGSettings["ProcessorDict"]["ThreadIdInt"] = threading.get_ident() # fill Processor thread id
|
||||||
|
while inGSettings["ProcessorDict"]["ExecuteBool"]:
|
||||||
|
lActivityList = inGSettings["ProcessorDict"]["ActivityList"] # Alias
|
||||||
|
if len(lActivityList)>0:
|
||||||
|
if lL: lL.debug(f'Processor ActivityList len: {len(lActivityList)}')
|
||||||
|
lActivityItem = inGSettings["ProcessorDict"]["ActivityList"].pop(0) # Extract the first item from processor queue
|
||||||
|
ActivityListExecute(inGSettings = inGSettings, inActivityList = [lActivityItem]) # execute the activity item
|
||||||
|
else:
|
||||||
|
time.sleep(inGSettings["ProcessorDict"]["CheckIntervalSecFloat"]) # Sleep when list is empty
|
||||||
|
|
||||||
|
# Execute ActivityItem list
|
||||||
|
# return the def result
|
||||||
|
def ActivityListExecute(inGSettings, inActivityList):
|
||||||
|
lL = inGSettings["Logger"] # Logger alias
|
||||||
|
lResultList = [] # init the result list
|
||||||
|
for lActivityItem in inActivityList: # Iterate throught the activity list
|
||||||
|
lDef = None # Def variable
|
||||||
|
if callable(lActivityItem["Def"]): # CHeck if def is callable
|
||||||
|
lDef = lActivityItem["Def"] # Get the def
|
||||||
|
else: # Is not callable - check alias
|
||||||
|
lDef = inGSettings["ProcessorDict"]["AliasDefDict"].get(lActivityItem["Def"], None) # get def if def key in Alias def storage
|
||||||
|
#gSettings
|
||||||
|
lGSettingsDictKey = lActivityItem.pop("ArgGSettings",None)
|
||||||
|
# # Prepare arg dict - gSettings
|
||||||
|
if type(lGSettingsDictKey) is str: # check if gSetting key is in ArgDict
|
||||||
|
lActivityItem["ArgDict"][lGSettingsDictKey] = inGSettings # Set the gSettings in dict
|
||||||
|
# # Prepare arg list
|
||||||
|
elif type(lGSettingsDictKey) is int: # check if gSetting key is in ArgDict
|
||||||
|
lActivityItem["ArgList"].insert(lGSettingsDictKey,inGSettings)# Set the gSettings in list by the index
|
||||||
|
#Logger
|
||||||
|
lLoggerDictKey = lActivityItem.pop("ArgLogger",None)
|
||||||
|
# # Prepare arg dict - gSettings
|
||||||
|
if type(lLoggerDictKey) is str: # check if gSetting key is in ArgDict
|
||||||
|
lActivityItem["ArgDict"][lLoggerDictKey] = lL # Set the lLogger in dict
|
||||||
|
# # Prepare arg list
|
||||||
|
elif type(lLoggerDictKey) is int: # check if gSetting key is in ArgDict
|
||||||
|
lActivityItem["ArgList"].insert(lLoggerDictKey,lL)# Set the lLogger in list by the index
|
||||||
|
|
||||||
|
try: # try to run function from Processor.py
|
||||||
|
lActivityItemResult = lDef(*lActivityItem["ArgList"], **lActivityItem["ArgDict"])
|
||||||
|
lResultList.append(lActivityItemResult) # return the result
|
||||||
|
except Exception as e:
|
||||||
|
if lL: lL.exception(f"Processor.ActivityListExecute: Exception in def execution - activity will be ignored. Activity item: {lActivityItem}") # Logging
|
||||||
|
lResultList.append(e) # return the generated exception
|
||||||
|
return lResultList # return the result list
|
@ -0,0 +1,97 @@
|
|||||||
|
import threading, socket, getpass, sys, uuid, subprocess, base64
|
||||||
|
from . import O2A, A2O # Data flow Orchestrator To Agent
|
||||||
|
from . import Processor # Processor Queue
|
||||||
|
|
||||||
|
# Create binary file by the base64 string (safe for JSON transmition)
|
||||||
|
def OSFileBinaryDataBase64StrCreate(inFilePathStr, inFileDataBase64Str,inGSettings = None):
|
||||||
|
""" Create binary file by the base64 string (safe for JSON transmition)"""
|
||||||
|
lFile = open(inFilePathStr, "wb")
|
||||||
|
lFile.write(base64.b64decode(inFileDataBase64Str))
|
||||||
|
lFile.close()
|
||||||
|
lL = inGSettings.get("Logger", None) if type(inGSettings) is dict else None
|
||||||
|
lMessageStr = f"AGENT Binary file {inFilePathStr} has been created."
|
||||||
|
if lL: lL.info(lMessageStr)
|
||||||
|
A2O.LogListSend(inGSettings=inGSettings, inLogList=[lMessageStr])
|
||||||
|
|
||||||
|
# Create text file by the string
|
||||||
|
def OSFileTextDataStrCreate(inFilePathStr, inFileDataStr, inEncodingStr = "utf-8",inGSettings = None):
|
||||||
|
lFile = open(inFilePathStr, "w", encoding=inEncodingStr)
|
||||||
|
lFile.write(inFileDataStr)
|
||||||
|
lFile.close()
|
||||||
|
lL = inGSettings.get("Logger", None) if type(inGSettings) is dict else None
|
||||||
|
lMessageStr = f"AGENT Text file {inFilePathStr} has been created."
|
||||||
|
if lL: lL.info(lMessageStr)
|
||||||
|
A2O.LogListSend(inGSettings=inGSettings, inLogList=[lMessageStr])
|
||||||
|
|
||||||
|
# Send CMD to OS. Result return to log + Orchestrator by the A2O connection
|
||||||
|
def OSCMD(inCMDStr, inRunAsyncBool=True, inGSettings = None):
|
||||||
|
lResultStr = ""
|
||||||
|
# Subdef to listen OS result
|
||||||
|
def _CMDRunAndListenLogs(inCMDStr, inGSettings = None):
|
||||||
|
lL = inGSettings.get("Logger",None) if type(inGSettings) is dict else None
|
||||||
|
lResultStr = ""
|
||||||
|
lOSCMDKeyStr = str(uuid.uuid4())[0:4].upper()
|
||||||
|
lCMDProcess = subprocess.Popen(f'cmd /c {inCMDStr}', stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
||||||
|
lListenBool = True
|
||||||
|
lMessageStr = f"{lOSCMDKeyStr}: # # # # AGENT CMD Process has been STARTED # # # # "
|
||||||
|
if lL: lL.info(lMessageStr)
|
||||||
|
A2O.LogListSend(inGSettings=inGSettings,inLogList=[lMessageStr])
|
||||||
|
lMessageStr = f"{lOSCMDKeyStr}: {inCMDStr}"
|
||||||
|
if lL: lL.info(lMessageStr)
|
||||||
|
A2O.LogListSend(inGSettings=inGSettings, inLogList=[lMessageStr])
|
||||||
|
while lListenBool:
|
||||||
|
lOutputLineBytes = lCMDProcess.stdout.readline()
|
||||||
|
if lOutputLineBytes == b"":
|
||||||
|
lListenBool = False
|
||||||
|
lStr = lOutputLineBytes.decode('cp866')
|
||||||
|
if lStr.endswith("\n"): lStr = lStr[:-1]
|
||||||
|
lMessageStr = f"{lOSCMDKeyStr}: {lStr}"
|
||||||
|
if lL: lL.info(lMessageStr)
|
||||||
|
A2O.LogListSend(inGSettings=inGSettings, inLogList=[lMessageStr])
|
||||||
|
lResultStr+=lStr
|
||||||
|
lMessageStr = f"{lOSCMDKeyStr}: # # # # AGENT CMD Process has been FINISHED # # # # "
|
||||||
|
if lL: lL.info(lMessageStr)
|
||||||
|
A2O.LogListSend(inGSettings=inGSettings, inLogList=[lMessageStr])
|
||||||
|
return lResultStr
|
||||||
|
# New call
|
||||||
|
if inRunAsyncBool:
|
||||||
|
lThread = threading.Thread(target=_CMDRunAndListenLogs, kwargs={"inCMDStr":inCMDStr, "inGSettings":inGSettings})
|
||||||
|
lThread.start()
|
||||||
|
lResultStr="ActivityList has been started in async mode - no output is available here."
|
||||||
|
else:
|
||||||
|
lResultStr = _CMDRunAndListenLogs(inCMDStr=inCMDStr, inGSettings=inGSettings)
|
||||||
|
#lCMDCode = "cmd /c " + inCMDStr
|
||||||
|
#subprocess.Popen(lCMDCode)
|
||||||
|
#lResultCMDRun = 1 # os.system(lCMDCode)
|
||||||
|
return lResultStr
|
||||||
|
|
||||||
|
|
||||||
|
# Main def
|
||||||
|
def Agent(inGSettings):
|
||||||
|
lL = inGSettings["Logger"]
|
||||||
|
|
||||||
|
# Append Orchestrator def to ProcessorDictAlias
|
||||||
|
lModule = sys.modules[__name__]
|
||||||
|
lModuleDefList = dir(lModule)
|
||||||
|
for lItemDefNameStr in lModuleDefList:
|
||||||
|
# Dont append alias for defs Agent
|
||||||
|
if lItemDefNameStr not in ["Agent"]:
|
||||||
|
lItemDef = getattr(lModule,lItemDefNameStr)
|
||||||
|
if callable(lItemDef): inGSettings["ProcessorDict"]["AliasDefDict"][lItemDefNameStr]=lItemDef
|
||||||
|
|
||||||
|
# Detect Machine host name and username
|
||||||
|
inGSettings["AgentDict"]["HostNameUpperStr"] = socket.gethostname().upper()
|
||||||
|
inGSettings["AgentDict"]["UserUpperStr"] = getpass.getuser().upper()
|
||||||
|
|
||||||
|
# Processor thread
|
||||||
|
lProcessorThread = threading.Thread(target= Processor.ProcessorRunSync, kwargs={"inGSettings":inGSettings})
|
||||||
|
lProcessorThread.daemon = True # Run the thread in daemon mode.
|
||||||
|
lProcessorThread.start() # Start the thread execution.
|
||||||
|
if lL: lL.info("Processor has been started (ProcessorDict)") #Logging
|
||||||
|
|
||||||
|
# Start thread to wait data from Orchestrator (O2A)
|
||||||
|
lO2AThread = threading.Thread(target=O2A.O2A_Loop, kwargs={"inGSettings":inGSettings})
|
||||||
|
lO2AThread.start()
|
||||||
|
|
||||||
|
# Send log that Agent has been started
|
||||||
|
A2O.LogListSend(inGSettings=inGSettings, inLogList=[f'Host: {inGSettings["AgentDict"]["HostNameUpperStr"]}, User: {inGSettings["AgentDict"]["UserUpperStr"]}, Agent has been started.'])
|
@ -0,0 +1,2 @@
|
|||||||
|
# TEST
|
||||||
|
Hello world
|
@ -0,0 +1,2 @@
|
|||||||
|
# Defs to use in ControlPanel files to render panels (busines users + technical user manipulations)
|
||||||
|
|
@ -0,0 +1,5 @@
|
|||||||
|
import threading
|
||||||
|
|
||||||
|
# Check if current execution is in Processor thread
|
||||||
|
def IsProcessorThread(inGSettings):
|
||||||
|
return inGSettings["ProcessorDict"]["ThreadIdInt"] == threading.get_ident()
|
@ -0,0 +1,322 @@
|
|||||||
|
import datetime
|
||||||
|
import http.client
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import subprocess
|
||||||
|
import importlib
|
||||||
|
import psutil
|
||||||
|
from . import BackwardCompatibility # Use backward compatibility to goes to the new processor
|
||||||
|
from . import Processor # Use new processor
|
||||||
|
import copy
|
||||||
|
#Input arg
|
||||||
|
# [
|
||||||
|
# {
|
||||||
|
# "Type": <RemoteMachineProcessingRun>,
|
||||||
|
# host: <localhost>,
|
||||||
|
# port: <port>,
|
||||||
|
# bodyObject: <object dict, int, str, list>
|
||||||
|
# },
|
||||||
|
# -----BELOW IS UPDATED----------------
|
||||||
|
# {
|
||||||
|
# "Type": "CMDStart",
|
||||||
|
# "Command": ""
|
||||||
|
# },
|
||||||
|
# -----BELOW IS UPDATED----------------
|
||||||
|
# {
|
||||||
|
# "Type": "OrchestratorRestart"
|
||||||
|
# },
|
||||||
|
# -----BELOW IS UPDATED----------------
|
||||||
|
# {
|
||||||
|
# "Type": "OrchestratorSessionSave"
|
||||||
|
# },
|
||||||
|
# -----BELOW IS UPDATED----------------
|
||||||
|
# {
|
||||||
|
# "Type": "GlobalDictKeyListValueSet",
|
||||||
|
# "KeyList": ["key1","key2",...],
|
||||||
|
# "Value": <List, Dict, String, int>
|
||||||
|
# },
|
||||||
|
# -----BELOW IS UPDATED----------------
|
||||||
|
# {
|
||||||
|
# "Type": "GlobalDictKeyListValueAppend",
|
||||||
|
# "KeyList": ["key1","key2",...],
|
||||||
|
# "Value": <List, Dict, String, int>
|
||||||
|
# },
|
||||||
|
# -----BELOW IS UPDATED----------------
|
||||||
|
# {
|
||||||
|
# "Type": "GlobalDictKeyListValueOperator+",
|
||||||
|
# "KeyList": ["key1","key2",...],
|
||||||
|
# "Value": <List, Dict, String, int>
|
||||||
|
# },
|
||||||
|
# -----BELOW IS UPDATED----------------
|
||||||
|
# {
|
||||||
|
# "Type": "GlobalDictKeyListValueGet",
|
||||||
|
# "KeyList": ["key1","key2",...]
|
||||||
|
# },
|
||||||
|
# -----BELOW IS UPDATED----------------
|
||||||
|
# {
|
||||||
|
# "Type":"ProcessStart",
|
||||||
|
# "Path":"",
|
||||||
|
# "ArgList":[]
|
||||||
|
# },
|
||||||
|
# -----BELOW IS UPDATED----------------
|
||||||
|
# {
|
||||||
|
# "Type":"ProcessStartIfTurnedOff",
|
||||||
|
# "CheckTaskName":"", #Check if current task name is not active (then start process),
|
||||||
|
# "Path":"",
|
||||||
|
# "ArgList":[]
|
||||||
|
# },
|
||||||
|
# -----BELOW IS UPDATED----------------
|
||||||
|
# {
|
||||||
|
# "Type":"ProcessStop",
|
||||||
|
# "Name":"",
|
||||||
|
# "FlagForce":True,
|
||||||
|
# "User":"" #Empty - all users, user or %username%
|
||||||
|
# },
|
||||||
|
# -----BELOW IS UPDATED----------------
|
||||||
|
# {
|
||||||
|
# "Type":"PythonStart",
|
||||||
|
# "ModuleName":"",
|
||||||
|
# "FunctionName":"",
|
||||||
|
# "ArgList":[],
|
||||||
|
# "ArgDict":{}
|
||||||
|
# },
|
||||||
|
# -----BELOW IS UPDATED----------------
|
||||||
|
# {
|
||||||
|
# "Type":"WindowsLogon",
|
||||||
|
# "Domain":"",
|
||||||
|
# "User":"",
|
||||||
|
# "Password":""
|
||||||
|
# # Return "Result": True - user is logged on, False - user is not logged on
|
||||||
|
# }
|
||||||
|
# ]
|
||||||
|
##################################
|
||||||
|
#Output result
|
||||||
|
# <input arg> with attributes:
|
||||||
|
# "DateTimeUTCStringStart"
|
||||||
|
# "DateTimeUTCStringStop"
|
||||||
|
# "Result"
|
||||||
|
gSettingsDict = None
|
||||||
|
def Activity(inActivity):
|
||||||
|
lItem = copy.deepcopy(inActivity)
|
||||||
|
global gSettingsDict
|
||||||
|
# Update 2020.10 - go to the new processor
|
||||||
|
lActivityNew = BackwardCompatibility.v1_2_0_ProcessorOld2NewActivityDict(inActivityOld=inActivity)
|
||||||
|
# Append new activity in list
|
||||||
|
lItem["Result"] = Processor.ActivityListExecute(inGSettings = gSettingsDict, inActivityList = [lActivityNew])[0]
|
||||||
|
"""
|
||||||
|
#Глобальная переменная - глобальный словарь унаследованный от Settings.py
|
||||||
|
lL = gSettingsDict["Logger"] # Alias for logger
|
||||||
|
#Alias (compatibility)
|
||||||
|
lItem = inActivity
|
||||||
|
lCurrentDateTime = datetime.datetime.now()
|
||||||
|
###########################################################
|
||||||
|
#Обработка запроса на отправку команды на удаленную машину
|
||||||
|
###########################################################
|
||||||
|
if lItem["Type"]=="RemoteMachineProcessingRun":
|
||||||
|
lHTTPConnection = http.client.HTTPConnection(lItem["host"], lItem["port"], timeout=5)
|
||||||
|
try:
|
||||||
|
lHTTPConnection.request("POST","/ProcessingRun",json.dumps(lItem["bodyObject"]))
|
||||||
|
except Exception as e:
|
||||||
|
#Объединение словарей
|
||||||
|
lItem["Result"] = {"State":"disconnected","ExceptionString":str(e)}
|
||||||
|
else:
|
||||||
|
lHTTPResponse=lHTTPConnection.getresponse()
|
||||||
|
lHTTPResponseByteArray=lHTTPResponse.read()
|
||||||
|
lItem["Result"] = json.loads(lHTTPResponseByteArray.decode('utf8'))
|
||||||
|
###########################################################
|
||||||
|
#Обработка команды CMDStart
|
||||||
|
###########################################################
|
||||||
|
if lItem["Type"]=="CMDStart":
|
||||||
|
lCMDCode="cmd /c "+lItem["Command"]
|
||||||
|
subprocess.Popen(lCMDCode)
|
||||||
|
lResultCMDRun=1#os.system(lCMDCode)
|
||||||
|
lItem["Result"] = str(lResultCMDRun)
|
||||||
|
###########################################################
|
||||||
|
#Обработка команды 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":
|
||||||
|
lDict = gSettingsDict
|
||||||
|
for lItem2 in lItem["KeyList"][:-1]:
|
||||||
|
#Check if key - value exists
|
||||||
|
if lItem2 in lDict:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
lDict[lItem2]={}
|
||||||
|
lDict=lDict[lItem2]
|
||||||
|
#Set value
|
||||||
|
lDict[lItem["KeyList"][-1]]=lItem["Value"]
|
||||||
|
lItem["Result"] = True
|
||||||
|
###########################################################
|
||||||
|
# Обработка команды GlobalDictKeyListValueAppend
|
||||||
|
###########################################################
|
||||||
|
if lItem["Type"] == "GlobalDictKeyListValueAppend":
|
||||||
|
lDict = gSettingsDict
|
||||||
|
for lItem2 in lItem["KeyList"][:-1]:
|
||||||
|
# Check if key - value exists
|
||||||
|
if lItem2 in lDict:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
lDict[lItem2] = {}
|
||||||
|
lDict = lDict[lItem2]
|
||||||
|
# Set value
|
||||||
|
lDict[lItem["KeyList"][-1]].append(lItem["Value"])
|
||||||
|
lItem["Result"] = True
|
||||||
|
###########################################################
|
||||||
|
# Обработка команды GlobalDictKeyListValueOperator+
|
||||||
|
###########################################################
|
||||||
|
if lItem["Type"] == "GlobalDictKeyListValueOperator+":
|
||||||
|
lDict = gSettingsDict
|
||||||
|
for lItem2 in lItem["KeyList"][:-1]:
|
||||||
|
# Check if key - value exists
|
||||||
|
if lItem2 in lDict:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
lDict[lItem2] = {}
|
||||||
|
lDict = lDict[lItem2]
|
||||||
|
# Set value
|
||||||
|
lDict[lItem["KeyList"][-1]]+=lItem["Value"]
|
||||||
|
lItem["Result"] = True
|
||||||
|
###########################################################
|
||||||
|
#Обработка команды GlobalDictKeyListValueGet
|
||||||
|
###########################################################
|
||||||
|
if lItem["Type"]=="GlobalDictKeyListValueGet":
|
||||||
|
lDict = gSettingsDict
|
||||||
|
for lItem2 in lItem["KeyList"][:-1]:
|
||||||
|
#Check if key - value exists
|
||||||
|
if lItem2 in lDict:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
lDict[lItem2]={}
|
||||||
|
lDict=lDict[lItem2]
|
||||||
|
#Return value
|
||||||
|
lItem["Result"]=lDict.get(lItem["KeyList"][-1],None)
|
||||||
|
#####################################
|
||||||
|
#ProcessStart
|
||||||
|
#####################################
|
||||||
|
if lItem["Type"]=="ProcessStart":
|
||||||
|
#Вид активности - запуск процесса
|
||||||
|
#Запись в массив отработанных активностей
|
||||||
|
#Запустить процесс
|
||||||
|
lItemArgs=[lItem["Path"]]
|
||||||
|
lItemArgs.extend(lItem["ArgList"])
|
||||||
|
subprocess.Popen(lItemArgs,shell=True)
|
||||||
|
#####################################
|
||||||
|
#ProcessStartIfTurnedOff
|
||||||
|
#####################################
|
||||||
|
if lItem["Type"]=="ProcessStartIfTurnedOff":
|
||||||
|
#Check if process running
|
||||||
|
#remove .exe from Taskname if exists
|
||||||
|
lCheckTaskName = lItem["CheckTaskName"]
|
||||||
|
if len(lCheckTaskName)>4:
|
||||||
|
if lCheckTaskName[-4:].upper() != ".EXE":
|
||||||
|
lCheckTaskName = lCheckTaskName+".exe"
|
||||||
|
else:
|
||||||
|
lCheckTaskName = lCheckTaskName+".exe"
|
||||||
|
#Check if process exist
|
||||||
|
if not CheckIfProcessRunning(lCheckTaskName):
|
||||||
|
#Вид активности - запуск процесса
|
||||||
|
#Запись в массив отработанных активностей
|
||||||
|
#Запустить процесс
|
||||||
|
lItemArgs=[lItem["Path"]]
|
||||||
|
lItemArgs.extend(lItem["ArgList"])
|
||||||
|
subprocess.Popen(lItemArgs,shell=True)
|
||||||
|
#################################
|
||||||
|
#ProcessStop
|
||||||
|
#################################
|
||||||
|
if lItem["Type"]=="ProcessStop":
|
||||||
|
#Вид активности - остановка процесса
|
||||||
|
#часовой пояс пока не учитываем
|
||||||
|
#Сформировать команду на завершение
|
||||||
|
lActivityCloseCommand='taskkill /im '+lItem["Name"]
|
||||||
|
#TODO Сделать безопасную обработку,если параметра нет в конфигурации
|
||||||
|
if lItem.get('FlagForce',False):
|
||||||
|
lActivityCloseCommand+=" /F"
|
||||||
|
#Завершить процессы только текущего пользоваиеля
|
||||||
|
if lItem.get('User',"")!="":
|
||||||
|
lActivityCloseCommand+=f' /fi "username eq {lItem["User"]}"'
|
||||||
|
#Завершить процесс
|
||||||
|
os.system(lActivityCloseCommand)
|
||||||
|
#################################
|
||||||
|
#PythonStart
|
||||||
|
#################################
|
||||||
|
if lItem["Type"]=="PythonStart":
|
||||||
|
try:
|
||||||
|
#Подключить модуль для вызова
|
||||||
|
lModule=importlib.import_module(lItem["ModuleName"])
|
||||||
|
#Найти функцию
|
||||||
|
lFunction=getattr(lModule,lItem["FunctionName"])
|
||||||
|
lItem["Result"]=lFunction(*lItem.get("ArgList",[]),**lItem.get("ArgDict",{}))
|
||||||
|
except Exception as e:
|
||||||
|
if lL: lL.exception("Loop activity error: module/function not founded")
|
||||||
|
#################################
|
||||||
|
# Windows logon
|
||||||
|
#################################
|
||||||
|
if lItem["Type"] == "WindowsLogon":
|
||||||
|
import win32security
|
||||||
|
try:
|
||||||
|
hUser = win32security.LogonUser(
|
||||||
|
lItem["User"],
|
||||||
|
lItem["Domain"],
|
||||||
|
lItem["Password"],
|
||||||
|
win32security.LOGON32_LOGON_NETWORK,
|
||||||
|
win32security.LOGON32_PROVIDER_DEFAULT
|
||||||
|
)
|
||||||
|
except win32security.error:
|
||||||
|
lItem["Result"] = False
|
||||||
|
else:
|
||||||
|
lItem["Result"] = True
|
||||||
|
###################################
|
||||||
|
"""
|
||||||
|
#Вернуть результат
|
||||||
|
return lItem
|
||||||
|
|
||||||
|
def ActivityListOrDict(inActivityListOrDict):
|
||||||
|
#Check arg type (list or dict)
|
||||||
|
if type(inActivityListOrDict)==list:
|
||||||
|
#List activity
|
||||||
|
lResult=[]
|
||||||
|
for lItem in inActivityListOrDict:
|
||||||
|
lResult.append(Activity(lItem))
|
||||||
|
return lResult
|
||||||
|
if type(inActivityListOrDict)==dict:
|
||||||
|
#Dict activity
|
||||||
|
return Activity(inActivityListOrDict)
|
||||||
|
|
||||||
|
def CheckIfProcessRunning(processName):
|
||||||
|
'''
|
||||||
|
Check if there is any running process that contains the given name processName.
|
||||||
|
'''
|
||||||
|
#Iterate over the all the running process
|
||||||
|
for proc in psutil.process_iter():
|
||||||
|
try:
|
||||||
|
# Check if process name contains the given name string.
|
||||||
|
if processName.lower() in proc.name().lower():
|
||||||
|
return True
|
||||||
|
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
|
||||||
|
pass
|
||||||
|
return False;
|
@ -0,0 +1,364 @@
|
|||||||
|
import os, logging, datetime, sys
|
||||||
|
|
||||||
|
# Technical def - return GSettings structure with examples
|
||||||
|
def __Create__():
|
||||||
|
return {
|
||||||
|
"VersionStr": None, # Will be filled in orchestrator,
|
||||||
|
"Autocleaner": {
|
||||||
|
# Some gurbage is collecting in g settings. So you can configure autocleaner to periodically clear gSettings
|
||||||
|
"IntervalSecFloat": 3600.0, # Sec float to periodically clear gsettings
|
||||||
|
},
|
||||||
|
"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
|
||||||
|
# }
|
||||||
|
},
|
||||||
|
},
|
||||||
|
# # # # # # Client... # # # # # # # #
|
||||||
|
"DumpLogListRefreshIntervalSecFloat": 3.0, # Duration between updates for the Client
|
||||||
|
"DumpLogListCountInt": 100, # Set the max row for the dump
|
||||||
|
"DumpLogList": [], # Will be filled automatically
|
||||||
|
"DumpLogListHashStr": None, # Will be filled automatically
|
||||||
|
# # # # # # # # # # # # # # # # # #
|
||||||
|
},
|
||||||
|
"ServerDict": {
|
||||||
|
"WorkingDirectoryPathStr": None, # Will be filled automatically
|
||||||
|
"RequestTimeoutSecFloat": 300, # Time to handle request in seconds
|
||||||
|
"ListenPort_": "Порт, по которому можно подключиться к демону",
|
||||||
|
"ListenPort": 80,
|
||||||
|
"ListenURLList": [
|
||||||
|
{
|
||||||
|
"Description": "Local machine test",
|
||||||
|
"URL_": "Сетевое расположение сервера демона",
|
||||||
|
"URL": ""
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"AccessUsers": { # Default - all URL is blocked
|
||||||
|
"FlagCredentialsAsk": True, # Turn on Authentication
|
||||||
|
"RuleDomainUserDict": {
|
||||||
|
# ("DOMAIN", "USER"): { !!!!! only in upper case !!!!
|
||||||
|
# "MethodMatchURLBeforeList": [
|
||||||
|
# {
|
||||||
|
# "Method":"GET|POST",
|
||||||
|
# "MatchType":"BeginWith|Contains|Equal|EqualCase",
|
||||||
|
# "URL":"",
|
||||||
|
# "FlagAccessDefRequestGlobalAuthenticate": None, #Return bool
|
||||||
|
# "FlagAccess": True
|
||||||
|
# }
|
||||||
|
# ],
|
||||||
|
# "ControlPanelKeyAllowedList":[], # If empty - all is allowed
|
||||||
|
# "RoleHierarchyAllowedDict": {
|
||||||
|
# "Orchestrator":{
|
||||||
|
# "Controls": {
|
||||||
|
# "RestartOrchestrator": {}, # Feature to restart orchestrator on virtual machine
|
||||||
|
# "LookMachineScreenshots": {} # Feature to look machina screenshots
|
||||||
|
# },
|
||||||
|
# "RDPActive": { # Robot RDP active module
|
||||||
|
# "ListRead": {} # Access to read RDP session list
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
},
|
||||||
|
"RuleMethodMatchURLBeforeList": [ # General MethodMatchURL list (no domain/user)
|
||||||
|
# {
|
||||||
|
# "Method":"GET|POST",
|
||||||
|
# "MatchType":"BeginWith|Contains|Equal|EqualCase",
|
||||||
|
# "URL":"",
|
||||||
|
# "FlagAccessDefRequestGlobalAuthenticate": None, #Return bool
|
||||||
|
# "FlagAccess": True
|
||||||
|
# }
|
||||||
|
],
|
||||||
|
"AuthTokensDict": {
|
||||||
|
# "<AuthToken>":{"User":"", "Domain":"", "TokenDatetime":<Datetime>, "FlagDoNotExpire":True}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"URLList": [ # List of available URLs with the orchestrator server
|
||||||
|
# {
|
||||||
|
# "Method":"GET|POST",
|
||||||
|
# "URL": "/index", #URL of the request
|
||||||
|
# "MatchType": "", #"BeginWith|Contains|Equal|EqualCase",
|
||||||
|
# "ResponseFilePath": "", #Absolute or relative path
|
||||||
|
# "ResponseFolderPath": "", #Absolute or relative path
|
||||||
|
# "ResponseContentType": "", #HTTP Content-type
|
||||||
|
# "ResponseDefRequestGlobal": None #Function with str result
|
||||||
|
# }
|
||||||
|
{
|
||||||
|
"Method": "GET",
|
||||||
|
"URL": "/test/", # URL of the request
|
||||||
|
"MatchType": "BeginWith", # "BeginWith|Contains|Equal|EqualCase",
|
||||||
|
# "ResponseFilePath": "", #Absolute or relative path
|
||||||
|
"ResponseFolderPath": "C:\Abs\Archive\scopeSrcUL\OpenRPA\Orchestrator\Settings",
|
||||||
|
# Absolute or relative path
|
||||||
|
# "ResponseContentType": "", #HTTP Content-type
|
||||||
|
# "ResponseDefRequestGlobal": None #Function with str result
|
||||||
|
}
|
||||||
|
],
|
||||||
|
|
||||||
|
},
|
||||||
|
"OrchestratorStart": {
|
||||||
|
"DefSettingsUpdatePathList": [],
|
||||||
|
# List of the .py files which should be loaded before init the algorythms
|
||||||
|
"ActivityList": [
|
||||||
|
# {
|
||||||
|
# "Type": "ProcessStop", #Activity type
|
||||||
|
# "Name": "OpenRPARobotDaemon.exe", #Process name
|
||||||
|
# "FlagForce": True, #Force process close
|
||||||
|
# "User": "%username%" #Empty, user or %username%
|
||||||
|
# },
|
||||||
|
# {
|
||||||
|
# "Type": "ProcessStartIfTurnedOff", #Activity type
|
||||||
|
# "CheckTaskName": "notepad.exe", #Python function module name
|
||||||
|
# "Path": "notepad", #Python function name
|
||||||
|
# "ArgList": [] #Input python function args
|
||||||
|
# },
|
||||||
|
# {
|
||||||
|
# "Type": "RDPSessionConnect", #Activity type - start/connect RDP Session
|
||||||
|
# "RDPSessionKeyStr": "notepad.exe", #Python function module name
|
||||||
|
# "RDPConfigurationDict": {}
|
||||||
|
# },
|
||||||
|
# {
|
||||||
|
# "Type": "RDPSessionLogoff", #Activity type - logoff RDP Session
|
||||||
|
# "RDPSessionKeyStr": "notepad.exe", #Python function module name
|
||||||
|
# },
|
||||||
|
# {
|
||||||
|
# "Type": "RDPSessionDisconnect", #Activity type - disconnect the RDP Session without logoff
|
||||||
|
# "RDPSessionKeyStr": "notepad.exe", #Python function module name
|
||||||
|
# },
|
||||||
|
# {
|
||||||
|
# "Type": "RDPSessionFileSend", #Activity type - send file to RDP session
|
||||||
|
# ...
|
||||||
|
# },
|
||||||
|
# {
|
||||||
|
# "Type": "RDPSessionFileRecieve", #Activity type - recieve file from rdp session
|
||||||
|
# ...
|
||||||
|
# },
|
||||||
|
# {
|
||||||
|
# "Type": "RDPSessionProcessStart", #Activity type -
|
||||||
|
# ...
|
||||||
|
# },
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"SchedulerDict": {
|
||||||
|
"CheckIntervalSecFloat": 5.0, # Check interval in seconds
|
||||||
|
"ActivityTimeList": [
|
||||||
|
# {
|
||||||
|
# "TimeHH:MMStr": "22:23", # Time [HH:MM] to trigger activity
|
||||||
|
# "WeekdayList": [0, 1, 2, 3, 4, 5, 6], #List of the weekday index when activity is applicable, Default [0,1,2,3,4,5,6]
|
||||||
|
# "ActivityList": [
|
||||||
|
# {
|
||||||
|
# "Type": "ProcessStart", # Activity type
|
||||||
|
# "Path": "start", # Executable file path
|
||||||
|
# "ArgList": ["cmd.exe", "/c", "PIPUpgrade.cmd"] # List of the arguments
|
||||||
|
# }
|
||||||
|
# ],
|
||||||
|
# "GUID": None # Will be filled in Orchestrator automatically - is needed for detect activity completion
|
||||||
|
# },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
"ProcessorDict": { # Has been changed. New general processor (one threaded) v.1.2.0
|
||||||
|
"ActivityList": [ # List of the activities
|
||||||
|
# {
|
||||||
|
# "Def":"DefAliasTest", # def link or def alias (look gSettings["Processor"]["AliasDefDict"])
|
||||||
|
# "ArgList":[1,2,3], # Args list
|
||||||
|
# "ArgDict":{"ttt":1,"222":2,"dsd":3} # Args dictionary
|
||||||
|
# "ArgGSettings": # Name of GSettings attribute: str (ArgDict) or index (for ArgList)
|
||||||
|
# "ArgLogger": None # Name of GSettings attribute: str (ArgDict) or index (for ArgList)
|
||||||
|
# },
|
||||||
|
],
|
||||||
|
"AliasDefDict": {}, # Storage for def with Str alias. To use it see pyOpenRPA.Orchestrator.ControlPanel
|
||||||
|
"CheckIntervalSecFloat": 1.0, # Interval for check gSettings in ProcessorDict > ActivityList
|
||||||
|
"ExecuteBool": True, # Flag to execute thread processor
|
||||||
|
"ThreadIdInt": None # Technical field - will be setup when processor init
|
||||||
|
},
|
||||||
|
"ControlPanelDict": { # Old structure > CPDict
|
||||||
|
"RefreshSeconds": 5, # deprecated parameter
|
||||||
|
"RobotList": [
|
||||||
|
#{
|
||||||
|
# "RenderFunction": RenderRobotR01,
|
||||||
|
# "KeyStr": "TestControlPanelKey"
|
||||||
|
#}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"CPDict": {
|
||||||
|
# "CPKey": {"HTMLRenderDef":None, "JSONGeneratorDef":None, "JSInitGeneratorDef":None}
|
||||||
|
},
|
||||||
|
# # # # # # # # # # # # # #
|
||||||
|
"RobotRDPActive": {
|
||||||
|
"RDPList": {
|
||||||
|
# "RDPSessionKey":{
|
||||||
|
# "Host": "77.77.22.22", # Host address
|
||||||
|
# "Port": "3389", # RDP Port
|
||||||
|
# "Login": "test", # Login
|
||||||
|
# "Password": "test", # Password
|
||||||
|
# "Screen": {
|
||||||
|
# "Width": 1680, # Width of the remote desktop in pixels
|
||||||
|
# "Height": 1050, # Height of the remote desktop in pixels
|
||||||
|
# # "640x480" or "1680x1050" or "FullScreen". If Resolution not exists set full screen
|
||||||
|
# "FlagUseAllMonitors": False, # True or False
|
||||||
|
# "DepthBit": "32" # "32" or "24" or "16" or "15"
|
||||||
|
# },
|
||||||
|
# "SharedDriveList": ["c"], # List of the Root sesion hard drives
|
||||||
|
# ###### Will updated in program ############
|
||||||
|
# "SessionHex": "", # Hex is created when robot runs
|
||||||
|
# "SessionIsWindowExistBool": False, # Flag if the RDP window is exist, old name "FlagSessionIsActive". Check every n seconds
|
||||||
|
# "SessionIsWindowResponsibleBool": False, # Flag if RDP window is responsible (recieve commands). Check every nn seconds. If window is Responsible - window is Exist too
|
||||||
|
# "SessionIsIgnoredBool": False # Flag to ignore RDP window False - dont ignore, True - ignore
|
||||||
|
# }
|
||||||
|
},
|
||||||
|
"ResponsibilityCheckIntervalSec": None,
|
||||||
|
# Seconds interval when Robot check the RDP responsibility. if None - dont check
|
||||||
|
"FullScreenRDPSessionKeyStr": None,
|
||||||
|
# RDPSessionKeyStr of the current session which is full screened, None is no session in fullscreen
|
||||||
|
"ActivityList": [
|
||||||
|
# Technical Activity list for RobotRDPActive thread - equal to Main activity list, apply only RDP activity
|
||||||
|
# {
|
||||||
|
# "DefNameStr":"test", # Function name in RobotRDPActive.Processor
|
||||||
|
# "ArgList":[1,2,3], # Args list
|
||||||
|
# "ArgDict":{"ttt":1,"222":2,"dsd":3} # Args dictionary
|
||||||
|
# },
|
||||||
|
# {
|
||||||
|
# "DefNameStr": "RDPSessionConnect", # Function name in RobotRDPActive.Processor
|
||||||
|
# "ArgList": [], # Args list
|
||||||
|
# "ArgDict": {"inRDPSessionKeyStr": "TestRDP", "inHostStr": "77.44.33.22", "inPortStr": "3389",
|
||||||
|
# "inLoginStr": "login", "inPasswordStr": "pass"} # Args dictionary
|
||||||
|
# },
|
||||||
|
# {
|
||||||
|
# "DefNameStr": "RDPSessionDisconnect", # Disconnect the RDP session without logoff. Function name in RobotRDPActive.Processor
|
||||||
|
# "ArgList": [], # Args list
|
||||||
|
# "ArgDict": {"inRDPSessionKeyStr": "TestRDP"}
|
||||||
|
# },
|
||||||
|
# {
|
||||||
|
# "DefNameStr": "RDPSessionReconnect", # Disconnect the RDP session without logoff. Function name in RobotRDPActive.Processor
|
||||||
|
# "ArgList": [], # Args list
|
||||||
|
# "ArgDict": {"inRDPSessionKeyStr": "TestRDP"}
|
||||||
|
# }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
# # # # # # # # # # # # # #
|
||||||
|
"FileManager": {
|
||||||
|
"FileURLFilePathDict_help": "https://localhost:8081/filemanager/<file URL>. All FileURL s must be set in lowercase",
|
||||||
|
"FileURLFilePathDict": {
|
||||||
|
#"r01/report.xlsx": "C:\\RPA\\R01_IntegrationOrderOut\\Data\\Reestr_otgruzok.xlsx"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Logger": logging.getLogger("Orchestrator"),
|
||||||
|
"Storage": {
|
||||||
|
"Robot_R01_help": "Robot data storage in orchestrator env",
|
||||||
|
"Robot_R01": {},
|
||||||
|
"R01_OrchestratorToRobot": {"Test2": "Test2"}
|
||||||
|
},
|
||||||
|
"AgentDict": { # Will be filled when program runs
|
||||||
|
#("HostNameUpperStr", "UserUpperStr"): { "IsListenBool": True, "QueueList": [] }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create full configuration for
|
||||||
|
def __AgentDictItemCreate__():
|
||||||
|
return {"IsListenBool":False, "ConnectionCountInt":0, "ConnectionFirstQueueItemCountInt":0, "ActivityList":[]}
|
||||||
|
# Create full configuration for
|
||||||
|
def __UACClientAdminCreate__():
|
||||||
|
lResultDict = {
|
||||||
|
"pyOpenRPADict":{
|
||||||
|
"CPKeyDict":{ # Empty dict - all access
|
||||||
|
# "CPKeyStr"{
|
||||||
|
# }
|
||||||
|
},
|
||||||
|
"RDPKeyDict":{ # Empty dict - all access
|
||||||
|
#"RDPKeyStr"{
|
||||||
|
# "FullscreenBool": True,
|
||||||
|
# "IgnoreBool":True,
|
||||||
|
# "ReconnectBool": True
|
||||||
|
# "NothingBool": True # USe option if you dont want to give some access to the RDP controls
|
||||||
|
# }
|
||||||
|
},
|
||||||
|
"AgentKeyDict": { # Empty dict - all access
|
||||||
|
# "AgentKeyStr"{
|
||||||
|
# }
|
||||||
|
},
|
||||||
|
"AdminDict":{ # Empty dict - all access
|
||||||
|
"LogViewerBool":True, # Show log viewer on the web page
|
||||||
|
"CMDInputBool":True, # Execute CMD on the server side and result to the logs
|
||||||
|
"ScreenshotViewerBool":True, # Show button to look screenshots
|
||||||
|
"RestartOrchestratorBool": True, # Restart orchestrator activity
|
||||||
|
"RestartOrchestratorGITPullBool": True, # Turn off (RDP remember) orc + git pull + Turn on (rdp remember)
|
||||||
|
"RestartPCBool": True, # Send CMD to restart pc
|
||||||
|
"NothingBool":True # USe option if you dont want to give some access to the RDP controls
|
||||||
|
},
|
||||||
|
"ActivityDict": { # Empty dict - all access
|
||||||
|
"ActivityListExecuteBool": True, # Execute activity at the current thread
|
||||||
|
"ActivityListAppendProcessorQueueBool": True # Append activity to the processor queue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return lResultDict
|
||||||
|
|
||||||
|
|
||||||
|
# Init the log dump to WEB
|
||||||
|
# import pdb; pdb.set_trace()
|
||||||
|
############################################
|
||||||
|
def LoggerDumpLogHandlerAdd(inLogger, inGSettingsClientDict):
|
||||||
|
lL = inLogger
|
||||||
|
if len(lL.handlers) == 0:
|
||||||
|
mRobotLoggerFormatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
|
||||||
|
else:
|
||||||
|
mRobotLoggerFormatter = lL.handlers[0].formatter
|
||||||
|
mHandlerDumpLogList = LoggerHandlerDumpLogList.LoggerHandlerDumpLogList(inDict=inGSettingsClientDict,
|
||||||
|
inKeyStr="DumpLogList", inHashKeyStr="DumpLogListHashStr", inRowCountInt=inGSettingsClientDict[
|
||||||
|
"DumpLogListCountInt"])
|
||||||
|
mHandlerDumpLogList.setFormatter(mRobotLoggerFormatter)
|
||||||
|
lL.addHandler(mHandlerDumpLogList)
|
||||||
|
|
||||||
|
# inModeStr:
|
||||||
|
# "BASIC" - create standart configuration
|
||||||
|
from pyOpenRPA.Orchestrator.Utils import LoggerHandlerDumpLogList
|
||||||
|
def Create(inModeStr="BASIC"):
|
||||||
|
if inModeStr=="BASIC":
|
||||||
|
lResult = __Create__() # Create settings
|
||||||
|
# Создать файл логирования
|
||||||
|
# add filemode="w" to overwrite
|
||||||
|
if not os.path.exists("Reports"):
|
||||||
|
os.makedirs("Reports")
|
||||||
|
##########################
|
||||||
|
# Подготовка логгера Robot
|
||||||
|
#########################
|
||||||
|
mRobotLogger = lResult["Logger"]
|
||||||
|
mRobotLogger.setLevel(logging.INFO)
|
||||||
|
# create the logging file handler
|
||||||
|
mRobotLoggerFH = logging.FileHandler(
|
||||||
|
"Reports\\" + datetime.datetime.now().strftime("%Y_%m_%d") + ".log")
|
||||||
|
mRobotLoggerFormatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
|
||||||
|
mRobotLoggerFH.setFormatter(mRobotLoggerFormatter)
|
||||||
|
# add handler to logger object
|
||||||
|
mRobotLogger.addHandler(mRobotLoggerFH)
|
||||||
|
####################Add console output
|
||||||
|
handler = logging.StreamHandler(sys.stdout)
|
||||||
|
handler.setFormatter(mRobotLoggerFormatter)
|
||||||
|
mRobotLogger.addHandler(handler)
|
||||||
|
############################################
|
||||||
|
LoggerDumpLogHandlerAdd(inLogger=mRobotLogger, inGSettingsClientDict=lResult["Client"])
|
||||||
|
#mHandlerDumpLogList = LoggerHandlerDumpLogList.LoggerHandlerDumpLogList(inDict=lResult["Client"],
|
||||||
|
# inKeyStr="DumpLogList",
|
||||||
|
# inHashKeyStr="DumpLogListHashStr",
|
||||||
|
# inRowCountInt=lResult["Client"][
|
||||||
|
# "DumpLogListCountInt"])
|
||||||
|
#mHandlerDumpLogList.setFormatter(mRobotLoggerFormatter)
|
||||||
|
#mRobotLogger.addHandler(mHandlerDumpLogList)
|
||||||
|
return lResult # return the result dict
|
@ -0,0 +1,16 @@
|
|||||||
|
from logging import StreamHandler
|
||||||
|
|
||||||
|
class LoggerHandlerDumpLogList(StreamHandler):
|
||||||
|
def __init__(self, inDict, inKeyStr, inHashKeyStr, inRowCountInt):
|
||||||
|
StreamHandler.__init__(self)
|
||||||
|
self.Dict = inDict
|
||||||
|
self.KeyStr = inKeyStr
|
||||||
|
self.HashKeyStr = inHashKeyStr
|
||||||
|
self.RowCountInt = inRowCountInt
|
||||||
|
self.Dict[self.HashKeyStr]="0"
|
||||||
|
def emit(self, inRecord):
|
||||||
|
inMessageStr = self.format(inRecord)
|
||||||
|
self.Dict[self.KeyStr].append(inMessageStr)
|
||||||
|
self.Dict[self.HashKeyStr]=str(int(self.Dict[self.HashKeyStr])+1)
|
||||||
|
if len(self.Dict[self.KeyStr])>self.RowCountInt:
|
||||||
|
self.Dict[self.KeyStr].pop(0)
|
@ -0,0 +1,122 @@
|
|||||||
|
import json
|
||||||
|
from .. import __Orchestrator__
|
||||||
|
from .. import Processor
|
||||||
|
# Escape JS to the safe JS for the inline JS in HTML tags ATTENTION! Use it only if want to paste JS into HTML tag - not in <script>
|
||||||
|
# USAGE: JSEscapeForHTMLInline(inJSStr="lTest=\"Hello World\"; alert(\"lTest\")")
|
||||||
|
def JSEscapeForHTMLInline(inJSStr):
|
||||||
|
lResult = inJSStr.replace("\"",""")
|
||||||
|
return lResult
|
||||||
|
|
||||||
|
# Create JS for send activity list/ activity to the processor
|
||||||
|
# USAGE: Orchestrator.Web.Basic.JSProcessorActivityListAdd(inActivityList)
|
||||||
|
def JSProcessorActivityListAdd(inActivityList):
|
||||||
|
Processor.__ActivityListVerify__(inActivityList=inActivityList) # DO VERIFICATION FOR THE inActivityList
|
||||||
|
# Check if no def function is here - if exist - replace to alias
|
||||||
|
for lActivityItem in inActivityList:
|
||||||
|
lDef = lActivityItem["Def"]
|
||||||
|
if callable(lDef): raise Exception(f"pyOpenRPA Exception: You can't send ActivityList with def to JS. Use Def Alias (see Orchestrator.ProcessorAliasDefUpdate)")
|
||||||
|
if type(inActivityList) is not list: inActivityList = [inActivityList]
|
||||||
|
lJSStr = f"""mGlobal.pyOpenRPA.ProcessorQueueAdd({json.dumps(inActivityList)});"""
|
||||||
|
return lJSStr
|
||||||
|
|
||||||
|
# Create JS for execute activity list/ activity permanent
|
||||||
|
# USAGE: Orchestrator.Web.Basic.JSActivityListExecute(inActivityList)
|
||||||
|
def JSActivityListExecute(inActivityList):
|
||||||
|
Processor.__ActivityListVerify__(inActivityList=inActivityList) # DO VERIFICATION FOR THE inActivityList
|
||||||
|
lJSStr = f"""mGlobal.pyOpenRPA.ActivityListExecute({json.dumps(inActivityList)});"""
|
||||||
|
return lJSStr
|
||||||
|
|
||||||
|
# Generate HTML code of the simple URL link by the URL
|
||||||
|
# USAGE: Orchestrator.Web.Basic.HTMLLinkURL(inURLStr="test",inColorStr="orange")
|
||||||
|
# USAGE: Basic.HTMLLinkURL(inURLStr="test",inColorStr="orange")
|
||||||
|
def HTMLLinkURL(inURLStr, inTitleStr=None, inColorStr=None):
|
||||||
|
lCSSStyleStr = ""
|
||||||
|
if not inTitleStr: inTitleStr = inURLStr
|
||||||
|
if inColorStr: lCSSStyleStr=f"style=\"color:{inColorStr}\""
|
||||||
|
lResult=f"<a {lCSSStyleStr} href=\"{inURLStr}\">{inTitleStr}</a>"
|
||||||
|
return lResult
|
||||||
|
|
||||||
|
# Generate HTML code of the simple URL link by the JS when onclick
|
||||||
|
# USAGE: Orchestrator.Web.Basic.HTMLLinkJSOnClick(inJSOnClickStr="",inColorStr="orange")
|
||||||
|
# USAGE: Basic.HTMLLinkJSOnClick(inJSOnClickStr="test",inColorStr="orange")
|
||||||
|
def HTMLLinkJSOnClick(inJSOnClickStr, inTitleStr, inColorStr=None):
|
||||||
|
lCSSStyleStr = ""
|
||||||
|
if inColorStr: lCSSStyleStr=f"style=\"color:{inColorStr}\""
|
||||||
|
inJSOnClickStr= JSEscapeForHTMLInline(inJSStr=inJSOnClickStr) # Escape some symbols for the inline JS
|
||||||
|
lResult=f"<a {lCSSStyleStr} onclick=\"{inJSOnClickStr}\">{inTitleStr}</a>"
|
||||||
|
return lResult
|
||||||
|
|
||||||
|
# Create HTMLLink by the def, argdict, arglist, gsettingsStr, logger Str titleStr, color, (add in processor queue)
|
||||||
|
def HTMLLinkDefProcessor(inGSettings, inDef, inArgDict=None, inArgList=None, inArgGSettingsStr=None, inArgLoggerStr=None, inLinkTitleStr=None, inLinkColorStr=""):
|
||||||
|
lDefAliasStr = inDef
|
||||||
|
if callable(inDef):
|
||||||
|
lDefAliasStr = str(inDef)
|
||||||
|
lDefAliasStr = __Orchestrator__.ProcessorAliasDefUpdate(inGSettings=inGSettings, inDef=inDef, inAliasStr=lDefAliasStr)
|
||||||
|
if inLinkTitleStr is None: inLinkTitleStr = lDefAliasStr
|
||||||
|
lActivityList = [__Orchestrator__.ProcessorActivityItemCreate(inDef=lDefAliasStr,inArgList=inArgList,inArgDict=inArgDict,inArgGSettingsStr=inArgGSettingsStr,inArgLoggerStr=inArgLoggerStr)]
|
||||||
|
lJSStr = JSProcessorActivityListAdd(lActivityList)
|
||||||
|
lHTMLStr = HTMLLinkJSOnClick(inJSOnClickStr=lJSStr,inTitleStr=inLinkTitleStr, inColorStr=inLinkColorStr)
|
||||||
|
return lHTMLStr
|
||||||
|
|
||||||
|
# Create HTMLLink by the def, argdict, arglist, gsettingsStr, logger Str titleStr, color, (execute permanently)
|
||||||
|
def HTMLLinkDefExecute(inGSettings, inDef, inArgDict=None, inArgList=None, inArgGSettingsStr=None, inArgLoggerStr=None, inLinkTitleStr=None, inLinkColorStr=""):
|
||||||
|
lDefAliasStr = inDef
|
||||||
|
if callable(inDef):
|
||||||
|
lDefAliasStr = str(inDef)
|
||||||
|
lDefAliasStr = __Orchestrator__.ProcessorAliasDefUpdate(inGSettings=inGSettings, inDef=inDef, inAliasStr=lDefAliasStr)
|
||||||
|
if inLinkTitleStr is None: inLinkTitleStr = lDefAliasStr
|
||||||
|
lActivityList = [__Orchestrator__.ProcessorActivityItemCreate(inDef=lDefAliasStr,inArgList=inArgList,inArgDict=inArgDict,inArgGSettingsStr=inArgGSettingsStr,inArgLoggerStr=inArgLoggerStr)]
|
||||||
|
lJSStr = JSActivityListExecute(lActivityList)
|
||||||
|
lHTMLStr = HTMLLinkJSOnClick(inJSOnClickStr=lJSStr,inTitleStr=inLinkTitleStr, inColorStr=inLinkColorStr)
|
||||||
|
return lHTMLStr
|
||||||
|
|
||||||
|
# HTML Generator for the CP up to v.1.2.0
|
||||||
|
def HTMLControlPanelBC(inCPDict):
|
||||||
|
# FooterButtonX2List generation
|
||||||
|
lFooterButtonX2Str = ""
|
||||||
|
for lItem in inCPDict["FooterButtonX2List"]:
|
||||||
|
lFooterButtonX2Str+=f'<div class="ui basic {lItem.get("Color","")} button" onclick="{JSEscapeForHTMLInline(lItem.get("OnClick",""))}">{lItem.get("Text","")}</div>'
|
||||||
|
# FooterButtonX1List generation
|
||||||
|
lFooterButtonX1Str = ""
|
||||||
|
for lItem in inCPDict["FooterButtonX1List"]:
|
||||||
|
lFooterButtonX1Str+=f'<div class="ui basic {lItem.get("Color","")} button" onclick="{JSEscapeForHTMLInline(lItem.get("OnClick",""))}">{lItem.get("Text","")}</div>'
|
||||||
|
# BodyKeyValue generation
|
||||||
|
lBodyKeyValueStr = ""
|
||||||
|
for lItem in inCPDict["BodyKeyValueList"]:
|
||||||
|
lBodyKeyValueStr+=f"<li>{lItem['Key']}: {lItem['Value']}</li>"
|
||||||
|
# Generate consolidated string
|
||||||
|
lResultHTMLStr = f"""
|
||||||
|
<div class="card">
|
||||||
|
<div class="content">
|
||||||
|
<div class="right floated mini ui ">
|
||||||
|
{inCPDict['HeaderRightText']}
|
||||||
|
</div>
|
||||||
|
<div class="header">
|
||||||
|
{inCPDict['HeaderLeftText']}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="meta">
|
||||||
|
{inCPDict['SubheaderText']}
|
||||||
|
</div>
|
||||||
|
<div class="description">
|
||||||
|
<ul style="padding-inline-start:16px;margin:0px">
|
||||||
|
{lBodyKeyValueStr}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="extra content">
|
||||||
|
{inCPDict['FooterText']}
|
||||||
|
</div>
|
||||||
|
<div class="extra content">
|
||||||
|
<div class="ui two buttons">
|
||||||
|
{lFooterButtonX2Str}
|
||||||
|
</div>
|
||||||
|
<div class="ui horizontal divider">Add. controls</div>
|
||||||
|
<div class="ui one buttons">
|
||||||
|
{lFooterButtonX1Str}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
"""
|
||||||
|
|
||||||
|
return lResultHTMLStr
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in new issue