@synopackageland/cli 0.4.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -3
- package/dist/build-spk/delete-app-data.d.ts +27 -7
- package/dist/build-spk/delete-app-data.js +35 -34
- package/dist/build-spk/dsm-arch.d.ts +6 -1
- package/dist/build-spk/dsm-arch.js +25 -1
- package/dist/build-spk/dsm-version.d.ts +14 -0
- package/dist/build-spk/dsm-version.js +47 -0
- package/dist/build-spk/gateway.d.ts +31 -0
- package/dist/build-spk/gateway.js +55 -0
- package/dist/build-spk/generator.d.ts +5 -0
- package/dist/build-spk/generator.js +103 -107
- package/dist/build-spk/install-wizard.d.ts +20 -0
- package/dist/build-spk/install-wizard.js +76 -0
- package/dist/build-spk/native-lifecycle.d.ts +5 -0
- package/dist/build-spk/native-lifecycle.js +12 -2
- package/dist/build-spk/resource-worker.d.ts +9 -4
- package/dist/build-spk/resource-worker.js +15 -6
- package/dist/build-spk/share-combobox.d.ts +3 -0
- package/dist/build-spk/share-combobox.js +27 -0
- package/dist/build-spk/uninstall-wizard.d.ts +14 -0
- package/dist/build-spk/uninstall-wizard.js +33 -0
- package/dist/build-spk/wizard-i18n.d.ts +18 -0
- package/dist/build-spk/wizard-i18n.js +38 -0
- package/dist/build-spk/wizard-messages.d.ts +388 -0
- package/dist/build-spk/wizard-messages.js +387 -0
- package/dist/cli.js +130 -30
- package/dist/compose/analyze.d.ts +20 -0
- package/dist/compose/analyze.js +75 -11
- package/dist/contract/validate.js +33 -1
- package/dist/contract/web-launch.d.ts +22 -0
- package/dist/contract/web-launch.js +37 -0
- package/dist/deploy/deploy.d.ts +3 -0
- package/dist/deploy/deploy.js +11 -2
- package/dist/error-registry.js +60 -1
- package/dist/host/open-url.d.ts +2 -0
- package/dist/host/open-url.js +4 -1
- package/dist/images/pin.d.ts +52 -0
- package/dist/images/pin.js +249 -0
- package/dist/init.d.ts +27 -3
- package/dist/init.js +104 -15
- package/dist/inspect.d.ts +3 -0
- package/dist/inspect.js +15 -3
- package/dist/standalone/background.d.ts +21 -0
- package/dist/standalone/background.js +52 -0
- package/dist/standalone/binary.d.ts +1 -0
- package/dist/standalone/binary.js +1 -1
- package/dist/standalone/build.d.ts +2 -0
- package/dist/standalone/build.js +38 -6
- package/dist/standalone/dsm-window.js +2 -2
- package/dist/standalone/helper-inventory.d.ts +15 -0
- package/dist/standalone/helper-inventory.js +9 -0
- package/dist/standalone/helper.d.ts +1 -0
- package/dist/standalone/helper.js +28 -10
- package/dist/standalone/host-adapter.d.ts +1 -1
- package/dist/standalone/host-adapter.js +33 -15
- package/dist/standalone/host-file-navigation.d.ts +7 -0
- package/dist/standalone/host-file-navigation.js +172 -0
- package/dist/standalone/inspect-helper.js +9 -4
- package/dist/standalone/inspect-spk.d.ts +1 -1
- package/dist/standalone/inspect-spk.js +200 -7
- package/dist/standalone/job-diagnostics.d.ts +1 -0
- package/dist/standalone/job-diagnostics.js +49 -0
- package/dist/standalone/lifecycle.js +12 -2
- package/dist/standalone/manifest.d.ts +15 -2
- package/dist/standalone/manifest.js +37 -6
- package/dist/standalone/native-layout.d.ts +74 -0
- package/dist/standalone/native-layout.js +318 -0
- package/dist/standalone/resource.d.ts +11 -0
- package/dist/standalone/resource.js +13 -0
- package/dist/standalone/root-window.d.ts +3 -1
- package/dist/standalone/root-window.js +156 -38
- package/dist/standalone/shared-folder.d.ts +39 -0
- package/dist/standalone/shared-folder.js +141 -0
- package/dist/standalone/spk.d.ts +2 -0
- package/dist/standalone/spk.js +33 -3
- package/dist/standalone/worker-contract-json.d.ts +8 -0
- package/dist/standalone/worker-contract-json.js +141 -0
- package/dist/standalone/worker-contract.d.ts +189 -0
- package/dist/standalone/worker-contract.js +175 -0
- package/dist/standalone/worker-registry.d.ts +40 -0
- package/dist/standalone/worker-registry.js +167 -0
- package/dist/templates/_daemon/go.mod +2 -0
- package/dist/templates/_gateway/auth.go +101 -0
- package/dist/templates/_gateway/auth_test.go +216 -0
- package/dist/templates/_gateway/cgi.go +133 -0
- package/dist/templates/_gateway/cgi_test.go +156 -0
- package/dist/templates/_gateway/csrf.go +73 -0
- package/dist/templates/_gateway/csrf_test.go +155 -0
- package/dist/templates/_gateway/directory.go +108 -0
- package/dist/templates/_gateway/directory_test.go +202 -0
- package/dist/templates/_gateway/gateway.go +412 -0
- package/dist/templates/_gateway/gateway_test.go +676 -0
- package/dist/templates/_gateway/go.mod +3 -0
- package/dist/templates/_gateway/groups.go +66 -0
- package/dist/templates/_gateway/main.go +45 -0
- package/dist/templates/binary/synology-app.yaml +1 -1
- package/dist/templates/compose-import/compose.yaml +1 -1
- package/dist/templates/compose-import/synology-app.yaml +1 -1
- package/dist/templates/hello-files/compose.yaml +1 -1
- package/dist/templates/hello-files/synology-app.yaml +1 -1
- package/dist/templates/hello-web/compose.yaml +5 -2
- package/dist/templates/hello-web/synology-app.yaml +4 -1
- package/dist/templates/hello-web-page/compose.yaml +5 -2
- package/dist/templates/hello-web-page/synology-app.yaml +4 -1
- package/dist/templates/native-go/README.md +93 -4
- package/dist/templates/native-go/backend/THIRD_PARTY_NOTICES.txt +3 -1
- package/dist/templates/native-go/backend/cmd/app/main.go +17 -0
- package/dist/templates/native-go/backend/cmd/app/sdk_main.go +60 -0
- package/dist/templates/native-go/backend/cmd/background-worker/main.go +38 -0
- package/dist/templates/native-go/backend/cmd/helper/main.go +10 -1
- package/dist/templates/native-go/backend/cmd/helper/sdk_registry.go +19 -0
- package/dist/templates/native-go/backend/go.mod +5 -3
- package/dist/templates/native-go/backend/go.sum +4 -4
- package/dist/templates/native-go/backend/internal/api/registry.go +17 -6
- package/dist/templates/native-go/backend/internal/api/server.go +7 -1
- package/dist/templates/native-go/backend/internal/app/background.go +270 -0
- package/dist/templates/native-go/backend/internal/app/background_none.go +8 -0
- package/dist/templates/native-go/backend/internal/app/background_owner.go +59 -0
- package/dist/templates/native-go/backend/internal/app/background_owner_test.go +145 -0
- package/dist/templates/native-go/backend/internal/app/background_schedule.go +74 -0
- package/dist/templates/native-go/backend/internal/app/background_schedule_test.go +62 -0
- package/dist/templates/native-go/backend/internal/app/background_test.go +346 -0
- package/dist/templates/native-go/backend/internal/app/integration_state.go +16 -0
- package/dist/templates/native-go/backend/internal/app/migrations.go +41 -0
- package/dist/templates/native-go/backend/internal/app/migrations_test.go +41 -0
- package/dist/templates/native-go/backend/internal/app/nas_cgi_artifact_test.go +8 -0
- package/dist/templates/native-go/backend/internal/app/routes.go +17 -3
- package/dist/templates/native-go/backend/internal/app/routes_test.go +20 -3
- package/dist/templates/native-go/backend/internal/app/sdk_jobs.go +70 -0
- package/dist/templates/native-go/backend/internal/app/sdk_jobs_test.go +116 -0
- package/dist/templates/native-go/backend/internal/app/sdk_routes.go +174 -0
- package/dist/templates/native-go/backend/internal/app/session_files.go +15 -0
- package/dist/templates/native-go/backend/internal/app/session_files_test.go +26 -0
- package/dist/templates/native-go/backend/internal/app/shared_folder.go +144 -0
- package/dist/templates/native-go/backend/internal/app/shared_folder_test.go +158 -0
- package/dist/templates/native-go/backend/internal/background/access.go +57 -0
- package/dist/templates/native-go/backend/internal/background/owner_test.go +126 -0
- package/dist/templates/native-go/backend/internal/background/runner.go +185 -0
- package/dist/templates/native-go/backend/internal/background/runner_test.go +209 -0
- package/dist/templates/native-go/backend/internal/background/schedule.go +300 -0
- package/dist/templates/native-go/backend/internal/background/schedule_test.go +335 -0
- package/dist/templates/native-go/backend/internal/background/store.go +807 -0
- package/dist/templates/native-go/backend/internal/background/store_test.go +407 -0
- package/dist/templates/native-go/backend/internal/datamigrate/migrate.go +191 -0
- package/dist/templates/native-go/backend/internal/datamigrate/migrate_test.go +177 -0
- package/dist/templates/native-go/backend/internal/filestation/browse_test.go +67 -0
- package/dist/templates/native-go/backend/internal/filestation/client.go +251 -0
- package/dist/templates/native-go/backend/internal/filestation/client_test.go +155 -0
- package/dist/templates/native-go/backend/internal/filestation/doc.go +4 -0
- package/dist/templates/native-go/backend/internal/filestation/read_file_test.go +90 -0
- package/dist/templates/native-go/backend/internal/filestation/repository.go +207 -0
- package/dist/templates/native-go/backend/internal/filestation/repository_test.go +104 -0
- package/dist/templates/native-go/backend/internal/filestation/sdk_session.go +241 -0
- package/dist/templates/native-go/backend/internal/filestation/sdk_session_test.go +183 -0
- package/dist/templates/native-go/backend/internal/filestation/service.go +254 -0
- package/dist/templates/native-go/backend/internal/filestation/service_test.go +94 -0
- package/dist/templates/native-go/backend/internal/filestation/session_semantics_test.go +383 -0
- package/dist/templates/native-go/backend/internal/filestation/write.go +72 -0
- package/dist/templates/native-go/backend/internal/filestation/write_test.go +123 -0
- package/dist/templates/native-go/backend/internal/helper/background_proof.go +163 -0
- package/dist/templates/native-go/backend/internal/helper/background_proof_contract.go +46 -0
- package/dist/templates/native-go/backend/internal/helper/background_proof_test.go +161 -0
- package/dist/templates/native-go/backend/internal/helper/data_contract.go +3 -0
- package/dist/templates/native-go/backend/internal/helper/data_protocol.go +3 -0
- package/dist/templates/native-go/backend/internal/helper/data_protocol_test.go +1 -1
- package/dist/templates/native-go/backend/internal/helper/grant_authority.go +3 -0
- package/dist/templates/native-go/backend/internal/helper/grant_authority_test.go +1 -1
- package/dist/templates/native-go/backend/internal/helper/grant_repository_linux.go +2 -1
- package/dist/templates/native-go/backend/internal/helper/grant_repository_linux_test.go +4 -3
- package/dist/templates/native-go/backend/internal/helper/grant_snapshot.go +3 -0
- package/dist/templates/native-go/backend/internal/helper/jobcontract/bindings.go +48 -0
- package/dist/templates/native-go/backend/internal/helper/jobcontract/contract_test.go +436 -0
- package/dist/templates/native-go/backend/internal/helper/jobcontract/decode.go +185 -0
- package/dist/templates/native-go/backend/internal/helper/jobcontract/digest.go +55 -0
- package/dist/templates/native-go/backend/internal/helper/jobcontract/registry.go +85 -0
- package/dist/templates/native-go/backend/internal/helper/jobcontract/registry_test.go +73 -0
- package/dist/templates/native-go/backend/internal/helper/jobcontract/result.go +53 -0
- package/dist/templates/native-go/backend/internal/helper/jobcontract/stub.go +8 -0
- package/dist/templates/native-go/backend/internal/helper/jobcontract/testdata/input-digests.json +127 -0
- package/dist/templates/native-go/backend/internal/helper/jobcontract/types.go +234 -0
- package/dist/templates/native-go/backend/internal/helper/jobcontract/types_test.go +29 -0
- package/dist/templates/native-go/backend/internal/helper/jobcontract/validate.go +462 -0
- package/dist/templates/native-go/backend/internal/helper/legacy_authority_schema_linux_test.go +34 -0
- package/dist/templates/native-go/backend/internal/helper/legacy_authority_schema_test.go +6 -0
- package/dist/templates/native-go/backend/internal/helper/management.go +79 -0
- package/dist/templates/native-go/backend/internal/helper/observation.go +42 -2
- package/dist/templates/native-go/backend/internal/helper/observation_health_test.go +13 -1
- package/dist/templates/native-go/backend/internal/helper/observer_diagnostic.go +56 -10
- package/dist/templates/native-go/backend/internal/helper/observer_diagnostic_linux_test.go +6 -0
- package/dist/templates/native-go/backend/internal/helper/observer_diagnostic_writer.go +40 -0
- package/dist/templates/native-go/backend/internal/helper/process_linux.go +3 -0
- package/dist/templates/native-go/backend/internal/helper/query_deadline_linux_test.go +115 -0
- package/dist/templates/native-go/backend/internal/helper/query_pending_diagnostic_test.go +254 -0
- package/dist/templates/native-go/backend/internal/helper/relaxed_invalidation.go +3 -0
- package/dist/templates/native-go/backend/internal/helper/s1r_actor_races_linux_test.go +23 -4
- package/dist/templates/native-go/backend/internal/helper/sdk_assembly_linux.go +51 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_attach.go +83 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_attach_contract.go +32 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_attach_test.go +184 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_authority_schema_test.go +6 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_background_authority.go +832 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_background_authority_test.go +714 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_background_invalidation.go +218 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_background_lease.go +218 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_background_snapshot.go +110 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_background_store_linux_test.go +261 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_background_store_test.go +58 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_bindings.go +60 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_data_contract.go +251 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_data_protocol.go +424 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_dispatch_absence_test.go +51 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_display.go +488 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_display_contract.go +121 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_display_test.go +459 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_grant_authority.go +559 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_grant_repository_linux.go +417 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_grant_snapshot.go +94 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_history.go +80 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_history_test.go +76 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_job.go +697 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_job_child_linux.go +309 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_job_contract.go +122 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_job_linux_test.go +159 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_job_process_linux.go +327 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_job_test.go +501 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_job_vm_linux_test.go +343 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_journal.go +77 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_journal_linux.go +244 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_journal_linux_test.go +295 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_journal_test.go +71 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_picker_test.go +50 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_process_linux.go +184 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_public_vm_linux_test.go +129 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_relaxed_invalidation.go +242 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_rpc.go +299 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_rpc_contract.go +70 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_rpc_test.go +135 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_server_linux.go +152 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_session.go +677 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_session_contract.go +72 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_session_fence_test.go +215 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_session_test.go +475 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_supervisor_frame.go +78 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_supervisor_linux.go +414 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_transport.go +79 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_transport_linux.go +82 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_transport_test.go +64 -0
- package/dist/templates/native-go/backend/internal/helper/server_linux.go +3 -0
- package/dist/templates/native-go/backend/internal/helper/stale_management_linux_test.go +126 -0
- package/dist/templates/native-go/backend/internal/helper/stale_management_test.go +122 -0
- package/dist/templates/native-go/backend/internal/helper/startup_diagnostic.go +68 -0
- package/dist/templates/native-go/backend/internal/helper/startup_diagnostic_linux_test.go +126 -0
- package/dist/templates/native-go/backend/internal/helper/startup_diagnostic_test.go +117 -0
- package/dist/templates/native-go/backend/internal/helper/status.go +22 -13
- package/dist/templates/native-go/backend/internal/helper/status_test.go +45 -0
- package/dist/templates/native-go/backend/internal/helper/supervision.go +1 -1
- package/dist/templates/native-go/backend/internal/helper/supervisor_frame.go +3 -0
- package/dist/templates/native-go/backend/internal/helper/supervisor_linux.go +6 -2
- package/dist/templates/native-go/backend/internal/helper/unit_connection_test.go +22 -4
- package/dist/templates/native-go/backend/internal/helper/unit_linux.go +7 -3
- package/dist/templates/native-go/backend/internal/helper/unit_query_linux.go +5 -1
- package/dist/templates/native-go/backend/internal/helper/write_files_linux.go +7 -4
- package/dist/templates/native-go/backend/internal/helper/write_files_linux_test.go +26 -0
- package/dist/templates/native-go/dsm-package.yaml +1 -1
- package/dist/templates/native-go-background/BACKGROUND.md +111 -0
- package/dist/templates/native-go-background/backend/internal/app/background_on.go +7 -0
- package/dist/templates/native-go-background/backend/internal/app/background_routes_test.go +32 -0
- package/dist/templates/native-go-background/frontend/src/background/BackgroundPanel.vue +178 -0
- package/dist/templates/native-go-background/frontend/src/background/i18n/de.json +83 -0
- package/dist/templates/native-go-background/frontend/src/background/i18n/en.json +83 -0
- package/dist/templates/native-go-background/frontend/src/background/i18n/es.json +83 -0
- package/dist/templates/native-go-background/frontend/src/background/i18n/fr.json +83 -0
- package/dist/templates/native-go-background/frontend/src/background/i18n/it.json +83 -0
- package/dist/templates/native-go-background/frontend/src/background/i18n/ja.json +83 -0
- package/dist/templates/native-go-background/frontend/src/background/i18n/ko.json +83 -0
- package/dist/templates/native-go-background/frontend/src/background/i18n/zh-CN.json +83 -0
- package/dist/templates/native-go-background/frontend/src/background/i18n/zh-TW.json +83 -0
- package/dist/templates/native-go-background/frontend/src/background/i18n.ts +19 -0
- package/dist/templates/native-go-background/frontend/src/background/picker-provider.ts +13 -0
- package/dist/templates/native-go-background/frontend/test/background.test.ts +179 -0
- package/dist/templates/native-go-integration/backend/internal/app/personal.go +2 -2
- package/dist/templates/native-go-integration/backend/internal/app/personal_test.go +37 -0
- package/dist/templates/native-go-vue/README.md +38 -7
- package/dist/templates/native-go-vue/frontend/DESIGN.md +15 -3
- package/dist/templates/native-go-vue/frontend/README-JOBS.md +75 -0
- package/dist/templates/native-go-vue/frontend/README-M2.md +64 -0
- package/dist/templates/native-go-vue/frontend/package-lock.json +5 -4
- package/dist/templates/native-go-vue/frontend/package.json +1 -1
- package/dist/templates/native-go-vue/frontend/src/App.vue +39 -11
- package/dist/templates/native-go-vue/frontend/src/M2App.vue +57 -0
- package/dist/templates/native-go-vue/frontend/src/SDKApp.vue +203 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/InteractiveJobForm.vue +70 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/JobsAdminPanel.vue +33 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/JobsPanel.vue +135 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/connected-provider.ts +179 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/i18n/de.json +62 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/i18n/en.json +62 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/i18n/es.json +62 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/i18n/fr.json +62 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/i18n/it.json +62 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/i18n/ja.json +62 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/i18n/ko.json +62 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/i18n/zh-CN.json +62 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/i18n/zh-TW.json +62 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/i18n.ts +15 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/mock-provider.ts +67 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/provider.ts +60 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/validate.ts +44 -0
- package/dist/templates/native-go-vue/frontend/src/m2-main.ts +21 -0
- package/dist/templates/native-go-vue/frontend/src/m2-style.css +7 -0
- package/dist/templates/native-go-vue/frontend/src/nas/M2Files.vue +94 -0
- package/dist/templates/native-go-vue/frontend/src/nas/M2PathPicker.vue +70 -0
- package/dist/templates/native-go-vue/frontend/src/nas/M2Settings.vue +69 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/de.json +56 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/en.json +56 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/es.json +56 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/fr.json +56 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/it.json +56 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/ja.json +56 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/ko.json +56 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/zh-CN.json +56 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/zh-TW.json +56 -0
- package/dist/templates/native-go-vue/frontend/src/nas/m2-contract.ts +33 -0
- package/dist/templates/native-go-vue/frontend/src/nas/m2-i18n.ts +24 -0
- package/dist/templates/native-go-vue/frontend/src/nas/m2-provider.ts +104 -0
- package/dist/templates/native-go-vue/frontend/src/nas/use-m2-request.ts +18 -0
- package/dist/templates/native-go-vue/frontend/src/sdk-main.ts +39 -0
- package/dist/templates/native-go-vue/frontend/src/shell/AppShell.vue +48 -0
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/de.json +10 -0
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/en.json +10 -0
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/es.json +10 -0
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/fr.json +10 -0
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/it.json +10 -0
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/ja.json +10 -0
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/ko.json +10 -0
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/zh-CN.json +10 -0
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/zh-TW.json +10 -0
- package/dist/templates/native-go-vue/frontend/src/shell/i18n.ts +17 -0
- package/dist/templates/native-go-vue/frontend/src/shell/pages.ts +34 -0
- package/dist/templates/native-go-vue/frontend/src/style.css +2 -6
- package/dist/templates/native-go-vue/frontend/test/apps.test.ts +21 -0
- package/dist/templates/native-go-vue/frontend/test/jobs-connected.test.ts +163 -0
- package/dist/templates/native-go-vue/frontend/test/jobs-preview.html +22 -0
- package/dist/templates/native-go-vue/frontend/test/jobs.test.ts +176 -0
- package/dist/templates/native-go-vue/frontend/test/m2-preview.html +27 -0
- package/dist/templates/native-go-vue/frontend/test/m2-provider.test.ts +87 -0
- package/dist/templates/native-go-vue/frontend/test/m2-ui.test.ts +209 -0
- package/dist/templates/native-go-vue/frontend/test/native-controls.test.ts +27 -0
- package/dist/templates/native-go-vue/frontend/test/picker-wire.test.ts +110 -0
- package/dist/templates/native-go-vue/frontend/test/shell-preview.html +19 -0
- package/dist/templates/native-go-vue/frontend/test/shell-sdk.test.ts +73 -0
- package/dist/templates/native-go-vue/frontend/test/shell-ui.test.ts +114 -0
- package/dist/templates/native-go-vue/frontend/test/shell.test.ts +45 -0
- package/dist/templates/native-go-vue/frontend/vite.config.ts +2 -2
- package/dist/validate.js +6 -3
- package/package.json +1 -1
- package/schema/synology-app.schema.json +19 -0
- package/skills/reference/create.md +4 -0
- package/templates/_daemon/go.mod +2 -0
- package/templates/_gateway/auth.go +101 -0
- package/templates/_gateway/auth_test.go +216 -0
- package/templates/_gateway/cgi.go +133 -0
- package/templates/_gateway/cgi_test.go +156 -0
- package/templates/_gateway/csrf.go +73 -0
- package/templates/_gateway/csrf_test.go +155 -0
- package/templates/_gateway/directory.go +108 -0
- package/templates/_gateway/directory_test.go +202 -0
- package/templates/_gateway/gateway.go +412 -0
- package/templates/_gateway/gateway_test.go +676 -0
- package/templates/_gateway/go.mod +3 -0
- package/templates/_gateway/groups.go +66 -0
- package/templates/_gateway/main.go +45 -0
- package/templates/binary/synology-app.yaml +1 -1
- package/templates/compose-import/compose.yaml +1 -1
- package/templates/compose-import/synology-app.yaml +1 -1
- package/templates/hello-files/compose.yaml +1 -1
- package/templates/hello-files/synology-app.yaml +1 -1
- package/templates/hello-web/compose.yaml +5 -2
- package/templates/hello-web/synology-app.yaml +4 -1
- package/templates/hello-web-page/compose.yaml +5 -2
- package/templates/hello-web-page/synology-app.yaml +4 -1
- package/templates/native-go/README.md +93 -4
- package/templates/native-go/backend/THIRD_PARTY_NOTICES.txt +3 -1
- package/templates/native-go/backend/cmd/app/main.go +17 -0
- package/templates/native-go/backend/cmd/app/sdk_main.go +60 -0
- package/templates/native-go/backend/cmd/background-worker/main.go +38 -0
- package/templates/native-go/backend/cmd/helper/main.go +10 -1
- package/templates/native-go/backend/cmd/helper/sdk_registry.go +19 -0
- package/templates/native-go/backend/go.mod +5 -3
- package/templates/native-go/backend/go.sum +4 -4
- package/templates/native-go/backend/internal/api/registry.go +17 -6
- package/templates/native-go/backend/internal/api/server.go +7 -1
- package/templates/native-go/backend/internal/app/background.go +270 -0
- package/templates/native-go/backend/internal/app/background_none.go +8 -0
- package/templates/native-go/backend/internal/app/background_owner.go +59 -0
- package/templates/native-go/backend/internal/app/background_owner_test.go +145 -0
- package/templates/native-go/backend/internal/app/background_schedule.go +74 -0
- package/templates/native-go/backend/internal/app/background_schedule_test.go +62 -0
- package/templates/native-go/backend/internal/app/background_test.go +346 -0
- package/templates/native-go/backend/internal/app/integration_state.go +16 -0
- package/templates/native-go/backend/internal/app/migrations.go +41 -0
- package/templates/native-go/backend/internal/app/migrations_test.go +41 -0
- package/templates/native-go/backend/internal/app/nas_cgi_artifact_test.go +8 -0
- package/templates/native-go/backend/internal/app/routes.go +17 -3
- package/templates/native-go/backend/internal/app/routes_test.go +20 -3
- package/templates/native-go/backend/internal/app/sdk_jobs.go +70 -0
- package/templates/native-go/backend/internal/app/sdk_jobs_test.go +116 -0
- package/templates/native-go/backend/internal/app/sdk_routes.go +174 -0
- package/templates/native-go/backend/internal/app/session_files.go +15 -0
- package/templates/native-go/backend/internal/app/session_files_test.go +26 -0
- package/templates/native-go/backend/internal/app/shared_folder.go +144 -0
- package/templates/native-go/backend/internal/app/shared_folder_test.go +158 -0
- package/templates/native-go/backend/internal/background/access.go +57 -0
- package/templates/native-go/backend/internal/background/owner_test.go +126 -0
- package/templates/native-go/backend/internal/background/runner.go +185 -0
- package/templates/native-go/backend/internal/background/runner_test.go +209 -0
- package/templates/native-go/backend/internal/background/schedule.go +300 -0
- package/templates/native-go/backend/internal/background/schedule_test.go +335 -0
- package/templates/native-go/backend/internal/background/store.go +807 -0
- package/templates/native-go/backend/internal/background/store_test.go +407 -0
- package/templates/native-go/backend/internal/datamigrate/migrate.go +191 -0
- package/templates/native-go/backend/internal/datamigrate/migrate_test.go +177 -0
- package/templates/native-go/backend/internal/filestation/browse_test.go +67 -0
- package/templates/native-go/backend/internal/filestation/client.go +251 -0
- package/templates/native-go/backend/internal/filestation/client_test.go +155 -0
- package/templates/native-go/backend/internal/filestation/doc.go +4 -0
- package/templates/native-go/backend/internal/filestation/read_file_test.go +90 -0
- package/templates/native-go/backend/internal/filestation/repository.go +207 -0
- package/templates/native-go/backend/internal/filestation/repository_test.go +104 -0
- package/templates/native-go/backend/internal/filestation/sdk_session.go +241 -0
- package/templates/native-go/backend/internal/filestation/sdk_session_test.go +183 -0
- package/templates/native-go/backend/internal/filestation/service.go +254 -0
- package/templates/native-go/backend/internal/filestation/service_test.go +94 -0
- package/templates/native-go/backend/internal/filestation/session_semantics_test.go +383 -0
- package/templates/native-go/backend/internal/filestation/write.go +72 -0
- package/templates/native-go/backend/internal/filestation/write_test.go +123 -0
- package/templates/native-go/backend/internal/helper/background_proof.go +163 -0
- package/templates/native-go/backend/internal/helper/background_proof_contract.go +46 -0
- package/templates/native-go/backend/internal/helper/background_proof_test.go +161 -0
- package/templates/native-go/backend/internal/helper/data_contract.go +3 -0
- package/templates/native-go/backend/internal/helper/data_protocol.go +3 -0
- package/templates/native-go/backend/internal/helper/data_protocol_test.go +1 -1
- package/templates/native-go/backend/internal/helper/grant_authority.go +3 -0
- package/templates/native-go/backend/internal/helper/grant_authority_test.go +1 -1
- package/templates/native-go/backend/internal/helper/grant_repository_linux.go +2 -1
- package/templates/native-go/backend/internal/helper/grant_repository_linux_test.go +4 -3
- package/templates/native-go/backend/internal/helper/grant_snapshot.go +3 -0
- package/templates/native-go/backend/internal/helper/jobcontract/bindings.go +48 -0
- package/templates/native-go/backend/internal/helper/jobcontract/contract_test.go +436 -0
- package/templates/native-go/backend/internal/helper/jobcontract/decode.go +185 -0
- package/templates/native-go/backend/internal/helper/jobcontract/digest.go +55 -0
- package/templates/native-go/backend/internal/helper/jobcontract/registry.go +85 -0
- package/templates/native-go/backend/internal/helper/jobcontract/registry_test.go +73 -0
- package/templates/native-go/backend/internal/helper/jobcontract/result.go +53 -0
- package/templates/native-go/backend/internal/helper/jobcontract/stub.go +8 -0
- package/templates/native-go/backend/internal/helper/jobcontract/testdata/input-digests.json +127 -0
- package/templates/native-go/backend/internal/helper/jobcontract/types.go +234 -0
- package/templates/native-go/backend/internal/helper/jobcontract/types_test.go +29 -0
- package/templates/native-go/backend/internal/helper/jobcontract/validate.go +462 -0
- package/templates/native-go/backend/internal/helper/legacy_authority_schema_linux_test.go +34 -0
- package/templates/native-go/backend/internal/helper/legacy_authority_schema_test.go +6 -0
- package/templates/native-go/backend/internal/helper/management.go +79 -0
- package/templates/native-go/backend/internal/helper/observation.go +42 -2
- package/templates/native-go/backend/internal/helper/observation_health_test.go +13 -1
- package/templates/native-go/backend/internal/helper/observer_diagnostic.go +56 -10
- package/templates/native-go/backend/internal/helper/observer_diagnostic_linux_test.go +6 -0
- package/templates/native-go/backend/internal/helper/observer_diagnostic_writer.go +40 -0
- package/templates/native-go/backend/internal/helper/process_linux.go +3 -0
- package/templates/native-go/backend/internal/helper/query_deadline_linux_test.go +115 -0
- package/templates/native-go/backend/internal/helper/query_pending_diagnostic_test.go +254 -0
- package/templates/native-go/backend/internal/helper/relaxed_invalidation.go +3 -0
- package/templates/native-go/backend/internal/helper/s1r_actor_races_linux_test.go +23 -4
- package/templates/native-go/backend/internal/helper/sdk_assembly_linux.go +51 -0
- package/templates/native-go/backend/internal/helper/sdk_attach.go +83 -0
- package/templates/native-go/backend/internal/helper/sdk_attach_contract.go +32 -0
- package/templates/native-go/backend/internal/helper/sdk_attach_test.go +184 -0
- package/templates/native-go/backend/internal/helper/sdk_authority_schema_test.go +6 -0
- package/templates/native-go/backend/internal/helper/sdk_background_authority.go +832 -0
- package/templates/native-go/backend/internal/helper/sdk_background_authority_test.go +714 -0
- package/templates/native-go/backend/internal/helper/sdk_background_invalidation.go +218 -0
- package/templates/native-go/backend/internal/helper/sdk_background_lease.go +218 -0
- package/templates/native-go/backend/internal/helper/sdk_background_snapshot.go +110 -0
- package/templates/native-go/backend/internal/helper/sdk_background_store_linux_test.go +261 -0
- package/templates/native-go/backend/internal/helper/sdk_background_store_test.go +58 -0
- package/templates/native-go/backend/internal/helper/sdk_bindings.go +60 -0
- package/templates/native-go/backend/internal/helper/sdk_data_contract.go +251 -0
- package/templates/native-go/backend/internal/helper/sdk_data_protocol.go +424 -0
- package/templates/native-go/backend/internal/helper/sdk_dispatch_absence_test.go +51 -0
- package/templates/native-go/backend/internal/helper/sdk_display.go +488 -0
- package/templates/native-go/backend/internal/helper/sdk_display_contract.go +121 -0
- package/templates/native-go/backend/internal/helper/sdk_display_test.go +459 -0
- package/templates/native-go/backend/internal/helper/sdk_grant_authority.go +559 -0
- package/templates/native-go/backend/internal/helper/sdk_grant_repository_linux.go +417 -0
- package/templates/native-go/backend/internal/helper/sdk_grant_snapshot.go +94 -0
- package/templates/native-go/backend/internal/helper/sdk_history.go +80 -0
- package/templates/native-go/backend/internal/helper/sdk_history_test.go +76 -0
- package/templates/native-go/backend/internal/helper/sdk_job.go +697 -0
- package/templates/native-go/backend/internal/helper/sdk_job_child_linux.go +309 -0
- package/templates/native-go/backend/internal/helper/sdk_job_contract.go +122 -0
- package/templates/native-go/backend/internal/helper/sdk_job_linux_test.go +159 -0
- package/templates/native-go/backend/internal/helper/sdk_job_process_linux.go +327 -0
- package/templates/native-go/backend/internal/helper/sdk_job_test.go +501 -0
- package/templates/native-go/backend/internal/helper/sdk_job_vm_linux_test.go +343 -0
- package/templates/native-go/backend/internal/helper/sdk_journal.go +77 -0
- package/templates/native-go/backend/internal/helper/sdk_journal_linux.go +244 -0
- package/templates/native-go/backend/internal/helper/sdk_journal_linux_test.go +295 -0
- package/templates/native-go/backend/internal/helper/sdk_journal_test.go +71 -0
- package/templates/native-go/backend/internal/helper/sdk_picker_test.go +50 -0
- package/templates/native-go/backend/internal/helper/sdk_process_linux.go +184 -0
- package/templates/native-go/backend/internal/helper/sdk_public_vm_linux_test.go +129 -0
- package/templates/native-go/backend/internal/helper/sdk_relaxed_invalidation.go +242 -0
- package/templates/native-go/backend/internal/helper/sdk_rpc.go +299 -0
- package/templates/native-go/backend/internal/helper/sdk_rpc_contract.go +70 -0
- package/templates/native-go/backend/internal/helper/sdk_rpc_test.go +135 -0
- package/templates/native-go/backend/internal/helper/sdk_server_linux.go +152 -0
- package/templates/native-go/backend/internal/helper/sdk_session.go +677 -0
- package/templates/native-go/backend/internal/helper/sdk_session_contract.go +72 -0
- package/templates/native-go/backend/internal/helper/sdk_session_fence_test.go +215 -0
- package/templates/native-go/backend/internal/helper/sdk_session_test.go +475 -0
- package/templates/native-go/backend/internal/helper/sdk_supervisor_frame.go +78 -0
- package/templates/native-go/backend/internal/helper/sdk_supervisor_linux.go +414 -0
- package/templates/native-go/backend/internal/helper/sdk_transport.go +79 -0
- package/templates/native-go/backend/internal/helper/sdk_transport_linux.go +82 -0
- package/templates/native-go/backend/internal/helper/sdk_transport_test.go +64 -0
- package/templates/native-go/backend/internal/helper/server_linux.go +3 -0
- package/templates/native-go/backend/internal/helper/stale_management_linux_test.go +126 -0
- package/templates/native-go/backend/internal/helper/stale_management_test.go +122 -0
- package/templates/native-go/backend/internal/helper/startup_diagnostic.go +68 -0
- package/templates/native-go/backend/internal/helper/startup_diagnostic_linux_test.go +126 -0
- package/templates/native-go/backend/internal/helper/startup_diagnostic_test.go +117 -0
- package/templates/native-go/backend/internal/helper/status.go +22 -13
- package/templates/native-go/backend/internal/helper/status_test.go +45 -0
- package/templates/native-go/backend/internal/helper/supervision.go +1 -1
- package/templates/native-go/backend/internal/helper/supervisor_frame.go +3 -0
- package/templates/native-go/backend/internal/helper/supervisor_linux.go +6 -2
- package/templates/native-go/backend/internal/helper/unit_connection_test.go +22 -4
- package/templates/native-go/backend/internal/helper/unit_linux.go +7 -3
- package/templates/native-go/backend/internal/helper/unit_query_linux.go +5 -1
- package/templates/native-go/backend/internal/helper/write_files_linux.go +7 -4
- package/templates/native-go/backend/internal/helper/write_files_linux_test.go +26 -0
- package/templates/native-go/dsm-package.yaml +1 -1
- package/templates/native-go-background/BACKGROUND.md +111 -0
- package/templates/native-go-background/backend/internal/app/background_on.go +7 -0
- package/templates/native-go-background/backend/internal/app/background_routes_test.go +32 -0
- package/templates/native-go-background/frontend/src/background/BackgroundPanel.vue +178 -0
- package/templates/native-go-background/frontend/src/background/i18n/de.json +83 -0
- package/templates/native-go-background/frontend/src/background/i18n/en.json +83 -0
- package/templates/native-go-background/frontend/src/background/i18n/es.json +83 -0
- package/templates/native-go-background/frontend/src/background/i18n/fr.json +83 -0
- package/templates/native-go-background/frontend/src/background/i18n/it.json +83 -0
- package/templates/native-go-background/frontend/src/background/i18n/ja.json +83 -0
- package/templates/native-go-background/frontend/src/background/i18n/ko.json +83 -0
- package/templates/native-go-background/frontend/src/background/i18n/zh-CN.json +83 -0
- package/templates/native-go-background/frontend/src/background/i18n/zh-TW.json +83 -0
- package/templates/native-go-background/frontend/src/background/i18n.ts +19 -0
- package/templates/native-go-background/frontend/src/background/picker-provider.ts +13 -0
- package/templates/native-go-background/frontend/test/background.test.ts +179 -0
- package/templates/native-go-integration/backend/internal/app/personal.go +2 -2
- package/templates/native-go-integration/backend/internal/app/personal_test.go +37 -0
- package/templates/native-go-vue/README.md +38 -7
- package/templates/native-go-vue/frontend/DESIGN.md +15 -3
- package/templates/native-go-vue/frontend/README-JOBS.md +75 -0
- package/templates/native-go-vue/frontend/README-M2.md +64 -0
- package/templates/native-go-vue/frontend/package-lock.json +5 -4
- package/templates/native-go-vue/frontend/package.json +1 -1
- package/templates/native-go-vue/frontend/src/App.vue +39 -11
- package/templates/native-go-vue/frontend/src/M2App.vue +57 -0
- package/templates/native-go-vue/frontend/src/SDKApp.vue +203 -0
- package/templates/native-go-vue/frontend/src/jobs/InteractiveJobForm.vue +70 -0
- package/templates/native-go-vue/frontend/src/jobs/JobsAdminPanel.vue +33 -0
- package/templates/native-go-vue/frontend/src/jobs/JobsPanel.vue +135 -0
- package/templates/native-go-vue/frontend/src/jobs/connected-provider.ts +179 -0
- package/templates/native-go-vue/frontend/src/jobs/i18n/de.json +62 -0
- package/templates/native-go-vue/frontend/src/jobs/i18n/en.json +62 -0
- package/templates/native-go-vue/frontend/src/jobs/i18n/es.json +62 -0
- package/templates/native-go-vue/frontend/src/jobs/i18n/fr.json +62 -0
- package/templates/native-go-vue/frontend/src/jobs/i18n/it.json +62 -0
- package/templates/native-go-vue/frontend/src/jobs/i18n/ja.json +62 -0
- package/templates/native-go-vue/frontend/src/jobs/i18n/ko.json +62 -0
- package/templates/native-go-vue/frontend/src/jobs/i18n/zh-CN.json +62 -0
- package/templates/native-go-vue/frontend/src/jobs/i18n/zh-TW.json +62 -0
- package/templates/native-go-vue/frontend/src/jobs/i18n.ts +15 -0
- package/templates/native-go-vue/frontend/src/jobs/mock-provider.ts +67 -0
- package/templates/native-go-vue/frontend/src/jobs/provider.ts +60 -0
- package/templates/native-go-vue/frontend/src/jobs/validate.ts +44 -0
- package/templates/native-go-vue/frontend/src/m2-main.ts +21 -0
- package/templates/native-go-vue/frontend/src/m2-style.css +7 -0
- package/templates/native-go-vue/frontend/src/nas/M2Files.vue +94 -0
- package/templates/native-go-vue/frontend/src/nas/M2PathPicker.vue +70 -0
- package/templates/native-go-vue/frontend/src/nas/M2Settings.vue +69 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/m2/de.json +56 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/m2/en.json +56 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/m2/es.json +56 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/m2/fr.json +56 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/m2/it.json +56 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/m2/ja.json +56 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/m2/ko.json +56 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/m2/zh-CN.json +56 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/m2/zh-TW.json +56 -0
- package/templates/native-go-vue/frontend/src/nas/m2-contract.ts +33 -0
- package/templates/native-go-vue/frontend/src/nas/m2-i18n.ts +24 -0
- package/templates/native-go-vue/frontend/src/nas/m2-provider.ts +104 -0
- package/templates/native-go-vue/frontend/src/nas/use-m2-request.ts +18 -0
- package/templates/native-go-vue/frontend/src/sdk-main.ts +39 -0
- package/templates/native-go-vue/frontend/src/shell/AppShell.vue +48 -0
- package/templates/native-go-vue/frontend/src/shell/i18n/de.json +10 -0
- package/templates/native-go-vue/frontend/src/shell/i18n/en.json +10 -0
- package/templates/native-go-vue/frontend/src/shell/i18n/es.json +10 -0
- package/templates/native-go-vue/frontend/src/shell/i18n/fr.json +10 -0
- package/templates/native-go-vue/frontend/src/shell/i18n/it.json +10 -0
- package/templates/native-go-vue/frontend/src/shell/i18n/ja.json +10 -0
- package/templates/native-go-vue/frontend/src/shell/i18n/ko.json +10 -0
- package/templates/native-go-vue/frontend/src/shell/i18n/zh-CN.json +10 -0
- package/templates/native-go-vue/frontend/src/shell/i18n/zh-TW.json +10 -0
- package/templates/native-go-vue/frontend/src/shell/i18n.ts +17 -0
- package/templates/native-go-vue/frontend/src/shell/pages.ts +34 -0
- package/templates/native-go-vue/frontend/src/style.css +2 -6
- package/templates/native-go-vue/frontend/test/apps.test.ts +21 -0
- package/templates/native-go-vue/frontend/test/jobs-connected.test.ts +163 -0
- package/templates/native-go-vue/frontend/test/jobs-preview.html +22 -0
- package/templates/native-go-vue/frontend/test/jobs.test.ts +176 -0
- package/templates/native-go-vue/frontend/test/m2-preview.html +27 -0
- package/templates/native-go-vue/frontend/test/m2-provider.test.ts +87 -0
- package/templates/native-go-vue/frontend/test/m2-ui.test.ts +209 -0
- package/templates/native-go-vue/frontend/test/native-controls.test.ts +27 -0
- package/templates/native-go-vue/frontend/test/picker-wire.test.ts +110 -0
- package/templates/native-go-vue/frontend/test/shell-preview.html +19 -0
- package/templates/native-go-vue/frontend/test/shell-sdk.test.ts +73 -0
- package/templates/native-go-vue/frontend/test/shell-ui.test.ts +114 -0
- package/templates/native-go-vue/frontend/test/shell.test.ts +45 -0
- package/templates/native-go-vue/frontend/vite.config.ts +2 -2
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
//go:build synopkgland_sdk_workers
|
|
2
|
+
|
|
3
|
+
package helper
|
|
4
|
+
|
|
5
|
+
import (
|
|
6
|
+
"context"
|
|
7
|
+
"crypto/rand"
|
|
8
|
+
"encoding/hex"
|
|
9
|
+
"encoding/json"
|
|
10
|
+
"errors"
|
|
11
|
+
"net"
|
|
12
|
+
"os"
|
|
13
|
+
"os/exec"
|
|
14
|
+
"path/filepath"
|
|
15
|
+
"runtime"
|
|
16
|
+
"strconv"
|
|
17
|
+
"syscall"
|
|
18
|
+
"time"
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
func setParentDeath() error {
|
|
22
|
+
_, _, err := syscall.Syscall6(syscall.SYS_PRCTL, syscall.PR_SET_PDEATHSIG, uintptr(syscall.SIGKILL), 0, 0, 0, 0)
|
|
23
|
+
if err != 0 {
|
|
24
|
+
return err
|
|
25
|
+
}
|
|
26
|
+
return nil
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
type ownedLinuxChild struct {
|
|
30
|
+
process *os.Process
|
|
31
|
+
reaped bool
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
func (c *ownedLinuxChild) exited() (bool, error) {
|
|
35
|
+
if c.reaped {
|
|
36
|
+
return true, nil
|
|
37
|
+
}
|
|
38
|
+
var status syscall.WaitStatus
|
|
39
|
+
pid, err := syscall.Wait4(c.process.Pid, &status, syscall.WNOHANG, nil)
|
|
40
|
+
if errors.Is(err, syscall.EINTR) {
|
|
41
|
+
return false, nil
|
|
42
|
+
}
|
|
43
|
+
if err != nil {
|
|
44
|
+
return false, err
|
|
45
|
+
} // ECHILD never permits signalling.
|
|
46
|
+
if pid == c.process.Pid {
|
|
47
|
+
c.reaped = true
|
|
48
|
+
c.process.Release()
|
|
49
|
+
}
|
|
50
|
+
return c.reaped, nil
|
|
51
|
+
}
|
|
52
|
+
func (c *ownedLinuxChild) signal(s syscall.Signal) error {
|
|
53
|
+
if c.reaped {
|
|
54
|
+
return errTrust
|
|
55
|
+
}
|
|
56
|
+
// This PID came from our own Start, and ONLY this event loop calls Wait4.
|
|
57
|
+
// Even if it exits here it remains an unreaped zombie, pinning its PID.
|
|
58
|
+
return syscall.Kill(c.process.Pid, s)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// The thread creating the child must remain alive: PDEATHSIG is tied to that
|
|
62
|
+
// Linux thread, not merely the supervisor's thread group / Go process.
|
|
63
|
+
func superviseLinux(c Client, binary string) error {
|
|
64
|
+
runtime.LockOSThread()
|
|
65
|
+
defer runtime.UnlockOSThread()
|
|
66
|
+
r, err := readRecord(c.StateDir, 0)
|
|
67
|
+
if err != nil || !r.Enabled || r.Inventory != c.Expected || r.Lifecycle == nil || r.Lifecycle.Phase != "running" {
|
|
68
|
+
return errTrust
|
|
69
|
+
}
|
|
70
|
+
lease, err := acquireLifetime(c, r.Lifecycle)
|
|
71
|
+
if err != nil {
|
|
72
|
+
return err
|
|
73
|
+
}
|
|
74
|
+
processLifetime = lease
|
|
75
|
+
// Recheck under the witness: repair may have fenced between the first
|
|
76
|
+
// approval read and lock acquisition. No child exists before this point.
|
|
77
|
+
current, err := readRecord(c.StateDir, 0)
|
|
78
|
+
if err != nil || !current.Enabled || current.Inventory != r.Inventory || current.Lifecycle == nil || current.Lifecycle.Epoch != r.Lifecycle.Epoch || current.Lifecycle.Phase != "running" {
|
|
79
|
+
return errTrust
|
|
80
|
+
}
|
|
81
|
+
o, err := openUnitObserver(context.Background(), c.Expected)
|
|
82
|
+
if err != nil {
|
|
83
|
+
return err
|
|
84
|
+
}
|
|
85
|
+
defer o.conn.Close()
|
|
86
|
+
if o.gate.binding != r.Lifecycle.Binding {
|
|
87
|
+
return errTrust
|
|
88
|
+
}
|
|
89
|
+
watcher, cancelWatcher := context.WithCancel(context.Background())
|
|
90
|
+
defer cancelWatcher()
|
|
91
|
+
go o.watch(watcher)
|
|
92
|
+
epoch := r.Lifecycle.Epoch
|
|
93
|
+
stopDiagnostics := startObserverDiagnostics(c, epoch, o.gate)
|
|
94
|
+
defer stopDiagnostics()
|
|
95
|
+
identity, err := inspectSupervisor(os.Getpid(), c.Expected)
|
|
96
|
+
if err != nil {
|
|
97
|
+
return err
|
|
98
|
+
}
|
|
99
|
+
if err := writeProcess(c.RunDir, identity); err != nil {
|
|
100
|
+
return err
|
|
101
|
+
}
|
|
102
|
+
socket := filepath.Join(c.RunDir, "supervisor.sock")
|
|
103
|
+
l, err := net.ListenUnix("unix", &net.UnixAddr{Name: socket, Net: "unix"})
|
|
104
|
+
if err != nil {
|
|
105
|
+
return err
|
|
106
|
+
}
|
|
107
|
+
l.SetUnlinkOnClose(false)
|
|
108
|
+
defer l.Close()
|
|
109
|
+
if err := os.Chmod(socket, 0600); err != nil {
|
|
110
|
+
return err
|
|
111
|
+
}
|
|
112
|
+
cmd := exec.Command(binary, "serve-child")
|
|
113
|
+
cmd.ExtraFiles = []*os.File{lease}
|
|
114
|
+
cmd.Env = []string{"PATH=/usr/sbin:/usr/bin:/sbin:/bin", "SYNOPKGLAND_PARENT=" + strconv.Itoa(os.Getpid())}
|
|
115
|
+
// Go sets prctl before exec and rechecks the parent immediately afterward.
|
|
116
|
+
cmd.SysProcAttr = &syscall.SysProcAttr{Pdeathsig: syscall.SIGKILL}
|
|
117
|
+
if err := cmd.Start(); err != nil {
|
|
118
|
+
return err
|
|
119
|
+
}
|
|
120
|
+
child := &ownedLinuxChild{process: cmd.Process}
|
|
121
|
+
cohort := newOperationCohort(c.Expected, epoch, child.process.Pid, o.gate, func() bool { return !child.reaped })
|
|
122
|
+
defer func() {
|
|
123
|
+
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
|
|
124
|
+
defer cancel()
|
|
125
|
+
_ = cohort.drain(ctx, time.Second)
|
|
126
|
+
_ = stopChild(ctx, child, time.Second)
|
|
127
|
+
}()
|
|
128
|
+
var grants *supervisorGrants
|
|
129
|
+
var jobs *sdkJobOwner
|
|
130
|
+
var grantRepo *FileGrantRepository
|
|
131
|
+
defer func() {
|
|
132
|
+
if jobs != nil && jobs.session != nil {
|
|
133
|
+
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
|
|
134
|
+
defer cancel()
|
|
135
|
+
_ = jobs.session.shutdown(ctx)
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
if grantRepo != nil {
|
|
139
|
+
grantRepo.Close()
|
|
140
|
+
}
|
|
141
|
+
}()
|
|
142
|
+
// M1 Start first observes the health handshake, then finalizeStart clears
|
|
143
|
+
// residual under policy.lock. Pin S3's COMPLETE approval only after that
|
|
144
|
+
// handoff; constructing against residual=true would permanently fence it.
|
|
145
|
+
initializeGrants := func() {
|
|
146
|
+
if c.Expected.Protocol != DataProtocol || grants != nil || !o.gate.allow(time.Now()) {
|
|
147
|
+
return
|
|
148
|
+
}
|
|
149
|
+
approval, e := readRecord(c.StateDir, 0)
|
|
150
|
+
if e != nil || !approval.Enabled || approval.Inventory != c.Expected || approval.Lifecycle == nil || approval.Lifecycle.Epoch != epoch || approval.Lifecycle.Phase != "running" {
|
|
151
|
+
o.gate.fence("grant-approval-unavailable")
|
|
152
|
+
return
|
|
153
|
+
}
|
|
154
|
+
if approval.Residual {
|
|
155
|
+
return
|
|
156
|
+
} // health-only handshake; no grant authority yet
|
|
157
|
+
var code Code
|
|
158
|
+
stage := "grants-open"
|
|
159
|
+
grants, grantRepo, code = openSupervisorGrants(c, binary, cohort)
|
|
160
|
+
if code == "" && len(sdkCompiledRegistry) > 0 {
|
|
161
|
+
jobs, code, stage = openSDKJobs(c, binary, grants, grantRepo)
|
|
162
|
+
}
|
|
163
|
+
if code != "" {
|
|
164
|
+
o.gate.fenceStartup(stage, code)
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
fenceRetryExhausted := false
|
|
168
|
+
// No cmd.Wait goroutine: reaping and signalling are serialized below.
|
|
169
|
+
for {
|
|
170
|
+
current, readErr := readRecord(c.StateDir, 0)
|
|
171
|
+
if readErr != nil || current.Lifecycle == nil || current.Lifecycle.Epoch != epoch {
|
|
172
|
+
o.gate.fence("approval-unavailable")
|
|
173
|
+
} else if !current.Enabled || current.Lifecycle.Phase != "running" {
|
|
174
|
+
o.gate.fence("admin-stop")
|
|
175
|
+
}
|
|
176
|
+
initializeGrants()
|
|
177
|
+
// Reload verification denies requests without retiring this epoch.
|
|
178
|
+
if o.gate.fenced(time.Now()) {
|
|
179
|
+
if grants != nil {
|
|
180
|
+
grants.authority.Fence()
|
|
181
|
+
}
|
|
182
|
+
cohort.deny()
|
|
183
|
+
// NB policy.lock keeps the owner loop and admin stop responsive. No
|
|
184
|
+
// graceful stop before the irreversible durable fence transaction.
|
|
185
|
+
err := errBusy
|
|
186
|
+
if !fenceRetryExhausted {
|
|
187
|
+
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
|
|
188
|
+
err = retryCohortPolicy(ctx, func() error {
|
|
189
|
+
return fenceRecord(c, epoch, o.gate.reason(), o.gate.observerDiagnostic(epoch).Fence.Detail)
|
|
190
|
+
})
|
|
191
|
+
cancel()
|
|
192
|
+
}
|
|
193
|
+
if err == nil {
|
|
194
|
+
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
|
|
195
|
+
if jobs != nil && jobs.session != nil {
|
|
196
|
+
if code := jobs.session.shutdown(ctx); code != "" {
|
|
197
|
+
err = code
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
if err == nil {
|
|
201
|
+
err = cohort.drain(ctx, time.Second)
|
|
202
|
+
}
|
|
203
|
+
if err == nil {
|
|
204
|
+
err = stopChild(ctx, child, time.Second)
|
|
205
|
+
}
|
|
206
|
+
cancel()
|
|
207
|
+
if err != nil {
|
|
208
|
+
return err
|
|
209
|
+
}
|
|
210
|
+
if err = l.Close(); err != nil {
|
|
211
|
+
return err
|
|
212
|
+
}
|
|
213
|
+
p, e := readProcess(c.RunDir, 0)
|
|
214
|
+
if e != nil || p != identity {
|
|
215
|
+
return errTrust
|
|
216
|
+
}
|
|
217
|
+
if err = cleanRuntime(c, true); err != nil {
|
|
218
|
+
return err
|
|
219
|
+
}
|
|
220
|
+
q, err := cohort.proof()
|
|
221
|
+
if err != nil {
|
|
222
|
+
return err
|
|
223
|
+
}
|
|
224
|
+
// Completion is quiescence proof, published after close/reap/unlink.
|
|
225
|
+
ctx, cancel = context.WithTimeout(context.Background(), time.Second)
|
|
226
|
+
defer cancel()
|
|
227
|
+
return retryCohortPolicy(ctx, func() error { return completeRecord(c, epoch, identity, q) })
|
|
228
|
+
}
|
|
229
|
+
if !errors.Is(err, errBusy) {
|
|
230
|
+
return err
|
|
231
|
+
}
|
|
232
|
+
// Budget expiry parks the fenced owner, retaining the lifetime
|
|
233
|
+
// witness. Do not exit (PDEATHSIG), poll/signal canceled children,
|
|
234
|
+
// or restart automatic retries. An explicit root stop retries below.
|
|
235
|
+
fenceRetryExhausted = true
|
|
236
|
+
}
|
|
237
|
+
if !fenceRetryExhausted {
|
|
238
|
+
if jobs != nil {
|
|
239
|
+
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
|
|
240
|
+
code := jobs.poll(ctx)
|
|
241
|
+
cancel()
|
|
242
|
+
if code == ErrCleanupRequired {
|
|
243
|
+
o.gate.fence("sdk-job-cleanup-required")
|
|
244
|
+
continue
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
if err := cohort.poll(); err != nil {
|
|
248
|
+
return err
|
|
249
|
+
}
|
|
250
|
+
if done, err := child.exited(); err != nil {
|
|
251
|
+
return err
|
|
252
|
+
} else if done && (cohort.started > 0 || jobs != nil && jobs.session != nil) {
|
|
253
|
+
o.gate.fence("helper-exited")
|
|
254
|
+
continue
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
l.SetDeadline(time.Now().Add(20 * time.Millisecond))
|
|
258
|
+
conn, err := l.AcceptUnix()
|
|
259
|
+
if err != nil {
|
|
260
|
+
if e, ok := err.(net.Error); ok && e.Timeout() {
|
|
261
|
+
continue
|
|
262
|
+
}
|
|
263
|
+
return err
|
|
264
|
+
}
|
|
265
|
+
peer, err := peerCredentials(conn)
|
|
266
|
+
if err != nil || peer.Uid != 0 {
|
|
267
|
+
conn.Close()
|
|
268
|
+
continue
|
|
269
|
+
}
|
|
270
|
+
req, code := receiveSupervisorRequest(conn)
|
|
271
|
+
if code != "" || req.Process != identity {
|
|
272
|
+
conn.Close()
|
|
273
|
+
continue
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
if req.Op == "jobs" {
|
|
277
|
+
initializeGrants()
|
|
278
|
+
conn.SetDeadline(time.Now().Add(3 * time.Second))
|
|
279
|
+
res := sdkWireResponse{Inventory: c.Expected, Nonce: req.Nonce, Code: ErrUnavailable}
|
|
280
|
+
if jobs != nil {
|
|
281
|
+
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
|
|
282
|
+
res = jobs.dispatchSDK(ctx, operationPeer{int(peer.Pid), peer.Uid}, req.Data)
|
|
283
|
+
cancel()
|
|
284
|
+
}
|
|
285
|
+
json.NewEncoder(conn).Encode(res)
|
|
286
|
+
conn.Close()
|
|
287
|
+
continue
|
|
288
|
+
}
|
|
289
|
+
if req.Op == "grants" {
|
|
290
|
+
initializeGrants()
|
|
291
|
+
conn.SetDeadline(time.Now().Add(3 * time.Second))
|
|
292
|
+
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
|
|
293
|
+
res := dispatchSupervisorGrant(ctx, grants, operationPeer{int(peer.Pid), peer.Uid}, req)
|
|
294
|
+
cancel()
|
|
295
|
+
json.NewEncoder(conn).Encode(res)
|
|
296
|
+
conn.Close()
|
|
297
|
+
if grants != nil {
|
|
298
|
+
grants.authority.mu.Lock()
|
|
299
|
+
fenced := grants.authority.fenced
|
|
300
|
+
grants.authority.mu.Unlock()
|
|
301
|
+
if fenced {
|
|
302
|
+
o.gate.fence("grant-authority-fenced")
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
continue
|
|
306
|
+
}
|
|
307
|
+
if req.Op == "admit" {
|
|
308
|
+
current, e := readRecord(c.StateDir, 0)
|
|
309
|
+
allowed := e == nil && current.Enabled && current.Inventory == c.Expected && current.Lifecycle != nil && current.Lifecycle.Epoch == epoch && current.Lifecycle.Phase == "running" && !child.reaped && int(peer.Pid) == child.process.Pid
|
|
310
|
+
readiness := "fenced"
|
|
311
|
+
if allowed {
|
|
312
|
+
readiness = o.gate.readiness(time.Now())
|
|
313
|
+
}
|
|
314
|
+
res := Response{Inventory: c.Expected, Nonce: req.Nonce, OK: readiness == "ready"}
|
|
315
|
+
if !res.OK {
|
|
316
|
+
res.Error = readiness
|
|
317
|
+
}
|
|
318
|
+
json.NewEncoder(conn).Encode(res)
|
|
319
|
+
conn.Close()
|
|
320
|
+
continue
|
|
321
|
+
}
|
|
322
|
+
conn.SetDeadline(time.Now().Add(3 * time.Second))
|
|
323
|
+
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
|
|
324
|
+
err = nil
|
|
325
|
+
if c.Expected.Protocol == DataProtocol || cohort.started > 0 || fenceRetryExhausted {
|
|
326
|
+
if grants != nil {
|
|
327
|
+
grants.authority.Fence()
|
|
328
|
+
}
|
|
329
|
+
cohort.deny()
|
|
330
|
+
fenceCtx, fenceCancel := context.WithTimeout(ctx, time.Second)
|
|
331
|
+
err = retryCohortPolicy(fenceCtx, func() error { return fenceRecord(c, epoch, "admin-stop") })
|
|
332
|
+
fenceCancel()
|
|
333
|
+
}
|
|
334
|
+
if err == nil {
|
|
335
|
+
if jobs != nil && jobs.session != nil {
|
|
336
|
+
if code := jobs.session.shutdown(ctx); code != "" {
|
|
337
|
+
err = code
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
if err == nil {
|
|
341
|
+
err = cohort.drain(ctx, time.Second)
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
if err == nil {
|
|
345
|
+
err = stopChild(ctx, child, time.Second)
|
|
346
|
+
}
|
|
347
|
+
if err == nil {
|
|
348
|
+
_, err = cohort.proof()
|
|
349
|
+
}
|
|
350
|
+
cancel()
|
|
351
|
+
// Kernel process-exit fd cleanup is not ordered: close the listener
|
|
352
|
+
// before ACK, so connection EOF cannot race a still-listening socket.
|
|
353
|
+
if err == nil {
|
|
354
|
+
err = l.Close()
|
|
355
|
+
}
|
|
356
|
+
res := Response{Inventory: c.Expected, Nonce: req.Nonce, OK: err == nil}
|
|
357
|
+
if err != nil {
|
|
358
|
+
res.Error = "cleanup-required"
|
|
359
|
+
}
|
|
360
|
+
json.NewEncoder(conn).Encode(res)
|
|
361
|
+
if err == nil {
|
|
362
|
+
// Keep this connection open until OS exit. An ACK plus EOF proves both
|
|
363
|
+
// that the child was reaped and this supervisor finished cooperatively.
|
|
364
|
+
os.Exit(0)
|
|
365
|
+
}
|
|
366
|
+
conn.Close()
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
func (p LinuxProcesses) Stop(want Process) error {
|
|
371
|
+
if want.Mode != "supervised" {
|
|
372
|
+
return errTrust
|
|
373
|
+
}
|
|
374
|
+
// Loss/reboot/PID reuse is not sufficient proof of child teardown. Preserve
|
|
375
|
+
// the record for fixed admin repair; never signal this recorded PID.
|
|
376
|
+
actual, err := inspectSupervisor(want.PID, want.Inventory)
|
|
377
|
+
if err != nil || actual != want {
|
|
378
|
+
return errTrust
|
|
379
|
+
}
|
|
380
|
+
socket := filepath.Join(p.RunDir, "supervisor.sock")
|
|
381
|
+
st, err := os.Lstat(socket)
|
|
382
|
+
if err != nil {
|
|
383
|
+
return err
|
|
384
|
+
}
|
|
385
|
+
stat, ok := st.Sys().(*syscall.Stat_t)
|
|
386
|
+
if !ok || stat.Uid != 0 || st.Mode()&os.ModeSocket == 0 || st.Mode().Perm() != 0600 {
|
|
387
|
+
return errTrust
|
|
388
|
+
}
|
|
389
|
+
conn, err := net.DialTimeout("unix", socket, time.Second)
|
|
390
|
+
if err != nil {
|
|
391
|
+
return err
|
|
392
|
+
}
|
|
393
|
+
defer conn.Close()
|
|
394
|
+
peer, err := peerCredentials(conn.(*net.UnixConn))
|
|
395
|
+
if err != nil || peer.Uid != 0 || int(peer.Pid) != want.PID {
|
|
396
|
+
return errTrust
|
|
397
|
+
}
|
|
398
|
+
// Recheck after binding the connection too. A connected socket cannot be
|
|
399
|
+
// substituted by a later process that reused the path or PID.
|
|
400
|
+
actual, err = inspectSupervisor(want.PID, want.Inventory)
|
|
401
|
+
if err != nil || actual != want {
|
|
402
|
+
return errTrust
|
|
403
|
+
}
|
|
404
|
+
conn.SetDeadline(time.Now().Add(3 * time.Second))
|
|
405
|
+
var nonce [32]byte
|
|
406
|
+
if _, err := rand.Read(nonce[:]); err != nil {
|
|
407
|
+
return err
|
|
408
|
+
}
|
|
409
|
+
req := supervisorRequest{Process: want, Op: "stop", Nonce: hex.EncodeToString(nonce[:])}
|
|
410
|
+
if err := json.NewEncoder(conn).Encode(req); err != nil {
|
|
411
|
+
return err
|
|
412
|
+
}
|
|
413
|
+
return readSupervisorReply(conn, want.Inventory, req.Nonce)
|
|
414
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
//go:build synopkgland_sdk_workers
|
|
2
|
+
|
|
3
|
+
package helper
|
|
4
|
+
|
|
5
|
+
import (
|
|
6
|
+
"context"
|
|
7
|
+
"encoding/json"
|
|
8
|
+
"net"
|
|
9
|
+
"path/filepath"
|
|
10
|
+
"time"
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
// SDKJobs is the bounded package-side client. Native authority is established
|
|
14
|
+
// again by the root owner; the CGI's username/admin flag is never forwarded.
|
|
15
|
+
func (c Client) SDKJobs(ctx context.Context, method string, carriers SessionCarriers, args json.RawMessage) (json.RawMessage, Code) {
|
|
16
|
+
if _, code := sdkArgs(method, args); code != "" {
|
|
17
|
+
return nil, code
|
|
18
|
+
}
|
|
19
|
+
if !c.Expected.Valid() || c.Expected.Protocol != DataProtocol || c.Expected.DataAccess != "relaxed" {
|
|
20
|
+
return nil, ErrIncompatible
|
|
21
|
+
}
|
|
22
|
+
if len(carriers.Cookie) > 4096 || len(carriers.SynoToken) > 4096 || len(carriers.ClientAddress) > 256 {
|
|
23
|
+
return nil, ErrLimit
|
|
24
|
+
}
|
|
25
|
+
nonce, code := sdkRandomRef()
|
|
26
|
+
if code != "" {
|
|
27
|
+
return nil, code
|
|
28
|
+
}
|
|
29
|
+
r := sdkWireRequest{c.Expected, nonce, method, grantCarriers{carriers.Cookie, carriers.SynoToken, carriers.ClientAddress}, args}
|
|
30
|
+
raw, e := json.Marshal(r)
|
|
31
|
+
if e != nil || len(raw) > MaxControlBytes {
|
|
32
|
+
return nil, ErrLimit
|
|
33
|
+
}
|
|
34
|
+
ctx, stop := context.WithTimeout(ctx, 3*time.Second)
|
|
35
|
+
defer stop()
|
|
36
|
+
deadline, _ := ctx.Deadline()
|
|
37
|
+
conn, e := (&net.Dialer{Deadline: deadline}).DialContext(ctx, "unix", filepath.Join(c.RunDir, "helper.sock"))
|
|
38
|
+
if e != nil {
|
|
39
|
+
return nil, ErrUnavailable
|
|
40
|
+
}
|
|
41
|
+
defer conn.Close()
|
|
42
|
+
unix, ok := conn.(*net.UnixConn)
|
|
43
|
+
if !ok || c.Peer == nil || c.Peer(unix) != nil {
|
|
44
|
+
return nil, ErrDenied
|
|
45
|
+
}
|
|
46
|
+
conn.SetDeadline(deadline)
|
|
47
|
+
// Cancel bounded I/O too; this is not the job's attach lease or Q witness.
|
|
48
|
+
done := make(chan struct{})
|
|
49
|
+
ended := make(chan struct{})
|
|
50
|
+
go func() {
|
|
51
|
+
defer close(ended)
|
|
52
|
+
select {
|
|
53
|
+
case <-ctx.Done():
|
|
54
|
+
conn.Close()
|
|
55
|
+
case <-done:
|
|
56
|
+
}
|
|
57
|
+
}()
|
|
58
|
+
defer func() { close(done); <-ended }()
|
|
59
|
+
if _, e = conn.Write(raw); e != nil {
|
|
60
|
+
return nil, ErrUnavailable
|
|
61
|
+
}
|
|
62
|
+
if e = unix.CloseWrite(); e != nil {
|
|
63
|
+
return nil, ErrUnavailable
|
|
64
|
+
}
|
|
65
|
+
var res sdkWireResponse
|
|
66
|
+
if code = decodeDataObject(conn, &res, MaxControlBytes); code != "" {
|
|
67
|
+
return nil, code
|
|
68
|
+
}
|
|
69
|
+
if res.Inventory != c.Expected || res.Nonce != nonce {
|
|
70
|
+
return nil, ErrIncompatible
|
|
71
|
+
}
|
|
72
|
+
if res.Code != "" {
|
|
73
|
+
return nil, safeGrantCode(res.Code)
|
|
74
|
+
}
|
|
75
|
+
if len(res.Data) == 0 {
|
|
76
|
+
return nil, ErrInvalid
|
|
77
|
+
}
|
|
78
|
+
return res.Data, ""
|
|
79
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
//go:build linux && synopkgland_sdk_workers
|
|
2
|
+
|
|
3
|
+
package helper
|
|
4
|
+
|
|
5
|
+
import (
|
|
6
|
+
"bytes"
|
|
7
|
+
"encoding/json"
|
|
8
|
+
"net"
|
|
9
|
+
"os"
|
|
10
|
+
"path/filepath"
|
|
11
|
+
"time"
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
// Only the exact owned helper may forward the package request. This is a fixed
|
|
15
|
+
// jobs control, not a caller-selected supervisor operation or process identity.
|
|
16
|
+
func forwardSDKJobs(c Client, raw []byte) sdkWireResponse {
|
|
17
|
+
res := sdkWireResponse{Inventory: c.Expected}
|
|
18
|
+
var request sdkWireRequest
|
|
19
|
+
if res.Code = decodeDataObject(bytes.NewReader(raw), &request, MaxControlBytes); res.Code != "" {
|
|
20
|
+
return res
|
|
21
|
+
}
|
|
22
|
+
res.Nonce = request.Nonce
|
|
23
|
+
if request.Inventory != c.Expected {
|
|
24
|
+
res.Code = ErrIncompatible
|
|
25
|
+
return res
|
|
26
|
+
}
|
|
27
|
+
if _, code := sdkArgs(request.Method, request.Args); code != "" {
|
|
28
|
+
res.Code = code
|
|
29
|
+
return res
|
|
30
|
+
}
|
|
31
|
+
want, err := readProcess(c.RunDir, 0)
|
|
32
|
+
if err != nil || want.PID != os.Getppid() || want.Inventory != c.Expected {
|
|
33
|
+
res.Code = ErrDenied
|
|
34
|
+
return res
|
|
35
|
+
}
|
|
36
|
+
actual, err := inspectSupervisor(want.PID, c.Expected)
|
|
37
|
+
if err != nil || actual != want {
|
|
38
|
+
res.Code = ErrDenied
|
|
39
|
+
return res
|
|
40
|
+
}
|
|
41
|
+
conn, err := net.DialUnix("unix", nil, &net.UnixAddr{Name: filepath.Join(c.RunDir, "supervisor.sock"), Net: "unix"})
|
|
42
|
+
if err != nil {
|
|
43
|
+
res.Code = ErrUnavailable
|
|
44
|
+
return res
|
|
45
|
+
}
|
|
46
|
+
defer conn.Close()
|
|
47
|
+
peer, err := peerCredentials(conn)
|
|
48
|
+
if err != nil || peer.Uid != 0 || int(peer.Pid) != want.PID {
|
|
49
|
+
res.Code = ErrDenied
|
|
50
|
+
return res
|
|
51
|
+
}
|
|
52
|
+
actual, err = inspectSupervisor(want.PID, c.Expected)
|
|
53
|
+
if err != nil || actual != want {
|
|
54
|
+
res.Code = ErrDenied
|
|
55
|
+
return res
|
|
56
|
+
}
|
|
57
|
+
conn.SetDeadline(time.Now().Add(3 * time.Second))
|
|
58
|
+
req := supervisorRequest{Process: want, Op: "jobs", Nonce: request.Nonce, Data: raw}
|
|
59
|
+
frame, err := json.Marshal(req)
|
|
60
|
+
if err != nil || len(frame) > MaxControlBytes {
|
|
61
|
+
res.Code = ErrLimit
|
|
62
|
+
return res
|
|
63
|
+
}
|
|
64
|
+
if _, err = conn.Write(frame); err != nil {
|
|
65
|
+
res.Code = ErrUnavailable
|
|
66
|
+
return res
|
|
67
|
+
}
|
|
68
|
+
if err = conn.CloseWrite(); err != nil {
|
|
69
|
+
res.Code = ErrUnavailable
|
|
70
|
+
return res
|
|
71
|
+
}
|
|
72
|
+
var reply sdkWireResponse
|
|
73
|
+
if code := decodeDataObject(conn, &reply, MaxControlBytes); code != "" {
|
|
74
|
+
res.Code = code
|
|
75
|
+
return res
|
|
76
|
+
}
|
|
77
|
+
if reply.Inventory != c.Expected || reply.Nonce != request.Nonce {
|
|
78
|
+
res.Code = ErrIncompatible
|
|
79
|
+
return res
|
|
80
|
+
}
|
|
81
|
+
return reply
|
|
82
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
//go:build synopkgland_sdk_workers
|
|
2
|
+
|
|
3
|
+
package helper
|
|
4
|
+
|
|
5
|
+
import (
|
|
6
|
+
"context"
|
|
7
|
+
"encoding/json"
|
|
8
|
+
"net"
|
|
9
|
+
"os"
|
|
10
|
+
"path/filepath"
|
|
11
|
+
"testing"
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
func TestSDKPublicTransportPinsInventoryNonceAndStrictArgs(t *testing.T) {
|
|
15
|
+
f := sdkJobFixture(t)
|
|
16
|
+
for _, bad := range []string{"", "inventory", "nonce"} {
|
|
17
|
+
t.Run(bad, func(t *testing.T) {
|
|
18
|
+
dir, e := os.MkdirTemp("/tmp", "s7-wire-")
|
|
19
|
+
if e != nil {
|
|
20
|
+
t.Fatal(e)
|
|
21
|
+
}
|
|
22
|
+
defer os.RemoveAll(dir)
|
|
23
|
+
ln, err := net.ListenUnix("unix", &net.UnixAddr{Name: filepath.Join(dir, "helper.sock"), Net: "unix"})
|
|
24
|
+
if err != nil {
|
|
25
|
+
t.Fatal(err)
|
|
26
|
+
}
|
|
27
|
+
defer ln.Close()
|
|
28
|
+
done := make(chan struct{})
|
|
29
|
+
go func() {
|
|
30
|
+
defer close(done)
|
|
31
|
+
conn, e := ln.AcceptUnix()
|
|
32
|
+
if e != nil {
|
|
33
|
+
return
|
|
34
|
+
}
|
|
35
|
+
defer conn.Close()
|
|
36
|
+
var r sdkWireRequest
|
|
37
|
+
if decodeDataObject(conn, &r, MaxControlBytes) != "" {
|
|
38
|
+
return
|
|
39
|
+
}
|
|
40
|
+
response := sdkWireResponse{Inventory: r.Inventory, Nonce: r.Nonce, Data: json.RawMessage(`{"fixture":true}`)}
|
|
41
|
+
if bad == "inventory" {
|
|
42
|
+
response.Inventory.Version = "99.0.0-0001"
|
|
43
|
+
}
|
|
44
|
+
if bad == "nonce" {
|
|
45
|
+
response.Nonce = grantRef('f')
|
|
46
|
+
}
|
|
47
|
+
json.NewEncoder(conn).Encode(response)
|
|
48
|
+
}()
|
|
49
|
+
c := Client{Expected: f.c.inventory, RunDir: dir, Peer: func(*net.UnixConn) error { return nil }}
|
|
50
|
+
_, code := c.SDKJobs(context.Background(), "jobs.status", f.carriers, json.RawMessage(`{}`))
|
|
51
|
+
<-done
|
|
52
|
+
if bad == "" && code != "" || bad != "" && code != ErrIncompatible {
|
|
53
|
+
t.Fatal(code)
|
|
54
|
+
}
|
|
55
|
+
})
|
|
56
|
+
}
|
|
57
|
+
c := NewClient(f.c.inventory)
|
|
58
|
+
if _, code := c.SDKJobs(context.Background(), "jobs.status", f.carriers, json.RawMessage(`{"actor":"root"}`)); code != ErrInvalid {
|
|
59
|
+
t.Fatal(code)
|
|
60
|
+
}
|
|
61
|
+
if _, code := c.SDKJobs(context.Background(), "jobs.exec", f.carriers, json.RawMessage(`{}`)); code != ErrUnsupported {
|
|
62
|
+
t.Fatal(code)
|
|
63
|
+
}
|
|
64
|
+
}
|