@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,66 @@
|
|
|
1
|
+
package main
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"bufio"
|
|
5
|
+
"context"
|
|
6
|
+
"fmt"
|
|
7
|
+
"os"
|
|
8
|
+
"slices"
|
|
9
|
+
"strings"
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
// groupsOf reads local group files fresh on each request. Directory accounts
|
|
13
|
+
// use NSS afresh; DSM provider caching may delay directory membership changes.
|
|
14
|
+
// DSM keeps no member list for the group
|
|
15
|
+
// that is an account's primary group (users), so membership is the member
|
|
16
|
+
// list or the primary gid from the passwd file. Accounts absent from passwd use
|
|
17
|
+
// DSM NSS; no local member-list fallback is permitted on lookup failure.
|
|
18
|
+
func (a *dsmAuthenticator) groupsOf(ctx context.Context, user string) ([]string, error) {
|
|
19
|
+
primary, err := a.primaryGID(user)
|
|
20
|
+
if err != nil {
|
|
21
|
+
return nil, err
|
|
22
|
+
}
|
|
23
|
+
if primary == "" {
|
|
24
|
+
if a.directoryGroups == nil {
|
|
25
|
+
return nil, fmt.Errorf("directory group lookup unavailable")
|
|
26
|
+
}
|
|
27
|
+
return a.directoryGroups(ctx, user)
|
|
28
|
+
}
|
|
29
|
+
f, err := os.Open(a.groupFile)
|
|
30
|
+
if err != nil {
|
|
31
|
+
return nil, fmt.Errorf("read groups: %w", err)
|
|
32
|
+
}
|
|
33
|
+
defer f.Close()
|
|
34
|
+
var groups []string
|
|
35
|
+
scanner := bufio.NewScanner(f)
|
|
36
|
+
for scanner.Scan() {
|
|
37
|
+
fields := strings.Split(scanner.Text(), ":")
|
|
38
|
+
if len(fields) == 4 && (fields[2] == primary || slices.Contains(strings.Split(fields[3], ","), user)) {
|
|
39
|
+
groups = append(groups, fields[0])
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if err := scanner.Err(); err != nil {
|
|
43
|
+
return nil, fmt.Errorf("read groups: %w", err)
|
|
44
|
+
}
|
|
45
|
+
return groups, nil
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// primaryGID is the account's gid in the passwd file; "" when the account has
|
|
49
|
+
// no local entry, which requires a fresh directory lookup.
|
|
50
|
+
func (a *dsmAuthenticator) primaryGID(user string) (string, error) {
|
|
51
|
+
f, err := os.Open(a.passwdFile)
|
|
52
|
+
if err != nil {
|
|
53
|
+
return "", fmt.Errorf("read accounts: %w", err)
|
|
54
|
+
}
|
|
55
|
+
defer f.Close()
|
|
56
|
+
scanner := bufio.NewScanner(f)
|
|
57
|
+
for scanner.Scan() {
|
|
58
|
+
if fields := strings.Split(scanner.Text(), ":"); len(fields) >= 4 && fields[0] == user {
|
|
59
|
+
return fields[3], nil
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if err := scanner.Err(); err != nil {
|
|
63
|
+
return "", fmt.Errorf("read accounts: %w", err)
|
|
64
|
+
}
|
|
65
|
+
return "", nil
|
|
66
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// Command gateway is the DSM-authenticated front door of a container package.
|
|
2
|
+
// DSM runs it as a CGI (ui/cgi/gateway.cgi in the package) under the package
|
|
3
|
+
// account, once per request.
|
|
4
|
+
package main
|
|
5
|
+
|
|
6
|
+
import (
|
|
7
|
+
"bytes"
|
|
8
|
+
"encoding/json"
|
|
9
|
+
"fmt"
|
|
10
|
+
"log"
|
|
11
|
+
"net/http/cgi"
|
|
12
|
+
"os"
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
// Set by `synopkgland build-spk` through -ldflags -X; never read from a request.
|
|
16
|
+
var (
|
|
17
|
+
packageID = "dev"
|
|
18
|
+
configJSON = ""
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
func main() {
|
|
22
|
+
log.SetFlags(0)
|
|
23
|
+
log.SetPrefix(packageID + ": ")
|
|
24
|
+
if os.Getenv("GATEWAY_INTERFACE") == "" {
|
|
25
|
+
fmt.Fprintf(os.Stderr, "%s: this program runs as the package's DSM CGI; open the app from the DSM main menu.\n", packageID)
|
|
26
|
+
os.Exit(2)
|
|
27
|
+
}
|
|
28
|
+
var cfg config
|
|
29
|
+
decoder := json.NewDecoder(bytes.NewReader([]byte(configJSON)))
|
|
30
|
+
decoder.DisallowUnknownFields()
|
|
31
|
+
if err := decoder.Decode(&cfg); err != nil {
|
|
32
|
+
log.Fatalf("invalid gateway configuration: %v", err)
|
|
33
|
+
}
|
|
34
|
+
g, err := newGateway(cfg, newDSMAuthenticator())
|
|
35
|
+
if err != nil {
|
|
36
|
+
log.Fatal(err)
|
|
37
|
+
}
|
|
38
|
+
req, err := cgi.Request()
|
|
39
|
+
if err != nil {
|
|
40
|
+
log.Fatal(err)
|
|
41
|
+
}
|
|
42
|
+
if err := serveCGI(g, req, os.Stdin, os.Stdout); err != nil {
|
|
43
|
+
log.Fatal(err)
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
services:
|
|
2
2
|
web:
|
|
3
|
-
image: busybox:1.36
|
|
3
|
+
image: busybox:1.36@sha256:73aaf090f3d85aa34ee199857f03fa3a95c8ede2ffd4cc2cdb5b94e566b11662
|
|
4
4
|
# DSM worker constraints to preserve when changing this service:
|
|
5
5
|
# 1) command/entrypoint arrays must not contain bare numeric elements
|
|
6
6
|
# (such as "18333"). DSM's docker-project worker drops the quotes on a
|
|
@@ -15,7 +15,10 @@ services:
|
|
|
15
15
|
# injects an arbitrary package UID/GID, and the nginx entrypoint needs
|
|
16
16
|
# root during startup, so it exits immediately under that identity.
|
|
17
17
|
command: ["sh","-c","httpd -f -p 18333 -h /usr/share/nginx/html"]
|
|
18
|
+
# Bound to loopback on purpose: the DSM-authenticated gateway generated by
|
|
19
|
+
# `synopkgland build-spk` is the only way in. A port on every interface would
|
|
20
|
+
# bypass DSM sign-in, and `synopkgland validate` rejects it.
|
|
18
21
|
ports:
|
|
19
|
-
- "18333:18333"
|
|
22
|
+
- "127.0.0.1:18333:18333"
|
|
20
23
|
volumes:
|
|
21
24
|
- "./html:/usr/share/nginx/html:ro"
|
|
@@ -4,10 +4,13 @@ version: 0.1.0
|
|
|
4
4
|
displayname: Hello Web
|
|
5
5
|
description: A minimal Syno Package Land web app template.
|
|
6
6
|
maintainer: Syno Package Land
|
|
7
|
-
os_min_ver: "7.2-69057"
|
|
7
|
+
os_min_ver: "7.2.1-69057"
|
|
8
8
|
adminprotocol: http
|
|
9
9
|
adminport: 18333
|
|
10
10
|
adminurl: /
|
|
11
11
|
integration:
|
|
12
12
|
web:
|
|
13
13
|
launch: dsm-window
|
|
14
|
+
# Who may open the app: dsm-users (any signed-in DSM user), dsm-admins,
|
|
15
|
+
# dsm-groups (with groups: [...]) or public (no DSM sign-in).
|
|
16
|
+
access: dsm-users
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
services:
|
|
2
2
|
web:
|
|
3
|
-
image: busybox:1.36
|
|
3
|
+
image: busybox:1.36@sha256:73aaf090f3d85aa34ee199857f03fa3a95c8ede2ffd4cc2cdb5b94e566b11662
|
|
4
4
|
# DSM worker constraints to preserve when changing this service:
|
|
5
5
|
# 1) command/entrypoint arrays must not contain bare numeric elements
|
|
6
6
|
# (such as "18333"). DSM's docker-project worker drops the quotes on a
|
|
@@ -15,7 +15,10 @@ services:
|
|
|
15
15
|
# injects an arbitrary package UID/GID, and the nginx entrypoint needs
|
|
16
16
|
# root during startup, so it exits immediately under that identity.
|
|
17
17
|
command: ["sh","-c","httpd -f -p 18333 -h /usr/share/nginx/html"]
|
|
18
|
+
# Bound to loopback on purpose: the DSM-authenticated gateway generated by
|
|
19
|
+
# `synopkgland build-spk` is the only way in. A port on every interface would
|
|
20
|
+
# bypass DSM sign-in, and `synopkgland validate` rejects it.
|
|
18
21
|
ports:
|
|
19
|
-
- "18333:18333"
|
|
22
|
+
- "127.0.0.1:18333:18333"
|
|
20
23
|
volumes:
|
|
21
24
|
- "./html:/usr/share/nginx/html:ro"
|
|
@@ -4,10 +4,13 @@ version: 0.1.0
|
|
|
4
4
|
displayname: Hello Web Page
|
|
5
5
|
description: A Syno Package Land web app template that opens in a new browser page.
|
|
6
6
|
maintainer: Syno Package Land
|
|
7
|
-
os_min_ver: "7.2-69057"
|
|
7
|
+
os_min_ver: "7.2.1-69057"
|
|
8
8
|
adminprotocol: http
|
|
9
9
|
adminport: 18333
|
|
10
10
|
adminurl: /
|
|
11
11
|
integration:
|
|
12
12
|
web:
|
|
13
13
|
launch: new-page
|
|
14
|
+
# Who may open the app: dsm-users (any signed-in DSM user), dsm-admins,
|
|
15
|
+
# dsm-groups (with groups: [...]) or public (no DSM sign-in).
|
|
16
|
+
access: dsm-users
|
|
@@ -171,7 +171,17 @@ not location completion or ACL success. Use canonical virtual share paths only;
|
|
|
171
171
|
OS `/volumeN/...`, traversal, repeated/trailing slash, controls and backslash are
|
|
172
172
|
invalid. No path conversion or grant is performed. `openFile`, `showFileDetails`
|
|
173
173
|
and `openAppSetting` return unsupported; private preview/details/settings flows
|
|
174
|
-
have no proven generic contract.
|
|
174
|
+
have no proven generic contract.
|
|
175
|
+
|
|
176
|
+
File reveal adds a best-effort correction using File Station 1.4.x private
|
|
177
|
+
structures. Required APIs are feature-detected; absent/throwing APIs silently
|
|
178
|
+
cancel and release timers/listeners. One AppLaunch callback binds one receiver;
|
|
179
|
+
only its model may be selected once. Interaction, navigation away from the reached
|
|
180
|
+
parent, close/destroy, disposal and new requests cancel the correction. The named
|
|
181
|
+
5000 ms total budget, 100 ms checks and 300 ms quiet interval have no device latency
|
|
182
|
+
proof. `requested` still does not mean `selected`; actual effectiveness on DSM 7.4 /
|
|
183
|
+
File Station 1.4.4 awaits a rebuilt-SPK device matrix. No second launch or broadcast
|
|
184
|
+
setter is used, and later reloads may still clear selection.
|
|
175
185
|
|
|
176
186
|
For an independent browser shell, use the SPK's generated `ui/host-0001.js`
|
|
177
187
|
(the number follows the manifest build). It has no Ext or npm runtime dependency:
|
|
@@ -206,7 +216,7 @@ ui:
|
|
|
206
216
|
```
|
|
207
217
|
|
|
208
218
|
The build must emit `app.js` (one script that registers `mount`) and
|
|
209
|
-
`app.css`. The public `@synopackageland/ui@0.
|
|
219
|
+
`app.css`. The public `@synopackageland/ui@0.5.7` package on
|
|
210
220
|
`https://registry.npmjs.org` gives Vue components with DSM 7 styling;
|
|
211
221
|
import its `themes/dsm7-embedded.css` for use inside a DSM window.
|
|
212
222
|
|
|
@@ -269,6 +279,51 @@ own folder, kept across upgrades). Bump `build` for every SPK you hand out;
|
|
|
269
279
|
bump `version` for feature releases. There are no lifecycle scripts to write:
|
|
270
280
|
the CGI starts per request, so start/stop do nothing.
|
|
271
281
|
|
|
282
|
+
### What an upgrade keeps
|
|
283
|
+
|
|
284
|
+
An upgrade replaces the program files and keeps the data. DSM preserves `var`
|
|
285
|
+
(`@appdata`), `home` (`@apphome`) and `etc` (`@appconf`) across an upgrade and
|
|
286
|
+
removes `tmp` (`@apptemp`) and `target` (`@appstore`). Keep everything you need
|
|
287
|
+
to keep under `var`, `home` or `etc`.
|
|
288
|
+
|
|
289
|
+
### Schema migrations
|
|
290
|
+
|
|
291
|
+
`backend/internal/datamigrate` applies ordered, idempotent schema migrations and
|
|
292
|
+
records the result in `<var>/data-version`. `backend/cmd/app` runs `app.Migrate`
|
|
293
|
+
on every start; the recorded version makes that a cheap no-op.
|
|
294
|
+
|
|
295
|
+
- Versions start at 1 and never change meaning. The template ships one empty
|
|
296
|
+
example in `backend/internal/app/migrations.go`; replace it with your steps.
|
|
297
|
+
- Every step must be idempotent: a crash between `Apply` and the version record,
|
|
298
|
+
or two CGI requests racing on the first start after an upgrade, can run one step
|
|
299
|
+
twice.
|
|
300
|
+
- A step that fails stops the run with the previous version still recorded, and
|
|
301
|
+
the next start resumes from there. The helper never deletes or rewrites data
|
|
302
|
+
itself, so a failed migration leaves your old data in place.
|
|
303
|
+
- `datamigrate.Context.OldPkgVer` is the version being upgraded from:
|
|
304
|
+
`SYNOPKG_OLD_PKGVER` when your environment sets it, otherwise the version the last
|
|
305
|
+
successful run recorded. `NewPkgVer` is the version running now.
|
|
306
|
+
|
|
307
|
+
Uninstalling keeps your data: DSM leaves `@appdata` and `@apphome` on the volume,
|
|
308
|
+
and reinstalling the same package ID picks them up again. The install wizard is a
|
|
309
|
+
dynamic `WIZARD_UIFILES/install_uifile.sh` that checks — read-only — whether
|
|
310
|
+
`@appdata/<package>` already exists and, if it does, tells the administrator the
|
|
311
|
+
install reuses the old data and how to start clean.
|
|
312
|
+
|
|
313
|
+
The generated SPK ships
|
|
314
|
+
an uninstall wizard (English, plus eight other languages) with one box, **Also
|
|
315
|
+
delete the app data listed above** (`pkgwizard_remove_additional`), unchecked by
|
|
316
|
+
default. Ticked, `postuninst` empties `@appdata/<package>` and `@apphome/<package>`
|
|
317
|
+
and nothing else: not `@appconf`, Shared Folders, the package account or other
|
|
318
|
+
packages. An upgrade never deletes anything. Do not write your own `postuninst`;
|
|
319
|
+
`synopkgland inspect --spk` flags a deleting script that lacks the upgrade guard
|
|
320
|
+
or deletes outside the package's own folders.
|
|
321
|
+
|
|
322
|
+
A package with a root integration (the helper) also warns in its uninstall
|
|
323
|
+
wizard: disable the integration in the App first. While it stays enabled,
|
|
324
|
+
`preuninst` refuses the uninstall and writes the reason to
|
|
325
|
+
`SYNOPKG_TEMP_LOGFILE`, which Package Center shows.
|
|
326
|
+
|
|
272
327
|
## Root access
|
|
273
328
|
|
|
274
329
|
By default (`privilege: none`) nothing in this package ever runs as root, and
|
|
@@ -295,7 +350,8 @@ How it works, with no keys or signing involved:
|
|
|
295
350
|
DSM language. A DSM administrator clicks **Authorize** and confirms with
|
|
296
351
|
their DSM password in DSM's own dialog. DSM then creates one **disabled**
|
|
297
352
|
root task in Task Scheduler, named `<package> root: <name>`. The
|
|
298
|
-
|
|
353
|
+
DSM 7.2+ uses its one-use password token for that task and never stores it.
|
|
354
|
+
DSM 7.1 uses the client-side confirmation described below.
|
|
299
355
|
3. **Run** checks that the task is still exactly the approved text, runs it
|
|
300
356
|
with the administrator's session and shows its result. The task writes
|
|
301
357
|
only to `/run/synopkgland-<package>/<name>.out`, which root owns and your
|
|
@@ -308,6 +364,39 @@ How it works, with no keys or signing involved:
|
|
|
308
364
|
password. Remove it before uninstalling the package, because DSM keeps
|
|
309
365
|
Task Scheduler tasks after an uninstall.
|
|
310
366
|
|
|
367
|
+
Root templates keep a minimum of **DSM 7.1-42661**. Init, validation and build
|
|
368
|
+
reject a root-package minimum below that version. DSM 7.0 has not been verified.
|
|
369
|
+
The window probes TaskScheduler `list v3` once per access instance; only DSM
|
|
370
|
+
error 103 selects the legacy API matrix. Permission, session and network errors
|
|
371
|
+
do not trigger a fallback, and create/run requests are never automatically
|
|
372
|
+
resent with another API version.
|
|
373
|
+
|
|
374
|
+
| Operation | DSM 7.1 | DSM 7.2+ |
|
|
375
|
+
| --- | --- | --- |
|
|
376
|
+
| List / detail | `list v2` (offset/limit) / `get v3` | `list v3` (start/limit) / `get v4` |
|
|
377
|
+
| Create | `TaskScheduler.create v3` | `TaskScheduler.Root.create v4` + `SynoConfirmPWToken` |
|
|
378
|
+
| Run / delete | `run v2` / `delete v2` | `run v2` / `delete v2` |
|
|
379
|
+
| Completion | `view v1` | `get_history_status_list v1` |
|
|
380
|
+
|
|
381
|
+
**DSM 7.1 security difference:** DSM's PasswordConfirmDialog is still required
|
|
382
|
+
in the window, but root-task creation has **no server-side password token**.
|
|
383
|
+
Any authenticated administrator session can call `create v3` to create root
|
|
384
|
+
tasks without this client dialog. The client confirmation records the user's
|
|
385
|
+
intent; it does not provide the server-enforced fresh password proof of the
|
|
386
|
+
7.2+ Root API. Both paths verify task name, root owner/real owner, disabled
|
|
387
|
+
script type and the exact approved action text before run or removal.
|
|
388
|
+
|
|
389
|
+
The legacy path saves the existing history before run and requires one new,
|
|
390
|
+
completed record with a valid `stop_time`, integer `exit_code: 0` and
|
|
391
|
+
`exit_type: normal`. It checks task identity again before returning output.
|
|
392
|
+
An accepted run request or old output never proves completion. Calls and polls
|
|
393
|
+
share a 30-second deadline (at most 60 polls, 500 ms apart); a timeout does not
|
|
394
|
+
cancel a task that DSM already started. Concurrent calls in one window share
|
|
395
|
+
one run. Existing running tasks, malformed or ambiguous history, and incomplete
|
|
396
|
+
scheduler lists are refused. List/history snapshots are limited to 500 entries.
|
|
397
|
+
Second-resolution history cannot identify same-second reruns reliably; those
|
|
398
|
+
runs may time out rather than reuse an old success record.
|
|
399
|
+
|
|
311
400
|
Non-administrators see DSM's "Only administrator accounts can perform this
|
|
312
401
|
operation." and nothing else. HTTP requests can never choose what runs as
|
|
313
402
|
root: the only root code is the fixed text an administrator approved. Your app
|
|
@@ -320,5 +409,5 @@ drive the same flow from its own UI.
|
|
|
320
409
|
| --- | --- |
|
|
321
410
|
| Build hosts | macOS, Linux (any OS with Go and Node) |
|
|
322
411
|
| Target CPUs | x86_64 and aarch64 DSM models (one SPK each) |
|
|
323
|
-
| DSM | 7.
|
|
412
|
+
| DSM | 7.1 or later declared (`os_min_ver`, change it with `init --min-dsm` or `build-spk --min-dsm`). Installed and tested on DSM 7.4 (x86_64). aarch64 SPKs are built the same way but have not been run on a NAS. |
|
|
324
413
|
| Not supported | 32-bit ARM, DSM 6, running anything as root without an administrator's approval |
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
DSM integration helper build dependencies
|
|
2
2
|
|
|
3
|
-
github.com/godbus/dbus/v5 v5.2.
|
|
3
|
+
github.com/godbus/dbus/v5 v5.2.3-0.20260924123156-0ea052abeb82 (BSD-2-Clause)
|
|
4
|
+
Pinned upstream commit: 0ea052abeb820894f944095b3c2dc125cef0df85
|
|
5
|
+
Fix panic in DecodeMessageWithFDs on read error (not yet in a tagged release).
|
|
4
6
|
|
|
5
7
|
Copyright (c) 2013, Georg Reinke (<guelfey at gmail dot com>), Google
|
|
6
8
|
All rights reserved.
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
+
//go:build !synopkgland_sdk_workers
|
|
2
|
+
|
|
1
3
|
// Command app is the package backend. DSM runs it as a CGI (ui/cgi/api.cgi in
|
|
2
4
|
// the package) under the package account, once per request.
|
|
5
|
+
//
|
|
6
|
+
//line dsmapp/cmd/app/main.go:1
|
|
3
7
|
package main
|
|
4
8
|
|
|
5
9
|
import (
|
|
@@ -12,6 +16,7 @@ import (
|
|
|
12
16
|
"dsmapp/internal/api"
|
|
13
17
|
"dsmapp/internal/app"
|
|
14
18
|
"dsmapp/internal/dsm"
|
|
19
|
+
"dsmapp/internal/filestation"
|
|
15
20
|
"dsmapp/internal/helper"
|
|
16
21
|
)
|
|
17
22
|
|
|
@@ -20,6 +25,10 @@ var (
|
|
|
20
25
|
packageID = "dev"
|
|
21
26
|
version = "0.0.0"
|
|
22
27
|
helperInventory = ""
|
|
28
|
+
// "package" when the project has an integration but no privileged helper.
|
|
29
|
+
integrationMode = ""
|
|
30
|
+
// "session" when the project opted into the interactive File Station adapter.
|
|
31
|
+
fileStation = ""
|
|
23
32
|
)
|
|
24
33
|
|
|
25
34
|
func main() {
|
|
@@ -33,12 +42,20 @@ func main() {
|
|
|
33
42
|
PackageID: packageID,
|
|
34
43
|
Version: version,
|
|
35
44
|
DataDir: "/var/packages/" + packageID + "/var",
|
|
45
|
+
|
|
46
|
+
PackageIntegration: integrationMode == "package",
|
|
36
47
|
}
|
|
37
48
|
if helperInventory != "" {
|
|
38
49
|
if json.Unmarshal([]byte(helperInventory), &cfg.HelperInventory) != nil || cfg.HelperInventory.Package != packageID || cfg.HelperInventory.Version != version {
|
|
39
50
|
cfg.HelperInventory = helper.Inventory{Package: packageID}
|
|
40
51
|
}
|
|
41
52
|
}
|
|
53
|
+
if err := app.Migrate(cfg); err != nil {
|
|
54
|
+
log.Fatalf("schema migration failed: %v", err)
|
|
55
|
+
}
|
|
56
|
+
if app.SessionFilesEnabled(cfg.HelperInventory, fileStation) {
|
|
57
|
+
cfg.SessionFiles = filestation.Local(cfg.DataDir)
|
|
58
|
+
}
|
|
42
59
|
srv, err := api.NewServer(dsm.NewAuthenticator(), app.Routes(cfg)...)
|
|
43
60
|
if err != nil {
|
|
44
61
|
log.Fatal(err)
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
//go:build synopkgland_sdk_workers
|
|
2
|
+
|
|
3
|
+
// Command app is the package backend. DSM runs it as a CGI (ui/cgi/api.cgi in
|
|
4
|
+
// the package) under the package account, once per request.
|
|
5
|
+
package main
|
|
6
|
+
|
|
7
|
+
import (
|
|
8
|
+
"encoding/json"
|
|
9
|
+
"fmt"
|
|
10
|
+
"log"
|
|
11
|
+
"net/http/cgi"
|
|
12
|
+
"os"
|
|
13
|
+
|
|
14
|
+
"dsmapp/internal/api"
|
|
15
|
+
"dsmapp/internal/app"
|
|
16
|
+
"dsmapp/internal/dsm"
|
|
17
|
+
"dsmapp/internal/filestation"
|
|
18
|
+
"dsmapp/internal/helper"
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
// Set by `synopkgland build-spk` through -ldflags -X; never read from a request.
|
|
22
|
+
var (
|
|
23
|
+
packageID = "dev"
|
|
24
|
+
version = "0.0.0"
|
|
25
|
+
helperInventory = ""
|
|
26
|
+
// "session" when the project opted into the interactive File Station adapter.
|
|
27
|
+
fileStation = ""
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
func main() {
|
|
31
|
+
log.SetFlags(0)
|
|
32
|
+
log.SetPrefix(packageID + ": ")
|
|
33
|
+
if os.Getenv("GATEWAY_INTERFACE") == "" {
|
|
34
|
+
fmt.Fprintf(os.Stderr, "%s %s: this program runs as the package's DSM CGI; open the app from the DSM main menu.\n", packageID, version)
|
|
35
|
+
os.Exit(2)
|
|
36
|
+
}
|
|
37
|
+
cfg := app.Config{
|
|
38
|
+
PackageID: packageID,
|
|
39
|
+
Version: version,
|
|
40
|
+
DataDir: "/var/packages/" + packageID + "/var",
|
|
41
|
+
}
|
|
42
|
+
if helperInventory != "" {
|
|
43
|
+
if json.Unmarshal([]byte(helperInventory), &cfg.HelperInventory) != nil || cfg.HelperInventory.Package != packageID || cfg.HelperInventory.Version != version {
|
|
44
|
+
cfg.HelperInventory = helper.Inventory{Package: packageID}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if err := app.Migrate(cfg); err != nil {
|
|
48
|
+
log.Fatalf("schema migration failed: %v", err)
|
|
49
|
+
}
|
|
50
|
+
if app.SessionFilesEnabled(cfg.HelperInventory, fileStation) {
|
|
51
|
+
cfg.SessionFiles = filestation.Local(cfg.DataDir)
|
|
52
|
+
}
|
|
53
|
+
srv, err := api.NewServer(dsm.NewAuthenticator(), app.Routes(cfg)...)
|
|
54
|
+
if err != nil {
|
|
55
|
+
log.Fatal(err)
|
|
56
|
+
}
|
|
57
|
+
if err := cgi.Serve(app.SDKHandler(srv)); err != nil {
|
|
58
|
+
log.Fatal(err)
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// Command background-worker is the package's fixed background worker. DSM runs
|
|
2
|
+
// it as the package's systemd user unit under the package account; it never
|
|
3
|
+
// runs as root and takes no input except the jobs in its private spool.
|
|
4
|
+
package main
|
|
5
|
+
|
|
6
|
+
import (
|
|
7
|
+
"context"
|
|
8
|
+
"log"
|
|
9
|
+
"os"
|
|
10
|
+
"os/signal"
|
|
11
|
+
"os/user"
|
|
12
|
+
"strconv"
|
|
13
|
+
"syscall"
|
|
14
|
+
|
|
15
|
+
"dsmapp/internal/background"
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
// Set by `synopkgland build-spk` through -ldflags -X.
|
|
19
|
+
var packageID = "dev"
|
|
20
|
+
|
|
21
|
+
func main() {
|
|
22
|
+
log.SetFlags(0)
|
|
23
|
+
log.SetPrefix(packageID + " background: ")
|
|
24
|
+
if err := background.RefuseRoot(os.Geteuid()); err != nil {
|
|
25
|
+
log.Fatal(err)
|
|
26
|
+
}
|
|
27
|
+
name := ""
|
|
28
|
+
if u, err := user.Current(); err == nil {
|
|
29
|
+
name = u.Username
|
|
30
|
+
}
|
|
31
|
+
info := background.WorkerInfo{PID: os.Getpid(), UID: os.Getuid(), Username: name}
|
|
32
|
+
ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGTERM, syscall.SIGINT)
|
|
33
|
+
defer stop()
|
|
34
|
+
log.Printf("started as uid %s", strconv.Itoa(info.UID))
|
|
35
|
+
if err := background.NewRunner("/var/packages/"+packageID+"/var/background", info).Run(ctx); err != nil {
|
|
36
|
+
log.Fatal(err)
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -16,11 +16,20 @@ func main() {
|
|
|
16
16
|
if len(os.Args) != 2 || json.Unmarshal([]byte(helperInventory), &i) != nil {
|
|
17
17
|
os.Exit(2)
|
|
18
18
|
}
|
|
19
|
-
if os.Args[1] == "check-stopped" || os.Args[1] == "diagnose" {
|
|
19
|
+
if os.Args[1] == "check-stopped" || os.Args[1] == "diagnose" || os.Args[1] == "diagnose-startup" {
|
|
20
20
|
c, err := helper.LocalClient(i)
|
|
21
21
|
if err != nil {
|
|
22
22
|
os.Exit(1)
|
|
23
23
|
}
|
|
24
|
+
if os.Args[1] == "diagnose-startup" {
|
|
25
|
+
diagnostic, err := c.StartupDiagnostic()
|
|
26
|
+
if err != nil {
|
|
27
|
+
fmt.Fprintln(os.Stderr, "startup diagnostic unavailable")
|
|
28
|
+
os.Exit(1)
|
|
29
|
+
}
|
|
30
|
+
json.NewEncoder(os.Stdout).Encode(diagnostic)
|
|
31
|
+
return
|
|
32
|
+
}
|
|
24
33
|
if os.Args[1] == "diagnose" {
|
|
25
34
|
json.NewEncoder(os.Stdout).Encode(c.Status(context.Background()))
|
|
26
35
|
return
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//go:build synopkgland_sdk_workers
|
|
2
|
+
|
|
3
|
+
package main
|
|
4
|
+
|
|
5
|
+
import (
|
|
6
|
+
"dsmapp/internal/helper"
|
|
7
|
+
"encoding/json"
|
|
8
|
+
"os"
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
// Linker-bound source-validated registry, never package-writable JSON.
|
|
12
|
+
var sdkWorkerRegistry string
|
|
13
|
+
|
|
14
|
+
func init() {
|
|
15
|
+
var inventory helper.Inventory
|
|
16
|
+
if json.Unmarshal([]byte(helperInventory), &inventory) != nil || helper.InstallSDKRegistry(inventory, sdkWorkerRegistry) != "" {
|
|
17
|
+
os.Exit(2)
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
module dsmapp
|
|
2
2
|
|
|
3
|
-
go 1.
|
|
3
|
+
go 1.25.0
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
toolchain go1.26.8
|
|
6
6
|
|
|
7
|
-
require
|
|
7
|
+
require github.com/godbus/dbus/v5 v5.2.3-0.20260924123156-0ea052abeb82
|
|
8
|
+
|
|
9
|
+
require golang.org/x/sys v0.44.0
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
github.com/godbus/dbus/v5 v5.2.
|
|
2
|
-
github.com/godbus/dbus/v5 v5.2.
|
|
3
|
-
golang.org/x/sys v0.
|
|
4
|
-
golang.org/x/sys v0.
|
|
1
|
+
github.com/godbus/dbus/v5 v5.2.3-0.20260924123156-0ea052abeb82 h1:QN/vQc8LI8KFWH6uZZ4R4jermkdwzvKzGy0Taimhbm0=
|
|
2
|
+
github.com/godbus/dbus/v5 v5.2.3-0.20260924123156-0ea052abeb82/go.mod h1:3AAv2+hPq5rdnr5txxxRwiGjPXamgoIHgz9FPBfOp3c=
|
|
3
|
+
golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ=
|
|
4
|
+
golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
|
|
@@ -10,6 +10,7 @@ import (
|
|
|
10
10
|
"encoding/json"
|
|
11
11
|
"errors"
|
|
12
12
|
"fmt"
|
|
13
|
+
"net/http"
|
|
13
14
|
"regexp"
|
|
14
15
|
)
|
|
15
16
|
|
|
@@ -29,10 +30,11 @@ type Handler func(ctx context.Context, caller Caller, params json.RawMessage) (a
|
|
|
29
30
|
// Route binds a method name to its handler and access policy. Its fields are
|
|
30
31
|
// private: build routes with User, Admin or Public.
|
|
31
32
|
type Route struct {
|
|
32
|
-
method
|
|
33
|
-
policy
|
|
34
|
-
handler
|
|
35
|
-
binary
|
|
33
|
+
method string
|
|
34
|
+
policy policy
|
|
35
|
+
handler Handler
|
|
36
|
+
binary BinaryReadHandler
|
|
37
|
+
requestHandler RequestHandler
|
|
36
38
|
}
|
|
37
39
|
|
|
38
40
|
// User declares an operation any signed-in DSM user may call.
|
|
@@ -40,6 +42,15 @@ func User(method string, h Handler) Route {
|
|
|
40
42
|
return Route{method: method, policy: policyUser, handler: h}
|
|
41
43
|
}
|
|
42
44
|
|
|
45
|
+
// RequestHandler receives the original request after the normal transport and
|
|
46
|
+
// authentication guards. Credentials must remain request-scoped.
|
|
47
|
+
type RequestHandler func(context.Context, Caller, *http.Request, json.RawMessage) (any, error)
|
|
48
|
+
|
|
49
|
+
// UserRequest declares a session-aware operation for a signed-in DSM user.
|
|
50
|
+
func UserRequest(method string, h RequestHandler) Route {
|
|
51
|
+
return Route{method: method, policy: policyUser, requestHandler: h}
|
|
52
|
+
}
|
|
53
|
+
|
|
43
54
|
// Admin declares an operation only members of DSM's administrators group may call.
|
|
44
55
|
func Admin(method string, h Handler) Route {
|
|
45
56
|
return Route{method: method, policy: policyAdmin, handler: h}
|
|
@@ -80,10 +91,10 @@ func buildRegistry(routes []Route) (map[string]Route, error) {
|
|
|
80
91
|
if !methodName.MatchString(r.method) {
|
|
81
92
|
return nil, fmt.Errorf("route %q: method must look like \"area.action\" (lowercase)", r.method)
|
|
82
93
|
}
|
|
83
|
-
if r.binary != nil && (r.method != "nas.files.read.binary" || r.policy != policyUser || r.handler != nil) {
|
|
94
|
+
if r.binary != nil && (r.method != "nas.files.read.binary" || r.policy != policyUser || r.handler != nil || r.requestHandler != nil) {
|
|
84
95
|
return nil, errors.New("binary read must use the fixed authenticated route")
|
|
85
96
|
}
|
|
86
|
-
if r.handler == nil && r.binary == nil {
|
|
97
|
+
if r.handler == nil && r.binary == nil && r.requestHandler == nil {
|
|
87
98
|
return nil, fmt.Errorf("route %q has no handler", r.method)
|
|
88
99
|
}
|
|
89
100
|
if _, dup := registry[r.method]; dup {
|
|
@@ -71,7 +71,13 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|
|
71
71
|
serveBoundedRead(w, r, caller, req.Params, route.binary)
|
|
72
72
|
return
|
|
73
73
|
}
|
|
74
|
-
data
|
|
74
|
+
var data any
|
|
75
|
+
var err error
|
|
76
|
+
if route.requestHandler != nil {
|
|
77
|
+
data, err = route.requestHandler(r.Context(), caller, r, req.Params)
|
|
78
|
+
} else {
|
|
79
|
+
data, err = route.handler(r.Context(), caller, req.Params)
|
|
80
|
+
}
|
|
75
81
|
if err != nil {
|
|
76
82
|
writeError(w, asError(err))
|
|
77
83
|
return
|