@synopackageland/cli 0.6.1 → 0.7.1
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/CHANGELOG.md +846 -0
- package/README.md +81 -89
- package/dist/add.d.ts +4 -1
- package/dist/add.js +45 -17
- package/dist/build-spk/delegate-scope.d.ts +6 -0
- package/dist/build-spk/delegate-scope.js +34 -0
- package/dist/build-spk/dsm-arch.d.ts +7 -1
- package/dist/build-spk/dsm-arch.js +24 -28
- package/dist/build-spk/dsm-platforms.json +42 -0
- package/dist/build-spk/dsm-version.d.ts +11 -0
- package/dist/build-spk/dsm-version.js +17 -0
- package/dist/build-spk/gateway.js +8 -4
- package/dist/build-spk/generator.js +30 -5
- package/dist/build-spk/go-toolchain.d.ts +20 -0
- package/dist/build-spk/go-toolchain.js +44 -0
- package/dist/build-spk/notices.js +4 -1
- package/dist/build-spk/resource-worker.js +3 -0
- package/dist/build-spk/wizard-messages.d.ts +66 -0
- package/dist/build-spk/wizard-messages.js +75 -9
- package/dist/cli.js +28 -14
- package/dist/contract/schema-validate.js +8 -0
- package/dist/contract/validate.js +30 -0
- package/dist/deploy/deploy.d.ts +1 -1
- package/dist/deploy/deploy.js +8 -0
- package/dist/deploy/native-install-values.d.ts +17 -0
- package/dist/deploy/native-install-values.js +32 -0
- package/dist/deploy/plan.d.ts +6 -2
- package/dist/deploy/plan.js +58 -7
- package/dist/deploy/spk-version.js +1 -1
- package/dist/error-registry.js +54 -20
- package/dist/host/dsm-client.d.ts +8 -4
- package/dist/host/dsm-client.js +63 -21
- package/dist/host/dsm-http.js +24 -2
- package/dist/host/types.d.ts +3 -1
- package/dist/info.js +45 -10
- package/dist/init.d.ts +3 -0
- package/dist/init.js +50 -19
- package/dist/package-metadata.d.ts +21 -0
- package/dist/package-metadata.js +101 -0
- package/dist/portal/alias.d.ts +25 -0
- package/dist/portal/alias.js +48 -0
- package/dist/portal/package.d.ts +33 -0
- package/dist/portal/package.js +116 -0
- package/dist/runtime/delegate-contract.d.ts +79 -0
- package/dist/runtime/delegate-contract.js +27 -0
- package/dist/runtime/dsm-version.d.ts +6 -0
- package/dist/runtime/dsm-version.js +8 -0
- package/dist/runtime/executor-build.js +10 -6
- package/dist/runtime/executor-inspect.d.ts +3 -0
- package/dist/runtime/executor-inspect.js +11 -5
- package/dist/runtime/executor-policy.d.ts +12 -0
- package/dist/runtime/executor-policy.js +43 -3
- package/dist/runtime/executor-scope-task.d.ts +4 -0
- package/dist/runtime/executor-scope-task.js +21 -0
- package/dist/runtime/executor-tasks.d.ts +2 -1
- package/dist/runtime/executor-tasks.js +4 -4
- package/dist/skill.js +1 -0
- package/dist/standalone/api-permissions.d.ts +10 -0
- package/dist/standalone/api-permissions.js +19 -2
- package/dist/standalone/background.d.ts +16 -0
- package/dist/standalone/background.js +69 -2
- package/dist/standalone/binary.d.ts +1 -1
- package/dist/standalone/binary.js +22 -8
- package/dist/standalone/build.d.ts +1 -1
- package/dist/standalone/build.js +38 -8
- package/dist/standalone/daemon.d.ts +1 -0
- package/dist/standalone/daemon.js +10 -5
- package/dist/standalone/dsm-window.d.ts +3 -1
- package/dist/standalone/dsm-window.js +78 -49
- package/dist/standalone/inspect-spk.d.ts +8 -0
- package/dist/standalone/inspect-spk.js +110 -27
- package/dist/standalone/lifecycle.js +86 -8
- package/dist/standalone/manifest.d.ts +13 -0
- package/dist/standalone/manifest.js +57 -8
- package/dist/standalone/native-authorization-window.d.ts +1 -1
- package/dist/standalone/native-authorization-window.js +9 -1
- package/dist/standalone/native-layout.d.ts +3 -0
- package/dist/standalone/native-layout.js +37 -5
- package/dist/standalone/native-root-window.d.ts +4 -2
- package/dist/standalone/native-root-window.js +33 -18
- package/dist/standalone/portal-window.d.ts +21 -0
- package/dist/standalone/portal-window.js +155 -0
- package/dist/standalone/portal.d.ts +4 -0
- package/dist/standalone/portal.js +4 -0
- package/dist/standalone/resource.d.ts +5 -3
- package/dist/standalone/resource.js +6 -3
- package/dist/standalone/root-window.d.ts +4 -1
- package/dist/standalone/root-window.js +193 -36
- package/dist/standalone/spk.d.ts +1 -1
- package/dist/standalone/spk.js +25 -7
- package/dist/templates/_daemon/go.mod +1 -1
- package/dist/templates/_daemon/main.go +6 -3
- package/dist/templates/_daemon/main_test.go +82 -9
- package/dist/templates/_daemon/testdata/child.go +3 -0
- package/dist/templates/_executor/README.md +130 -16
- package/dist/templates/_executor/anchor.go +156 -0
- package/dist/templates/_executor/anchor_test.go +161 -0
- package/dist/templates/_executor/apppriv_review_test.go +1 -1
- package/dist/templates/_executor/cancel_contract_test.go +236 -0
- package/dist/templates/_executor/copy.go +64 -0
- package/dist/templates/_executor/copy_test.go +88 -0
- package/dist/templates/_executor/digest_review_test.go +2 -2
- package/dist/templates/_executor/dsm.go +63 -13
- package/dist/templates/_executor/dsm_test.go +95 -1
- package/dist/templates/_executor/executor.go +260 -49
- package/dist/templates/_executor/executor_test.go +36 -6
- package/dist/templates/_executor/go.mod +2 -0
- package/dist/templates/_executor/identity.go +27 -1
- package/dist/templates/_executor/identity_kernel_linux_test.go +60 -0
- package/dist/templates/_executor/identity_linux.go +82 -0
- package/dist/templates/_executor/identity_security_test.go +43 -0
- package/dist/templates/_executor/internal/lifecycle/lifecycle.go +5 -0
- package/dist/templates/_executor/internal/lifecycle/lifecycle_test.go +61 -3
- package/dist/templates/_executor/internal/taskscript/boot.sh +9 -9
- package/dist/templates/_executor/internal/taskscript/cmd/main.go +2 -2
- package/dist/templates/_executor/internal/taskscript/control.sh +15 -10
- package/dist/templates/_executor/internal/taskscript/tasks.go +5 -3
- package/dist/templates/_executor/lifecycle_test.go +11 -0
- package/dist/templates/_executor/link_linux.go +28 -0
- package/dist/templates/_executor/long_running_test.go +530 -0
- package/dist/templates/_executor/main.go +83 -25
- package/dist/templates/_executor/managed.go +3 -3
- package/dist/templates/_executor/managed_test.go +3 -3
- package/dist/templates/_executor/move_linux.go +490 -0
- package/dist/templates/_executor/move_linux_test.go +460 -0
- package/dist/templates/_executor/move_validation.go +46 -0
- package/dist/templates/_executor/move_validation_test.go +187 -0
- package/dist/templates/_executor/operations.go +926 -0
- package/dist/templates/_executor/path_test.go +18 -0
- package/dist/templates/_executor/pid.go +37 -0
- package/dist/templates/_executor/pid_test.go +113 -0
- package/dist/templates/_executor/platform_linux.go +24 -173
- package/dist/templates/_executor/platform_linux_test.go +9 -65
- package/dist/templates/_executor/platform_other.go +38 -4
- package/dist/templates/_executor/process.go +3 -0
- package/dist/templates/_executor/purge_log.go +18 -0
- package/dist/templates/_executor/records.go +242 -0
- package/dist/templates/_executor/scope_cancel_contract_test.go +91 -0
- package/dist/templates/_executor/scope_client.go +37 -0
- package/dist/templates/_executor/scope_contract.go +12 -0
- package/dist/templates/_executor/selected_scope.go +146 -0
- package/dist/templates/_executor/selected_scope_test.go +186 -0
- package/dist/templates/_executor/status_disabled_test.go +33 -0
- package/dist/templates/_executor/store.go +4 -3
- package/dist/templates/_executor/supervise.go +109 -0
- package/dist/templates/_executor/supervise_test.go +130 -0
- package/dist/templates/_executor/task_race_review_test.go +1 -1
- package/dist/templates/_executor/tasks.go +52 -15
- package/dist/templates/_executor/tasks_dsm71_test.go +114 -0
- package/dist/templates/_executor/tasks_review_test.go +1 -1
- package/dist/templates/_executor/tasks_test.go +62 -5
- package/dist/templates/_executor/upgrade_watch_test.go +13 -5
- package/dist/templates/_executor/watch.go +8 -0
- package/dist/templates/_executor/watch_test.go +23 -2
- package/dist/templates/_executor/write_review_linux_test.go +4 -12
- package/dist/templates/_gateway/go.mod +2 -0
- package/dist/templates/_shared/AGENTS.md +129 -0
- package/dist/templates/binary/dsm-package.yaml +24 -0
- package/dist/templates/binary/i18n/messages/de.json +4 -0
- package/dist/templates/binary/i18n/messages/en.json +4 -0
- package/dist/templates/binary/i18n/messages/es.json +4 -0
- package/dist/templates/binary/i18n/messages/fr.json +4 -0
- package/dist/templates/binary/i18n/messages/it.json +4 -0
- package/dist/templates/binary/i18n/messages/ja.json +4 -0
- package/dist/templates/binary/i18n/messages/ko.json +4 -0
- package/dist/templates/binary/i18n/messages/zh-CN.json +4 -0
- package/dist/templates/binary/i18n/messages/zh-TW.json +4 -0
- package/dist/templates/binary/ui/app.js +19 -4
- package/dist/templates/native-authorization/AuthorizationGate.vue +5 -3
- package/dist/templates/native-authorization/i18n/de.json +1 -0
- package/dist/templates/native-authorization/i18n/en.json +1 -0
- package/dist/templates/native-authorization/i18n/es.json +2 -1
- package/dist/templates/native-authorization/i18n/fr.json +1 -0
- package/dist/templates/native-authorization/i18n/it.json +11 -10
- package/dist/templates/native-authorization/i18n/ja.json +1 -0
- package/dist/templates/native-authorization/i18n/ko.json +10 -9
- package/dist/templates/native-authorization/i18n/zh-CN.json +6 -5
- package/dist/templates/native-authorization/i18n/zh-TW.json +6 -5
- package/dist/templates/native-go/README.md +43 -10
- package/dist/templates/native-go/backend/cmd/app/main.go +27 -7
- package/dist/templates/native-go/backend/go.mod +1 -1
- package/dist/templates/native-go/backend/internal/api/entry_test.go +47 -0
- package/dist/templates/native-go/backend/internal/api/permissions_test.go +3 -3
- package/dist/templates/native-go/backend/internal/api/registry.go +11 -0
- package/dist/templates/native-go/backend/internal/api/sdk-permissions.json +14 -1
- package/dist/templates/native-go/backend/internal/api/server.go +18 -5
- package/dist/templates/native-go/backend/internal/app/delegate_config.go +57 -0
- package/dist/templates/native-go/backend/internal/app/delegate_config_test.go +28 -0
- package/dist/templates/native-go/backend/internal/app/portal.go +30 -0
- package/dist/templates/native-go/backend/internal/app/portal_test.go +55 -0
- package/dist/templates/native-go/backend/internal/app/routes.go +8 -2
- package/dist/templates/native-go/backend/internal/background/runner.go +1 -1
- package/dist/templates/native-go/backend/internal/background/store.go +16 -14
- package/dist/templates/native-go/backend/internal/dsm/admin.go +8 -2
- package/dist/templates/native-go/backend/internal/dsm/admin_linux.go +43 -13
- package/dist/templates/native-go/backend/internal/dsm/admin_linux_test.go +56 -0
- package/dist/templates/native-go/backend/internal/dsm/admin_other.go +4 -1
- package/dist/templates/native-go/backend/internal/dsm/apppriv.go +30 -0
- package/dist/templates/native-go/backend/internal/dsm/bridge_file.go +75 -0
- package/dist/templates/native-go/backend/internal/dsm/bridge_file_test.go +57 -0
- package/dist/templates/native-go/backend/internal/dsm/entry.go +177 -0
- package/dist/templates/native-go/backend/internal/dsm/entry_test.go +315 -0
- package/dist/templates/native-go/backend/internal/dsm/native/admin-armv7.elf +0 -0
- package/dist/templates/native-go/backend/internal/dsm/native/apppriv-aarch64.elf +0 -0
- package/dist/templates/native-go/backend/internal/dsm/native/apppriv-armv7.elf +0 -0
- package/dist/templates/native-go/backend/internal/dsm/native/apppriv-x86_64.elf +0 -0
- package/dist/templates/native-go/backend/internal/dsm/native/apppriv_check.c +33 -0
- package/dist/templates/native-go/backend/internal/dsm/native/build.sh +13 -4
- package/dist/templates/native-go/backend/internal/dsm/native/provenance.json +9 -3
- package/dist/templates/native-go/backend/internal/filestation/check_permission.go +71 -0
- package/dist/templates/native-go/backend/internal/filestation/check_permission_test.go +77 -0
- package/dist/templates/native-go/backend/internal/filestation/client.go +39 -3
- package/dist/templates/native-go/backend/internal/filestation/download_dsm71_test.go +82 -0
- package/dist/templates/native-go/backend/internal/filestation/sdk_policy_test.go +39 -0
- package/dist/templates/native-go/backend/internal/filestation/service.go +1 -1
- package/dist/templates/native-go/backend/internal/identity/README.md +5 -1
- package/dist/templates/native-go/backend/internal/identity/dsm.go +24 -5
- package/dist/templates/native-go/backend/internal/identity/http.go +1 -1
- package/dist/templates/native-go/backend/internal/identity/identity_test.go +48 -1
- package/dist/templates/native-go/backend/internal/identity/service.go +1 -1
- package/dist/templates/native-go/backend/internal/portal/portal.go +138 -0
- package/dist/templates/native-go/backend/internal/portal/portal_test.go +89 -0
- package/dist/templates/native-go/dsm-package.yaml +20 -1
- package/dist/templates/native-go/i18n/glossary.json +2 -1
- package/dist/templates/native-go/i18n/messages/de.json +1 -0
- package/dist/templates/native-go/i18n/messages/en.json +1 -0
- package/dist/templates/native-go/i18n/messages/es.json +1 -0
- package/dist/templates/native-go/i18n/messages/fr.json +1 -0
- package/dist/templates/native-go/i18n/messages/it.json +1 -0
- package/dist/templates/native-go/i18n/messages/ja.json +1 -0
- package/dist/templates/native-go/i18n/messages/ko.json +1 -0
- package/dist/templates/native-go/i18n/messages/zh-CN.json +1 -0
- package/dist/templates/native-go/i18n/messages/zh-TW.json +1 -0
- package/dist/templates/native-go/ui/app.css +10 -0
- package/dist/templates/native-go/ui/app.js +11 -1
- package/dist/templates/native-go-delegate/DELEGATE.md +126 -5
- package/dist/templates/native-go-delegate/backend/cmd/background-worker/main.go +7 -0
- package/dist/templates/native-go-delegate/backend/internal/app/delegate.go +11 -1
- package/dist/templates/native-go-delegate/backend/internal/app/delegate_routes_test.go +14 -0
- package/dist/templates/native-go-delegate/backend/internal/background/delegated_moves.go +270 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/admission_recovery_test.go +410 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/cancel_contract_test.go +95 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/client.go +8 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/destination.go +110 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/destination_state.go +117 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/destination_state_test.go +60 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/destination_test.go +116 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/example.go +81 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/example_test.go +91 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/executor_contract_test.go +511 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/files.go +1 -1
- package/dist/templates/native-go-delegate/backend/internal/delegate/long_running_routes.go +92 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/long_running_routes_test.go +99 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/move.go +348 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/move_test.go +351 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/operations_list.go +65 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/operations_list_test.go +114 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/retry_test.go +1 -1
- package/dist/templates/native-go-delegate/backend/internal/delegate/service.go +58 -17
- package/dist/templates/native-go-delegate/backend/internal/delegate/staging.go +121 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/status_disabled_test.go +51 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/testdata/executor_contract.txt +112 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/transient_contract_test.go +137 -0
- package/dist/templates/native-go-delegate/backend/internal/filestation/files.go +1 -31
- package/dist/templates/native-go-delegate/frontend/src/CapabilityPanels.vue +30 -3
- package/dist/templates/native-go-delegate/frontend/src/delegate/BackgroundSavePanel.vue +113 -0
- package/dist/templates/native-go-delegate/frontend/src/delegate/copy.ts +5 -6
- package/dist/templates/native-go-delegate/frontend/test/background-save.test.ts +121 -0
- package/dist/templates/native-go-delegate/frontend/test/delegate.test.ts +15 -0
- package/dist/templates/native-go-delegate/frontend/test/scope-settings.test.ts +49 -0
- package/dist/templates/native-go-delegate/test.sh +1 -0
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/de.json +2 -2
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/en.json +2 -2
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/es.json +12 -12
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/fr.json +4 -4
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/it.json +17 -17
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/ja.json +7 -7
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/ko.json +15 -15
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/zh-CN.json +3 -3
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/zh-TW.json +2 -2
- package/dist/templates/native-go-jobs/frontend/test/background.test.ts +25 -28
- package/dist/templates/native-go-root-ops/backend/internal/app/executor.go +30 -2
- package/dist/templates/native-go-root-ops/backend/internal/app/executor_test.go +64 -0
- package/dist/templates/native-go-vue/README.md +4 -0
- package/dist/templates/native-go-vue/frontend/package-lock.json +4 -4
- package/dist/templates/native-go-vue/frontend/package.json +1 -1
- package/dist/templates/native-go-vue/frontend/src/App.vue +18 -13
- package/dist/templates/native-go-vue/frontend/src/context.ts +31 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/ExecutorSettings.vue +54 -9
- package/dist/templates/native-go-vue/frontend/src/delegate/catalogs.ts +11 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/copy.test.ts +12 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/copy.ts +4 -4
- package/dist/templates/native-go-vue/frontend/src/delegate/executor-settings.test.ts +23 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/executor-setup.ts +8 -2
- package/dist/templates/native-go-vue/frontend/src/delegate/facade.test.ts +100 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/facade.ts +85 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/de.json +47 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/en.json +13 -2
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/es.json +47 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/fr.json +47 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/it.json +47 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/ja.json +47 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/ko.json +47 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/de.json +42 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/en.json +42 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/es.json +42 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/fr.json +42 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/it.json +42 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/ja.json +42 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/ko.json +42 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-CN.json +42 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-TW.json +42 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/zh-CN.json +47 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/zh-TW.json +16 -5
- package/dist/templates/native-go-vue/frontend/src/delegate/long-running.ts +57 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/save-copy.test.ts +12 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/save-copy.ts +24 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/scoped-picker.test.ts +12 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/scoped-picker.ts +21 -0
- package/dist/templates/native-go-vue/frontend/src/files/files.test.ts +7 -0
- package/dist/templates/native-go-vue/frontend/src/i18n/de.json +20 -0
- package/dist/templates/native-go-vue/frontend/src/i18n/en.json +20 -0
- package/dist/templates/native-go-vue/frontend/src/i18n/es.json +20 -0
- package/dist/templates/native-go-vue/frontend/src/i18n/fr.json +20 -0
- package/dist/templates/native-go-vue/frontend/src/i18n/it.json +20 -0
- package/dist/templates/native-go-vue/frontend/src/i18n/ja.json +20 -0
- package/dist/templates/native-go-vue/frontend/src/i18n/ko.json +20 -0
- package/dist/templates/native-go-vue/frontend/src/i18n/zh-CN.json +20 -0
- package/dist/templates/native-go-vue/frontend/src/i18n/zh-TW.json +20 -0
- package/dist/templates/native-go-vue/frontend/src/i18n.ts +13 -0
- package/dist/templates/native-go-vue/frontend/src/identity/LoginPage.vue +16 -14
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/de.json +27 -0
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/en.json +27 -0
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/es.json +27 -0
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/fr.json +27 -0
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/it.json +27 -0
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/ja.json +27 -0
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/ko.json +27 -0
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/zh-CN.json +27 -0
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/zh-TW.json +27 -0
- package/dist/templates/native-go-vue/frontend/src/identity/i18n.ts +14 -0
- package/dist/templates/native-go-vue/frontend/src/identity/session.test.ts +4 -0
- package/dist/templates/native-go-vue/frontend/src/identity/session.ts +9 -8
- package/dist/templates/native-go-vue/frontend/src/nas/NasPicker.vue +31 -12
- package/dist/templates/native-go-vue/frontend/src/nas/destination.test.ts +48 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/de.json +1 -1
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/en.json +1 -1
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/es.json +10 -10
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/fr.json +1 -1
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/it.json +12 -12
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/ja.json +15 -15
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/ko.json +12 -12
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/zh-CN.json +1 -1
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/zh-TW.json +1 -1
- package/dist/templates/native-go-vue/frontend/src/portal/PortalSettings.vue +39 -0
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/fr.json +1 -1
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/ja.json +1 -1
- package/dist/templates/native-go-vue/frontend/test/apps.test.ts +14 -0
- package/dist/templates/native-go-vue/frontend/test/portal-settings.test.ts +71 -0
- package/dist/templates/native-go-vue/frontend/test/shell-i18n.test.ts +50 -0
- package/package.json +5 -1
- package/schema/package-metadata.schema.json +101 -0
- package/schema/synology-app.schema.json +112 -0
- package/skills/SKILL.md +106 -4
- package/skills/reference/create.md +101 -2
- package/skills/reference/deploy.md +2 -2
- package/skills/reference/files.md +113 -2
- package/skills/reference/identity.md +70 -1
- package/skills/reference/portal.md +17 -0
- package/skills/reference/ui-vue.md +12 -0
- package/templates/_daemon/go.mod +1 -1
- package/templates/_daemon/main.go +6 -3
- package/templates/_daemon/main_test.go +82 -9
- package/templates/_daemon/testdata/child.go +3 -0
- package/templates/_executor/README.md +130 -16
- package/templates/_executor/anchor.go +156 -0
- package/templates/_executor/anchor_test.go +161 -0
- package/templates/_executor/apppriv_review_test.go +1 -1
- package/templates/_executor/cancel_contract_test.go +236 -0
- package/templates/_executor/copy.go +64 -0
- package/templates/_executor/copy_test.go +88 -0
- package/templates/_executor/digest_review_test.go +2 -2
- package/templates/_executor/dsm.go +63 -13
- package/templates/_executor/dsm_test.go +95 -1
- package/templates/_executor/executor.go +260 -49
- package/templates/_executor/executor_test.go +36 -6
- package/templates/_executor/go.mod +2 -0
- package/templates/_executor/identity.go +27 -1
- package/templates/_executor/identity_kernel_linux_test.go +60 -0
- package/templates/_executor/identity_linux.go +82 -0
- package/templates/_executor/identity_security_test.go +43 -0
- package/templates/_executor/internal/lifecycle/lifecycle.go +5 -0
- package/templates/_executor/internal/lifecycle/lifecycle_test.go +61 -3
- package/templates/_executor/internal/taskscript/boot.sh +9 -9
- package/templates/_executor/internal/taskscript/cmd/main.go +2 -2
- package/templates/_executor/internal/taskscript/control.sh +15 -10
- package/templates/_executor/internal/taskscript/tasks.go +5 -3
- package/templates/_executor/lifecycle_test.go +11 -0
- package/templates/_executor/link_linux.go +28 -0
- package/templates/_executor/long_running_test.go +530 -0
- package/templates/_executor/main.go +83 -25
- package/templates/_executor/managed.go +3 -3
- package/templates/_executor/managed_test.go +3 -3
- package/templates/_executor/move_linux.go +490 -0
- package/templates/_executor/move_linux_test.go +460 -0
- package/templates/_executor/move_validation.go +46 -0
- package/templates/_executor/move_validation_test.go +187 -0
- package/templates/_executor/operations.go +926 -0
- package/templates/_executor/path_test.go +18 -0
- package/templates/_executor/pid.go +37 -0
- package/templates/_executor/pid_test.go +113 -0
- package/templates/_executor/platform_linux.go +24 -173
- package/templates/_executor/platform_linux_test.go +9 -65
- package/templates/_executor/platform_other.go +38 -4
- package/templates/_executor/process.go +3 -0
- package/templates/_executor/purge_log.go +18 -0
- package/templates/_executor/records.go +242 -0
- package/templates/_executor/scope_cancel_contract_test.go +91 -0
- package/templates/_executor/scope_client.go +37 -0
- package/templates/_executor/scope_contract.go +12 -0
- package/templates/_executor/selected_scope.go +146 -0
- package/templates/_executor/selected_scope_test.go +186 -0
- package/templates/_executor/status_disabled_test.go +33 -0
- package/templates/_executor/store.go +4 -3
- package/templates/_executor/supervise.go +109 -0
- package/templates/_executor/supervise_test.go +130 -0
- package/templates/_executor/task_race_review_test.go +1 -1
- package/templates/_executor/tasks.go +52 -15
- package/templates/_executor/tasks_dsm71_test.go +114 -0
- package/templates/_executor/tasks_review_test.go +1 -1
- package/templates/_executor/tasks_test.go +62 -5
- package/templates/_executor/upgrade_watch_test.go +13 -5
- package/templates/_executor/watch.go +8 -0
- package/templates/_executor/watch_test.go +23 -2
- package/templates/_executor/write_review_linux_test.go +4 -12
- package/templates/_gateway/go.mod +2 -0
- package/templates/_shared/AGENTS.md +129 -0
- package/templates/binary/dsm-package.yaml +24 -0
- package/templates/binary/i18n/messages/de.json +4 -0
- package/templates/binary/i18n/messages/en.json +4 -0
- package/templates/binary/i18n/messages/es.json +4 -0
- package/templates/binary/i18n/messages/fr.json +4 -0
- package/templates/binary/i18n/messages/it.json +4 -0
- package/templates/binary/i18n/messages/ja.json +4 -0
- package/templates/binary/i18n/messages/ko.json +4 -0
- package/templates/binary/i18n/messages/zh-CN.json +4 -0
- package/templates/binary/i18n/messages/zh-TW.json +4 -0
- package/templates/binary/ui/app.js +19 -4
- package/templates/native-authorization/AuthorizationGate.vue +5 -3
- package/templates/native-authorization/i18n/de.json +1 -0
- package/templates/native-authorization/i18n/en.json +1 -0
- package/templates/native-authorization/i18n/es.json +2 -1
- package/templates/native-authorization/i18n/fr.json +1 -0
- package/templates/native-authorization/i18n/it.json +11 -10
- package/templates/native-authorization/i18n/ja.json +1 -0
- package/templates/native-authorization/i18n/ko.json +10 -9
- package/templates/native-authorization/i18n/zh-CN.json +6 -5
- package/templates/native-authorization/i18n/zh-TW.json +6 -5
- package/templates/native-go/README.md +43 -10
- package/templates/native-go/backend/cmd/app/main.go +27 -7
- package/templates/native-go/backend/go.mod +1 -1
- package/templates/native-go/backend/internal/api/entry_test.go +47 -0
- package/templates/native-go/backend/internal/api/permissions_test.go +3 -3
- package/templates/native-go/backend/internal/api/registry.go +11 -0
- package/templates/native-go/backend/internal/api/sdk-permissions.json +14 -1
- package/templates/native-go/backend/internal/api/server.go +18 -5
- package/templates/native-go/backend/internal/app/delegate_config.go +57 -0
- package/templates/native-go/backend/internal/app/delegate_config_test.go +28 -0
- package/templates/native-go/backend/internal/app/portal.go +30 -0
- package/templates/native-go/backend/internal/app/portal_test.go +55 -0
- package/templates/native-go/backend/internal/app/routes.go +8 -2
- package/templates/native-go/backend/internal/background/runner.go +1 -1
- package/templates/native-go/backend/internal/background/store.go +16 -14
- package/templates/native-go/backend/internal/dsm/admin.go +8 -2
- package/templates/native-go/backend/internal/dsm/admin_linux.go +43 -13
- package/templates/native-go/backend/internal/dsm/admin_linux_test.go +56 -0
- package/templates/native-go/backend/internal/dsm/admin_other.go +4 -1
- package/templates/native-go/backend/internal/dsm/apppriv.go +30 -0
- package/templates/native-go/backend/internal/dsm/bridge_file.go +75 -0
- package/templates/native-go/backend/internal/dsm/bridge_file_test.go +57 -0
- package/templates/native-go/backend/internal/dsm/entry.go +177 -0
- package/templates/native-go/backend/internal/dsm/entry_test.go +315 -0
- package/templates/native-go/backend/internal/dsm/native/admin-armv7.elf +0 -0
- package/templates/native-go/backend/internal/dsm/native/apppriv-aarch64.elf +0 -0
- package/templates/native-go/backend/internal/dsm/native/apppriv-armv7.elf +0 -0
- package/templates/native-go/backend/internal/dsm/native/apppriv-x86_64.elf +0 -0
- package/templates/native-go/backend/internal/dsm/native/apppriv_check.c +33 -0
- package/templates/native-go/backend/internal/dsm/native/build.sh +13 -4
- package/templates/native-go/backend/internal/dsm/native/provenance.json +9 -3
- package/templates/native-go/backend/internal/filestation/check_permission.go +71 -0
- package/templates/native-go/backend/internal/filestation/check_permission_test.go +77 -0
- package/templates/native-go/backend/internal/filestation/client.go +39 -3
- package/templates/native-go/backend/internal/filestation/download_dsm71_test.go +82 -0
- package/templates/native-go/backend/internal/filestation/sdk_policy_test.go +39 -0
- package/templates/native-go/backend/internal/filestation/service.go +1 -1
- package/templates/native-go/backend/internal/identity/README.md +5 -1
- package/templates/native-go/backend/internal/identity/dsm.go +24 -5
- package/templates/native-go/backend/internal/identity/http.go +1 -1
- package/templates/native-go/backend/internal/identity/identity_test.go +48 -1
- package/templates/native-go/backend/internal/identity/service.go +1 -1
- package/templates/native-go/backend/internal/portal/portal.go +138 -0
- package/templates/native-go/backend/internal/portal/portal_test.go +89 -0
- package/templates/native-go/dsm-package.yaml +20 -1
- package/templates/native-go/i18n/glossary.json +2 -1
- package/templates/native-go/i18n/messages/de.json +1 -0
- package/templates/native-go/i18n/messages/en.json +1 -0
- package/templates/native-go/i18n/messages/es.json +1 -0
- package/templates/native-go/i18n/messages/fr.json +1 -0
- package/templates/native-go/i18n/messages/it.json +1 -0
- package/templates/native-go/i18n/messages/ja.json +1 -0
- package/templates/native-go/i18n/messages/ko.json +1 -0
- package/templates/native-go/i18n/messages/zh-CN.json +1 -0
- package/templates/native-go/i18n/messages/zh-TW.json +1 -0
- package/templates/native-go/ui/app.css +10 -0
- package/templates/native-go/ui/app.js +11 -1
- package/templates/native-go-delegate/DELEGATE.md +126 -5
- package/templates/native-go-delegate/backend/cmd/background-worker/main.go +7 -0
- package/templates/native-go-delegate/backend/internal/app/delegate.go +11 -1
- package/templates/native-go-delegate/backend/internal/app/delegate_routes_test.go +14 -0
- package/templates/native-go-delegate/backend/internal/background/delegated_moves.go +270 -0
- package/templates/native-go-delegate/backend/internal/delegate/admission_recovery_test.go +410 -0
- package/templates/native-go-delegate/backend/internal/delegate/cancel_contract_test.go +95 -0
- package/templates/native-go-delegate/backend/internal/delegate/client.go +8 -0
- package/templates/native-go-delegate/backend/internal/delegate/destination.go +110 -0
- package/templates/native-go-delegate/backend/internal/delegate/destination_state.go +117 -0
- package/templates/native-go-delegate/backend/internal/delegate/destination_state_test.go +60 -0
- package/templates/native-go-delegate/backend/internal/delegate/destination_test.go +116 -0
- package/templates/native-go-delegate/backend/internal/delegate/example.go +81 -0
- package/templates/native-go-delegate/backend/internal/delegate/example_test.go +91 -0
- package/templates/native-go-delegate/backend/internal/delegate/executor_contract_test.go +511 -0
- package/templates/native-go-delegate/backend/internal/delegate/files.go +1 -1
- package/templates/native-go-delegate/backend/internal/delegate/long_running_routes.go +92 -0
- package/templates/native-go-delegate/backend/internal/delegate/long_running_routes_test.go +99 -0
- package/templates/native-go-delegate/backend/internal/delegate/move.go +348 -0
- package/templates/native-go-delegate/backend/internal/delegate/move_test.go +351 -0
- package/templates/native-go-delegate/backend/internal/delegate/operations_list.go +65 -0
- package/templates/native-go-delegate/backend/internal/delegate/operations_list_test.go +114 -0
- package/templates/native-go-delegate/backend/internal/delegate/retry_test.go +1 -1
- package/templates/native-go-delegate/backend/internal/delegate/service.go +58 -17
- package/templates/native-go-delegate/backend/internal/delegate/staging.go +121 -0
- package/templates/native-go-delegate/backend/internal/delegate/status_disabled_test.go +51 -0
- package/templates/native-go-delegate/backend/internal/delegate/testdata/executor_contract.txt +112 -0
- package/templates/native-go-delegate/backend/internal/delegate/transient_contract_test.go +137 -0
- package/templates/native-go-delegate/backend/internal/filestation/files.go +1 -31
- package/templates/native-go-delegate/frontend/src/CapabilityPanels.vue +30 -3
- package/templates/native-go-delegate/frontend/src/delegate/BackgroundSavePanel.vue +113 -0
- package/templates/native-go-delegate/frontend/src/delegate/copy.ts +5 -6
- package/templates/native-go-delegate/frontend/test/background-save.test.ts +121 -0
- package/templates/native-go-delegate/frontend/test/delegate.test.ts +15 -0
- package/templates/native-go-delegate/frontend/test/scope-settings.test.ts +49 -0
- package/templates/native-go-delegate/test.sh +1 -0
- package/templates/native-go-jobs/frontend/src/background/i18n/de.json +2 -2
- package/templates/native-go-jobs/frontend/src/background/i18n/en.json +2 -2
- package/templates/native-go-jobs/frontend/src/background/i18n/es.json +12 -12
- package/templates/native-go-jobs/frontend/src/background/i18n/fr.json +4 -4
- package/templates/native-go-jobs/frontend/src/background/i18n/it.json +17 -17
- package/templates/native-go-jobs/frontend/src/background/i18n/ja.json +7 -7
- package/templates/native-go-jobs/frontend/src/background/i18n/ko.json +15 -15
- package/templates/native-go-jobs/frontend/src/background/i18n/zh-CN.json +3 -3
- package/templates/native-go-jobs/frontend/src/background/i18n/zh-TW.json +2 -2
- package/templates/native-go-jobs/frontend/test/background.test.ts +25 -28
- package/templates/native-go-root-ops/backend/internal/app/executor.go +30 -2
- package/templates/native-go-root-ops/backend/internal/app/executor_test.go +64 -0
- package/templates/native-go-vue/README.md +4 -0
- package/templates/native-go-vue/frontend/package-lock.json +4 -4
- package/templates/native-go-vue/frontend/package.json +1 -1
- package/templates/native-go-vue/frontend/src/App.vue +18 -13
- package/templates/native-go-vue/frontend/src/context.ts +31 -0
- package/templates/native-go-vue/frontend/src/delegate/ExecutorSettings.vue +54 -9
- package/templates/native-go-vue/frontend/src/delegate/catalogs.ts +11 -0
- package/templates/native-go-vue/frontend/src/delegate/copy.test.ts +12 -0
- package/templates/native-go-vue/frontend/src/delegate/copy.ts +4 -4
- package/templates/native-go-vue/frontend/src/delegate/executor-settings.test.ts +23 -0
- package/templates/native-go-vue/frontend/src/delegate/executor-setup.ts +8 -2
- package/templates/native-go-vue/frontend/src/delegate/facade.test.ts +100 -0
- package/templates/native-go-vue/frontend/src/delegate/facade.ts +85 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/de.json +47 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/en.json +13 -2
- package/templates/native-go-vue/frontend/src/delegate/i18n/es.json +47 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/fr.json +47 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/it.json +47 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/ja.json +47 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/ko.json +47 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/de.json +42 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/en.json +42 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/es.json +42 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/fr.json +42 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/it.json +42 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/ja.json +42 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/ko.json +42 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-CN.json +42 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-TW.json +42 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/zh-CN.json +47 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/zh-TW.json +16 -5
- package/templates/native-go-vue/frontend/src/delegate/long-running.ts +57 -0
- package/templates/native-go-vue/frontend/src/delegate/save-copy.test.ts +12 -0
- package/templates/native-go-vue/frontend/src/delegate/save-copy.ts +24 -0
- package/templates/native-go-vue/frontend/src/delegate/scoped-picker.test.ts +12 -0
- package/templates/native-go-vue/frontend/src/delegate/scoped-picker.ts +21 -0
- package/templates/native-go-vue/frontend/src/files/files.test.ts +7 -0
- package/templates/native-go-vue/frontend/src/i18n/de.json +20 -0
- package/templates/native-go-vue/frontend/src/i18n/en.json +20 -0
- package/templates/native-go-vue/frontend/src/i18n/es.json +20 -0
- package/templates/native-go-vue/frontend/src/i18n/fr.json +20 -0
- package/templates/native-go-vue/frontend/src/i18n/it.json +20 -0
- package/templates/native-go-vue/frontend/src/i18n/ja.json +20 -0
- package/templates/native-go-vue/frontend/src/i18n/ko.json +20 -0
- package/templates/native-go-vue/frontend/src/i18n/zh-CN.json +20 -0
- package/templates/native-go-vue/frontend/src/i18n/zh-TW.json +20 -0
- package/templates/native-go-vue/frontend/src/i18n.ts +13 -0
- package/templates/native-go-vue/frontend/src/identity/LoginPage.vue +16 -14
- package/templates/native-go-vue/frontend/src/identity/i18n/de.json +27 -0
- package/templates/native-go-vue/frontend/src/identity/i18n/en.json +27 -0
- package/templates/native-go-vue/frontend/src/identity/i18n/es.json +27 -0
- package/templates/native-go-vue/frontend/src/identity/i18n/fr.json +27 -0
- package/templates/native-go-vue/frontend/src/identity/i18n/it.json +27 -0
- package/templates/native-go-vue/frontend/src/identity/i18n/ja.json +27 -0
- package/templates/native-go-vue/frontend/src/identity/i18n/ko.json +27 -0
- package/templates/native-go-vue/frontend/src/identity/i18n/zh-CN.json +27 -0
- package/templates/native-go-vue/frontend/src/identity/i18n/zh-TW.json +27 -0
- package/templates/native-go-vue/frontend/src/identity/i18n.ts +14 -0
- package/templates/native-go-vue/frontend/src/identity/session.test.ts +4 -0
- package/templates/native-go-vue/frontend/src/identity/session.ts +9 -8
- package/templates/native-go-vue/frontend/src/nas/NasPicker.vue +31 -12
- package/templates/native-go-vue/frontend/src/nas/destination.test.ts +48 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/files/de.json +1 -1
- package/templates/native-go-vue/frontend/src/nas/i18n/files/en.json +1 -1
- package/templates/native-go-vue/frontend/src/nas/i18n/files/es.json +10 -10
- package/templates/native-go-vue/frontend/src/nas/i18n/files/fr.json +1 -1
- package/templates/native-go-vue/frontend/src/nas/i18n/files/it.json +12 -12
- package/templates/native-go-vue/frontend/src/nas/i18n/files/ja.json +15 -15
- package/templates/native-go-vue/frontend/src/nas/i18n/files/ko.json +12 -12
- package/templates/native-go-vue/frontend/src/nas/i18n/files/zh-CN.json +1 -1
- package/templates/native-go-vue/frontend/src/nas/i18n/files/zh-TW.json +1 -1
- package/templates/native-go-vue/frontend/src/portal/PortalSettings.vue +39 -0
- package/templates/native-go-vue/frontend/src/shell/i18n/fr.json +1 -1
- package/templates/native-go-vue/frontend/src/shell/i18n/ja.json +1 -1
- package/templates/native-go-vue/frontend/test/apps.test.ts +14 -0
- package/templates/native-go-vue/frontend/test/portal-settings.test.ts +71 -0
- package/templates/native-go-vue/frontend/test/shell-i18n.test.ts +50 -0
package/skills/SKILL.md
CHANGED
|
@@ -5,15 +5,15 @@ description: Initialize, extend, check, build, inspect, and deploy Synology appl
|
|
|
5
5
|
|
|
6
6
|
# Independent Synology SPKs
|
|
7
7
|
|
|
8
|
-
Use this guide to initialize, build and inspect own applications or upstream OSS as independent packages. 依已實作能力區分 DSM session 檔案、私有 jobs 與 App 登入;delegate 已實作並隨 CLI
|
|
8
|
+
Use this guide to initialize, build and inspect own applications or upstream OSS as independent packages. 依已實作能力區分 DSM session 檔案、私有 jobs 與 App 登入;delegate 已實作並隨 CLI 提供固定操作的離線委託(預設 `files.moveFromStaging`);共用 delegate/rootOps executor 的完整裝置生命週期驗收仍待完成,不得宣稱已通過;支援邊界依 delegate guide/support matrix,禁止發明新的身分平台。
|
|
9
9
|
|
|
10
10
|
Start with `synopkgland init -t native-go`, `synopkgland init -t binary`, or `synopkgland init -t compose`. Read reference/create.md or reference/wrap.md, then reference/deploy.md. Native CGI session checks belong to the package. Container authentication belongs to upstream; fixed service credentials govern mounted data access.
|
|
11
11
|
|
|
12
12
|
Never install, uninstall, publish or modify NAS data without task authorization. Prefer check, inspect and deploy --dry-run for reviewable artifacts.
|
|
13
13
|
|
|
14
|
-
Native projects use schema 2 capabilities and `--with files,jobs,login,root-ops`; use `add` for existing projects. Prefer `check --json`, `build --json`, `inspect <spk> --json`, `deploy --dry-run --json`, and `status --host <profile> --json` for structured results. Read the conflict policy in reference/create.md before adding overlays.
|
|
14
|
+
Native projects use schema 2 capabilities and `--with files,jobs,login,root-ops,delegate`; use `add` for existing projects. Prefer `check --json`, `build --json`, `inspect <spk> --json`, `deploy --dry-run --json`, and `status --host <profile> --json` for structured results. Read the conflict policy in reference/create.md before adding overlays.
|
|
15
15
|
|
|
16
|
-
Read reference/files.md and reference/identity.md for capability boundaries. RootOps and delegate share one-time protected executor boot/control setup with digest approval. Existing native products can explicitly use the separate authorization-sdk build-time adapter; do not mix its tasks with generated executor capabilities. App sessions alone do not grant NAS file authority.
|
|
16
|
+
Read reference/portal.md before declaring or changing a DSM Application Portal alias (`add portal`); DSM owns the saved setting. Read reference/files.md and reference/identity.md for capability boundaries. RootOps and delegate share one-time protected executor boot/control setup with digest approval. Existing native products can explicitly use the separate authorization-sdk build-time adapter; do not mix its tasks with generated executor capabilities. App sessions alone do not grant NAS file authority.
|
|
17
17
|
|
|
18
18
|
Read [reference/ui-vue.md](reference/ui-vue.md) when editing Vue components in the native-go Vue template; use the installed SDK contracts, keep DSM embedding boundaries, and verify the actual app.
|
|
19
19
|
|
|
@@ -26,4 +26,106 @@ Use `syno-pkg-land-ui` directly in npm scripts; keep AI guidance version-indepen
|
|
|
26
26
|
|
|
27
27
|
For existing native products, schema 2 `backend: {kind: native}` preserves project-owned payload/metadata, prepare/compile argv hooks and pinned toolkits. See the native-layout guide; run `check`, `build`, then `inspect <spk>` locally. Keep lifecycle/systemd as the package account and preserve product-owned digest approval/revocation. Native layouts do not opt into generated Go capabilities.
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
|
|
30
|
+
## Permanent destination integration
|
|
31
|
+
|
|
32
|
+
`init --with delegate` / `add delegate` default to `operations: [files.moveFromStaging]`,
|
|
33
|
+
`destinations: [save]`, `lifetime: until-revoked`, `scope: install-selected`. Existing legacy
|
|
34
|
+
TTL declarations retain their 1–3600 second service / 30-day wire ceiling and
|
|
35
|
+
64 MiB / 60-second URL example. Do not apply those limits to the new move API.
|
|
36
|
+
Delegate can coexist with daemon; ordinary standalone jobs cannot. Preserve
|
|
37
|
+
App business route floors. Binary/compose remain unsupported.
|
|
38
|
+
|
|
39
|
+
Use File Station `/home[/...]`, never `/homes/<user>`. The SDK destination picker
|
|
40
|
+
selection itself grants access after fresh DSM session/UID/write verification,
|
|
41
|
+
without a second consent dialog. Ordinary and administrator subjects use their
|
|
42
|
+
own nonzero UID/current groups, never root. An online App can create an in-scope
|
|
43
|
+
grant using a valid session; there is no trusted external consent or notification.
|
|
44
|
+
|
|
45
|
+
Use the default `createBackgroundSaveFacade(ctx)` / CapabilityPanels management
|
|
46
|
+
page. `delegate.status` exposes verified `disabled` and manifest mode; missing
|
|
47
|
+
protected evidence must not imply enabled. `delegate.operations.list` accepts
|
|
48
|
+
only `{}`, uses the backend move mirrors, and returns the caller's username+UID
|
|
49
|
+
operations only, including for admins. Mirrors are not completion receipts:
|
|
50
|
+
query original `delegate.operations.get` and show Saved only for committed with
|
|
51
|
+
a receipt. Cancel by the same reference; revoke by grant ID. Never resubmit
|
|
52
|
+
uncertain/interrupted work. Admin disable is protected and revokes grants;
|
|
53
|
+
enable/mailbox start does not resurrect them. Keep IDs, never session credentials.
|
|
54
|
+
|
|
55
|
+
App-owned daemon completion and scheduled CSV export call configured Go
|
|
56
|
+
`Service.MoveFromStaging` with `delegation_id`, stable `job_id`, private relative
|
|
57
|
+
`staging`, `name`, `size`. No owner/UID selector. Bounds: 16 GiB/file, queued16,
|
|
58
|
+
active1/package, 24-hour attempt, 5-second revalidation ticks (one check at a time, 30-second complete-check deadline; proven timeouts retain private copying, publication still revalidates), 10 MiB operation records,
|
|
59
|
+
50 MiB audit. Scope is a usage restriction, not hard subtree confinement.
|
|
60
|
+
Local production-executor fixtures use fake DSM/peer/bulk writer; do not claim
|
|
61
|
+
NAS ACL, actual writer UID, logout/reboot or full lifecycle acceptance from them.
|
|
62
|
+
Gopeed product wiring remains a separate task.
|
|
63
|
+
|
|
64
|
+
Admission recovery (per job): on `EXECUTOR_UNAVAILABLE`, `EXECUTOR_TIMEOUT`,
|
|
65
|
+
`EXECUTOR_PROTOCOL`, `canceled`, `EXECUTOR_PAUSED`, `queue-full`,
|
|
66
|
+
`STORAGE_ERROR`, `ADMISSION_PENDING`, `jobs_busy` or `jobs_unavailable` (the
|
|
67
|
+
package journal was busy or failed transiently; a caller deadline or cancel
|
|
68
|
+
spent waiting for it is `canceled`), call `MoveFromStaging` again later with
|
|
69
|
+
the same exact params. It queries the original reference first and re-sends
|
|
70
|
+
admission only when the executor does not know it and the pinned source is
|
|
71
|
+
unchanged; executor tuple deduplication keeps one operation, so a lost reply or a
|
|
72
|
+
racing caller never copies twice. At most 10 possibly-delivered sends, 2 s
|
|
73
|
+
backoff doubling to 5 min; the worker sweep does the same. Terminal, do not
|
|
74
|
+
retry: `APP_DENIED`, `DELEGATION_DENIED`, `operation-conflict`, `disabled`,
|
|
75
|
+
`SCOPE_DENIED` and other executor refusals, `STAGING_CHANGED`,
|
|
76
|
+
`ADMISSION_EXHAUSTED`, `spool_unsafe` and `journal_corrupt` (repair the package
|
|
77
|
+
spool first), and `operation-not-found` for an accepted operation.
|
|
78
|
+
Never change job/grant IDs, delete mirrors or call the socket directly to retry.
|
|
79
|
+
|
|
80
|
+
Cancellation (per job): `CancelOperation` / `delegate.operations.cancel` with the
|
|
81
|
+
original ref is idempotent; repeat it with the same ref after any retryable
|
|
82
|
+
error or a lost reply. A reply `queued`→`canceled` is final at once. A copy in
|
|
83
|
+
flight answers `copying` with code `CANCEL_REQUESTED`: the cancel is accepted and
|
|
84
|
+
durable, not finished; poll `OperationStatus` on the same ref until terminal
|
|
85
|
+
(repeating the cancel is harmless). `canceled` (`OPERATION_CANCELED`) guarantees the writer
|
|
86
|
+
stopped, its part file is removed, nothing was published and staging is kept; it
|
|
87
|
+
stays canceled across executor crash, package stop/start and logout. Revoke, scope change and disable store their reason (`grant-revoked`,
|
|
88
|
+
`scope-changed`, `integration-disabled`) the same way: a copy in flight answers
|
|
89
|
+
`CANCEL_REQUESTED` with it and settles `canceled` with it across a restart. A
|
|
90
|
+
copy the executor stops without a cancel ends `interrupted`/`EXECUTOR_PAUSED`
|
|
91
|
+
(`interrupted`/`interrupted` after a crash), never `WRITE_FAILED`. `committed`
|
|
92
|
+
means publication won the race: the file stays (cancel never removes it) and only
|
|
93
|
+
the app record may be dropped. `uncertain` means a publish attempt failed before
|
|
94
|
+
the cancel; keep querying. A cancel of a ref the executor has not admitted yet
|
|
95
|
+
(reserved/sent mirror) returns `canceled` and leaves a tombstone, so a late or
|
|
96
|
+
recovered admission of that ref returns `canceled` and never copies; a producer
|
|
97
|
+
cancel is also written to the mirror first, so `MoveFromStaging` and the worker
|
|
98
|
+
sweep forward the cancel instead of admitting it.
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
### Install-selected scope and the destination API
|
|
102
|
+
|
|
103
|
+
- The DSM install wizard dynamically lists local shares (`SYNO.Core.Share list`
|
|
104
|
+
via `api_store`) and offers home. It saves only a package-owned pre-selection
|
|
105
|
+
in `var/delegate-install.json`; never trust that file for authority.
|
|
106
|
+
- The existing administrator PasswordConfirm form displays this pre-selection
|
|
107
|
+
at first enable. `ctx.executor.authorize(password, selectedScope)` confirms it
|
|
108
|
+
through a pinned, exact-readback one-time root task. Settings changes use the
|
|
109
|
+
same form/password path; no App CGI route may set protected scope directly.
|
|
110
|
+
- The executor trusts `/usr/local/etc/synopkgland/<pkg>/delegations/selected-scope.record`
|
|
111
|
+
only. Its scope/generation are runtime protected state; shipped policy pins
|
|
112
|
+
lock the selection mode and operations. Changes revoke old grants and cancel
|
|
113
|
+
pending writes. Change-away-and-back never revives an old grant.
|
|
114
|
+
- Follow `selection` from verified `delegate.status` / `sdk.destination(key)`.
|
|
115
|
+
If the draft differs, display the difference and follow the protected value.
|
|
116
|
+
Home and fixed `shared:<name>` manifests stay compatible.
|
|
117
|
+
- Frontend: `const sdk = createBackgroundSaveFacade(ctx); const current = await
|
|
118
|
+
sdk.destination('save')` returns typed `{key, selection, destination, status}`.
|
|
119
|
+
`selection` contains `{scope, root, generation}`; `destination` is this caller's
|
|
120
|
+
grant or null. Handle active/missing/reselection-required/needs-scope-confirmation/disabled.
|
|
121
|
+
- Go: `Service.Destination(ctx, caller, request, key)` verifies the fresh DSM
|
|
122
|
+
session and username+UID. Capture its active grant ID into the App job. The
|
|
123
|
+
offline producer uses existing `Service.MoveFromStaging`; no user/UID selector,
|
|
124
|
+
cookie, token, or browser path cache. Executor revalidates at use/publication.
|
|
125
|
+
- The generated Background saves page includes a working **Save example file**
|
|
126
|
+
(`sdk.exportExample({key, job_id})`, `delegate.example.export`). Go
|
|
127
|
+
`ExportExample` creates a private JSON file, calls `MoveFromStaging` once, and
|
|
128
|
+
repeats the original request on repeated IDs. Review `example.go` to
|
|
129
|
+
adapt a real producer; show Saved only from a protected committed receipt.
|
|
130
|
+
- Wizard support is measured on vt-nas DSM 7.4 via a session-only SSH local
|
|
131
|
+
forward. This is not proof of other DSM releases or full writer/reboot behavior.
|
|
@@ -27,8 +27,107 @@ synopkgland init -t compose --from ./compose.yaml upstream-app
|
|
|
27
27
|
## Schema 2 能力
|
|
28
28
|
|
|
29
29
|
native-go 與 binary 使用 `dsm-package.yaml` 的 `schema: 2`,backend 寫 `kind: go, dir: backend` 或 `kind: binary, files: {x86_64: prebuilt/api-x86_64}`。
|
|
30
|
-
`--with files,jobs,login,root-ops` 分別宣告 `capabilities.files: session`、`jobs: true`、`identity: standalone`、`rootOps: true`。jobs 可寫 `{worker: sha256-v1}`,與 daemon 互斥;delegate
|
|
30
|
+
`--with files,jobs,login,root-ops,delegate` 分別宣告 `capabilities.files: session`、`jobs: true`、`identity: standalone`、`rootOps: true`、`delegate: {operations: [files.moveFromStaging], destinations: [save], lifetime: until-revoked, scope: install-selected}`。jobs 可寫 `{worker: sha256-v1}`,與 daemon 互斥;delegate 隱含 worker 並可與 daemon 共存;admin/normal 都以本人 UID 執行。binary/compose 不支援 files/jobs/login/delegate。
|
|
31
31
|
既有 native-go 專案用 `synopkgland add files jobs login`;已存在能力回報 no-op。overlay 檔案已有不同內容或 stub 被改動時,add 拒絕並列出衝突;不修改業務 routes 或 App.vue。
|
|
32
32
|
check、inspect、build、deploy、status 支援 `--json`,stdout 只有單一 JSON 物件,錯誤包含 code、message、hint;進度在 stderr。
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
rootOps 與 delegate 已共用管理員 PasswordConfirm 核准的 protected executor、boot/control tasks;精確 task readback 與 digest health 一致才 ready,pins 變更須重核准。native 產品另可明確 opt-in authorization-sdk adapter,不與 generated executor tasks 混用。SDK off stub 與 routes_test.go 的預設 policy scaffold 只有內容仍等於 bundled base 時才會替換;App 自訂版本拒絕。
|
|
35
|
+
|
|
36
|
+
## Permanent destination integration
|
|
37
|
+
|
|
38
|
+
`init --with delegate` / `add delegate` default to `operations: [files.moveFromStaging]`,
|
|
39
|
+
`destinations: [save]`, `lifetime: until-revoked`, `scope: install-selected`. Existing legacy
|
|
40
|
+
TTL declarations retain their 1–3600 second service / 30-day wire ceiling and
|
|
41
|
+
64 MiB / 60-second URL example. Do not apply those limits to the new move API.
|
|
42
|
+
Delegate can coexist with daemon; ordinary standalone jobs cannot. Preserve
|
|
43
|
+
App business route floors. Binary/compose remain unsupported.
|
|
44
|
+
|
|
45
|
+
Use File Station `/home[/...]`, never `/homes/<user>`. The SDK destination picker
|
|
46
|
+
selection itself grants access after fresh DSM session/UID/write verification,
|
|
47
|
+
without a second consent dialog. Ordinary and administrator subjects use their
|
|
48
|
+
own nonzero UID/current groups, never root. An online App can create an in-scope
|
|
49
|
+
grant using a valid session; there is no trusted external consent or notification.
|
|
50
|
+
|
|
51
|
+
Use the default `createBackgroundSaveFacade(ctx)` / CapabilityPanels management
|
|
52
|
+
page. `delegate.status` exposes verified `disabled` and manifest mode; missing
|
|
53
|
+
protected evidence must not imply enabled. `delegate.operations.list` accepts
|
|
54
|
+
only `{}`, uses the backend move mirrors, and returns the caller's username+UID
|
|
55
|
+
operations only, including for admins. Mirrors are not completion receipts:
|
|
56
|
+
query original `delegate.operations.get` and show Saved only for committed with
|
|
57
|
+
a receipt. Cancel by the same reference; revoke by grant ID. Never resubmit
|
|
58
|
+
uncertain/interrupted work. Admin disable is protected and revokes grants;
|
|
59
|
+
enable/mailbox start does not resurrect them. Keep IDs, never session credentials.
|
|
60
|
+
|
|
61
|
+
App-owned daemon completion and scheduled CSV export call configured Go
|
|
62
|
+
`Service.MoveFromStaging` with `delegation_id`, stable `job_id`, private relative
|
|
63
|
+
`staging`, `name`, `size`. No owner/UID selector. Bounds: 16 GiB/file, queued16,
|
|
64
|
+
active1/package, 24-hour attempt, 5-second revalidation ticks (one check at a time, 30-second complete-check deadline; proven timeouts retain private copying, publication still revalidates), 10 MiB operation records,
|
|
65
|
+
50 MiB audit. Scope is a usage restriction, not hard subtree confinement.
|
|
66
|
+
Local production-executor fixtures use fake DSM/peer/bulk writer; do not claim
|
|
67
|
+
NAS ACL, actual writer UID, logout/reboot or full lifecycle acceptance from them.
|
|
68
|
+
Gopeed product wiring remains a separate task.
|
|
69
|
+
|
|
70
|
+
Admission recovery (per job): on `EXECUTOR_UNAVAILABLE`, `EXECUTOR_TIMEOUT`,
|
|
71
|
+
`EXECUTOR_PROTOCOL`, `canceled`, `EXECUTOR_PAUSED`, `queue-full`,
|
|
72
|
+
`STORAGE_ERROR`, `ADMISSION_PENDING`, `jobs_busy` or `jobs_unavailable` (the
|
|
73
|
+
package journal was busy or failed transiently; a caller deadline or cancel
|
|
74
|
+
spent waiting for it is `canceled`), call `MoveFromStaging` again later with
|
|
75
|
+
the same exact params. It queries the original reference first and re-sends
|
|
76
|
+
admission only when the executor does not know it and the pinned source is
|
|
77
|
+
unchanged; executor tuple deduplication keeps one operation, so a lost reply or a
|
|
78
|
+
racing caller never copies twice. At most 10 possibly-delivered sends, 2 s
|
|
79
|
+
backoff doubling to 5 min; the worker sweep does the same. Terminal, do not
|
|
80
|
+
retry: `APP_DENIED`, `DELEGATION_DENIED`, `operation-conflict`, `disabled`,
|
|
81
|
+
`SCOPE_DENIED` and other executor refusals, `STAGING_CHANGED`,
|
|
82
|
+
`ADMISSION_EXHAUSTED`, `spool_unsafe` and `journal_corrupt` (repair the package
|
|
83
|
+
spool first), and `operation-not-found` for an accepted operation.
|
|
84
|
+
Never change job/grant IDs, delete mirrors or call the socket directly to retry.
|
|
85
|
+
|
|
86
|
+
Cancellation (per job): `CancelOperation` / `delegate.operations.cancel` with the
|
|
87
|
+
original ref is idempotent; repeat it with the same ref after any retryable
|
|
88
|
+
error or a lost reply. A reply `queued`→`canceled` is final at once. A copy in
|
|
89
|
+
flight answers `copying` with code `CANCEL_REQUESTED`: the cancel is accepted and
|
|
90
|
+
durable, not finished; poll `OperationStatus` on the same ref until terminal
|
|
91
|
+
(repeating the cancel is harmless). `canceled` (`OPERATION_CANCELED`) guarantees the writer
|
|
92
|
+
stopped, its part file is removed, nothing was published and staging is kept; it
|
|
93
|
+
stays canceled across executor crash, package stop/start and logout. `committed`
|
|
94
|
+
means publication won the race: the file stays (cancel never removes it) and only
|
|
95
|
+
the app record may be dropped. `uncertain` means a publish attempt failed before
|
|
96
|
+
the cancel; keep querying. A cancel of a ref the executor has not admitted yet
|
|
97
|
+
(reserved/sent mirror) returns `canceled` and leaves a tombstone, so a late or
|
|
98
|
+
recovered admission of that ref returns `canceled` and never copies; a producer
|
|
99
|
+
cancel is also written to the mirror first, so `MoveFromStaging` and the worker
|
|
100
|
+
sweep forward the cancel instead of admitting it.
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
### Install-selected scope and the destination API
|
|
104
|
+
|
|
105
|
+
- The DSM install wizard dynamically lists local shares (`SYNO.Core.Share list`
|
|
106
|
+
via `api_store`) and offers home. It saves only a package-owned pre-selection
|
|
107
|
+
in `var/delegate-install.json`; never trust that file for authority.
|
|
108
|
+
- The existing administrator PasswordConfirm form displays this pre-selection
|
|
109
|
+
at first enable. `ctx.executor.authorize(password, selectedScope)` confirms it
|
|
110
|
+
through a pinned, exact-readback one-time root task. Settings changes use the
|
|
111
|
+
same form/password path; no App CGI route may set protected scope directly.
|
|
112
|
+
- The executor trusts `/usr/local/etc/synopkgland/<pkg>/delegations/selected-scope.record`
|
|
113
|
+
only. Its scope/generation are runtime protected state; shipped policy pins
|
|
114
|
+
lock the selection mode and operations. Changes revoke old grants and cancel
|
|
115
|
+
pending writes. Change-away-and-back never revives an old grant.
|
|
116
|
+
- Follow `selection` from verified `delegate.status` / `sdk.destination(key)`.
|
|
117
|
+
If the draft differs, display the difference and follow the protected value.
|
|
118
|
+
Home and fixed `shared:<name>` manifests stay compatible.
|
|
119
|
+
- Frontend: `const sdk = createBackgroundSaveFacade(ctx); const current = await
|
|
120
|
+
sdk.destination('save')` returns typed `{key, selection, destination, status}`.
|
|
121
|
+
`selection` contains `{scope, root, generation}`; `destination` is this caller's
|
|
122
|
+
grant or null. Handle active/missing/reselection-required/needs-scope-confirmation/disabled.
|
|
123
|
+
- Go: `Service.Destination(ctx, caller, request, key)` verifies the fresh DSM
|
|
124
|
+
session and username+UID. Capture its active grant ID into the App job. The
|
|
125
|
+
offline producer uses existing `Service.MoveFromStaging`; no user/UID selector,
|
|
126
|
+
cookie, token, or browser path cache. Executor revalidates at use/publication.
|
|
127
|
+
- The generated Background saves page includes a working **Save example file**
|
|
128
|
+
(`sdk.exportExample({key, job_id})`, `delegate.example.export`). Go
|
|
129
|
+
`ExportExample` creates a private JSON file, calls `MoveFromStaging` once, and
|
|
130
|
+
repeats the original request on repeated IDs. Review `example.go` to
|
|
131
|
+
adapt a real producer; show Saved only from a protected committed receipt.
|
|
132
|
+
- Wizard support is measured on vt-nas DSM 7.4 via a session-only SSH local
|
|
133
|
+
forward. This is not proof of other DSM releases or full writer/reboot behavior.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Build and deploy
|
|
2
2
|
|
|
3
|
-
1. Run `synopkgland check` and `synopkgland build --arch x86_64` (use aarch64 for
|
|
3
|
+
1. Run `synopkgland check` and `synopkgland build --arch x86_64` (use aarch64 or armv7 for those targets; armv7 must be listed in `arches`; its jobs, daemon and executor are built but not NAS-verified). deploy detects the NAS arch, except on Marvell CPUs, where it asks for `--arch`.
|
|
4
4
|
2. Inspect the resulting file with `synopkgland inspect <file>`.
|
|
5
5
|
3. Review `synopkgland deploy --dry-run --arch x86_64`, which does not connect to a NAS.
|
|
6
6
|
4. Only when installation is authorized, run `synopkgland deploy --host <profile>`.
|
|
@@ -9,4 +9,4 @@ Deployment uploads directly to DSM. It does not publish artifacts. Container ins
|
|
|
9
9
|
|
|
10
10
|
For native-go root-ops, approve fixed operations in DSM after installation. Updates that change the task text require fresh approval. Remove tasks before uninstall. Never delete installed packages or data as part of a code cleanup.
|
|
11
11
|
|
|
12
|
-
5. After installation run `synopkgland status --host <profile> --json`; inspect every capability state and Open URL. Installation is not readiness.
|
|
12
|
+
5. After installation run `synopkgland status --host <profile> --json`; inspect every capability state and Open URL. Installation is not readiness. Delegate is implemented and shipped (default `files.moveFromStaging`); full device lifecycle acceptance is still pending for the shared delegate/rootOps executor: install → setup → reboot → upgrade → revoke → uninstall. Delete App Data is not evidence of complete cleanup; verify retained directories/account artifacts.
|
|
@@ -1,13 +1,124 @@
|
|
|
1
1
|
# 檔案與背景工作
|
|
2
2
|
|
|
3
|
-
Native-go 的 B 能力使用 `init --with files` 或 `add files`,對應 schema 2 `capabilities.files: session`。File tree 與共用 NasPicker 以 TreeView/DataGrid
|
|
3
|
+
Native-go 的 B 能力使用 `init --with files` 或 `add files`,對應 schema 2 `capabilities.files: session`。File tree 與共用 NasPicker 以 TreeView/DataGrid 顯示本人可見內容;一般選取不建立授權;delegate destination 選取例外,確認即授權。FilePicker 選瀏覽器本機檔案。上傳/下載使用 streaming transport,不把內容放進 JSON。每次以呼叫者有效 DSM session 由 File Station 判權,不需管理員進行能力設定。
|
|
4
4
|
|
|
5
5
|
只有 App session 沒有有效 DSM cookie 時回 `dsm_session_required`,須在同 hostname 登入 DSM。不能以套件帳號或 root 作後備存取。
|
|
6
6
|
|
|
7
7
|
A 能力 `--with jobs` 使用套件帳號處理已匯入的私有副本,依可信 username/UID 綁定;一般使用者不需 admin 設定即可提交、查詢與取消自己的工作。關閉瀏覽器後繼續,不保存 cookie/SID/密碼。匯入需要本人在線 session;私有副本不是離線讀取原檔案的權限。Jobs 與 daemon 互斥。
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
|
|
10
|
+
## Permanent destination integration
|
|
11
|
+
|
|
12
|
+
`init --with delegate` / `add delegate` default to `operations: [files.moveFromStaging]`,
|
|
13
|
+
`destinations: [save]`, `lifetime: until-revoked`, `scope: install-selected`. Existing legacy
|
|
14
|
+
TTL declarations retain their 1–3600 second service / 30-day wire ceiling and
|
|
15
|
+
64 MiB / 60-second URL example. Do not apply those limits to the new move API.
|
|
16
|
+
Delegate can coexist with daemon; ordinary standalone jobs cannot. Preserve
|
|
17
|
+
App business route floors. Binary/compose remain unsupported.
|
|
18
|
+
|
|
19
|
+
Use File Station `/home[/...]`, never `/homes/<user>`. The SDK destination picker
|
|
20
|
+
selection itself grants access after fresh DSM session/UID/write verification,
|
|
21
|
+
without a second consent dialog. Ordinary and administrator subjects use their
|
|
22
|
+
own nonzero UID/current groups, never root. An online App can create an in-scope
|
|
23
|
+
grant using a valid session; there is no trusted external consent or notification.
|
|
24
|
+
|
|
25
|
+
Use the default `createBackgroundSaveFacade(ctx)` / CapabilityPanels management
|
|
26
|
+
page. `delegate.status` exposes verified `disabled` and manifest mode; missing
|
|
27
|
+
protected evidence must not imply enabled. `delegate.operations.list` accepts
|
|
28
|
+
only `{}`, uses the backend move mirrors, and returns the caller's username+UID
|
|
29
|
+
operations only, including for admins. Mirrors are not completion receipts:
|
|
30
|
+
query original `delegate.operations.get` and show Saved only for committed with
|
|
31
|
+
a receipt. Cancel by the same reference; revoke by grant ID. Never resubmit
|
|
32
|
+
uncertain/interrupted work. Revoke, scope change and disable store their reason (`grant-revoked`,
|
|
33
|
+
`scope-changed`, `integration-disabled`) the same way: a copy in flight answers
|
|
34
|
+
`CANCEL_REQUESTED` with it and settles `canceled` with it across a restart. A
|
|
35
|
+
copy the executor stops without a cancel ends `interrupted`/`EXECUTOR_PAUSED`
|
|
36
|
+
(`interrupted`/`interrupted` after a crash), never `WRITE_FAILED`. A lost publish receipt (or a restart after publish
|
|
37
|
+
intent) settles to committed only when the recorded part inode is the final name;
|
|
38
|
+
otherwise it stays uncertain. Nothing is copied twice. Admin disable is protected and revokes grants;
|
|
39
|
+
enable/mailbox start does not resurrect them. Keep IDs, never session credentials.
|
|
40
|
+
|
|
41
|
+
App-owned daemon completion and scheduled CSV export call configured Go
|
|
42
|
+
`Service.MoveFromStaging` with `delegation_id`, stable `job_id`, private relative
|
|
43
|
+
`staging`, `name`, `size`. No owner/UID selector. Bounds: 16 GiB/file, queued16,
|
|
44
|
+
active1/package, 24-hour attempt, 5-second revalidation ticks (one check at a time, 30-second complete-check deadline; proven timeouts retain private copying, publication still revalidates), 10 MiB operation records,
|
|
45
|
+
50 MiB audit. Scope is a usage restriction, not hard subtree confinement.
|
|
46
|
+
Local production-executor fixtures use fake DSM/peer/bulk writer; do not claim
|
|
47
|
+
NAS ACL, actual writer UID, logout/reboot or full lifecycle acceptance from them.
|
|
48
|
+
Gopeed product wiring remains a separate task.
|
|
49
|
+
|
|
50
|
+
Admission recovery (per job): on `EXECUTOR_UNAVAILABLE`, `EXECUTOR_TIMEOUT`,
|
|
51
|
+
`EXECUTOR_PROTOCOL`, `canceled`, `EXECUTOR_PAUSED`, `queue-full`,
|
|
52
|
+
`STORAGE_ERROR`, `ADMISSION_PENDING`, `jobs_busy` or `jobs_unavailable` (the
|
|
53
|
+
package journal was busy or failed transiently; a caller deadline or cancel
|
|
54
|
+
spent waiting for it is `canceled`), call `MoveFromStaging` again later with
|
|
55
|
+
the same exact params. It queries the original reference first and re-sends
|
|
56
|
+
admission only when the executor does not know it and the pinned source is
|
|
57
|
+
unchanged; executor tuple deduplication keeps one operation, so a lost reply or a
|
|
58
|
+
racing caller never copies twice. At most 10 possibly-delivered sends, 2 s
|
|
59
|
+
backoff doubling to 5 min; the worker sweep does the same. Terminal, do not
|
|
60
|
+
retry: `APP_DENIED`, `DELEGATION_DENIED`, `operation-conflict`, `disabled`,
|
|
61
|
+
`SCOPE_DENIED` and other executor refusals, `STAGING_CHANGED`,
|
|
62
|
+
`ADMISSION_EXHAUSTED`, `spool_unsafe` and `journal_corrupt` (repair the package
|
|
63
|
+
spool first), and `operation-not-found` for an accepted operation.
|
|
64
|
+
Never change job/grant IDs, delete mirrors or call the socket directly to retry.
|
|
65
|
+
|
|
66
|
+
Cancellation (per job): `CancelOperation` / `delegate.operations.cancel` with the
|
|
67
|
+
original ref is idempotent; repeat it with the same ref after any retryable
|
|
68
|
+
error or a lost reply. A reply `queued`→`canceled` is final at once. A copy in
|
|
69
|
+
flight answers `copying` with code `CANCEL_REQUESTED`: the cancel is accepted and
|
|
70
|
+
durable, not finished; poll `OperationStatus` on the same ref until terminal
|
|
71
|
+
(repeating the cancel is harmless). `canceled` (`OPERATION_CANCELED`) guarantees the writer
|
|
72
|
+
stopped, its part file is removed, nothing was published and staging is kept; it
|
|
73
|
+
stays canceled across executor crash, package stop/start and logout. `committed`
|
|
74
|
+
means publication won the race: the file stays (cancel never removes it) and only
|
|
75
|
+
the app record may be dropped. `uncertain` means a publish attempt failed before
|
|
76
|
+
the cancel; keep querying. A cancel of a ref the executor has not admitted yet
|
|
77
|
+
(reserved/sent mirror) returns `canceled` and leaves a tombstone, so a late or
|
|
78
|
+
recovered admission of that ref returns `canceled` and never copies; a producer
|
|
79
|
+
cancel is also written to the mirror first, so `MoveFromStaging` and the worker
|
|
80
|
+
sweep forward the cancel instead of admitting it.
|
|
81
|
+
|
|
10
82
|
|
|
11
83
|
容器使用固定 DSM run-as 使用者與掛載,不代表瀏覽器本人 ACL。容器路徑依 Compose/映像的 upstream target,保留 target、ro/rw,只替換 host source;管理員在安裝時選擇 Share(共用資料夾)。不要對既有資料 chown。App Data 使用 package var;共用資料夾與 named volume 分別備份。`posix_all_shares` 僅為部署時快照,不會自動加入新資料夾。
|
|
12
84
|
|
|
13
85
|
`install.sharedFolder` 使用套件帳號:select 模式安裝後可能須管理員手動授予權限,create 由 DSM data-share 建立;都不是逐使用者 session access。移除不刪共用資料夾。Delete App Data 不是完整清理證明,須讀回殘留。
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
### Install-selected scope and the destination API
|
|
89
|
+
|
|
90
|
+
- The DSM install wizard dynamically lists local shares (`SYNO.Core.Share list`
|
|
91
|
+
via `api_store`) and offers home. It saves only a package-owned pre-selection
|
|
92
|
+
in `var/delegate-install.json`; never trust that file for authority.
|
|
93
|
+
- The existing administrator PasswordConfirm form displays this pre-selection
|
|
94
|
+
at first enable. `ctx.executor.authorize(password, selectedScope)` confirms it
|
|
95
|
+
through a pinned, exact-readback one-time root task. Settings changes use the
|
|
96
|
+
same form/password path; no App CGI route may set protected scope directly.
|
|
97
|
+
A change on a running, pin-verified executor never restarts it; copies in
|
|
98
|
+
flight end `canceled`/`scope-changed`. A `blocked` reply with `requested:
|
|
99
|
+
{scope, generation}` may still land: poll `ctx.executor.status()` until
|
|
100
|
+
`selection` shows that scope above that generation; resubmitting is safe.
|
|
101
|
+
- The executor trusts `/usr/local/etc/synopkgland/<pkg>/delegations/selected-scope.record`
|
|
102
|
+
only. Its scope/generation are runtime protected state; shipped policy pins
|
|
103
|
+
lock the selection mode and operations. Changes revoke old grants and cancel
|
|
104
|
+
pending writes. Change-away-and-back never revives an old grant.
|
|
105
|
+
- Follow `selection` from verified `delegate.status` / `sdk.destination(key)`.
|
|
106
|
+
If the draft differs, display the difference and follow the protected value.
|
|
107
|
+
Home and fixed `shared:<name>` manifests stay compatible.
|
|
108
|
+
- Frontend: `const sdk = createBackgroundSaveFacade(ctx); const current = await
|
|
109
|
+
sdk.destination('save')` returns typed `{key, selection, destination, status}`.
|
|
110
|
+
`selection` contains `{scope, root, generation}`; `destination` is this caller's
|
|
111
|
+
grant or null. Handle active/missing/reselection-required/needs-scope-confirmation/disabled.
|
|
112
|
+
- Go: `Service.Destination(ctx, caller, request, key)` verifies the fresh DSM
|
|
113
|
+
session and username+UID. Capture its active grant ID into the App job. The
|
|
114
|
+
offline producer uses existing `Service.MoveFromStaging`; no user/UID selector,
|
|
115
|
+
cookie, token, or browser path cache. Executor revalidates at use/publication.
|
|
116
|
+
- The generated Background saves page includes a working **Save example file**
|
|
117
|
+
(`sdk.exportExample({key, job_id})`, `delegate.example.export`). Go
|
|
118
|
+
`ExportExample` creates a private JSON file, calls `MoveFromStaging` once, and
|
|
119
|
+
repeats the original request on repeated IDs. Review `example.go` to
|
|
120
|
+
adapt a real producer; show Saved only from a protected committed receipt.
|
|
121
|
+
- Wizard support is measured on vt-nas DSM 7.4 via a session-only SSH local
|
|
122
|
+
forward. This is not proof of other DSM releases or full writer/reboot behavior.
|
|
123
|
+
|
|
124
|
+
The pinned scope-selection task also binds the protected generation observed before confirmation. The executor compares it under the publish lock and refuses stale tasks, so a retained task cannot replay an older selection after another confirmation.
|
|
@@ -2,10 +2,79 @@
|
|
|
2
2
|
|
|
3
3
|
Native-go validates the caller's DSM session per package. Business route permissions come from backend/internal/api/permissions.json; SDK-owned route policy is protected separately. Capabilities describe execution/resources and do not grant business route access. Never trust a request username as owner.
|
|
4
4
|
|
|
5
|
+
Entry: omit `entry` for legacy access; `entry: admin-only` admits administrators only and is the floor of every route: SDK routes a capability adds (files, jobs, portal, delegate, rootOps) refuse ordinary users with `admin_required`, the launcher is hidden, and an app route marked `authenticated` or `public` in permissions.json fails validate/build with `STANDALONE_ENTRY_WIDENED` (only the public `identity: standalone` login routes stay public; they admit no one by themselves). The SPK records the mode in `sdk-package.json`; `inspect` prints it and flags `ENTRY_LAUNCHER_MISMATCH`; `entry: app-privilege` also admits accounts DSM Application Privileges allows for `SYNO.SDS.<package>.Instance` (native-go only, needs an `authenticated` route). DSM evaluates user/group/everyone rules, allow/deny precedence and IP ranges; one CGI check covers every route, failures refuse with `app_privilege_denied`, and decisions are cached at most 30 seconds. DSM's install default allows administrators only, so declaring or upgrading never opens the app to everyone. The delegate executor applies the same entry rule to every protected and producer move: once DSM no longer allows a user, new moves under that user's still-valid grant are refused (`APP_DENIED`, grant invalidated); files already saved stay. Guard global settings in shared routes with Go `api.RequireAdmin(caller)` (`admin_required`); the frontend `ctx.user?.isAdmin` only hides controls.
|
|
6
|
+
|
|
5
7
|
I capability: init --with login or add login enables Go-native standalone identity and Vue login. Same-host DSM cookies can be reused across ports after backend verification. Missing cookies use an HTTPS DSM account/password/OTP fallback; passwords and DSM credentials are not persisted. Plain UI is unsupported. App sessions last at most 15 minutes; sensitive operations revalidate live DSM cookies and local UID. Password-only sessions permit only basic app.status/greeting.get reads. Missing revalidation returns session_revalidation_required; files return dsm_session_required. Sign in to DSM on the same hostname. Web Station portal/proxy acceptance remains pending.
|
|
6
8
|
|
|
7
9
|
B files needs the current user's DSM session. A jobs processes owner-bound private copies as the package account without administrator setup. Neither App identity nor login alone grants offline File Station access.
|
|
8
10
|
|
|
9
|
-
|
|
11
|
+
|
|
12
|
+
## Permanent destination integration
|
|
13
|
+
|
|
14
|
+
`init --with delegate` / `add delegate` default to `operations: [files.moveFromStaging]`,
|
|
15
|
+
`destinations: [save]`, `lifetime: until-revoked`, `scope: home`. Existing legacy
|
|
16
|
+
TTL declarations retain their 1–3600 second service / 30-day wire ceiling and
|
|
17
|
+
64 MiB / 60-second URL example. Do not apply those limits to the new move API.
|
|
18
|
+
Delegate can coexist with daemon; ordinary standalone jobs cannot. Preserve
|
|
19
|
+
App business route floors. Binary/compose remain unsupported.
|
|
20
|
+
|
|
21
|
+
Use File Station `/home[/...]`, never `/homes/<user>`. The SDK destination picker
|
|
22
|
+
selection itself grants access after fresh DSM session/UID/write verification,
|
|
23
|
+
without a second consent dialog. Ordinary and administrator subjects use their
|
|
24
|
+
own nonzero UID/current groups, never root. An online App can create an in-scope
|
|
25
|
+
grant using a valid session; there is no trusted external consent or notification.
|
|
26
|
+
|
|
27
|
+
Use the default `createBackgroundSaveFacade(ctx)` / CapabilityPanels management
|
|
28
|
+
page. `delegate.status` exposes verified `disabled` and manifest mode; missing
|
|
29
|
+
protected evidence must not imply enabled. `delegate.operations.list` accepts
|
|
30
|
+
only `{}`, uses the backend move mirrors, and returns the caller's username+UID
|
|
31
|
+
operations only, including for admins. Mirrors are not completion receipts:
|
|
32
|
+
query original `delegate.operations.get` and show Saved only for committed with
|
|
33
|
+
a receipt. Cancel by the same reference; revoke by grant ID. Never resubmit
|
|
34
|
+
uncertain/interrupted work. Admin disable is protected and revokes grants;
|
|
35
|
+
enable/mailbox start does not resurrect them. Keep IDs, never session credentials.
|
|
36
|
+
|
|
37
|
+
App-owned daemon completion and scheduled CSV export call configured Go
|
|
38
|
+
`Service.MoveFromStaging` with `delegation_id`, stable `job_id`, private relative
|
|
39
|
+
`staging`, `name`, `size`. No owner/UID selector. Bounds: 16 GiB/file, queued16,
|
|
40
|
+
active1/package, 24-hour attempt, 5-second revalidation ticks (one check at a time, 30-second complete-check deadline; proven timeouts retain private copying, publication still revalidates), 10 MiB operation records,
|
|
41
|
+
50 MiB audit. Scope is a usage restriction, not hard subtree confinement.
|
|
42
|
+
Local production-executor fixtures use fake DSM/peer/bulk writer; do not claim
|
|
43
|
+
NAS ACL, actual writer UID, logout/reboot or full lifecycle acceptance from them.
|
|
44
|
+
Gopeed product wiring remains a separate task.
|
|
45
|
+
|
|
46
|
+
Admission recovery (per job): on `EXECUTOR_UNAVAILABLE`, `EXECUTOR_TIMEOUT`,
|
|
47
|
+
`EXECUTOR_PROTOCOL`, `canceled`, `EXECUTOR_PAUSED`, `queue-full`,
|
|
48
|
+
`STORAGE_ERROR`, `ADMISSION_PENDING`, `jobs_busy` or `jobs_unavailable` (the
|
|
49
|
+
package journal was busy or failed transiently; a caller deadline or cancel
|
|
50
|
+
spent waiting for it is `canceled`), call `MoveFromStaging` again later with
|
|
51
|
+
the same exact params. It queries the original reference first and re-sends
|
|
52
|
+
admission only when the executor does not know it and the pinned source is
|
|
53
|
+
unchanged; executor tuple deduplication keeps one operation, so a lost reply or a
|
|
54
|
+
racing caller never copies twice. At most 10 possibly-delivered sends, 2 s
|
|
55
|
+
backoff doubling to 5 min; the worker sweep does the same. Terminal, do not
|
|
56
|
+
retry: `APP_DENIED`, `DELEGATION_DENIED`, `operation-conflict`, `disabled`,
|
|
57
|
+
`SCOPE_DENIED` and other executor refusals, `STAGING_CHANGED`,
|
|
58
|
+
`ADMISSION_EXHAUSTED`, `spool_unsafe` and `journal_corrupt` (repair the package
|
|
59
|
+
spool first), and `operation-not-found` for an accepted operation.
|
|
60
|
+
Never change job/grant IDs, delete mirrors or call the socket directly to retry.
|
|
61
|
+
|
|
62
|
+
Cancellation (per job): `CancelOperation` / `delegate.operations.cancel` with the
|
|
63
|
+
original ref is idempotent; repeat it with the same ref after any retryable
|
|
64
|
+
error or a lost reply. A reply `queued`→`canceled` is final at once. A copy in
|
|
65
|
+
flight answers `copying` with code `CANCEL_REQUESTED`: the cancel is accepted and
|
|
66
|
+
durable, not finished; poll `OperationStatus` on the same ref until terminal
|
|
67
|
+
(repeating the cancel is harmless). `canceled` (`OPERATION_CANCELED`) guarantees the writer
|
|
68
|
+
stopped, its part file is removed, nothing was published and staging is kept; it
|
|
69
|
+
stays canceled across executor crash, package stop/start and logout. `committed`
|
|
70
|
+
means publication won the race: the file stays (cancel never removes it) and only
|
|
71
|
+
the app record may be dropped. `uncertain` means a publish attempt failed before
|
|
72
|
+
the cancel; keep querying. A cancel of a ref the executor has not admitted yet
|
|
73
|
+
(reserved/sent mirror) returns `canceled` and leaves a tombstone, so a late or
|
|
74
|
+
recovered admission of that ref returns `canceled` and never copies; a producer
|
|
75
|
+
cancel is also written to the mirror first, so `MoveFromStaging` and the worker
|
|
76
|
+
sweep forward the cancel instead of admitting it.
|
|
77
|
+
|
|
78
|
+
RootOps/delegate share PasswordConfirm-approved digest-pinned setup with exact task readback and health. Pins changes require reapproval. The separate native authorization-sdk adapter must not mix its tasks with generated executor tasks.
|
|
10
79
|
|
|
11
80
|
Compose uses its DSM gateway plus upstream authentication. A fixed service UID/GID identifies the service, not the browser user. Do not infer general SSO or per-user file authority from a service mount.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# DSM Application Portal
|
|
2
|
+
|
|
3
|
+
Declare: native-go/binary `portal: {}` or `portal: {alias: my-app}` in dsm-package.yaml (`synopkgland add portal`); Compose `integration.web.portal: {}` only for a DSM-window app behind the DSM auth gateway. The alias defaults to the package name in lowercase. Aliases are 1–64 lowercase letters, digits or `-`, not starting or ending with `-`, and not a DSM path or Synology App alias (`webman`, `file`, …). The native-layout `backend: {kind: native}` owns its conf/scripts: the SDK does not register a portal for it.
|
|
4
|
+
|
|
5
|
+
Build: the SPK carries `etc/portal.json` (every field DSM's app-portal worker needs) and `etc/portal.mustache`, `conf/resource` registers them, and the install wizard adds a prefilled alias step. preinst validates the answer; postinst stores it as the package's own draft and default alias. Nothing is active until an administrator applies it. `inspect <spk> --json` reports `portal: {appId, alias}` and refuses any other portal content.
|
|
6
|
+
|
|
7
|
+
Activate: DSM owns the saved setting. Administrators use the app's portal panel (`ctx.portal.apply(alias)` / `disable()`, DSM `SYNO.Core.AppPortal set` with their own session; DSM refuses non-administrators with 105) or Control Panel > Login Portal > Applications (`ctx.portal.openControlPanel()`). DSM errors map to `portal_alias_invalid`, `portal_alias_reserved`, `portal_alias_in_use`, `admin_required`, `portal_unavailable`.
|
|
8
|
+
|
|
9
|
+
Read: ordinary users call the Go backend's `portal.status` (`authenticated`), which reads `/var/packages/<package>/etc/AppPortal.json` read-only, bounded (64 KiB, no symlinks, one JSON object, matching app id). Anything else is `unavailable` and the UI shows "ask an administrator". A binary CGI must implement the same `{state, alias}` answer itself or ordinary users never see the link.
|
|
10
|
+
|
|
11
|
+
DSM floor: os_min_ver must be 7.3.2-86009 or later. DSM 7.1.1-42962 refuses an unsigned SPK whose conf/resource carries web-config app-portal (Package Center error 320, "non-synology-signed package should not use internal worker"); 7.3.2-86009 and 7.4 install it; 7.2 and 7.3.0/7.3.1 are untested (unknown). validate/build fail with `STANDALONE_PORTAL_MIN_DSM` / `CONTRACT_PORTAL_MIN_DSM`, `--min-dsm` cannot go below it, `add portal` raises a lower os_min_ver, and inspect flags a lower INFO os_min_ver. Fix: raise os_min_ver or remove the portal.
|
|
12
|
+
|
|
13
|
+
Capability: beyond that floor, no version gate. The panel needs SYNO.API.Info to list `SYNO.Core.AppPortal` (v2) and the app's registration to exist; otherwise administrators get only the Control Panel shortcut.
|
|
14
|
+
|
|
15
|
+
UI: plain JS calls `ctx.portal && ctx.portal.mountPanel(element)` and disposes it on unmount; Vue renders `portal/PortalSettings.vue`. `ctx.portal.messages` carries the SDK text in all nine languages.
|
|
16
|
+
|
|
17
|
+
Never: write `AppPortal.json`, `@appconf/<package>` or `/usr/syno/etc/www/app.d`; add a backend route that changes the alias; relay QuickConnect responses or build QuickConnect links; reboot or change other packages' portal entries while testing. DSM keeps the alias across upgrades and removes the entry on uninstall.
|
|
@@ -69,3 +69,15 @@ handlers; it does not replace the Vue build, tests or actual-app screenshots.
|
|
|
69
69
|
Finally run the project's `check --json`, `build --json` and
|
|
70
70
|
`inspect <spk> --json` workflow from AGENTS.md. Fix errors, warnings and layout
|
|
71
71
|
issues before handing over the app.
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
## Delegate scope Settings
|
|
75
|
+
|
|
76
|
+
Default delegate uses `install-selected`. Keep ExecutorSettings and BackgroundSavePanel
|
|
77
|
+
in the existing Settings surface. Show the installer draft only as a pre-selection;
|
|
78
|
+
follow protected `selection` from `delegate.status` / `sdk.destination(key)`. Use
|
|
79
|
+
`ctx.executor.authorize(password, scope)` for both first enable and scope changes,
|
|
80
|
+
with the same PasswordConfirm form and no extra dialog. Mismatch must be explicit.
|
|
81
|
+
Restrict the existing NasPicker to `selection.root`; do not grant via cached paths.
|
|
82
|
+
The default facade includes typed `destination(key)` and `exportExample({key,job_id})`;
|
|
83
|
+
use original operation references and display Saved only for protected receipts.
|
package/templates/_daemon/go.mod
CHANGED
|
@@ -28,6 +28,9 @@ type deadlines struct {
|
|
|
28
28
|
Start int `json:"start"`
|
|
29
29
|
Stop int `json:"stop"`
|
|
30
30
|
Status int `json:"status"`
|
|
31
|
+
// Uninstall bounds uninstall_args separately from Stop: a revoke on a
|
|
32
|
+
// loaded NAS can take longer than stopping the daemon.
|
|
33
|
+
Uninstall int `json:"uninstall"`
|
|
31
34
|
}
|
|
32
35
|
type config struct {
|
|
33
36
|
Package string `json:"package"`
|
|
@@ -88,7 +91,7 @@ func load(dest, data string) (*controller, error) {
|
|
|
88
91
|
if cfg.Exec == "" || filepath.IsAbs(cfg.Exec) || filepath.Clean(cfg.Exec) != cfg.Exec || strings.HasPrefix(cfg.Exec, "../") {
|
|
89
92
|
return nil, errors.New("invalid fixed executable")
|
|
90
93
|
}
|
|
91
|
-
if cfg.Timeouts.Start < 2 || cfg.Timeouts.Start > 120 || cfg.Timeouts.Stop < 2 || cfg.Timeouts.Stop > 120 || cfg.Timeouts.Status < 1 || cfg.Timeouts.Status > 10 {
|
|
94
|
+
if cfg.Timeouts.Start < 2 || cfg.Timeouts.Start > 120 || cfg.Timeouts.Stop < 2 || cfg.Timeouts.Stop > 120 || cfg.Timeouts.Status < 1 || cfg.Timeouts.Status > 10 || cfg.Timeouts.Uninstall < 2 || cfg.Timeouts.Uninstall > 120 {
|
|
92
95
|
return nil, errors.New("invalid daemon deadlines")
|
|
93
96
|
}
|
|
94
97
|
hash := sha256.Sum256(raw)
|
|
@@ -162,7 +165,7 @@ func (c *controller) run(action string) (int, error) {
|
|
|
162
165
|
budget += c.Timeouts.Start
|
|
163
166
|
}
|
|
164
167
|
if action == "uninstall" {
|
|
165
|
-
budget += c.Timeouts.
|
|
168
|
+
budget += c.Timeouts.Uninstall + 2
|
|
166
169
|
}
|
|
167
170
|
if action != "start" && action != "stop" && action != "status" && action != "restart" && action != "uninstall" {
|
|
168
171
|
return 1, errors.New("unsupported daemon action")
|
|
@@ -414,7 +417,7 @@ func (c *controller) uninstall() error {
|
|
|
414
417
|
select {
|
|
415
418
|
case err := <-done:
|
|
416
419
|
return err
|
|
417
|
-
case <-time.After(time.Duration(c.Timeouts.
|
|
420
|
+
case <-time.After(time.Duration(c.Timeouts.Uninstall) * time.Second):
|
|
418
421
|
cmd.Process.Signal(syscall.SIGTERM)
|
|
419
422
|
}
|
|
420
423
|
select {
|