diff --git a/.gitignore b/.gitignore index b9004093..6897328a 100644 --- a/.gitignore +++ b/.gitignore @@ -23,16 +23,4 @@ database.db # Misc Files/Folders .vs/s __pycache__ -/Update_Staging/ - -# Assembly Databases -/Data/Engine/Assemblies/community.db -/Data/Engine/Assemblies/community.db-shm -/Data/Engine/Assemblies/community.db-wal -/Data/Engine/Assemblies/official.db -/Data/Engine/Assemblies/official.db-shm -/Data/Engine/Assemblies/official.db-wal -/Data/Engine/Assemblies/user_created.db -/Data/Engine/Assemblies/user_created.db-shm -/Data/Engine/Assemblies/user_created.db-wal -/Data/Engine/Assemblies/Payloads/ \ No newline at end of file +/Update_Staging/ \ No newline at end of file diff --git a/Data/Engine/Assemblies/Scripts/Software Installers/Internet Browsers/Mozilla_Firefox_WIN.json b/Data/Engine/Assemblies/Payloads/17708843d44e102813a99b93ec654592d1394673/payload.json similarity index 100% rename from Data/Engine/Assemblies/Scripts/Software Installers/Internet Browsers/Mozilla_Firefox_WIN.json rename to Data/Engine/Assemblies/Payloads/17708843d44e102813a99b93ec654592d1394673/payload.json diff --git a/Data/Engine/Assemblies/Scripts/Active Directory/Unlock_AD_Account.json b/Data/Engine/Assemblies/Payloads/189e450acf0546adc35aa8d4faaea8dc0a8784cf/payload.json similarity index 100% rename from Data/Engine/Assemblies/Scripts/Active Directory/Unlock_AD_Account.json rename to Data/Engine/Assemblies/Payloads/189e450acf0546adc35aa8d4faaea8dc0a8784cf/payload.json diff --git a/Data/Engine/Assemblies/Scripts/Software Installers/7-Zip_WIN.json b/Data/Engine/Assemblies/Payloads/197e26e0237296ff6c9968f091d1ea38786266ea/payload.json similarity index 100% rename from Data/Engine/Assemblies/Scripts/Software Installers/7-Zip_WIN.json rename to Data/Engine/Assemblies/Payloads/197e26e0237296ff6c9968f091d1ea38786266ea/payload.json diff --git a/Data/Engine/Assemblies/Payloads/1e23a1b937a74cd69fc1df16d00386e3/payload.json b/Data/Engine/Assemblies/Payloads/1e23a1b937a74cd69fc1df16d00386e3/payload.json new file mode 100644 index 00000000..16ee2cf0 --- /dev/null +++ b/Data/Engine/Assemblies/Payloads/1e23a1b937a74cd69fc1df16d00386e3/payload.json @@ -0,0 +1,23 @@ +{ + "category": "script", + "description": "Import/export test script.", + "files": [], + "name": "Import Script", + "script": "V3JpdGUtSG9zdCAicm91bmQgdHJpcCBleHBvcnQi", + "script_encoding": "base64", + "sites": { + "mode": "all", + "values": [] + }, + "timeout_seconds": 45, + "type": "powershell", + "variables": [ + { + "default": "", + "label": "Example", + "name": "example", + "type": "string" + } + ], + "version": 2 +} \ No newline at end of file diff --git a/Data/Engine/Assemblies/Payloads/24d2e1f0f47f4f61a96af204175733ca/payload.json b/Data/Engine/Assemblies/Payloads/24d2e1f0f47f4f61a96af204175733ca/payload.json new file mode 100644 index 00000000..16ee2cf0 --- /dev/null +++ b/Data/Engine/Assemblies/Payloads/24d2e1f0f47f4f61a96af204175733ca/payload.json @@ -0,0 +1,23 @@ +{ + "category": "script", + "description": "Import/export test script.", + "files": [], + "name": "Import Script", + "script": "V3JpdGUtSG9zdCAicm91bmQgdHJpcCBleHBvcnQi", + "script_encoding": "base64", + "sites": { + "mode": "all", + "values": [] + }, + "timeout_seconds": 45, + "type": "powershell", + "variables": [ + { + "default": "", + "label": "Example", + "name": "example", + "type": "string" + } + ], + "version": 2 +} \ No newline at end of file diff --git a/Data/Engine/Assemblies/Payloads/373053b84099448fb73f9ce2448e5797/payload.json b/Data/Engine/Assemblies/Payloads/373053b84099448fb73f9ce2448e5797/payload.json new file mode 100644 index 00000000..5c533b92 --- /dev/null +++ b/Data/Engine/Assemblies/Payloads/373053b84099448fb73f9ce2448e5797/payload.json @@ -0,0 +1,16 @@ +{ + "category": "script", + "description": "Permission test script.", + "files": [], + "name": "Official Dev Mode Script", + "script": "V3JpdGUtSG9zdCAicGVybWlzc2lvbnMi", + "script_encoding": "base64", + "sites": { + "mode": "all", + "values": [] + }, + "timeout_seconds": 60, + "type": "powershell", + "variables": [], + "version": 1 +} \ No newline at end of file diff --git a/Data/Engine/Assemblies/Scripts/Software Installers/Filezilla_WIN.json b/Data/Engine/Assemblies/Payloads/460ebfd15c302dd729d345f7d9b886dddcf31c43/payload.json similarity index 100% rename from Data/Engine/Assemblies/Scripts/Software Installers/Filezilla_WIN.json rename to Data/Engine/Assemblies/Payloads/460ebfd15c302dd729d345f7d9b886dddcf31c43/payload.json diff --git a/Data/Engine/Assemblies/Scripts/Software Installers/VLC_Media_Player_WIN.json b/Data/Engine/Assemblies/Payloads/497ada264febae8857aa3ee5570569b99337e299/payload.json similarity index 100% rename from Data/Engine/Assemblies/Scripts/Software Installers/VLC_Media_Player_WIN.json rename to Data/Engine/Assemblies/Payloads/497ada264febae8857aa3ee5570569b99337e299/payload.json diff --git a/Data/Engine/Assemblies/Scripts/Software Installers/Citrix_Workspace_WIN.json b/Data/Engine/Assemblies/Payloads/4db3e82b7472ed3f51a18dd4dd7f3c9061db61eb/payload.json similarity index 100% rename from Data/Engine/Assemblies/Scripts/Software Installers/Citrix_Workspace_WIN.json rename to Data/Engine/Assemblies/Payloads/4db3e82b7472ed3f51a18dd4dd7f3c9061db61eb/payload.json diff --git a/Data/Engine/Assemblies/Workflows/Examples/OCR/Text Recognition.json b/Data/Engine/Assemblies/Payloads/5007b260a7a38bc0044252daddf7ad85c1ffc843/payload.json similarity index 100% rename from Data/Engine/Assemblies/Workflows/Examples/OCR/Text Recognition.json rename to Data/Engine/Assemblies/Payloads/5007b260a7a38bc0044252daddf7ad85c1ffc843/payload.json diff --git a/Data/Engine/Assemblies/Ansible_Playbooks/Examples/Query_OS_String.json b/Data/Engine/Assemblies/Payloads/534ddf6b589b1766578d3329db4e4008c568acac/payload.json similarity index 100% rename from Data/Engine/Assemblies/Ansible_Playbooks/Examples/Query_OS_String.json rename to Data/Engine/Assemblies/Payloads/534ddf6b589b1766578d3329db4e4008c568acac/payload.json diff --git a/Data/Engine/Assemblies/Payloads/64abb31bfd6f4d39bb27e4cad046b2cb/payload.json b/Data/Engine/Assemblies/Payloads/64abb31bfd6f4d39bb27e4cad046b2cb/payload.json new file mode 100644 index 00000000..178ec60c --- /dev/null +++ b/Data/Engine/Assemblies/Payloads/64abb31bfd6f4d39bb27e4cad046b2cb/payload.json @@ -0,0 +1,19 @@ +{ + "description": "Import/export workflow test.", + "edges": [], + "nodes": [ + { + "data": { + "label": "Input", + "value": "example" + }, + "id": "node-1", + "position": { + "x": 10, + "y": 20 + }, + "type": "DataNode" + } + ], + "tab_name": "Import Workflow" +} \ No newline at end of file diff --git a/Data/Engine/Assemblies/Scripts/General Purpose/Shutdown_Device_WIN.json b/Data/Engine/Assemblies/Payloads/6df431a02cedb99d843f05ac5f1be3998913c397/payload.json similarity index 100% rename from Data/Engine/Assemblies/Scripts/General Purpose/Shutdown_Device_WIN.json rename to Data/Engine/Assemblies/Payloads/6df431a02cedb99d843f05ac5f1be3998913c397/payload.json diff --git a/Data/Engine/Assemblies/Payloads/6fd2d340642f4067b69fa1c45241ce29/payload.json b/Data/Engine/Assemblies/Payloads/6fd2d340642f4067b69fa1c45241ce29/payload.json new file mode 100644 index 00000000..178ec60c --- /dev/null +++ b/Data/Engine/Assemblies/Payloads/6fd2d340642f4067b69fa1c45241ce29/payload.json @@ -0,0 +1,19 @@ +{ + "description": "Import/export workflow test.", + "edges": [], + "nodes": [ + { + "data": { + "label": "Input", + "value": "example" + }, + "id": "node-1", + "position": { + "x": 10, + "y": 20 + }, + "type": "DataNode" + } + ], + "tab_name": "Import Workflow" +} \ No newline at end of file diff --git a/Data/Engine/Assemblies/Workflows/Games/Flyff Universe/Chat Text Search Alerter.json b/Data/Engine/Assemblies/Payloads/71b5d42179fc521917081de3720cdb5c90cc9b6a/payload.json similarity index 100% rename from Data/Engine/Assemblies/Workflows/Games/Flyff Universe/Chat Text Search Alerter.json rename to Data/Engine/Assemblies/Payloads/71b5d42179fc521917081de3720cdb5c90cc9b6a/payload.json diff --git a/Data/Engine/Assemblies/Workflows/Examples/Basic/Math Operations.json b/Data/Engine/Assemblies/Payloads/74897bde8142f1affa4db19d9be78a1316a51cd3/payload.json similarity index 100% rename from Data/Engine/Assemblies/Workflows/Examples/Basic/Math Operations.json rename to Data/Engine/Assemblies/Payloads/74897bde8142f1affa4db19d9be78a1316a51cd3/payload.json diff --git a/Data/Engine/Assemblies/Scripts/Software Installers/Package Managers/Chocolatey_WIN.json b/Data/Engine/Assemblies/Payloads/778db92963c5d5253a7331b291467218cd566a2a/payload.json similarity index 100% rename from Data/Engine/Assemblies/Scripts/Software Installers/Package Managers/Chocolatey_WIN.json rename to Data/Engine/Assemblies/Payloads/778db92963c5d5253a7331b291467218cd566a2a/payload.json diff --git a/Data/Engine/Assemblies/Scripts/Software Installers/Install_RocketChat_WIN.json b/Data/Engine/Assemblies/Payloads/7d4686320184e4091c3487123054254a6162ce39/payload.json similarity index 100% rename from Data/Engine/Assemblies/Scripts/Software Installers/Install_RocketChat_WIN.json rename to Data/Engine/Assemblies/Payloads/7d4686320184e4091c3487123054254a6162ce39/payload.json diff --git a/Data/Engine/Assemblies/Scripts/Borealis/Remote_Agent_Update_WIN.json b/Data/Engine/Assemblies/Payloads/7dc33704d29cd8afc1f47a969280dad407bb0569/payload.json similarity index 100% rename from Data/Engine/Assemblies/Scripts/Borealis/Remote_Agent_Update_WIN.json rename to Data/Engine/Assemblies/Payloads/7dc33704d29cd8afc1f47a969280dad407bb0569/payload.json diff --git a/Data/Engine/Assemblies/Payloads/83fb2768611549ea813f5a046b92e2b2/payload.json b/Data/Engine/Assemblies/Payloads/83fb2768611549ea813f5a046b92e2b2/payload.json new file mode 100644 index 00000000..16ee2cf0 --- /dev/null +++ b/Data/Engine/Assemblies/Payloads/83fb2768611549ea813f5a046b92e2b2/payload.json @@ -0,0 +1,23 @@ +{ + "category": "script", + "description": "Import/export test script.", + "files": [], + "name": "Import Script", + "script": "V3JpdGUtSG9zdCAicm91bmQgdHJpcCBleHBvcnQi", + "script_encoding": "base64", + "sites": { + "mode": "all", + "values": [] + }, + "timeout_seconds": 45, + "type": "powershell", + "variables": [ + { + "default": "", + "label": "Example", + "name": "example", + "type": "string" + } + ], + "version": 2 +} \ No newline at end of file diff --git a/Data/Engine/Assemblies/Scripts/Borealis/Migrate_Agent_to_Different_Borealis_Server.json b/Data/Engine/Assemblies/Payloads/8465764869a09940149087626d2ea7aac4145358/payload.json similarity index 100% rename from Data/Engine/Assemblies/Scripts/Borealis/Migrate_Agent_to_Different_Borealis_Server.json rename to Data/Engine/Assemblies/Payloads/8465764869a09940149087626d2ea7aac4145358/payload.json diff --git a/Data/Engine/Assemblies/Scripts/User Management/Logoff_Specific_User_WIN.json b/Data/Engine/Assemblies/Payloads/86d3c953f98b7efce4de9770a1ca980630b35dbc/payload.json similarity index 100% rename from Data/Engine/Assemblies/Scripts/User Management/Logoff_Specific_User_WIN.json rename to Data/Engine/Assemblies/Payloads/86d3c953f98b7efce4de9770a1ca980630b35dbc/payload.json diff --git a/Data/Engine/Assemblies/Scripts/Software Installers/PuTTY_WIN.json b/Data/Engine/Assemblies/Payloads/8a28afbbf3988832d419776be13400a6ae0a0dab/payload.json similarity index 100% rename from Data/Engine/Assemblies/Scripts/Software Installers/PuTTY_WIN.json rename to Data/Engine/Assemblies/Payloads/8a28afbbf3988832d419776be13400a6ae0a0dab/payload.json diff --git a/Data/Engine/Assemblies/Payloads/900f216d0aaa4145a8c67fa249b90cbe/payload.json b/Data/Engine/Assemblies/Payloads/900f216d0aaa4145a8c67fa249b90cbe/payload.json new file mode 100644 index 00000000..16ee2cf0 --- /dev/null +++ b/Data/Engine/Assemblies/Payloads/900f216d0aaa4145a8c67fa249b90cbe/payload.json @@ -0,0 +1,23 @@ +{ + "category": "script", + "description": "Import/export test script.", + "files": [], + "name": "Import Script", + "script": "V3JpdGUtSG9zdCAicm91bmQgdHJpcCBleHBvcnQi", + "script_encoding": "base64", + "sites": { + "mode": "all", + "values": [] + }, + "timeout_seconds": 45, + "type": "powershell", + "variables": [ + { + "default": "", + "label": "Example", + "name": "example", + "type": "string" + } + ], + "version": 2 +} \ No newline at end of file diff --git a/Data/Engine/Assemblies/Scripts/Software Installers/Java_Runtime_Environment_8_WIN.json b/Data/Engine/Assemblies/Payloads/9931b7c8a16733cd95c866e9334b1380f442185e/payload.json similarity index 100% rename from Data/Engine/Assemblies/Scripts/Software Installers/Java_Runtime_Environment_8_WIN.json rename to Data/Engine/Assemblies/Payloads/9931b7c8a16733cd95c866e9334b1380f442185e/payload.json diff --git a/Data/Engine/Assemblies/Payloads/a449231516a645b39a4eee42ff24d009/payload.json b/Data/Engine/Assemblies/Payloads/a449231516a645b39a4eee42ff24d009/payload.json new file mode 100644 index 00000000..178ec60c --- /dev/null +++ b/Data/Engine/Assemblies/Payloads/a449231516a645b39a4eee42ff24d009/payload.json @@ -0,0 +1,19 @@ +{ + "description": "Import/export workflow test.", + "edges": [], + "nodes": [ + { + "data": { + "label": "Input", + "value": "example" + }, + "id": "node-1", + "position": { + "x": 10, + "y": 20 + }, + "type": "DataNode" + } + ], + "tab_name": "Import Workflow" +} \ No newline at end of file diff --git a/Data/Engine/Assemblies/Scripts/Software Installers/Visual C++/VisualC__Redis_2015-2022_WIN.json b/Data/Engine/Assemblies/Payloads/a4f0bc58c49c6e0725998c0bc96598751c67451b/payload.json similarity index 100% rename from Data/Engine/Assemblies/Scripts/Software Installers/Visual C++/VisualC__Redis_2015-2022_WIN.json rename to Data/Engine/Assemblies/Payloads/a4f0bc58c49c6e0725998c0bc96598751c67451b/payload.json diff --git a/Data/Engine/Assemblies/Payloads/aedbfeba09c44f739d906ce28f0a9ed0/payload.json b/Data/Engine/Assemblies/Payloads/aedbfeba09c44f739d906ce28f0a9ed0/payload.json new file mode 100644 index 00000000..16ee2cf0 --- /dev/null +++ b/Data/Engine/Assemblies/Payloads/aedbfeba09c44f739d906ce28f0a9ed0/payload.json @@ -0,0 +1,23 @@ +{ + "category": "script", + "description": "Import/export test script.", + "files": [], + "name": "Import Script", + "script": "V3JpdGUtSG9zdCAicm91bmQgdHJpcCBleHBvcnQi", + "script_encoding": "base64", + "sites": { + "mode": "all", + "values": [] + }, + "timeout_seconds": 45, + "type": "powershell", + "variables": [ + { + "default": "", + "label": "Example", + "name": "example", + "type": "string" + } + ], + "version": 2 +} \ No newline at end of file diff --git a/Data/Engine/Assemblies/Workflows/Examples/Basic/Logic Comparison.json b/Data/Engine/Assemblies/Payloads/b5b712984e7ad55cf98f9e624e43b0714fd012eb/payload.json similarity index 100% rename from Data/Engine/Assemblies/Workflows/Examples/Basic/Logic Comparison.json rename to Data/Engine/Assemblies/Payloads/b5b712984e7ad55cf98f9e624e43b0714fd012eb/payload.json diff --git a/Data/Engine/Assemblies/Payloads/bd7656ab60544a779b8fb7178648452a/payload.json b/Data/Engine/Assemblies/Payloads/bd7656ab60544a779b8fb7178648452a/payload.json new file mode 100644 index 00000000..5c533b92 --- /dev/null +++ b/Data/Engine/Assemblies/Payloads/bd7656ab60544a779b8fb7178648452a/payload.json @@ -0,0 +1,16 @@ +{ + "category": "script", + "description": "Permission test script.", + "files": [], + "name": "Official Dev Mode Script", + "script": "V3JpdGUtSG9zdCAicGVybWlzc2lvbnMi", + "script_encoding": "base64", + "sites": { + "mode": "all", + "values": [] + }, + "timeout_seconds": 60, + "type": "powershell", + "variables": [], + "version": 1 +} \ No newline at end of file diff --git a/Data/Engine/Assemblies/Scripts/Networking/ipconfig_release-renew_WIN.json b/Data/Engine/Assemblies/Payloads/bf84253be7f2bc6d35edaf3b277514611356aea5/payload.json similarity index 100% rename from Data/Engine/Assemblies/Scripts/Networking/ipconfig_release-renew_WIN.json rename to Data/Engine/Assemblies/Payloads/bf84253be7f2bc6d35edaf3b277514611356aea5/payload.json diff --git a/Data/Engine/Assemblies/Workflows/Examples/API Requests/Value Parser.json b/Data/Engine/Assemblies/Payloads/bf8e3f7806f7f7aeb304f1c264490cfb9522a266/payload.json similarity index 100% rename from Data/Engine/Assemblies/Workflows/Examples/API Requests/Value Parser.json rename to Data/Engine/Assemblies/Payloads/bf8e3f7806f7f7aeb304f1c264490cfb9522a266/payload.json diff --git a/Data/Engine/Assemblies/Payloads/c1d5b41722444d24b9dd4da33f462cf2/payload.json b/Data/Engine/Assemblies/Payloads/c1d5b41722444d24b9dd4da33f462cf2/payload.json new file mode 100644 index 00000000..178ec60c --- /dev/null +++ b/Data/Engine/Assemblies/Payloads/c1d5b41722444d24b9dd4da33f462cf2/payload.json @@ -0,0 +1,19 @@ +{ + "description": "Import/export workflow test.", + "edges": [], + "nodes": [ + { + "data": { + "label": "Input", + "value": "example" + }, + "id": "node-1", + "position": { + "x": 10, + "y": 20 + }, + "type": "DataNode" + } + ], + "tab_name": "Import Workflow" +} \ No newline at end of file diff --git a/Data/Engine/Assemblies/Scripts/Software Installers/Package Managers/WinGet_WIN.json b/Data/Engine/Assemblies/Payloads/c2138360041664d4bf7cfd9b6eb9dbc23dd319c6/payload.json similarity index 100% rename from Data/Engine/Assemblies/Scripts/Software Installers/Package Managers/WinGet_WIN.json rename to Data/Engine/Assemblies/Payloads/c2138360041664d4bf7cfd9b6eb9dbc23dd319c6/payload.json diff --git a/Data/Engine/Assemblies/Scripts/General Purpose/Ad_Hoc_Powershell_WIN.json b/Data/Engine/Assemblies/Payloads/c5c7657ec77eb52f9ded599b9baa13ba9c0206fe/payload.json similarity index 100% rename from Data/Engine/Assemblies/Scripts/General Purpose/Ad_Hoc_Powershell_WIN.json rename to Data/Engine/Assemblies/Payloads/c5c7657ec77eb52f9ded599b9baa13ba9c0206fe/payload.json diff --git a/Data/Engine/Assemblies/Payloads/c7ac1b6cf83a4e60a48cfff9a8dfb3fc/payload.json b/Data/Engine/Assemblies/Payloads/c7ac1b6cf83a4e60a48cfff9a8dfb3fc/payload.json new file mode 100644 index 00000000..178ec60c --- /dev/null +++ b/Data/Engine/Assemblies/Payloads/c7ac1b6cf83a4e60a48cfff9a8dfb3fc/payload.json @@ -0,0 +1,19 @@ +{ + "description": "Import/export workflow test.", + "edges": [], + "nodes": [ + { + "data": { + "label": "Input", + "value": "example" + }, + "id": "node-1", + "position": { + "x": 10, + "y": 20 + }, + "type": "DataNode" + } + ], + "tab_name": "Import Workflow" +} \ No newline at end of file diff --git a/Data/Engine/Assemblies/Payloads/c9cb794542574eca963ff49fb6b4284f/payload.json b/Data/Engine/Assemblies/Payloads/c9cb794542574eca963ff49fb6b4284f/payload.json new file mode 100644 index 00000000..5c533b92 --- /dev/null +++ b/Data/Engine/Assemblies/Payloads/c9cb794542574eca963ff49fb6b4284f/payload.json @@ -0,0 +1,16 @@ +{ + "category": "script", + "description": "Permission test script.", + "files": [], + "name": "Official Dev Mode Script", + "script": "V3JpdGUtSG9zdCAicGVybWlzc2lvbnMi", + "script_encoding": "base64", + "sites": { + "mode": "all", + "values": [] + }, + "timeout_seconds": 60, + "type": "powershell", + "variables": [], + "version": 1 +} \ No newline at end of file diff --git a/Data/Engine/Assemblies/Workflows/Games/Flyff Universe/Character Status Breakdown.json b/Data/Engine/Assemblies/Payloads/d63205e94f66a7f86797c6a5b3490d5a2805ca38/payload.json similarity index 100% rename from Data/Engine/Assemblies/Workflows/Games/Flyff Universe/Character Status Breakdown.json rename to Data/Engine/Assemblies/Payloads/d63205e94f66a7f86797c6a5b3490d5a2805ca38/payload.json diff --git a/Data/Engine/Assemblies/Ansible_Playbooks/Examples/Write Canary to C Drive Root.json b/Data/Engine/Assemblies/Payloads/d7099c3d9d588903b483570926da4739aa99aacf/payload.json similarity index 100% rename from Data/Engine/Assemblies/Ansible_Playbooks/Examples/Write Canary to C Drive Root.json rename to Data/Engine/Assemblies/Payloads/d7099c3d9d588903b483570926da4739aa99aacf/payload.json diff --git a/Data/Engine/Assemblies/Scripts/Software Installers/Internet Browsers/Google_Chrome_WIN.json b/Data/Engine/Assemblies/Payloads/dd8acdc0d70c55aa46a542b0f743ed9bd7b29580/payload.json similarity index 100% rename from Data/Engine/Assemblies/Scripts/Software Installers/Internet Browsers/Google_Chrome_WIN.json rename to Data/Engine/Assemblies/Payloads/dd8acdc0d70c55aa46a542b0f743ed9bd7b29580/payload.json diff --git a/Data/Engine/Assemblies/Payloads/e82dc1df2ed94faebb585f42409b5989/payload.json b/Data/Engine/Assemblies/Payloads/e82dc1df2ed94faebb585f42409b5989/payload.json new file mode 100644 index 00000000..5c533b92 --- /dev/null +++ b/Data/Engine/Assemblies/Payloads/e82dc1df2ed94faebb585f42409b5989/payload.json @@ -0,0 +1,16 @@ +{ + "category": "script", + "description": "Permission test script.", + "files": [], + "name": "Official Dev Mode Script", + "script": "V3JpdGUtSG9zdCAicGVybWlzc2lvbnMi", + "script_encoding": "base64", + "sites": { + "mode": "all", + "values": [] + }, + "timeout_seconds": 60, + "type": "powershell", + "variables": [], + "version": 1 +} \ No newline at end of file diff --git a/Data/Engine/Assemblies/Scripts/Examples/Write_Canary_File_to_a_Specific_Folder.json b/Data/Engine/Assemblies/Payloads/e9bdfd44b24bad66e43971b97c1c06f9b3b963b4/payload.json similarity index 100% rename from Data/Engine/Assemblies/Scripts/Examples/Write_Canary_File_to_a_Specific_Folder.json rename to Data/Engine/Assemblies/Payloads/e9bdfd44b24bad66e43971b97c1c06f9b3b963b4/payload.json diff --git a/Data/Engine/Assemblies/Payloads/f32f3108f7b34ac6b3e067e1d492d1cf/payload.json b/Data/Engine/Assemblies/Payloads/f32f3108f7b34ac6b3e067e1d492d1cf/payload.json new file mode 100644 index 00000000..5c533b92 --- /dev/null +++ b/Data/Engine/Assemblies/Payloads/f32f3108f7b34ac6b3e067e1d492d1cf/payload.json @@ -0,0 +1,16 @@ +{ + "category": "script", + "description": "Permission test script.", + "files": [], + "name": "Official Dev Mode Script", + "script": "V3JpdGUtSG9zdCAicGVybWlzc2lvbnMi", + "script_encoding": "base64", + "sites": { + "mode": "all", + "values": [] + }, + "timeout_seconds": 60, + "type": "powershell", + "variables": [], + "version": 1 +} \ No newline at end of file diff --git a/Data/Engine/Assemblies/Scripts/Examples/Write Canary to C Drive.json b/Data/Engine/Assemblies/Payloads/fa79d353e96ef7f84f099e16b559f09596a34e4c/payload.json similarity index 100% rename from Data/Engine/Assemblies/Scripts/Examples/Write Canary to C Drive.json rename to Data/Engine/Assemblies/Payloads/fa79d353e96ef7f84f099e16b559f09596a34e4c/payload.json diff --git a/Data/Engine/Assemblies/Scripts/Software Installers/Adobe_Acrobat_Reader_DC_WIN.json b/Data/Engine/Assemblies/Payloads/ffdcc5fefff32445ac37cf3336b81604faa242cd/payload.json similarity index 100% rename from Data/Engine/Assemblies/Scripts/Software Installers/Adobe_Acrobat_Reader_DC_WIN.json rename to Data/Engine/Assemblies/Payloads/ffdcc5fefff32445ac37cf3336b81604faa242cd/payload.json diff --git a/Data/Engine/Assemblies/community.db b/Data/Engine/Assemblies/community.db new file mode 100644 index 00000000..2e1ed4a4 Binary files /dev/null and b/Data/Engine/Assemblies/community.db differ diff --git a/Data/Engine/Assemblies/official.db b/Data/Engine/Assemblies/official.db new file mode 100644 index 00000000..c20ca2b7 Binary files /dev/null and b/Data/Engine/Assemblies/official.db differ diff --git a/Data/Engine/Assemblies/user_created.db b/Data/Engine/Assemblies/user_created.db new file mode 100644 index 00000000..0398a0bd Binary files /dev/null and b/Data/Engine/Assemblies/user_created.db differ diff --git a/Data/Engine/assembly_management/bootstrap.py b/Data/Engine/assembly_management/bootstrap.py index a9f51160..224d925a 100644 --- a/Data/Engine/assembly_management/bootstrap.py +++ b/Data/Engine/assembly_management/bootstrap.py @@ -18,9 +18,6 @@ from typing import Dict, List, Mapping, Optional from .databases import AssemblyDatabaseManager from .models import AssemblyDomain, AssemblyRecord, CachedAssembly from .payloads import PayloadManager -from .sync import sync_official_domain - - class AssemblyCache: """Caches assemblies in memory and coordinates background persistence.""" @@ -278,10 +275,8 @@ def initialise_assembly_runtime( db_manager.initialise() payload_manager = PayloadManager(staging_root=payload_staging, runtime_root=payload_runtime, logger=logger) - try: - sync_official_domain(db_manager, payload_manager, staging_root, logger=logger) - except Exception: # pragma: no cover - best effort during bootstrap - (logger or logging.getLogger(__name__)).exception("Official assembly sync failed during startup.") + # Automatic JSON-to-database imports have been retired so that staging official.db remains the single source + # of truth. flush_interval = _resolve_flush_interval(config) return AssemblyCache.initialise( diff --git a/Data/Engine/assembly_management/sync.py b/Data/Engine/assembly_management/sync.py deleted file mode 100644 index 103439dc..00000000 --- a/Data/Engine/assembly_management/sync.py +++ /dev/null @@ -1,215 +0,0 @@ -# ====================================================== -# Data\Engine\assembly_management\sync.py -# Description: Synchronises assembly databases from staged filesystem sources (official domain importer). -# -# API Endpoints (if applicable): None -# ====================================================== - -"""Synchronisation helpers for assembly persistence domains.""" - -from __future__ import annotations - -import datetime as _dt -import hashlib -import json -import logging -from pathlib import Path -from typing import Iterable, Optional, Tuple - -from .databases import AssemblyDatabaseManager -from .models import AssemblyDomain, AssemblyRecord, CachedAssembly, PayloadType -from .payloads import PayloadManager - - -_SCRIPT_DIRS = {"scripts", "script"} -_WORKFLOW_DIRS = {"workflows", "workflow"} -_ANSIBLE_DIRS = {"ansible_playbooks", "ansible-playbooks", "ansible"} - - -def sync_official_domain( - db_manager: AssemblyDatabaseManager, - payload_manager: PayloadManager, - staging_root: Path, - *, - logger: Optional[logging.Logger] = None, -) -> None: - """Repopulate the official domain database from staged JSON assemblies.""" - - log = logger or logging.getLogger(__name__) - root = staging_root.resolve() - if not root.is_dir(): - log.warning("Assembly staging root missing during official sync: %s", root) - return - - files = tuple(_iter_assembly_sources(root)) - if not files: - log.info("No staged assemblies discovered for official sync; clearing domain.") - db_manager.reset_domain(AssemblyDomain.OFFICIAL) - return - - db_manager.reset_domain(AssemblyDomain.OFFICIAL) - - imported = 0 - skipped = 0 - - for rel_path, file_path in files: - record = _record_from_file(rel_path, file_path, payload_manager, log) - if record is None: - skipped += 1 - continue - entry = CachedAssembly( - domain=AssemblyDomain.OFFICIAL, - record=record, - is_dirty=False, - last_persisted=record.updated_at, - ) - try: - db_manager.upsert_record(AssemblyDomain.OFFICIAL, entry) - imported += 1 - except Exception: # pragma: no cover - defensive logging - skipped += 1 - log.exception("Failed to import assembly %s during official sync.", rel_path) - - log.info( - "Official assembly sync complete: imported=%s skipped=%s source_root=%s", - imported, - skipped, - root, - ) - - -def _iter_assembly_sources(root: Path) -> Iterable[Tuple[str, Path]]: - for path in root.rglob("*.json"): - if not path.is_file(): - continue - rel_path = path.relative_to(root).as_posix() - yield rel_path, path - - -def _record_from_file( - rel_path: str, - file_path: Path, - payload_manager: PayloadManager, - logger: logging.Logger, -) -> Optional[AssemblyRecord]: - try: - text = file_path.read_text(encoding="utf-8") - except Exception as exc: - logger.warning("Unable to read assembly source %s: %s", file_path, exc) - return None - - try: - document = json.loads(text) - except Exception as exc: - logger.warning("Invalid JSON for assembly %s: %s", file_path, exc) - return None - - kind = _infer_kind(rel_path) - if kind == "unknown": - logger.debug("Skipping non-assembly file %s", rel_path) - return None - - payload_type = _payload_type_for_kind(kind) - assembly_guid = hashlib.sha1(rel_path.encode("utf-8")).hexdigest() - descriptor = payload_manager.store_payload(payload_type, text, assembly_guid=assembly_guid, extension=".json") - - file_stat = file_path.stat() - timestamp = _dt.datetime.utcfromtimestamp(file_stat.st_mtime).replace(microsecond=0) - descriptor.created_at = timestamp - descriptor.updated_at = timestamp - - assembly_path = _assembly_id_from_path(rel_path) - document_metadata = _metadata_from_document(kind, document, rel_path) - tags = _coerce_dict(document.get("tags")) - - record = AssemblyRecord( - assembly_guid=assembly_guid, - display_name=document_metadata.get("display_name") or assembly_path.rsplit("/", 1)[-1], - summary=document_metadata.get("summary"), - category=document_metadata.get("category"), - assembly_kind=kind, - assembly_type=document_metadata.get("assembly_type"), - version=_coerce_int(document.get("version"), default=1), - payload=descriptor, - metadata=document_metadata, - tags=tags, - checksum=hashlib.sha256(text.encode("utf-8")).hexdigest(), - created_at=timestamp, - updated_at=timestamp, - ) - return record - - -def _infer_kind(rel_path: str) -> str: - first = rel_path.split("/", 1)[0].strip().lower() - if first in _SCRIPT_DIRS: - return "script" - if first in _WORKFLOW_DIRS: - return "workflow" - if first in _ANSIBLE_DIRS: - return "ansible" - return "unknown" - - -def _payload_type_for_kind(kind: str) -> PayloadType: - if kind == "workflow": - return PayloadType.WORKFLOW - if kind == "script": - return PayloadType.SCRIPT - if kind == "ansible": - return PayloadType.BINARY - return PayloadType.UNKNOWN - - -def _assembly_id_from_path(rel_path: str) -> str: - normalised = rel_path.replace("\\", "/") - if normalised.lower().endswith(".json"): - normalised = normalised[:-5] - return normalised - - -def _metadata_from_document(kind: str, document: dict, rel_path: str) -> dict: - metadata = { - "source_path": rel_path, - "display_name": None, - "summary": None, - "category": None, - "assembly_type": None, - } - - if kind == "workflow": - metadata["display_name"] = document.get("tab_name") or document.get("name") - metadata["summary"] = document.get("description") - metadata["category"] = "workflow" - metadata["assembly_type"] = "workflow" - elif kind == "script": - metadata["display_name"] = document.get("name") or document.get("display_name") - metadata["summary"] = document.get("description") - metadata["category"] = (document.get("category") or "script").lower() - metadata["assembly_type"] = (document.get("type") or "powershell").lower() - elif kind == "ansible": - metadata["display_name"] = document.get("name") or document.get("display_name") or rel_path.rsplit("/", 1)[-1] - metadata["summary"] = document.get("description") - metadata["category"] = "ansible" - metadata["assembly_type"] = "ansible" - - metadata.update( - { - "sites": document.get("sites"), - "variables": document.get("variables"), - "files": document.get("files"), - } - ) - metadata["display_name"] = metadata.get("display_name") or rel_path.rsplit("/", 1)[-1] - return metadata - - -def _coerce_int(value, *, default: int = 0) -> int: - try: - return int(value) - except Exception: - return default - - -def _coerce_dict(value) -> dict: - return value if isinstance(value, dict) else {} diff --git a/Data/Engine/services/API/assemblies/management.py b/Data/Engine/services/API/assemblies/management.py index 29005a62..eafcef54 100644 --- a/Data/Engine/services/API/assemblies/management.py +++ b/Data/Engine/services/API/assemblies/management.py @@ -11,7 +11,6 @@ # - POST /api/assemblies//clone (Token Authenticated (Admin+Dev Mode for non-user domains)) - Clones an assembly into a target domain. # - POST /api/assemblies/dev-mode/switch (Token Authenticated (Admin)) - Enables or disables Dev Mode overrides for the current session. # - POST /api/assemblies/dev-mode/write (Token Authenticated (Admin+Dev Mode)) - Flushes queued assembly writes immediately. -# - POST /api/assemblies/official/sync (Token Authenticated (Admin+Dev Mode)) - Rebuilds the official domain from staged JSON assemblies. # - POST /api/assemblies/import (Token Authenticated (Domain write permissions)) - Imports a legacy assembly JSON document into the selected domain. # - GET /api/assemblies//export (Token Authenticated) - Exports an assembly as legacy JSON with metadata. # ====================================================== @@ -552,21 +551,4 @@ def register_assemblies(app, adapters: "EngineServiceAdapters") -> None: service._audit(user=user, action="flush_queue", status="error", detail="internal server error") return jsonify({"error": "internal server error"}), 500 - # ------------------------------------------------------------------ - # Official sync - # ------------------------------------------------------------------ - @blueprint.route("/official/sync", methods=["POST"]) - def sync_official(): - user, error = service.require_admin(dev_mode_required=True) - if error: - return jsonify(error[0]), error[1] - try: - service.runtime.sync_official() - service._audit(user=user, action="sync_official", status="success") - return jsonify({"status": "synced"}), 200 - except Exception: # pragma: no cover - service.logger.exception("Official assembly sync failed.") - service._audit(user=user, action="sync_official", status="error", detail="internal server error") - return jsonify({"error": "internal server error"}), 500 - app.register_blueprint(blueprint) diff --git a/Data/Engine/services/assemblies/service.py b/Data/Engine/services/assemblies/service.py index 369494f4..33099147 100644 --- a/Data/Engine/services/assemblies/service.py +++ b/Data/Engine/services/assemblies/service.py @@ -19,7 +19,6 @@ from typing import Any, Dict, List, Mapping, Optional, Union from ...assembly_management.bootstrap import AssemblyCache from ...assembly_management.models import AssemblyDomain, AssemblyRecord, CachedAssembly, PayloadType -from ...assembly_management.sync import sync_official_domain from .serialization import ( AssemblySerializationError, MAX_DOCUMENT_BYTES, @@ -168,13 +167,6 @@ class AssemblyRuntimeService: def flush_writes(self) -> None: self._cache.flush_now() - def sync_official(self) -> None: - db_manager = self._cache.database_manager - payload_manager = self._cache.payload_manager - staging_root = db_manager.staging_root - sync_official_domain(db_manager, payload_manager, staging_root, logger=self._logger) - self._cache.reload() - def import_assembly( self, *, diff --git a/Data/Engine/tools/assemblies.py b/Data/Engine/tools/assemblies.py deleted file mode 100644 index 1fbfb96a..00000000 --- a/Data/Engine/tools/assemblies.py +++ /dev/null @@ -1,87 +0,0 @@ -# ====================================================== -# Data\Engine\tools\assemblies.py -# Description: CLI helper for assembly maintenance tasks, including official domain synchronisation. -# -# API Endpoints (if applicable): None -# ====================================================== - -"""Assembly maintenance CLI.""" - -from __future__ import annotations - -import argparse -import logging -import sys -from pathlib import Path -from typing import Optional - -from Data.Engine.assembly_management.databases import AssemblyDatabaseManager -from Data.Engine.assembly_management.models import AssemblyDomain -from Data.Engine.assembly_management.payloads import PayloadManager -from Data.Engine.assembly_management.sync import sync_official_domain - - -logger = logging.getLogger("borealis.assembly.cli") - - -def _default_staging_root() -> Path: - return Path(__file__).resolve().parents[3] / "Data" / "Engine" / "Assemblies" - - -def _default_runtime_root() -> Path: - return Path(__file__).resolve().parents[3] / "Engine" / "Assemblies" - - -def cmd_sync_official(*, staging_root: Optional[Path], runtime_root: Optional[Path]) -> int: - staging = staging_root or _default_staging_root() - runtime = runtime_root or _default_runtime_root() - staging.mkdir(parents=True, exist_ok=True) - runtime.mkdir(parents=True, exist_ok=True) - - logger.info("Starting official assembly sync.") - db_manager = AssemblyDatabaseManager(staging_root=staging, runtime_root=runtime, logger=logger) - db_manager.initialise() - payload_manager = PayloadManager(staging_root=staging / "Payloads", runtime_root=runtime / "Payloads", logger=logger) - - sync_official_domain(db_manager, payload_manager, staging, logger=logger) - records = db_manager.load_all(AssemblyDomain.OFFICIAL) - source_count = sum(1 for path in staging.rglob("*.json") if path.is_file()) - - logger.info( - "Official sync complete: %s records persisted (staging sources=%s).", - len(records), - source_count, - ) - print(f"Official assemblies synced: records={len(records)} staged_json={source_count}") - if len(records) != source_count: - print("warning: record count does not match JSON source file count", file=sys.stderr) - return 1 - return 0 - - -def build_parser() -> argparse.ArgumentParser: - parser = argparse.ArgumentParser(description="Borealis assembly maintenance CLI.") - subparsers = parser.add_subparsers(dest="command") - - sync_parser = subparsers.add_parser("sync-official", help="Rebuild the official assembly database from staged JSON sources.") - sync_parser.add_argument("--staging-root", type=Path, default=None, help="Override the staging assemblies directory.") - sync_parser.add_argument("--runtime-root", type=Path, default=None, help="Override the runtime assemblies directory.") - - return parser - - -def main(argv: Optional[list[str]] = None) -> int: - logging.basicConfig(level=logging.INFO, format="%(asctime)s-%(levelname)s: %(message)s") - parser = build_parser() - args = parser.parse_args(argv) - - if args.command == "sync-official": - return cmd_sync_official(staging_root=args.staging_root, runtime_root=args.runtime_root) - - parser.print_help() - return 1 - - -if __name__ == "__main__": # pragma: no cover - CLI entrypoint - raise SystemExit(main()) - diff --git a/Docs/assemblies.md b/Docs/assemblies.md index 03384119..fb943209 100644 --- a/Docs/assemblies.md +++ b/Docs/assemblies.md @@ -2,6 +2,7 @@ ## Database Layout - Three SQLite databases live under `Data/Engine/Assemblies` (`official.db`, `community.db`, `user_created.db`) and mirror to `Engine/Assemblies` at runtime. +- Automatic JSON → SQLite imports for the official domain have been retired; the staged `official.db` now serves as the authoritative store unless you invoke a manual sync. - Payload binaries/json store under `Payloads/` in both staging and runtime directories; the AssemblyCache references payload GUIDs instead of embedding large blobs. - WAL mode with shared-cache is enabled on every connection; queue flushes copy the refreshed `.db`, `-wal`, and `-shm` files into the runtime mirror. - `AssemblyCache.describe()` reveals dirty/clean state per assembly, helping operators spot pending writes before shutdown or sync operations. @@ -15,5 +16,5 @@ ## Backup Guidance - Regularly snapshot `Data/Engine/Assemblies` and `Data/Engine/Assemblies/Payloads` alongside the mirrored runtime copies to preserve both metadata and payload artifacts. - Include the queue inspection endpoint (`GET /api/assemblies`) in maintenance scripts to verify no dirty entries remain before capturing backups. -- The new CLI helper `python Data/Engine/tools/assemblies.py sync-official` refreshes the official domain from staged JSON and reports row counts, useful after restoring from backup or before releases. +- Maintain the staged databases directly; to publish new official assemblies copy the curated `official.db` into `Data/Engine/Assemblies` before restarting the Engine. - Future automation will extend to scheduled backups and staged restore helpers; until then, ensure filesystem backups capture both SQLite databases and payload directories atomically.