From 77342c80472ffbb3dee4cf026af8b9e0799183fa Mon Sep 17 00:00:00 2001 From: librelad Date: Tue, 26 May 2026 21:30:36 +0100 Subject: [PATCH] feat(lazy-load): extend manifest to containers/ + skip container scan (Phase 5) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Containers used to be eager-loaded via `sourceScanFiles "containers"` even under LP_LAZY=1 — sourcing all ~160 installer functions up front. Phase 5 brings them into the autoload-stub mechanism. generate_function_manifest.sh now scans BOTH scripts/ AND containers/ (maxdepth 3, matching sourceScanFiles' existing prune), with a per-entry root selector so stub emission uses the right base directory: scripts/peer/peer_add.sh → source "${install_scripts_dir}peer/peer_add.sh" containers/linkding/linkding.sh → source "${install_containers_dir}linkding/linkding.sh" New manifest exports: LP_FN_MAP funcname → relpath (existing) LP_FN_ROOT funcname → scripts|containers NEW LP_EAGER_FILES ":" entries NEW format ~860 autoload stubs (was ~700; +160 from containers) Loader changes (initilize_files.sh): - Parses LP_EAGER_FILES entries as `root:path`, dispatches to the right install_*_dir. Pre-Phase-5 entries without a colon default to scripts (backwards-compatible). - sourceScanFiles "containers" is skipped when LP_LAZY=1 AND LP_FN_MAP is loaded (manifest-driven autoload covers it). Eager mode and lazy-with-missing-manifest both still run the scan. Measurement target: ~70 ms saved on top of Phase 4. Verified separately in the commit message of the next deploy. Signed-off-by: librelad --- .../source/files/arrays/function_manifest.sh | 1215 ++++++++++++++++- .../files/generate_function_manifest.sh | 121 +- scripts/source/loading/initilize_files.sh | 43 +- 3 files changed, 1320 insertions(+), 59 deletions(-) diff --git a/scripts/source/files/arrays/function_manifest.sh b/scripts/source/files/arrays/function_manifest.sh index a35b3eb..8356b3f 100644 --- a/scripts/source/files/arrays/function_manifest.sh +++ b/scripts/source/files/arrays/function_manifest.sh @@ -7,24 +7,130 @@ # Function name → relative path. Used by the lazy loader (LP_LAZY=1) # to install an autoload stub for each public function. First call to a # stub sources the real file, which redefines the function with the real -# body; subsequent calls hit the real one directly. +# body; subsequent calls hit the real one directly. Path is relative to +# install_scripts_dir for "scripts" entries, install_containers_dir for +# "containers" entries — see LP_FN_ROOT below. declare -gA LP_FN_MAP=( [acquireSingletonLock]="crontab/task/crontab_task_processor.sh" [adoptDockerSubnet]="checks/requirements/check_docker_network.sh" + [appAdguardApplyDnsUpdater]="adguard/tools/adguard_apply_dns_updater.sh" + [appAdguardResetPassword]="adguard/tools/adguard_reset_password.sh" + [appBookstackCreateAccount]="bookstack/tools/bookstack_create_account.sh" + [appBookstackDeleteUser]="bookstack/tools/bookstack_delete_user.sh" + [appBookstackListUsers]="bookstack/tools/bookstack_list_users.sh" + [appBookstackResetPassword]="bookstack/tools/bookstack_reset_password.sh" + [appBookstackSetAdmin]="bookstack/tools/bookstack_set_admin.sh" + [appCrowdSecAlertsList]="crowdsec/scripts/crowdsec_alerts_list.sh" + [appCrowdSecConsoleDisable]="crowdsec/scripts/crowdsec_console_disable.sh" + [appCrowdSecConsoleEnroll]="crowdsec/scripts/crowdsec_console_enroll.sh" + [appCrowdSecDecisionsList]="crowdsec/scripts/crowdsec_decisions_list.sh" + [appCrowdSecFixPriority]="crowdsec/scripts/crowdsec_fix_priority.sh" + [appCrowdSecHubUpdate]="crowdsec/scripts/crowdsec_hub_update.sh" + [appCrowdSecMetrics]="crowdsec/scripts/crowdsec_metrics.sh" + [appCrowdSecStatus]="crowdsec/scripts/crowdsec_status.sh" + [appCrowdSecUnban]="crowdsec/scripts/crowdsec_unban.sh" + [appCrowdSecUpdate]="crowdsec/scripts/crowdsec_update.sh" + [appCrowdSecVerifyFirewall]="crowdsec/scripts/crowdsec_verify_firewall.sh" + [appDashyManageShortcuts]="dashy/tools/dashy_manage_shortcuts.sh" + [appDashyUpdateConf]="dashy/scripts/dashy_update_conf.sh" + [appFocalboardCreateAccount]="focalboard/tools/focalboard_create_account.sh" + [appFocalboardDeleteUser]="focalboard/tools/focalboard_delete_user.sh" + [appFocalboardListUsers]="focalboard/tools/focalboard_list_users.sh" + [appFocalboardResetPassword]="focalboard/tools/focalboard_reset_password.sh" + [appFocalboardSetAdmin]="focalboard/scripts/focalboard_set_admin.sh" [appGenerate]="app/app_generate.sh" [appGetKeyData]="app/app_get_key_data.sh" + [appGiteaCreateAccount]="gitea/tools/gitea_create_account.sh" + [appGiteaDeleteUser]="gitea/tools/gitea_delete_user.sh" + [appGiteaListUsers]="gitea/tools/gitea_list_users.sh" + [appGiteaResetPassword]="gitea/tools/gitea_reset_password.sh" + [appGiteaSetAdmin]="gitea/tools/gitea_set_admin.sh" + [appGluetunRecreateRouted]="gluetun/scripts/gluetun_recreate_routed.sh" + [appGluetunRefreshProviders]="gluetun/tools/gluetun_refresh_providers.sh" [appInstallCheckRequirements]="checks/requirements/check_app_install.sh" [appInstallMenu]="menu/menu_app_install.sh" + [appInvidiousCreateAccount]="invidious/tools/invidious_create_account.sh" + [appInvidiousDeleteUser]="invidious/tools/invidious_delete_user.sh" + [appInvidiousListUsers]="invidious/tools/invidious_list_users.sh" + [appInvidiousResetPassword]="invidious/tools/invidious_reset_password.sh" + [appInvidiousSetAdmin]="invidious/scripts/invidious_set_admin.sh" + [appLinkdingCreateAccount]="linkding/tools/linkding_create_account.sh" + [appLinkdingDeleteUser]="linkding/tools/linkding_delete_user.sh" + [appLinkdingListUsers]="linkding/tools/linkding_list_users.sh" + [appLinkdingResetPassword]="linkding/tools/linkding_reset_password.sh" + [appLinkdingSetAdmin]="linkding/tools/linkding_set_admin.sh" + [appNetworkApplyMode_gluetun]="gluetun/scripts/gluetun_network.sh" + [appNetworkRegisterPorts_gluetun]="gluetun/scripts/gluetun_network.sh" + [appNextcloudAddTrustedDomain]="nextcloud/tools/nextcloud_add_trusted_domain.sh" + [appNextcloudCreateAccount]="nextcloud/tools/nextcloud_create_account.sh" + [appNextcloudDeleteUser]="nextcloud/tools/nextcloud_delete_user.sh" + [appNextcloudListUsers]="nextcloud/tools/nextcloud_list_users.sh" + [appNextcloudRescanFiles]="nextcloud/tools/nextcloud_rescan_files.sh" + [appNextcloudResetPassword]="nextcloud/tools/nextcloud_reset_password.sh" + [appNextcloudSetAdmin]="nextcloud/tools/nextcloud_set_admin.sh" + [appNextcloudSystemStatus]="nextcloud/tools/nextcloud_system_status.sh" + [appNextcloudTailLogs]="nextcloud/tools/nextcloud_tail_logs.sh" + [appNextcloudToggleMaintenance]="nextcloud/tools/nextcloud_toggle_maintenance.sh" + [appOwnCloudSetupConfig]="owncloud/scripts/owncloud_setup_config.sh" + [appPiholeApplyDnsUpdater]="pihole/tools/pihole_apply_dns_updater.sh" [_appReqHasDomain]="checks/requirements/check_app_install.sh" [_appReqServiceInstalled]="checks/requirements/check_app_install.sh" [_appReqServiceMsg]="checks/requirements/check_app_install.sh" [appScanAvailable]="app/app_scan_available.sh" + [appSetupComposeTags_gluetun]="gluetun/scripts/gluetun_compose_tags.sh" + [appSetupComposeTags_nextcloud]="nextcloud/scripts/nextcloud_compose_tags.sh" + [appSetupComposeTags_pihole]="pihole/scripts/pihole_compose_tags.sh" + [appSetupComposeTags_searxng]="searxng/scripts/searxng_compose_tags.sh" + [appSetupComposeTags_speedtest]="speedtest/scripts/speedtest_compose_tags.sh" + [appSetupComposeTags_vaultwarden]="vaultwarden/scripts/vaultwarden_compose_tags.sh" + [appSetupComposeTags_wireguard]="wireguard/scripts/wireguard_compose_tags.sh" [appStatus]="app/app_status.sh" + [appTraefikExtraMiddlewares_onlyoffice]="onlyoffice/scripts/onlyoffice_traefik.sh" + [appTraefikResetPassword]="traefik/tools/traefik_reset_password.sh" + [appTraefikSkipsDefaultMiddleware_onlyoffice]="onlyoffice/scripts/onlyoffice_traefik.sh" + [appTraefikSkipsDefaultMiddleware_owncloud]="owncloud/scripts/owncloud_traefik.sh" [appUninstallMenu]="menu/menu_app_uninstall.sh" [appUpdateSpecifics]="app/app_update_specifics.sh" + [appUpdateSpecifics_adguard]="adguard/scripts/adguard_update_specifics.sh" + [appUpdateSpecifics_dashy]="dashy/scripts/dashy_update_specifics.sh" + [appUpdateSpecifics_focalboard]="focalboard/scripts/focalboard_update_specifics.sh" + [appUpdateSpecifics_libreportal]="libreportal/scripts/libreportal_update_specifics.sh" + [appUpdateSpecifics_nextcloud]="nextcloud/scripts/nextcloud_update_specifics.sh" + [appUpdateSpecifics_pihole]="pihole/scripts/pihole_update_specifics.sh" + [appWebuiRefresh_gluetun]="gluetun/scripts/gluetun_providers.sh" [atomicWriteWebUI]="webui/data/utils/webui_atomic_write.sh" + [authAdapter_adguard_setPassword]="adguard/scripts/adguard_auth.sh" + [authAdapter_bookstack_createUser]="bookstack/scripts/bookstack_auth.sh" + [authAdapter_bookstack_deleteUser]="bookstack/scripts/bookstack_auth.sh" + [authAdapter_bookstack_listUsers]="bookstack/scripts/bookstack_auth.sh" + [authAdapter_bookstack_setAdmin]="bookstack/scripts/bookstack_auth.sh" + [authAdapter_bookstack_setPassword]="bookstack/scripts/bookstack_auth.sh" [authAdapterCall]="app/auth_adapter.sh" [authAdapterCanDo]="app/auth_adapter.sh" + [authAdapter_focalboard_createUser]="focalboard/scripts/focalboard_auth.sh" + [authAdapter_focalboard_deleteUser]="focalboard/scripts/focalboard_auth.sh" + [authAdapter_focalboard_listUsers]="focalboard/scripts/focalboard_auth.sh" + [authAdapter_focalboard_setAdmin]="focalboard/scripts/focalboard_auth.sh" + [authAdapter_focalboard_setPassword]="focalboard/scripts/focalboard_auth.sh" + [authAdapter_gitea_createUser]="gitea/scripts/gitea_auth.sh" + [authAdapter_gitea_listUsers]="gitea/scripts/gitea_auth.sh" + [authAdapter_gitea_setPassword]="gitea/scripts/gitea_auth.sh" + [authAdapter_invidious_createUser]="invidious/scripts/invidious_auth.sh" + [authAdapter_invidious_deleteUser]="invidious/scripts/invidious_auth.sh" + [authAdapter_invidious_listUsers]="invidious/scripts/invidious_auth.sh" + [authAdapter_invidious_setAdmin]="invidious/scripts/invidious_auth.sh" + [authAdapter_invidious_setPassword]="invidious/scripts/invidious_auth.sh" + [authAdapter_linkding_createUser]="linkding/scripts/linkding_auth.sh" + [authAdapter_linkding_deleteUser]="linkding/scripts/linkding_auth.sh" + [authAdapter_linkding_listUsers]="linkding/scripts/linkding_auth.sh" + [authAdapter_linkding_setAdmin]="linkding/scripts/linkding_auth.sh" + [authAdapter_linkding_setPassword]="linkding/scripts/linkding_auth.sh" + [authAdapter_nextcloud_createUser]="nextcloud/scripts/nextcloud_auth.sh" + [authAdapter_nextcloud_deleteUser]="nextcloud/scripts/nextcloud_auth.sh" + [authAdapter_nextcloud_listUsers]="nextcloud/scripts/nextcloud_auth.sh" + [authAdapter_nextcloud_setAdmin]="nextcloud/scripts/nextcloud_auth.sh" + [authAdapter_nextcloud_setPassword]="nextcloud/scripts/nextcloud_auth.sh" + [authAdapter_traefik_setPassword]="traefik/scripts/traefik_auth.sh" [authPersistCfg]="app/auth_adapter.sh" [authToolArg]="app/auth_adapter.sh" [backupAllApps]="backup/app/backup_app_all.sh" @@ -73,6 +179,7 @@ declare -gA LP_FN_MAP=( [backupSshKeySet]="backup/locations/location_ssh.sh" [backupSystemConfig]="backup/system/backup_system.sh" [backupVerifySnapshot]="backup/verify/backup_verify.sh" + [_bookstackArtisan]="bookstack/scripts/bookstack_auth.sh" [borgArchiveName]="backup/engine/borg_env.sh" [borgBackupAppToLocation]="backup/engine/borg_backup.sh" [borgBackupSystemToLocation]="backup/engine/borg_backup.sh" @@ -190,6 +297,7 @@ declare -gA LP_FN_MAP=( [crontabSetupSystemInfoUpdater]="crontab/system/crontab_setup_system_info_updater.sh" [crontabSetupTaskProcessor]="crontab/task/crontab_setup_task_processor.sh" [crontabToolsMenu]="menu/tools/manage_crontab.sh" + [crowdsecToggleLibrePortalLogMounts]="crowdsec/scripts/crowdsec_install_host.sh" [dashyToolsMenu]="menu/tools/manage_dashy.sh" [databaseAppScan]="database/app/db_app_scan.sh" [databaseBackupInsert]="database/insert/db_insert_backups.sh" @@ -295,6 +403,8 @@ declare -gA LP_FN_MAP=( [fixConfigPermissions]="function/permission/config.sh" [fixFolderPermissions]="function/permission/libreportal_folders.sh" [fixPermissionsBeforeStart]="function/permission/before_start.sh" + [_focalboardBcrypt]="focalboard/scripts/focalboard_auth.sh" + [_focalboardSqlite]="focalboard/scripts/focalboard_auth.sh" [generateHealthReport]="crontab/task/crontab_check_processor.sh" [generateInstallName]="checks/generate_install_name.sh" [generateRandomPassword]="config/password/password_generate.sh" @@ -306,12 +416,16 @@ declare -gA LP_FN_MAP=( [gitCheckForUpdate]="update/git/checks/update_git_check.sh" [gitCheckGitDetails]="update/git/check_git_details.sh" [gitCleanInstallBackups]="update/backup/install_git_backup.sh" + [_giteaCmd]="gitea/scripts/gitea_auth.sh" [gitFolderResetAndBackup]="update/backup/reset_git_backup.sh" [gitPerformUpdate]="update/backup/reset_git_backup.sh" [gitReset]="update/git/reset_git.sh" [gitUntrackFiles]="update/git/untrack_files.sh" [gitUseExistingBackup]="update/backup/use_git_backup.sh" + [gluetunRouteExistingAppsPrompt]="gluetun/scripts/gluetun_route_apps.sh" [hashPassword]="config/password/password_hash.sh" + [headscaleCommands]="headscale/scripts/headscale_commands.sh" + [headscaleEditConfig]="headscale/scripts/headscale_edit_config.sh" [healthLogError]="crontab/task/crontab_check_processor.sh" [healthLogInfo]="crontab/task/crontab_check_processor.sh" [healthLogSuccess]="crontab/task/crontab_check_processor.sh" @@ -328,8 +442,13 @@ declare -gA LP_FN_MAP=( [hostSshSetPasswordAuth]="ssh/host_access.sh" [hostSshUser]="ssh/host_access.sh" [initializeAppVariables]="network/variables/variables_init_app.sh" + [installAdguard]="adguard/adguard.sh" [installArch]="os/install/arch.sh" + [installAuthelia]="authelia/authelia.sh" + [installBookstack]="bookstack/bookstack.sh" [installCrontab]="crontab/crontab_install.sh" + [installCrowdsec]="crowdsec/crowdsec.sh" + [installDashy]="dashy/dashy.sh" [installDebianUbuntu]="os/install/ubuntu.sh" [installDockerNetwork]="docker/network/network_setup.sh" [installDockerRooted]="docker/install/rooted/rooted_docker.sh" @@ -338,18 +457,46 @@ declare -gA LP_FN_MAP=( [installDockerRootless]="docker/install/rootless/rootless_docker.sh" [installDockerRootlessStartSetup]="docker/install/rootless/rootless_start_setup.sh" [installDockerRootlessUser]="docker/install/rootless/rootless_user.sh" + [installFocalboard]="focalboard/focalboard.sh" + [installGitea]="gitea/gitea.sh" + [installGluetun]="gluetun/gluetun.sh" + [installGrafana]="grafana/grafana.sh" + [installHeadscale]="headscale/headscale.sh" + [installInvidious]="invidious/invidious.sh" + [installIpinfo]="ipinfo/ipinfo.sh" + [installJellyfin]="jellyfin/jellyfin.sh" + [installJitsimeet]="jitsimeet/jitsimeet.sh" + [installLibrePortal]="libreportal/libreportal.sh" [installLibrePortalAppWebUI]="webui/webui_install_app.sh" [installLibrePortalImageWebUI]="webui/webui_install_image.sh" [installLibrePortalWebUITaskService]="webui/webui_install_systemd.sh" + [installLinkding]="linkding/linkding.sh" + [installMastodon]="mastodon/mastodon.sh" + [installMoneyapp]="moneyapp/moneyapp.sh" + [installNextcloud]="nextcloud/nextcloud.sh" + [installOllama]="ollama/ollama.sh" + [installOnlyoffice]="onlyoffice/onlyoffice.sh" [installOptionalMetricsApps]="start/start_recommended.sh" + [installOwncloud]="owncloud/owncloud.sh" + [installPihole]="pihole/pihole.sh" + [installPrometheus]="prometheus/prometheus.sh" [installRecommendedApps]="start/start_recommended.sh" [installResticHost]="install/install_restic.sh" [installResticMigrateLegacyPasswords]="install/install_restic.sh" + [installSearxng]="searxng/searxng.sh" + [installSpeedtest]="speedtest/speedtest.sh" [installSQLiteDatabase]="database/install_sqlite.sh" [installSSLCertificate]="install/install_certificate.sh" [installSwapfile]="install/install_swapfile.sh" + [installTraefik]="traefik/traefik.sh" + [installTrilium]="trilium/trilium.sh" [installUFW]="install/install_ufw.sh" [installUFWDocker]="install/install_ufwd.sh" + [installUnbound]="unbound/unbound.sh" + [installVaultwarden]="vaultwarden/vaultwarden.sh" + [installWireguard]="wireguard/wireguard.sh" + [_invidiousBcrypt]="invidious/scripts/invidious_auth.sh" + [_invidiousPsql]="invidious/scripts/invidious_auth.sh" [invidiousToolsMenu]="menu/tools/manage_invidious.sh" [ipAllocation]="network/ip/ip_allocation.sh" [ipFindAvailable]="network/ip/ip_find_available.sh" @@ -387,6 +534,7 @@ declare -gA LP_FN_MAP=( [kopiaLocationUri]="backup/engine/kopia_env.sh" [kopiaRestoreSnapshot]="backup/engine/kopia_restore.sh" [kopiaSnapshotsJson]="backup/engine/kopia_snapshots.sh" + [_linkdingManage]="linkding/scripts/linkding_auth.sh" [listDockerComposeFiles]="config/docker/docker_list_compose_files.sh" [localDnsAppHosts]="network/dns/setup_local_dns.sh" [localDnsApplyAdguard]="network/dns/setup_local_dns.sh" @@ -450,6 +598,8 @@ declare -gA LP_FN_MAP=( [monitoringIsInstalled]="network/monitoring/monitoring.sh" [monitoringToggleAppConfig]="network/monitoring/monitoring.sh" [moveFile]="function/file/move_file.sh" + [_nextcloudOcc]="nextcloud/scripts/nextcloud_auth.sh" + [_nextcloudOccWithPass]="nextcloud/scripts/nextcloud_auth.sh" [openFifoReader]="crontab/task/crontab_task_processor.sh" [passwordValidation]="function/validation/password.sh" [peerAdd]="peer/peer_add.sh" @@ -522,6 +672,7 @@ declare -gA LP_FN_MAP=( [replaceVAPIDKeys]="config/password/password_replace vapid.sh" [resetToMenu]="menu/menu_reset_to_menu.sh" [resolveDockerInstallUser]="checks/requirements/check_install_type.sh" + [restartCrowdsec]="crowdsec/crowdsec.sh" [resticAllLocationIndices]="backup/engine/restic_env.sh" [resticBackupAppAllLocations]="backup/engine/restic_backup.sh" [resticBackupAppToLocation]="backup/engine/restic_backup.sh" @@ -592,6 +743,14 @@ declare -gA LP_FN_MAP=( [setupCheckDomainPointsHere]="setup/setup_apply.sh" [setupDNSIP]="network/dns/setup_dns_ip.sh" [setupGenerateName]="setup/setup_apply.sh" + [setupHeadscale]="headscale/scripts/headscale_setup.sh" + [setupHeadscaleCheckRemote]="headscale/scripts/headscale_check_remote.sh" + [setupHeadscaleGenerateAuthKey]="headscale/scripts/headscale_generate_auth.sh" + [setupHeadscaleGetHostname]="headscale/scripts/headscale_get_hostname.sh" + [setupHeadscaleLocal]="headscale/scripts/headscale_setup_local.sh" + [setupHeadscaleLocalhost]="headscale/scripts/headscale_setup_localhost.sh" + [setupHeadscaleRemote]="headscale/scripts/headscale_setup_remote.sh" + [setupHeadscaleUser]="headscale/scripts/headscale_user.sh" [setupHeadscaleVariables]="network/variables/headscale_variables.sh" [setupTaskDir]="crontab/task/crontab_task_processor.sh" [setupWizardMarkComplete]="setup/setup_lock.sh" @@ -605,6 +764,7 @@ declare -gA LP_FN_MAP=( [startOther]="start/start_other.sh" [startPreInstall]="start/start_preinstall.sh" [startScan]="start/start_scan.sh" + [stopCrowdsec]="crowdsec/crowdsec.sh" [switchMigrateBackupApps]="docker/type_switcher/swap_docker_type.sh" [switchMigrateRestoreApps]="docker/type_switcher/swap_docker_type.sh" [tagsManagerGetTagContent]="config/tags/manager/tags_manager_content.sh" @@ -624,11 +784,13 @@ declare -gA LP_FN_MAP=( [tagsProcessorStandardReplacements]="config/tags/processors/tags_processor_standard_replacements.sh" [tagsProcessorTraefikControl]="config/tags/processors/tags_processor_traefik_control.sh" [tagsProcessorTrustedDomains]="config/tags/processors/tags_processor_trusted_domains.sh" + [tailscaleInstallToContainer]="headscale/scripts/tailscale_install.sh" [toolArgsGet]="docker/app/functions/function_app_tool.sh" [toolsMenu]="menu/tools/manage_main.sh" [traefikSetupLabelsMiddlewares]="network/traefik/traefik_middlewares.sh" [traefikSetupLoginCredentials]="network/traefik/traefik_login_credentials.sh" [traefikUpdateWhitelist]="network/traefik/traefik_whitelist.sh" + [uninstallCrowdsec]="crowdsec/crowdsec.sh" [uninstallDockerRootless]="docker/install/rootless/rootless_uninstall.sh" [updateAppConfig]="webui/data/generators/apps/webui_app_config.sh" [updateConfigOption]="config/core/config_update_option.sh" @@ -709,43 +871,1010 @@ declare -gA LP_FN_MAP=( [zipFile]="function/file/zip_file.sh" ) -# Files with top-level side effects (variable assignments, source calls, -# command invocations outside any function). Lazy mode MUST source these +# Per-function root selector — "scripts" or "containers". Mirrors +# LP_FN_MAP; used by the loader / debugging tools. +declare -gA LP_FN_ROOT=( + [acquireSingletonLock]="scripts" + [adoptDockerSubnet]="scripts" + [appAdguardApplyDnsUpdater]="containers" + [appAdguardResetPassword]="containers" + [appBookstackCreateAccount]="containers" + [appBookstackDeleteUser]="containers" + [appBookstackListUsers]="containers" + [appBookstackResetPassword]="containers" + [appBookstackSetAdmin]="containers" + [appCrowdSecAlertsList]="containers" + [appCrowdSecConsoleDisable]="containers" + [appCrowdSecConsoleEnroll]="containers" + [appCrowdSecDecisionsList]="containers" + [appCrowdSecFixPriority]="containers" + [appCrowdSecHubUpdate]="containers" + [appCrowdSecMetrics]="containers" + [appCrowdSecStatus]="containers" + [appCrowdSecUnban]="containers" + [appCrowdSecUpdate]="containers" + [appCrowdSecVerifyFirewall]="containers" + [appDashyManageShortcuts]="containers" + [appDashyUpdateConf]="containers" + [appFocalboardCreateAccount]="containers" + [appFocalboardDeleteUser]="containers" + [appFocalboardListUsers]="containers" + [appFocalboardResetPassword]="containers" + [appFocalboardSetAdmin]="containers" + [appGenerate]="scripts" + [appGetKeyData]="scripts" + [appGiteaCreateAccount]="containers" + [appGiteaDeleteUser]="containers" + [appGiteaListUsers]="containers" + [appGiteaResetPassword]="containers" + [appGiteaSetAdmin]="containers" + [appGluetunRecreateRouted]="containers" + [appGluetunRefreshProviders]="containers" + [appInstallCheckRequirements]="scripts" + [appInstallMenu]="scripts" + [appInvidiousCreateAccount]="containers" + [appInvidiousDeleteUser]="containers" + [appInvidiousListUsers]="containers" + [appInvidiousResetPassword]="containers" + [appInvidiousSetAdmin]="containers" + [appLinkdingCreateAccount]="containers" + [appLinkdingDeleteUser]="containers" + [appLinkdingListUsers]="containers" + [appLinkdingResetPassword]="containers" + [appLinkdingSetAdmin]="containers" + [appNetworkApplyMode_gluetun]="containers" + [appNetworkRegisterPorts_gluetun]="containers" + [appNextcloudAddTrustedDomain]="containers" + [appNextcloudCreateAccount]="containers" + [appNextcloudDeleteUser]="containers" + [appNextcloudListUsers]="containers" + [appNextcloudRescanFiles]="containers" + [appNextcloudResetPassword]="containers" + [appNextcloudSetAdmin]="containers" + [appNextcloudSystemStatus]="containers" + [appNextcloudTailLogs]="containers" + [appNextcloudToggleMaintenance]="containers" + [appOwnCloudSetupConfig]="containers" + [appPiholeApplyDnsUpdater]="containers" + [_appReqHasDomain]="scripts" + [_appReqServiceInstalled]="scripts" + [_appReqServiceMsg]="scripts" + [appScanAvailable]="scripts" + [appSetupComposeTags_gluetun]="containers" + [appSetupComposeTags_nextcloud]="containers" + [appSetupComposeTags_pihole]="containers" + [appSetupComposeTags_searxng]="containers" + [appSetupComposeTags_speedtest]="containers" + [appSetupComposeTags_vaultwarden]="containers" + [appSetupComposeTags_wireguard]="containers" + [appStatus]="scripts" + [appTraefikExtraMiddlewares_onlyoffice]="containers" + [appTraefikResetPassword]="containers" + [appTraefikSkipsDefaultMiddleware_onlyoffice]="containers" + [appTraefikSkipsDefaultMiddleware_owncloud]="containers" + [appUninstallMenu]="scripts" + [appUpdateSpecifics]="scripts" + [appUpdateSpecifics_adguard]="containers" + [appUpdateSpecifics_dashy]="containers" + [appUpdateSpecifics_focalboard]="containers" + [appUpdateSpecifics_libreportal]="containers" + [appUpdateSpecifics_nextcloud]="containers" + [appUpdateSpecifics_pihole]="containers" + [appWebuiRefresh_gluetun]="containers" + [atomicWriteWebUI]="scripts" + [authAdapter_adguard_setPassword]="containers" + [authAdapter_bookstack_createUser]="containers" + [authAdapter_bookstack_deleteUser]="containers" + [authAdapter_bookstack_listUsers]="containers" + [authAdapter_bookstack_setAdmin]="containers" + [authAdapter_bookstack_setPassword]="containers" + [authAdapterCall]="scripts" + [authAdapterCanDo]="scripts" + [authAdapter_focalboard_createUser]="containers" + [authAdapter_focalboard_deleteUser]="containers" + [authAdapter_focalboard_listUsers]="containers" + [authAdapter_focalboard_setAdmin]="containers" + [authAdapter_focalboard_setPassword]="containers" + [authAdapter_gitea_createUser]="containers" + [authAdapter_gitea_listUsers]="containers" + [authAdapter_gitea_setPassword]="containers" + [authAdapter_invidious_createUser]="containers" + [authAdapter_invidious_deleteUser]="containers" + [authAdapter_invidious_listUsers]="containers" + [authAdapter_invidious_setAdmin]="containers" + [authAdapter_invidious_setPassword]="containers" + [authAdapter_linkding_createUser]="containers" + [authAdapter_linkding_deleteUser]="containers" + [authAdapter_linkding_listUsers]="containers" + [authAdapter_linkding_setAdmin]="containers" + [authAdapter_linkding_setPassword]="containers" + [authAdapter_nextcloud_createUser]="containers" + [authAdapter_nextcloud_deleteUser]="containers" + [authAdapter_nextcloud_listUsers]="containers" + [authAdapter_nextcloud_setAdmin]="containers" + [authAdapter_nextcloud_setPassword]="containers" + [authAdapter_traefik_setPassword]="containers" + [authPersistCfg]="scripts" + [authToolArg]="scripts" + [backupAllApps]="scripts" + [backupAppDeleteAll]="scripts" + [backupAppDeleteSnapshot]="scripts" + [backupAppIsLiveSafe]="scripts" + [backupAppLiveCapable]="scripts" + [backupAppRunHook]="scripts" + [backupAppSchedule]="scripts" + [backupAppStart]="scripts" + [backupAppStrategyOptions]="scripts" + [backupContainerFilesRestore]="scripts" + [backupContainerFilesToTemp]="scripts" + [backupDbDescriptors]="scripts" + [backupDbDump]="scripts" + [_backupDbDumpName]="scripts" + [backupDbExcludePaths]="scripts" + [backupDbHasDescriptors]="scripts" + [_backupDbImport]="scripts" + [_backupDbWaitReady]="scripts" + [backupFilesCapture]="scripts" + [backupFilesDescriptors]="scripts" + [backupFilesExcludePaths]="scripts" + [backupFilesHasDescriptors]="scripts" + [backupLocationConfig]="scripts" + [backupLocationDir]="scripts" + [backupLocationEnsureDir]="scripts" + [backupLocationKopiaConfig]="scripts" + [backupLocationLocalGuard]="scripts" + [backupLocationOwner]="scripts" + [backupLocationResolvedPath]="scripts" + [backupLocationsDir]="scripts" + [backupLocationsMigrate]="scripts" + [backupLocationSshKey]="scripts" + [backupResolveStrategy]="scripts" + [backupRestoreSystemConfig]="scripts" + [backupSchedule]="scripts" + [backupScheduleEnabledApps]="scripts" + [backupSshCommand]="scripts" + [backupSshKeyDelete]="scripts" + [backupSshKeyExists]="scripts" + [backupSshKeyFile]="scripts" + [backupSshKeyGenerate]="scripts" + [backupSshKeyPublic]="scripts" + [backupSshKeyRefreshUi]="scripts" + [backupSshKeySet]="scripts" + [backupSystemConfig]="scripts" + [backupVerifySnapshot]="scripts" + [_bookstackArtisan]="containers" + [borgArchiveName]="scripts" + [borgBackupAppToLocation]="scripts" + [borgBackupSystemToLocation]="scripts" + [borgCheckLocation]="scripts" + [borgDumpFile]="scripts" + [borgEnsureLocationReady]="scripts" + [borgEnvExport]="scripts" + [borgEnvUnset]="scripts" + [borgForgetApp]="scripts" + [borgForgetSystem]="scripts" + [borgInitLocation]="scripts" + [borgInstall]="scripts" + [borgLocationStats]="scripts" + [borgLocationUri]="scripts" + [borgRestoreSnapshot]="scripts" + [borgRestoreSystemLatest]="scripts" + [borgSnapshotsJson]="scripts" + [changeRootOwnedFile]="scripts" + [changeUserGroupOnFolder]="scripts" + [checkApplicationsConfigFilesMissingVariables]="scripts" + [checkCommandRequirement]="scripts" + [checkConfigFilesMissingFiles]="scripts" + [checkConfigFilesMissingVariables]="scripts" + [checkConfigFirstInstall]="scripts" + [checkConfigRequirement]="scripts" + [checkCrontabRequirement]="scripts" + [checkDatabaseRequirement]="scripts" + [checkDockerComposeRequirement]="scripts" + [checkDockerNetworkRequirement]="scripts" + [checkDockerRequirement]="scripts" + [checkDockerRootlessRequirement]="scripts" + [checkDockerSwitcherRequirement]="scripts" + [checkIfOSUpdateShouldRun]="scripts" + [checkInstallTypeRequirement]="scripts" + [checkLibrePortalConfigFilesMissingVariables]="scripts" + [checkLibrePortalWebUIAppRequirement]="scripts" + [checkLibrePortalWebUIImageRequirement]="scripts" + [checkPasswordsRequirement]="scripts" + [checkRequirements]="scripts" + [checkRootRequirement]="scripts" + [checkSSLCertsRequirement]="scripts" + [checkSuccess]="scripts" + [checkSuggestInstallsRequirement]="scripts" + [checkSwapfileRequirement]="scripts" + [check_task_processor_health]="scripts" + [checkTraefikRequirement]="scripts" + [checkUFWDRequirement]="scripts" + [checkUFWRequirement]="scripts" + [checkUpdates]="scripts" + [checkWebUISystemdRequirement]="scripts" + [cleanupZeroByteFiles]="scripts" + [cliAppRestore]="scripts" + [cliAppToolList]="scripts" + [cliDebugLoadTrace]="scripts" + [cliFirewallHeader]="scripts" + [cliHandleAppCommands]="scripts" + [cliHandleBackupCommands]="scripts" + [cliHandleConfigCommands]="scripts" + [cliHandleDebugCommands]="scripts" + [cliHandleDockertypeCommands]="scripts" + [cliHandleFirewallCommands]="scripts" + [cliHandleHelpCommands]="scripts" + [cliHandleInstallCommands]="scripts" + [cliHandleIPCommands]="scripts" + [cliHandlePeerCommands]="scripts" + [cliHandleRegenCommands]="scripts" + [cliHandleResetCommands]="scripts" + [cliHandleRestoreCommands]="scripts" + [cliHandleSetupCommands]="scripts" + [cliHandleSshCommands]="scripts" + [cliHandleSystemCommands]="scripts" + [cliHandleUpdateCommands]="scripts" + [cliHandleValidationCommands]="scripts" + [cliHandleWebuiCommands]="scripts" + [cliInitialize]="scripts" + [cliShowAppHelp]="scripts" + [cliShowBackupHelp]="scripts" + [cliShowConfigHelp]="scripts" + [cliShowDebugHelp]="scripts" + [cliShowDockertypeHelp]="scripts" + [cliShowHelpHelp]="scripts" + [cliShowInstallHelp]="scripts" + [cliShowIPHelp]="scripts" + [cliShowPeerHelp]="scripts" + [cliShowRegenHelp]="scripts" + [cliShowResetHelp]="scripts" + [cliShowRestoreHelp]="scripts" + [cliShowSetupHelp]="scripts" + [cliShowSshHelp]="scripts" + [cliShowSystemHelp]="scripts" + [cliShowUpdateHelp]="scripts" + [cliShowValidationHelp]="scripts" + [cliShowWebuiHelp]="scripts" + [cliUpdateCommands]="scripts" + [cliWebuiLoginReset]="scripts" + [completeMessage]="scripts" + [configSetupFileWithData]="scripts" + [configUpdateBatch]="scripts" + [containsElement]="scripts" + [copyFile]="scripts" + [copyFiles]="scripts" + [copyFolder]="scripts" + [copyFolders]="scripts" + [copyResource]="scripts" + [createFolders]="scripts" + [createSuccessfulRunFile]="scripts" + [createTaskFile]="scripts" + [createTouch]="scripts" + [crontabClean]="scripts" + [crontabClear]="scripts" + [crontabRefresh]="scripts" + [crontabSetup]="scripts" + [crontabSetupBackupScheduler]="scripts" + [crontabSetupCheckProcessor]="scripts" + [crontabSetupSystemInfoUpdater]="scripts" + [crontabSetupTaskProcessor]="scripts" + [crontabToolsMenu]="scripts" + [crowdsecToggleLibrePortalLogMounts]="containers" + [dashyToolsMenu]="scripts" + [databaseAppScan]="scripts" + [databaseBackupInsert]="scripts" + [databaseCreateTables]="scripts" + [databaseCycleThroughListApps]="scripts" + [databaseDisplayTables]="scripts" + [databaseEmptyTable]="scripts" + [databaseInstallApp]="scripts" + [databaseListAllApps]="scripts" + [databaseListInstalledApp]="scripts" + [databaseListInstalledApps]="scripts" + [databaseOptionInsert]="scripts" + [databasePortOpenInsert]="scripts" + [databasePortUsedInsert]="scripts" + [databaseRemoveFile]="scripts" + [databaseRestoreInsert]="scripts" + [databaseUninstallApp]="scripts" + [detectOS]="scripts" + [dispatchPending]="scripts" + [dispatchSpecific]="scripts" + [dockerAppRunTool]="scripts" + [dockerCheckAppHealthDetails]="scripts" + [dockerCheckAppHealthStatus]="scripts" + [dockerCheckAppInstalled]="scripts" + [dockerCheckContainerHealth]="scripts" + [dockerCheckContainerHealthLoop]="scripts" + [dockerCheckIsRunningForUser]="scripts" + [dockerCommandRun]="scripts" + [dockerCommandRunInstallUser]="scripts" + [dockerComposeDown]="scripts" + [dockerComposeDownAllApps]="scripts" + [dockerComposeDownRemove]="scripts" + [dockerComposeRestart]="scripts" + [dockerComposeRestartAfterUpdate]="scripts" + [dockerComposeSetupFile]="scripts" + [dockerComposeUp]="scripts" + [dockerComposeUpAllApps]="scripts" + [dockerComposeUpdate]="scripts" + [dockerComposeUpdateAndStartApp]="scripts" + [dockerConfigSetupFileWithData]="scripts" + [dockerConfigSetupToContainer]="scripts" + [dockerContainerOwner]="scripts" + [dockerCopyBuildContext]="scripts" + [dockerDeleteData]="scripts" + [dockerInstallApp]="scripts" + [dockerPruneAppNetworks]="scripts" + [dockerRemoveApp]="scripts" + [dockerRemoveAppImages]="scripts" + [dockerRestartApp]="scripts" + [dockerRestartAppViaInstall]="scripts" + [dockerServiceStart]="scripts" + [dockerServiceStop]="scripts" + [dockerSetupEnvFile]="scripts" + [dockerStartAllApps]="scripts" + [dockerStartApp]="scripts" + [dockerStopAllApps]="scripts" + [dockerStopApp]="scripts" + [dockerSwitcherScanContainersForSocket]="scripts" + [dockerSwitcherSetSocketPermissions]="scripts" + [dockerSwitcherSwap]="scripts" + [dockerSwitcherUpdateContainersToDockerType]="scripts" + [dockerToolsMenu]="scripts" + [dockerUninstallApp]="scripts" + [editAppConfig]="scripts" + [emailValidation]="scripts" + [endStart]="scripts" + [engineBackupApp]="scripts" + [engineBackupSystem]="scripts" + [engineCheckAllLocations]="scripts" + [engineCheckLocation]="scripts" + [engineDispatch]="scripts" + [engineDumpFile]="scripts" + [engineEnsureAllLocationsReady]="scripts" + [engineEnsureLocationReady]="scripts" + [engineEnvExport]="scripts" + [engineEnvUnset]="scripts" + [engineForgetApp]="scripts" + [engineForgetAppAllLocations]="scripts" + [engineForgetSystem]="scripts" + [engineForLocation]="scripts" + [engineInitAllLocations]="scripts" + [engineInitLocation]="scripts" + [engineInstallAll]="scripts" + [engineKnownIds]="scripts" + [engineLocationStats]="scripts" + [engineLocationUri]="scripts" + [enginePasswordEnsure]="scripts" + [engineRestoreSnapshot]="scripts" + [engineRestoreSystemLatest]="scripts" + [engineSnapshotLatestId]="scripts" + [engineSnapshotListFiles]="scripts" + [engineSnapshotsJson]="scripts" + [engineSystemSnapshotsJson]="scripts" + [exitScript]="scripts" + [exportBcryptPassword]="scripts" + [fileHasEmptyLine]="scripts" + [findConfigFileForOption]="scripts" + [firewallClearLibrePortalRules]="scripts" + [firewallInitialSetup]="scripts" + [firewallRebuildFromDatabase]="scripts" + [firewallRefreshAll]="scripts" + [fixAppFolderPermissions]="scripts" + [fixConfigPermissions]="scripts" + [fixFolderPermissions]="scripts" + [fixPermissionsBeforeStart]="scripts" + [_focalboardBcrypt]="containers" + [_focalboardSqlite]="containers" + [generateHealthReport]="scripts" + [generateInstallName]="scripts" + [generateRandomPassword]="scripts" + [generateRandomUsername]="scripts" + [getConfigOptionData]="scripts" + [getLibrePortalWebUIUrls]="scripts" + [getStoredPassword]="scripts" + [gitCheckConfigs]="scripts" + [gitCheckForUpdate]="scripts" + [gitCheckGitDetails]="scripts" + [gitCleanInstallBackups]="scripts" + [_giteaCmd]="containers" + [gitFolderResetAndBackup]="scripts" + [gitPerformUpdate]="scripts" + [gitReset]="scripts" + [gitUntrackFiles]="scripts" + [gitUseExistingBackup]="scripts" + [gluetunRouteExistingAppsPrompt]="containers" + [hashPassword]="scripts" + [headscaleCommands]="containers" + [headscaleEditConfig]="containers" + [healthLogError]="scripts" + [healthLogInfo]="scripts" + [healthLogSuccess]="scripts" + [healthLogWarning]="scripts" + [hostAppInstall]="scripts" + [hostSshAuthKeysFile]="scripts" + [hostSshEnsureDir]="scripts" + [hostSshHome]="scripts" + [hostSshKeyAdd]="scripts" + [hostSshKeyCount]="scripts" + [hostSshKeyRemove]="scripts" + [hostSshPasswordAuthEnabled]="scripts" + [hostSshRefreshUi]="scripts" + [hostSshSetPasswordAuth]="scripts" + [hostSshUser]="scripts" + [initializeAppVariables]="scripts" + [installAdguard]="containers" + [installArch]="scripts" + [installAuthelia]="containers" + [installBookstack]="containers" + [installCrontab]="scripts" + [installCrowdsec]="containers" + [installDashy]="containers" + [installDebianUbuntu]="scripts" + [installDockerNetwork]="scripts" + [installDockerRooted]="scripts" + [installDockerRootedCheck]="scripts" + [installDockerRootedCompose]="scripts" + [installDockerRootless]="scripts" + [installDockerRootlessStartSetup]="scripts" + [installDockerRootlessUser]="scripts" + [installFocalboard]="containers" + [installGitea]="containers" + [installGluetun]="containers" + [installGrafana]="containers" + [installHeadscale]="containers" + [installInvidious]="containers" + [installIpinfo]="containers" + [installJellyfin]="containers" + [installJitsimeet]="containers" + [installLibrePortal]="containers" + [installLibrePortalAppWebUI]="scripts" + [installLibrePortalImageWebUI]="scripts" + [installLibrePortalWebUITaskService]="scripts" + [installLinkding]="containers" + [installMastodon]="containers" + [installMoneyapp]="containers" + [installNextcloud]="containers" + [installOllama]="containers" + [installOnlyoffice]="containers" + [installOptionalMetricsApps]="scripts" + [installOwncloud]="containers" + [installPihole]="containers" + [installPrometheus]="containers" + [installRecommendedApps]="scripts" + [installResticHost]="scripts" + [installResticMigrateLegacyPasswords]="scripts" + [installSearxng]="containers" + [installSpeedtest]="containers" + [installSQLiteDatabase]="scripts" + [installSSLCertificate]="scripts" + [installSwapfile]="scripts" + [installTraefik]="containers" + [installTrilium]="containers" + [installUFW]="scripts" + [installUFWDocker]="scripts" + [installUnbound]="containers" + [installVaultwarden]="containers" + [installWireguard]="containers" + [_invidiousBcrypt]="containers" + [_invidiousPsql]="containers" + [invidiousToolsMenu]="scripts" + [ipAllocation]="scripts" + [ipFindAvailable]="scripts" + [ipIsAvailable]="scripts" + [ipRemoveFromDatabase]="scripts" + [ip_scan_all_network_services]="scripts" + [ip_scan_network_conflicts]="scripts" + [ip_scan_network_health]="scripts" + [ip_scan_traefik_services]="scripts" + [ip_show_allocations]="scripts" + [ipUpdateComposeTags]="scripts" + [isError]="scripts" + [isFatalError]="scripts" + [isFatalErrorExit]="scripts" + [isHeader]="scripts" + [isNotice]="scripts" + [isOption]="scripts" + [isOptionMenu]="scripts" + [isQuestion]="scripts" + [isSetupWizardComplete]="scripts" + [isSuccessful]="scripts" + [kopiaBackupAppToLocation]="scripts" + [kopiaBackupSystemToLocation]="scripts" + [kopiaCheckLocation]="scripts" + [kopiaConfigPath]="scripts" + [kopiaDumpFile]="scripts" + [kopiaEnsureLocationReady]="scripts" + [kopiaEnvExport]="scripts" + [kopiaEnvUnset]="scripts" + [kopiaForgetApp]="scripts" + [kopiaForgetSystem]="scripts" + [kopiaInitLocation]="scripts" + [kopiaInstall]="scripts" + [kopiaLocationStats]="scripts" + [kopiaLocationUri]="scripts" + [kopiaRestoreSnapshot]="scripts" + [kopiaSnapshotsJson]="scripts" + [_linkdingManage]="containers" + [listDockerComposeFiles]="scripts" + [localDnsAppHosts]="scripts" + [localDnsApplyAdguard]="scripts" + [localDnsApplyPihole]="scripts" + [localDnsDomains]="scripts" + [localDnsServerIp]="scripts" + [locationAdd]="scripts" + [locationRemove]="scripts" + [logDebug]="scripts" + [logError]="scripts" + [logInfo]="scripts" + [_lpDownload]="scripts" + [lpFetchRelease]="scripts" + [lpFetchSource]="scripts" + [_lpFetchTool]="scripts" + [lpInstalledFootprintVersion]="scripts" + [_lpJsonNum]="scripts" + [_lpJsonStr]="scripts" + [lpRegen]="scripts" + [lpRegenArrays]="scripts" + [_lpRegenStale]="scripts" + [lpRegenWebui]="scripts" + [lpReleaseBaseUrl]="scripts" + [lpReleaseChannel]="scripts" + [lpReleaseLatestFootprint]="scripts" + [lpReleaseLatestVersion]="scripts" + [_lpSha256]="scripts" + [lpVersionGt]="scripts" + [mainLoop]="scripts" + [mainMenu]="scripts" + [manifestCollect]="scripts" + [manifestReadField]="scripts" + [manifestReadFromSnapshot]="scripts" + [manifestRemove]="scripts" + [manifestWrite]="scripts" + [mattermostToolsMenu]="scripts" + [maybeRegenPoll]="scripts" + [menuContinue]="scripts" + [menuLoginRequired]="scripts" + [menuShowFinalMessages]="scripts" + [_metricsReadCpu]="scripts" + [migrateApp]="scripts" + [migrateApplyApp]="scripts" + [migrateApplySystem]="scripts" + [migrateApplyUrlRewrite]="scripts" + [migrateDiscoverAppDetail]="scripts" + [migrateDiscoverApps]="scripts" + [migrateDiscoverAppsForHost]="scripts" + [migrateDiscoverHosts]="scripts" + [migrateEmit]="scripts" + [_migrateParseOpts]="scripts" + [migratePreBackupDestination]="scripts" + [migratePreflight]="scripts" + [_migratePreflightAppend]="scripts" + [_migrateResolveLocation]="scripts" + [migrateRunHook]="scripts" + [migrateSystem]="scripts" + [migrateUrlRewriteEnabled]="scripts" + [monitoringAppEnabled]="scripts" + [monitoringInstalledApps]="scripts" + [monitoringIsInstalled]="scripts" + [monitoringToggleAppConfig]="scripts" + [moveFile]="scripts" + [_nextcloudOcc]="containers" + [_nextcloudOccWithPass]="containers" + [openFifoReader]="scripts" + [passwordValidation]="scripts" + [peerAdd]="scripts" + [peerCheckAll]="scripts" + [peerCheckReachable]="scripts" + [_peerDb]="scripts" + [_peerEnvPath]="scripts" + [peerExec]="scripts" + [peerGet]="scripts" + [peerInstallShell]="scripts" + [_peerKeyDir]="scripts" + [peerKeyEnsure]="scripts" + [peerKeyFingerprint]="scripts" + [_peerKeyPrivPath]="scripts" + [peerKeyPublic]="scripts" + [_peerKeyPubPath]="scripts" + [peerList]="scripts" + [peerListAppsRemote]="scripts" + [peerNameForHostname]="scripts" + [peerPairingAccept]="scripts" + [_peerPairingJsonNum]="scripts" + [_peerPairingJsonStr]="scripts" + [peerPairingParse]="scripts" + [peerPairingToken]="scripts" + [peerPing]="scripts" + [peerPullApp]="scripts" + [peerRemove]="scripts" + [_peerShellPath]="scripts" + [_peerShellSrc]="scripts" + [peerSqlEscape]="scripts" + [_peerSshOpts]="scripts" + [_peerSshTarget]="scripts" + [peerValidateKind]="scripts" + [peerValidateName]="scripts" + [performMaintenance]="scripts" + [portAllocate]="scripts" + [portFindNextAvailablePort]="scripts" + [portGetPublicPorts]="scripts" + [portGetServicePorts]="scripts" + [portGetServicePortsOnly]="scripts" + [portIsReservedHostPort]="scripts" + [portLookupExisting]="scripts" + [port_show_all_network_services]="scripts" + [port_show_network_service]="scripts" + [port_show_network_services_by_app]="scripts" + [port_show_network_services_by_category]="scripts" + [port_show_network_statistics]="scripts" + [portsRemoveFromDatabase]="scripts" + [portStoreMapping]="scripts" + [portUpdateComposeTags]="scripts" + [processBcryptPassword]="scripts" + [readTaskField]="scripts" + [reconcileConfigFile]="scripts" + [reconcileContainersTopOwnership]="scripts" + [reconcileDockerOwnership]="scripts" + [reconcileWebuiDirOwnership]="scripts" + [recoverOrphans]="scripts" + [removeEmptyLineAtFileEnd]="scripts" + [repairDirectoryStructure]="scripts" + [repairFileSystem]="scripts" + [repairPermissions]="scripts" + [repairSystemIssues]="scripts" + [repairSystemService]="scripts" + [repairTaskSystem]="scripts" + [replaceBcryptPasswords]="scripts" + [replaceHexKeys]="scripts" + [replaceLaravelAppKeys]="scripts" + [replacePlainPasswords]="scripts" + [replaceRandomUsernames]="scripts" + [replaceVAPIDKeys]="scripts" + [resetToMenu]="scripts" + [resolveDockerInstallUser]="scripts" + [restartCrowdsec]="containers" + [resticAllLocationIndices]="scripts" + [resticBackupAppAllLocations]="scripts" + [resticBackupAppToLocation]="scripts" + [resticBackupSystemToLocation]="scripts" + [resticCheckAllLocations]="scripts" + [resticCheckLocation]="scripts" + [resticDumpFile]="scripts" + [resticEnabledLocations]="scripts" + [resticEnsureAllLocationsReady]="scripts" + [resticEnsureLocationReady]="scripts" + [resticEnvExport]="scripts" + [resticEnvUnset]="scripts" + [resticForgetApp]="scripts" + [resticForgetAppAllLocations]="scripts" + [resticForgetSystem]="scripts" + [resticInitAllLocations]="scripts" + [resticInitLocation]="scripts" + [resticInstall]="scripts" + [resticLocationAppendOnly]="scripts" + [resticLocationEnabled]="scripts" + [resticLocationField]="scripts" + [resticLocationName]="scripts" + [resticLocationPassword]="scripts" + [resticLocationStats]="scripts" + [resticLocationType]="scripts" + [resticLocationUri]="scripts" + [resticNextFreeIndex]="scripts" + [resticRestoreAppLatest]="scripts" + [resticRestoreSnapshot]="scripts" + [resticRestoreSystemLatest]="scripts" + [resticRetentionFor]="scripts" + [resticSnapshotLatestId]="scripts" + [resticSnapshotListFiles]="scripts" + [resticSnapshotsJson]="scripts" + [resticSystemSnapshotsJson]="scripts" + [restoreAppRunHook]="scripts" + [restoreAppStart]="scripts" + [restoreDbRehydratePreStart]="scripts" + [restoreDbReplayPostStart]="scripts" + [restoreFilesRehydratePreStart]="scripts" + [restoreFirstRunBulk]="scripts" + [restoreFirstRunDiscover]="scripts" + [restorePickSnapshot]="scripts" + [runAppCfg]="scripts" + [runAsManager]="scripts" + [runBackupOp]="scripts" + [runBinInstall]="scripts" + [runFileOp]="scripts" + [runFileWrite]="scripts" + [runInstallOp]="scripts" + [runInstallWrite]="scripts" + [runOwnership]="scripts" + [runReinstall]="scripts" + [runResolv]="scripts" + [_runRootHelper]="scripts" + [runSocket]="scripts" + [runSshAccess]="scripts" + [runSvc]="scripts" + [runSystem]="scripts" + [runTask]="scripts" + [run_task_processor]="scripts" + [scanConfigsForRandomPassword]="scripts" + [scanFileForRandomPasswordKeysUsers]="scripts" + [setupApply]="scripts" + [setupApplyConfig]="scripts" + [setupApplyFinalize]="scripts" + [setupBasicScanVariables]="scripts" + [setupCheckDomainPointsHere]="scripts" + [setupDNSIP]="scripts" + [setupGenerateName]="scripts" + [setupHeadscale]="containers" + [setupHeadscaleCheckRemote]="containers" + [setupHeadscaleGenerateAuthKey]="containers" + [setupHeadscaleGetHostname]="containers" + [setupHeadscaleLocal]="containers" + [setupHeadscaleLocalhost]="containers" + [setupHeadscaleRemote]="containers" + [setupHeadscaleUser]="containers" + [setupHeadscaleVariables]="scripts" + [setupTaskDir]="scripts" + [setupWizardMarkComplete]="scripts" + [setupWizardReset]="scripts" + [setupWizardTerminal]="scripts" + [showInstructions]="scripts" + [sourceBackupLocations]="scripts" + [sshRemote]="scripts" + [startInstall]="scripts" + [startLoad]="scripts" + [startOther]="scripts" + [startPreInstall]="scripts" + [startScan]="scripts" + [stopCrowdsec]="containers" + [switchMigrateBackupApps]="scripts" + [switchMigrateRestoreApps]="scripts" + [tagsManagerGetTagContent]="scripts" + [tagsManagerGetTagState]="scripts" + [tagsManagerUpdateUniversalTag]="scripts" + [tagsProcessorAppConfigValues]="scripts" + [tagsProcessorAppUrl]="scripts" + [tagsProcessorDockerInstallation]="scripts" + [tagsProcessorHealthcheck]="scripts" + [tagsProcessorPasswordAndKeyGeneration]="scripts" + [tagsProcessorPortMiddlewares]="scripts" + [tagsProcessorPortRouterBlocks]="scripts" + [tagsProcessorPortSubdomains]="scripts" + [tagsProcessorRandomUserGeneration]="scripts" + [tagsProcessorSocketConfiguration]="scripts" + [tagsProcessorSpeedtestPass]="scripts" + [tagsProcessorStandardReplacements]="scripts" + [tagsProcessorTraefikControl]="scripts" + [tagsProcessorTrustedDomains]="scripts" + [tailscaleInstallToContainer]="containers" + [toolArgsGet]="scripts" + [toolsMenu]="scripts" + [traefikSetupLabelsMiddlewares]="scripts" + [traefikSetupLoginCredentials]="scripts" + [traefikUpdateWhitelist]="scripts" + [uninstallCrowdsec]="containers" + [uninstallDockerRootless]="scripts" + [updateAppConfig]="scripts" + [updateConfigOption]="scripts" + [updateDNS]="scripts" + [updateDockerInstallPassword]="scripts" + [updateDockerNetworkSubnet]="scripts" + [updateDockerSudoPassword]="scripts" + [updateFileOwnership]="scripts" + [updateHostIPToWhitelist]="scripts" + [updateTaskFields]="scripts" + [userExists]="scripts" + [validateContainerHealth]="scripts" + [validateDirectoryStructure]="scripts" + [validateDiskSpace]="scripts" + [validateDockerService]="scripts" + [validateFileSystem]="scripts" + [validateLibrePortalInstallation]="scripts" + [validateLogHealth]="scripts" + [validatePermissions]="scripts" + [validateSystemHealth]="scripts" + [validateSystemService]="scripts" + [validateTaskSystem]="scripts" + [validateWebUIReadiness]="scripts" + [viewAppCategoryConfigs]="scripts" + [viewAppConfigs]="scripts" + [viewComposeFiles]="scripts" + [viewConfigs]="scripts" + [viewLibrePortalConfigs]="scripts" + [viewLogs]="scripts" + [viewLogsAppMenu]="scripts" + [webuiCheckUpdateLock]="scripts" + [webuiContainerSetup]="scripts" + [webuiCreateAppFieldMappings]="scripts" + [webuiCreateAppsCategories]="scripts" + [webuiCreateAppsConfigCategories]="scripts" + [webuiCreateCategories]="scripts" + [webuiCreateLogsFolders]="scripts" + [webuiCreateUpdateLock]="scripts" + [webuiDisplayLogins]="scripts" + [webuiEnsureTaskFiles]="scripts" + [webuiGenerateAppLogs]="scripts" + [webuiGenerateAppsServicesConfig]="scripts" + [webuiGenerateAppsToolsConfig]="scripts" + [webuiGenerateBackupAppStatus]="scripts" + [webuiGenerateBackupDashboard]="scripts" + [webuiGenerateBackupEngines]="scripts" + [webuiGenerateBackupLocations]="scripts" + [webuiGenerateBackupMigrate]="scripts" + [webuiGenerateBackupPasswords]="scripts" + [webuiGenerateBackupSchema]="scripts" + [webuiGenerateBackupSnapshots]="scripts" + [webuiGenerateLibrePortalConfig]="scripts" + [webuiGeneratePeers]="scripts" + [webuiGenerateSshAccess]="scripts" + [webuiGenerateSystemConfigs]="scripts" + [webuiLibrePortalUpdate]="scripts" + [webuiPatchAppConfigJson]="scripts" + [webuiPrintInstallCard]="scripts" + [webuiPrintLoginBlock]="scripts" + [_webuiReadServiceTags]="scripts" + [webuiRemoveSetupLock]="scripts" + [webuiRemoveUpdateLock]="scripts" + [webuiRunUpdate]="scripts" + [webuiSetConfigOptions]="scripts" + [webuiSyncAppIcon]="scripts" + [webuiSyncAppIcons]="scripts" + [webuiSystemDisk]="scripts" + [webuiSystemInfo]="scripts" + [webuiSystemMemory]="scripts" + [webuiSystemUpdate]="scripts" + [webuiSystemUpdateCheck]="scripts" + [webuiUpdateAppLog]="scripts" + [webuiUpdateAppStatus]="scripts" + [webuiUpdateSystemConfig]="scripts" + [webuiValidateConfigValue]="scripts" + [whitelistPortUpdater]="scripts" + [writeAtomic]="scripts" + [zipFile]="scripts" +) + +# Files with top-level side effects. Lazy mode MUST source these # unconditionally — deferring them would skip the side effect, not just -# defer a function definition. +# defer a function definition. Stored as ":" so the +# loader picks the right base dir; existing entries without a prefix +# (pre-Phase-5 manifests) default to scripts/. LP_EAGER_FILES=( - "backup/db/backup_db.sh" - "backup/files/backup_files.sh" - "cli/commands/debug/cli_debug_commands.sh" - "crontab/task/crontab_check_processor.sh" - "crontab/task/crontab_task_processor.sh" - "docker/type_switcher/swap_docker_type.sh" - "migrate/migrate_url_rewrite.sh" - "setup/setup_lock.sh" + "scripts:backup/db/backup_db.sh" + "scripts:backup/files/backup_files.sh" + "scripts:cli/commands/debug/cli_debug_commands.sh" + "scripts:crontab/task/crontab_check_processor.sh" + "scripts:crontab/task/crontab_task_processor.sh" + "scripts:docker/type_switcher/swap_docker_type.sh" + "containers:gluetun/scripts/gluetun_providers.sh" + "scripts:migrate/migrate_url_rewrite.sh" + "scripts:setup/setup_lock.sh" ) # Autoload stubs — one per public function. First call sources the # real file (which redefines this stub with the real body), then # re-invokes. Sourced inline instead of eval-in-loop because bash -# parses one large file faster than it evals 700 small snippets. -# Only emitted when the manifest is read; behaviour-neutral when the -# loader does not flip into LP_LAZY=1 mode. +# parses one large file faster than it evals snippets at startup. acquireSingletonLock() { source "${install_scripts_dir}crontab/task/crontab_task_processor.sh"; acquireSingletonLock "$@"; } adoptDockerSubnet() { source "${install_scripts_dir}checks/requirements/check_docker_network.sh"; adoptDockerSubnet "$@"; } +appAdguardApplyDnsUpdater() { source "${install_containers_dir}adguard/tools/adguard_apply_dns_updater.sh"; appAdguardApplyDnsUpdater "$@"; } +appAdguardResetPassword() { source "${install_containers_dir}adguard/tools/adguard_reset_password.sh"; appAdguardResetPassword "$@"; } +appBookstackCreateAccount() { source "${install_containers_dir}bookstack/tools/bookstack_create_account.sh"; appBookstackCreateAccount "$@"; } +appBookstackDeleteUser() { source "${install_containers_dir}bookstack/tools/bookstack_delete_user.sh"; appBookstackDeleteUser "$@"; } +appBookstackListUsers() { source "${install_containers_dir}bookstack/tools/bookstack_list_users.sh"; appBookstackListUsers "$@"; } +appBookstackResetPassword() { source "${install_containers_dir}bookstack/tools/bookstack_reset_password.sh"; appBookstackResetPassword "$@"; } +appBookstackSetAdmin() { source "${install_containers_dir}bookstack/tools/bookstack_set_admin.sh"; appBookstackSetAdmin "$@"; } +appCrowdSecAlertsList() { source "${install_containers_dir}crowdsec/scripts/crowdsec_alerts_list.sh"; appCrowdSecAlertsList "$@"; } +appCrowdSecConsoleDisable() { source "${install_containers_dir}crowdsec/scripts/crowdsec_console_disable.sh"; appCrowdSecConsoleDisable "$@"; } +appCrowdSecConsoleEnroll() { source "${install_containers_dir}crowdsec/scripts/crowdsec_console_enroll.sh"; appCrowdSecConsoleEnroll "$@"; } +appCrowdSecDecisionsList() { source "${install_containers_dir}crowdsec/scripts/crowdsec_decisions_list.sh"; appCrowdSecDecisionsList "$@"; } +appCrowdSecFixPriority() { source "${install_containers_dir}crowdsec/scripts/crowdsec_fix_priority.sh"; appCrowdSecFixPriority "$@"; } +appCrowdSecHubUpdate() { source "${install_containers_dir}crowdsec/scripts/crowdsec_hub_update.sh"; appCrowdSecHubUpdate "$@"; } +appCrowdSecMetrics() { source "${install_containers_dir}crowdsec/scripts/crowdsec_metrics.sh"; appCrowdSecMetrics "$@"; } +appCrowdSecStatus() { source "${install_containers_dir}crowdsec/scripts/crowdsec_status.sh"; appCrowdSecStatus "$@"; } +appCrowdSecUnban() { source "${install_containers_dir}crowdsec/scripts/crowdsec_unban.sh"; appCrowdSecUnban "$@"; } +appCrowdSecUpdate() { source "${install_containers_dir}crowdsec/scripts/crowdsec_update.sh"; appCrowdSecUpdate "$@"; } +appCrowdSecVerifyFirewall() { source "${install_containers_dir}crowdsec/scripts/crowdsec_verify_firewall.sh"; appCrowdSecVerifyFirewall "$@"; } +appDashyManageShortcuts() { source "${install_containers_dir}dashy/tools/dashy_manage_shortcuts.sh"; appDashyManageShortcuts "$@"; } +appDashyUpdateConf() { source "${install_containers_dir}dashy/scripts/dashy_update_conf.sh"; appDashyUpdateConf "$@"; } +appFocalboardCreateAccount() { source "${install_containers_dir}focalboard/tools/focalboard_create_account.sh"; appFocalboardCreateAccount "$@"; } +appFocalboardDeleteUser() { source "${install_containers_dir}focalboard/tools/focalboard_delete_user.sh"; appFocalboardDeleteUser "$@"; } +appFocalboardListUsers() { source "${install_containers_dir}focalboard/tools/focalboard_list_users.sh"; appFocalboardListUsers "$@"; } +appFocalboardResetPassword() { source "${install_containers_dir}focalboard/tools/focalboard_reset_password.sh"; appFocalboardResetPassword "$@"; } +appFocalboardSetAdmin() { source "${install_containers_dir}focalboard/scripts/focalboard_set_admin.sh"; appFocalboardSetAdmin "$@"; } appGenerate() { source "${install_scripts_dir}app/app_generate.sh"; appGenerate "$@"; } appGetKeyData() { source "${install_scripts_dir}app/app_get_key_data.sh"; appGetKeyData "$@"; } +appGiteaCreateAccount() { source "${install_containers_dir}gitea/tools/gitea_create_account.sh"; appGiteaCreateAccount "$@"; } +appGiteaDeleteUser() { source "${install_containers_dir}gitea/tools/gitea_delete_user.sh"; appGiteaDeleteUser "$@"; } +appGiteaListUsers() { source "${install_containers_dir}gitea/tools/gitea_list_users.sh"; appGiteaListUsers "$@"; } +appGiteaResetPassword() { source "${install_containers_dir}gitea/tools/gitea_reset_password.sh"; appGiteaResetPassword "$@"; } +appGiteaSetAdmin() { source "${install_containers_dir}gitea/tools/gitea_set_admin.sh"; appGiteaSetAdmin "$@"; } +appGluetunRecreateRouted() { source "${install_containers_dir}gluetun/scripts/gluetun_recreate_routed.sh"; appGluetunRecreateRouted "$@"; } +appGluetunRefreshProviders() { source "${install_containers_dir}gluetun/tools/gluetun_refresh_providers.sh"; appGluetunRefreshProviders "$@"; } appInstallCheckRequirements() { source "${install_scripts_dir}checks/requirements/check_app_install.sh"; appInstallCheckRequirements "$@"; } appInstallMenu() { source "${install_scripts_dir}menu/menu_app_install.sh"; appInstallMenu "$@"; } +appInvidiousCreateAccount() { source "${install_containers_dir}invidious/tools/invidious_create_account.sh"; appInvidiousCreateAccount "$@"; } +appInvidiousDeleteUser() { source "${install_containers_dir}invidious/tools/invidious_delete_user.sh"; appInvidiousDeleteUser "$@"; } +appInvidiousListUsers() { source "${install_containers_dir}invidious/tools/invidious_list_users.sh"; appInvidiousListUsers "$@"; } +appInvidiousResetPassword() { source "${install_containers_dir}invidious/tools/invidious_reset_password.sh"; appInvidiousResetPassword "$@"; } +appInvidiousSetAdmin() { source "${install_containers_dir}invidious/scripts/invidious_set_admin.sh"; appInvidiousSetAdmin "$@"; } +appLinkdingCreateAccount() { source "${install_containers_dir}linkding/tools/linkding_create_account.sh"; appLinkdingCreateAccount "$@"; } +appLinkdingDeleteUser() { source "${install_containers_dir}linkding/tools/linkding_delete_user.sh"; appLinkdingDeleteUser "$@"; } +appLinkdingListUsers() { source "${install_containers_dir}linkding/tools/linkding_list_users.sh"; appLinkdingListUsers "$@"; } +appLinkdingResetPassword() { source "${install_containers_dir}linkding/tools/linkding_reset_password.sh"; appLinkdingResetPassword "$@"; } +appLinkdingSetAdmin() { source "${install_containers_dir}linkding/tools/linkding_set_admin.sh"; appLinkdingSetAdmin "$@"; } +appNetworkApplyMode_gluetun() { source "${install_containers_dir}gluetun/scripts/gluetun_network.sh"; appNetworkApplyMode_gluetun "$@"; } +appNetworkRegisterPorts_gluetun() { source "${install_containers_dir}gluetun/scripts/gluetun_network.sh"; appNetworkRegisterPorts_gluetun "$@"; } +appNextcloudAddTrustedDomain() { source "${install_containers_dir}nextcloud/tools/nextcloud_add_trusted_domain.sh"; appNextcloudAddTrustedDomain "$@"; } +appNextcloudCreateAccount() { source "${install_containers_dir}nextcloud/tools/nextcloud_create_account.sh"; appNextcloudCreateAccount "$@"; } +appNextcloudDeleteUser() { source "${install_containers_dir}nextcloud/tools/nextcloud_delete_user.sh"; appNextcloudDeleteUser "$@"; } +appNextcloudListUsers() { source "${install_containers_dir}nextcloud/tools/nextcloud_list_users.sh"; appNextcloudListUsers "$@"; } +appNextcloudRescanFiles() { source "${install_containers_dir}nextcloud/tools/nextcloud_rescan_files.sh"; appNextcloudRescanFiles "$@"; } +appNextcloudResetPassword() { source "${install_containers_dir}nextcloud/tools/nextcloud_reset_password.sh"; appNextcloudResetPassword "$@"; } +appNextcloudSetAdmin() { source "${install_containers_dir}nextcloud/tools/nextcloud_set_admin.sh"; appNextcloudSetAdmin "$@"; } +appNextcloudSystemStatus() { source "${install_containers_dir}nextcloud/tools/nextcloud_system_status.sh"; appNextcloudSystemStatus "$@"; } +appNextcloudTailLogs() { source "${install_containers_dir}nextcloud/tools/nextcloud_tail_logs.sh"; appNextcloudTailLogs "$@"; } +appNextcloudToggleMaintenance() { source "${install_containers_dir}nextcloud/tools/nextcloud_toggle_maintenance.sh"; appNextcloudToggleMaintenance "$@"; } +appOwnCloudSetupConfig() { source "${install_containers_dir}owncloud/scripts/owncloud_setup_config.sh"; appOwnCloudSetupConfig "$@"; } +appPiholeApplyDnsUpdater() { source "${install_containers_dir}pihole/tools/pihole_apply_dns_updater.sh"; appPiholeApplyDnsUpdater "$@"; } _appReqHasDomain() { source "${install_scripts_dir}checks/requirements/check_app_install.sh"; _appReqHasDomain "$@"; } _appReqServiceInstalled() { source "${install_scripts_dir}checks/requirements/check_app_install.sh"; _appReqServiceInstalled "$@"; } _appReqServiceMsg() { source "${install_scripts_dir}checks/requirements/check_app_install.sh"; _appReqServiceMsg "$@"; } appScanAvailable() { source "${install_scripts_dir}app/app_scan_available.sh"; appScanAvailable "$@"; } +appSetupComposeTags_gluetun() { source "${install_containers_dir}gluetun/scripts/gluetun_compose_tags.sh"; appSetupComposeTags_gluetun "$@"; } +appSetupComposeTags_nextcloud() { source "${install_containers_dir}nextcloud/scripts/nextcloud_compose_tags.sh"; appSetupComposeTags_nextcloud "$@"; } +appSetupComposeTags_pihole() { source "${install_containers_dir}pihole/scripts/pihole_compose_tags.sh"; appSetupComposeTags_pihole "$@"; } +appSetupComposeTags_searxng() { source "${install_containers_dir}searxng/scripts/searxng_compose_tags.sh"; appSetupComposeTags_searxng "$@"; } +appSetupComposeTags_speedtest() { source "${install_containers_dir}speedtest/scripts/speedtest_compose_tags.sh"; appSetupComposeTags_speedtest "$@"; } +appSetupComposeTags_vaultwarden() { source "${install_containers_dir}vaultwarden/scripts/vaultwarden_compose_tags.sh"; appSetupComposeTags_vaultwarden "$@"; } +appSetupComposeTags_wireguard() { source "${install_containers_dir}wireguard/scripts/wireguard_compose_tags.sh"; appSetupComposeTags_wireguard "$@"; } appStatus() { source "${install_scripts_dir}app/app_status.sh"; appStatus "$@"; } +appTraefikExtraMiddlewares_onlyoffice() { source "${install_containers_dir}onlyoffice/scripts/onlyoffice_traefik.sh"; appTraefikExtraMiddlewares_onlyoffice "$@"; } +appTraefikResetPassword() { source "${install_containers_dir}traefik/tools/traefik_reset_password.sh"; appTraefikResetPassword "$@"; } +appTraefikSkipsDefaultMiddleware_onlyoffice() { source "${install_containers_dir}onlyoffice/scripts/onlyoffice_traefik.sh"; appTraefikSkipsDefaultMiddleware_onlyoffice "$@"; } +appTraefikSkipsDefaultMiddleware_owncloud() { source "${install_containers_dir}owncloud/scripts/owncloud_traefik.sh"; appTraefikSkipsDefaultMiddleware_owncloud "$@"; } appUninstallMenu() { source "${install_scripts_dir}menu/menu_app_uninstall.sh"; appUninstallMenu "$@"; } appUpdateSpecifics() { source "${install_scripts_dir}app/app_update_specifics.sh"; appUpdateSpecifics "$@"; } +appUpdateSpecifics_adguard() { source "${install_containers_dir}adguard/scripts/adguard_update_specifics.sh"; appUpdateSpecifics_adguard "$@"; } +appUpdateSpecifics_dashy() { source "${install_containers_dir}dashy/scripts/dashy_update_specifics.sh"; appUpdateSpecifics_dashy "$@"; } +appUpdateSpecifics_focalboard() { source "${install_containers_dir}focalboard/scripts/focalboard_update_specifics.sh"; appUpdateSpecifics_focalboard "$@"; } +appUpdateSpecifics_libreportal() { source "${install_containers_dir}libreportal/scripts/libreportal_update_specifics.sh"; appUpdateSpecifics_libreportal "$@"; } +appUpdateSpecifics_nextcloud() { source "${install_containers_dir}nextcloud/scripts/nextcloud_update_specifics.sh"; appUpdateSpecifics_nextcloud "$@"; } +appUpdateSpecifics_pihole() { source "${install_containers_dir}pihole/scripts/pihole_update_specifics.sh"; appUpdateSpecifics_pihole "$@"; } +appWebuiRefresh_gluetun() { source "${install_containers_dir}gluetun/scripts/gluetun_providers.sh"; appWebuiRefresh_gluetun "$@"; } atomicWriteWebUI() { source "${install_scripts_dir}webui/data/utils/webui_atomic_write.sh"; atomicWriteWebUI "$@"; } +authAdapter_adguard_setPassword() { source "${install_containers_dir}adguard/scripts/adguard_auth.sh"; authAdapter_adguard_setPassword "$@"; } +authAdapter_bookstack_createUser() { source "${install_containers_dir}bookstack/scripts/bookstack_auth.sh"; authAdapter_bookstack_createUser "$@"; } +authAdapter_bookstack_deleteUser() { source "${install_containers_dir}bookstack/scripts/bookstack_auth.sh"; authAdapter_bookstack_deleteUser "$@"; } +authAdapter_bookstack_listUsers() { source "${install_containers_dir}bookstack/scripts/bookstack_auth.sh"; authAdapter_bookstack_listUsers "$@"; } +authAdapter_bookstack_setAdmin() { source "${install_containers_dir}bookstack/scripts/bookstack_auth.sh"; authAdapter_bookstack_setAdmin "$@"; } +authAdapter_bookstack_setPassword() { source "${install_containers_dir}bookstack/scripts/bookstack_auth.sh"; authAdapter_bookstack_setPassword "$@"; } authAdapterCall() { source "${install_scripts_dir}app/auth_adapter.sh"; authAdapterCall "$@"; } authAdapterCanDo() { source "${install_scripts_dir}app/auth_adapter.sh"; authAdapterCanDo "$@"; } +authAdapter_focalboard_createUser() { source "${install_containers_dir}focalboard/scripts/focalboard_auth.sh"; authAdapter_focalboard_createUser "$@"; } +authAdapter_focalboard_deleteUser() { source "${install_containers_dir}focalboard/scripts/focalboard_auth.sh"; authAdapter_focalboard_deleteUser "$@"; } +authAdapter_focalboard_listUsers() { source "${install_containers_dir}focalboard/scripts/focalboard_auth.sh"; authAdapter_focalboard_listUsers "$@"; } +authAdapter_focalboard_setAdmin() { source "${install_containers_dir}focalboard/scripts/focalboard_auth.sh"; authAdapter_focalboard_setAdmin "$@"; } +authAdapter_focalboard_setPassword() { source "${install_containers_dir}focalboard/scripts/focalboard_auth.sh"; authAdapter_focalboard_setPassword "$@"; } +authAdapter_gitea_createUser() { source "${install_containers_dir}gitea/scripts/gitea_auth.sh"; authAdapter_gitea_createUser "$@"; } +authAdapter_gitea_listUsers() { source "${install_containers_dir}gitea/scripts/gitea_auth.sh"; authAdapter_gitea_listUsers "$@"; } +authAdapter_gitea_setPassword() { source "${install_containers_dir}gitea/scripts/gitea_auth.sh"; authAdapter_gitea_setPassword "$@"; } +authAdapter_invidious_createUser() { source "${install_containers_dir}invidious/scripts/invidious_auth.sh"; authAdapter_invidious_createUser "$@"; } +authAdapter_invidious_deleteUser() { source "${install_containers_dir}invidious/scripts/invidious_auth.sh"; authAdapter_invidious_deleteUser "$@"; } +authAdapter_invidious_listUsers() { source "${install_containers_dir}invidious/scripts/invidious_auth.sh"; authAdapter_invidious_listUsers "$@"; } +authAdapter_invidious_setAdmin() { source "${install_containers_dir}invidious/scripts/invidious_auth.sh"; authAdapter_invidious_setAdmin "$@"; } +authAdapter_invidious_setPassword() { source "${install_containers_dir}invidious/scripts/invidious_auth.sh"; authAdapter_invidious_setPassword "$@"; } +authAdapter_linkding_createUser() { source "${install_containers_dir}linkding/scripts/linkding_auth.sh"; authAdapter_linkding_createUser "$@"; } +authAdapter_linkding_deleteUser() { source "${install_containers_dir}linkding/scripts/linkding_auth.sh"; authAdapter_linkding_deleteUser "$@"; } +authAdapter_linkding_listUsers() { source "${install_containers_dir}linkding/scripts/linkding_auth.sh"; authAdapter_linkding_listUsers "$@"; } +authAdapter_linkding_setAdmin() { source "${install_containers_dir}linkding/scripts/linkding_auth.sh"; authAdapter_linkding_setAdmin "$@"; } +authAdapter_linkding_setPassword() { source "${install_containers_dir}linkding/scripts/linkding_auth.sh"; authAdapter_linkding_setPassword "$@"; } +authAdapter_nextcloud_createUser() { source "${install_containers_dir}nextcloud/scripts/nextcloud_auth.sh"; authAdapter_nextcloud_createUser "$@"; } +authAdapter_nextcloud_deleteUser() { source "${install_containers_dir}nextcloud/scripts/nextcloud_auth.sh"; authAdapter_nextcloud_deleteUser "$@"; } +authAdapter_nextcloud_listUsers() { source "${install_containers_dir}nextcloud/scripts/nextcloud_auth.sh"; authAdapter_nextcloud_listUsers "$@"; } +authAdapter_nextcloud_setAdmin() { source "${install_containers_dir}nextcloud/scripts/nextcloud_auth.sh"; authAdapter_nextcloud_setAdmin "$@"; } +authAdapter_nextcloud_setPassword() { source "${install_containers_dir}nextcloud/scripts/nextcloud_auth.sh"; authAdapter_nextcloud_setPassword "$@"; } +authAdapter_traefik_setPassword() { source "${install_containers_dir}traefik/scripts/traefik_auth.sh"; authAdapter_traefik_setPassword "$@"; } authPersistCfg() { source "${install_scripts_dir}app/auth_adapter.sh"; authPersistCfg "$@"; } authToolArg() { source "${install_scripts_dir}app/auth_adapter.sh"; authToolArg "$@"; } backupAllApps() { source "${install_scripts_dir}backup/app/backup_app_all.sh"; backupAllApps "$@"; } @@ -794,6 +1923,7 @@ backupSshKeyRefreshUi() { source "${install_scripts_dir}backup/locations/locatio backupSshKeySet() { source "${install_scripts_dir}backup/locations/location_ssh.sh"; backupSshKeySet "$@"; } backupSystemConfig() { source "${install_scripts_dir}backup/system/backup_system.sh"; backupSystemConfig "$@"; } backupVerifySnapshot() { source "${install_scripts_dir}backup/verify/backup_verify.sh"; backupVerifySnapshot "$@"; } +_bookstackArtisan() { source "${install_containers_dir}bookstack/scripts/bookstack_auth.sh"; _bookstackArtisan "$@"; } borgArchiveName() { source "${install_scripts_dir}backup/engine/borg_env.sh"; borgArchiveName "$@"; } borgBackupAppToLocation() { source "${install_scripts_dir}backup/engine/borg_backup.sh"; borgBackupAppToLocation "$@"; } borgBackupSystemToLocation() { source "${install_scripts_dir}backup/engine/borg_backup.sh"; borgBackupSystemToLocation "$@"; } @@ -911,6 +2041,7 @@ crontabSetupCheckProcessor() { source "${install_scripts_dir}crontab/task/cronta crontabSetupSystemInfoUpdater() { source "${install_scripts_dir}crontab/system/crontab_setup_system_info_updater.sh"; crontabSetupSystemInfoUpdater "$@"; } crontabSetupTaskProcessor() { source "${install_scripts_dir}crontab/task/crontab_setup_task_processor.sh"; crontabSetupTaskProcessor "$@"; } crontabToolsMenu() { source "${install_scripts_dir}menu/tools/manage_crontab.sh"; crontabToolsMenu "$@"; } +crowdsecToggleLibrePortalLogMounts() { source "${install_containers_dir}crowdsec/scripts/crowdsec_install_host.sh"; crowdsecToggleLibrePortalLogMounts "$@"; } dashyToolsMenu() { source "${install_scripts_dir}menu/tools/manage_dashy.sh"; dashyToolsMenu "$@"; } databaseAppScan() { source "${install_scripts_dir}database/app/db_app_scan.sh"; databaseAppScan "$@"; } databaseBackupInsert() { source "${install_scripts_dir}database/insert/db_insert_backups.sh"; databaseBackupInsert "$@"; } @@ -1016,6 +2147,8 @@ fixAppFolderPermissions() { source "${install_scripts_dir}function/permission/ap fixConfigPermissions() { source "${install_scripts_dir}function/permission/config.sh"; fixConfigPermissions "$@"; } fixFolderPermissions() { source "${install_scripts_dir}function/permission/libreportal_folders.sh"; fixFolderPermissions "$@"; } fixPermissionsBeforeStart() { source "${install_scripts_dir}function/permission/before_start.sh"; fixPermissionsBeforeStart "$@"; } +_focalboardBcrypt() { source "${install_containers_dir}focalboard/scripts/focalboard_auth.sh"; _focalboardBcrypt "$@"; } +_focalboardSqlite() { source "${install_containers_dir}focalboard/scripts/focalboard_auth.sh"; _focalboardSqlite "$@"; } generateHealthReport() { source "${install_scripts_dir}crontab/task/crontab_check_processor.sh"; generateHealthReport "$@"; } generateInstallName() { source "${install_scripts_dir}checks/generate_install_name.sh"; generateInstallName "$@"; } generateRandomPassword() { source "${install_scripts_dir}config/password/password_generate.sh"; generateRandomPassword "$@"; } @@ -1027,12 +2160,16 @@ gitCheckConfigs() { source "${install_scripts_dir}update/git/checks/config_git_c gitCheckForUpdate() { source "${install_scripts_dir}update/git/checks/update_git_check.sh"; gitCheckForUpdate "$@"; } gitCheckGitDetails() { source "${install_scripts_dir}update/git/check_git_details.sh"; gitCheckGitDetails "$@"; } gitCleanInstallBackups() { source "${install_scripts_dir}update/backup/install_git_backup.sh"; gitCleanInstallBackups "$@"; } +_giteaCmd() { source "${install_containers_dir}gitea/scripts/gitea_auth.sh"; _giteaCmd "$@"; } gitFolderResetAndBackup() { source "${install_scripts_dir}update/backup/reset_git_backup.sh"; gitFolderResetAndBackup "$@"; } gitPerformUpdate() { source "${install_scripts_dir}update/backup/reset_git_backup.sh"; gitPerformUpdate "$@"; } gitReset() { source "${install_scripts_dir}update/git/reset_git.sh"; gitReset "$@"; } gitUntrackFiles() { source "${install_scripts_dir}update/git/untrack_files.sh"; gitUntrackFiles "$@"; } gitUseExistingBackup() { source "${install_scripts_dir}update/backup/use_git_backup.sh"; gitUseExistingBackup "$@"; } +gluetunRouteExistingAppsPrompt() { source "${install_containers_dir}gluetun/scripts/gluetun_route_apps.sh"; gluetunRouteExistingAppsPrompt "$@"; } hashPassword() { source "${install_scripts_dir}config/password/password_hash.sh"; hashPassword "$@"; } +headscaleCommands() { source "${install_containers_dir}headscale/scripts/headscale_commands.sh"; headscaleCommands "$@"; } +headscaleEditConfig() { source "${install_containers_dir}headscale/scripts/headscale_edit_config.sh"; headscaleEditConfig "$@"; } healthLogError() { source "${install_scripts_dir}crontab/task/crontab_check_processor.sh"; healthLogError "$@"; } healthLogInfo() { source "${install_scripts_dir}crontab/task/crontab_check_processor.sh"; healthLogInfo "$@"; } healthLogSuccess() { source "${install_scripts_dir}crontab/task/crontab_check_processor.sh"; healthLogSuccess "$@"; } @@ -1049,8 +2186,13 @@ hostSshRefreshUi() { source "${install_scripts_dir}ssh/host_access.sh"; hostSshR hostSshSetPasswordAuth() { source "${install_scripts_dir}ssh/host_access.sh"; hostSshSetPasswordAuth "$@"; } hostSshUser() { source "${install_scripts_dir}ssh/host_access.sh"; hostSshUser "$@"; } initializeAppVariables() { source "${install_scripts_dir}network/variables/variables_init_app.sh"; initializeAppVariables "$@"; } +installAdguard() { source "${install_containers_dir}adguard/adguard.sh"; installAdguard "$@"; } installArch() { source "${install_scripts_dir}os/install/arch.sh"; installArch "$@"; } +installAuthelia() { source "${install_containers_dir}authelia/authelia.sh"; installAuthelia "$@"; } +installBookstack() { source "${install_containers_dir}bookstack/bookstack.sh"; installBookstack "$@"; } installCrontab() { source "${install_scripts_dir}crontab/crontab_install.sh"; installCrontab "$@"; } +installCrowdsec() { source "${install_containers_dir}crowdsec/crowdsec.sh"; installCrowdsec "$@"; } +installDashy() { source "${install_containers_dir}dashy/dashy.sh"; installDashy "$@"; } installDebianUbuntu() { source "${install_scripts_dir}os/install/ubuntu.sh"; installDebianUbuntu "$@"; } installDockerNetwork() { source "${install_scripts_dir}docker/network/network_setup.sh"; installDockerNetwork "$@"; } installDockerRooted() { source "${install_scripts_dir}docker/install/rooted/rooted_docker.sh"; installDockerRooted "$@"; } @@ -1059,18 +2201,46 @@ installDockerRootedCompose() { source "${install_scripts_dir}docker/install/root installDockerRootless() { source "${install_scripts_dir}docker/install/rootless/rootless_docker.sh"; installDockerRootless "$@"; } installDockerRootlessStartSetup() { source "${install_scripts_dir}docker/install/rootless/rootless_start_setup.sh"; installDockerRootlessStartSetup "$@"; } installDockerRootlessUser() { source "${install_scripts_dir}docker/install/rootless/rootless_user.sh"; installDockerRootlessUser "$@"; } +installFocalboard() { source "${install_containers_dir}focalboard/focalboard.sh"; installFocalboard "$@"; } +installGitea() { source "${install_containers_dir}gitea/gitea.sh"; installGitea "$@"; } +installGluetun() { source "${install_containers_dir}gluetun/gluetun.sh"; installGluetun "$@"; } +installGrafana() { source "${install_containers_dir}grafana/grafana.sh"; installGrafana "$@"; } +installHeadscale() { source "${install_containers_dir}headscale/headscale.sh"; installHeadscale "$@"; } +installInvidious() { source "${install_containers_dir}invidious/invidious.sh"; installInvidious "$@"; } +installIpinfo() { source "${install_containers_dir}ipinfo/ipinfo.sh"; installIpinfo "$@"; } +installJellyfin() { source "${install_containers_dir}jellyfin/jellyfin.sh"; installJellyfin "$@"; } +installJitsimeet() { source "${install_containers_dir}jitsimeet/jitsimeet.sh"; installJitsimeet "$@"; } +installLibrePortal() { source "${install_containers_dir}libreportal/libreportal.sh"; installLibrePortal "$@"; } installLibrePortalAppWebUI() { source "${install_scripts_dir}webui/webui_install_app.sh"; installLibrePortalAppWebUI "$@"; } installLibrePortalImageWebUI() { source "${install_scripts_dir}webui/webui_install_image.sh"; installLibrePortalImageWebUI "$@"; } installLibrePortalWebUITaskService() { source "${install_scripts_dir}webui/webui_install_systemd.sh"; installLibrePortalWebUITaskService "$@"; } +installLinkding() { source "${install_containers_dir}linkding/linkding.sh"; installLinkding "$@"; } +installMastodon() { source "${install_containers_dir}mastodon/mastodon.sh"; installMastodon "$@"; } +installMoneyapp() { source "${install_containers_dir}moneyapp/moneyapp.sh"; installMoneyapp "$@"; } +installNextcloud() { source "${install_containers_dir}nextcloud/nextcloud.sh"; installNextcloud "$@"; } +installOllama() { source "${install_containers_dir}ollama/ollama.sh"; installOllama "$@"; } +installOnlyoffice() { source "${install_containers_dir}onlyoffice/onlyoffice.sh"; installOnlyoffice "$@"; } installOptionalMetricsApps() { source "${install_scripts_dir}start/start_recommended.sh"; installOptionalMetricsApps "$@"; } +installOwncloud() { source "${install_containers_dir}owncloud/owncloud.sh"; installOwncloud "$@"; } +installPihole() { source "${install_containers_dir}pihole/pihole.sh"; installPihole "$@"; } +installPrometheus() { source "${install_containers_dir}prometheus/prometheus.sh"; installPrometheus "$@"; } installRecommendedApps() { source "${install_scripts_dir}start/start_recommended.sh"; installRecommendedApps "$@"; } installResticHost() { source "${install_scripts_dir}install/install_restic.sh"; installResticHost "$@"; } installResticMigrateLegacyPasswords() { source "${install_scripts_dir}install/install_restic.sh"; installResticMigrateLegacyPasswords "$@"; } +installSearxng() { source "${install_containers_dir}searxng/searxng.sh"; installSearxng "$@"; } +installSpeedtest() { source "${install_containers_dir}speedtest/speedtest.sh"; installSpeedtest "$@"; } installSQLiteDatabase() { source "${install_scripts_dir}database/install_sqlite.sh"; installSQLiteDatabase "$@"; } installSSLCertificate() { source "${install_scripts_dir}install/install_certificate.sh"; installSSLCertificate "$@"; } installSwapfile() { source "${install_scripts_dir}install/install_swapfile.sh"; installSwapfile "$@"; } +installTraefik() { source "${install_containers_dir}traefik/traefik.sh"; installTraefik "$@"; } +installTrilium() { source "${install_containers_dir}trilium/trilium.sh"; installTrilium "$@"; } installUFW() { source "${install_scripts_dir}install/install_ufw.sh"; installUFW "$@"; } installUFWDocker() { source "${install_scripts_dir}install/install_ufwd.sh"; installUFWDocker "$@"; } +installUnbound() { source "${install_containers_dir}unbound/unbound.sh"; installUnbound "$@"; } +installVaultwarden() { source "${install_containers_dir}vaultwarden/vaultwarden.sh"; installVaultwarden "$@"; } +installWireguard() { source "${install_containers_dir}wireguard/wireguard.sh"; installWireguard "$@"; } +_invidiousBcrypt() { source "${install_containers_dir}invidious/scripts/invidious_auth.sh"; _invidiousBcrypt "$@"; } +_invidiousPsql() { source "${install_containers_dir}invidious/scripts/invidious_auth.sh"; _invidiousPsql "$@"; } invidiousToolsMenu() { source "${install_scripts_dir}menu/tools/manage_invidious.sh"; invidiousToolsMenu "$@"; } ipAllocation() { source "${install_scripts_dir}network/ip/ip_allocation.sh"; ipAllocation "$@"; } ipFindAvailable() { source "${install_scripts_dir}network/ip/ip_find_available.sh"; ipFindAvailable "$@"; } @@ -1108,6 +2278,7 @@ kopiaLocationStats() { source "${install_scripts_dir}backup/engine/kopia_check.s kopiaLocationUri() { source "${install_scripts_dir}backup/engine/kopia_env.sh"; kopiaLocationUri "$@"; } kopiaRestoreSnapshot() { source "${install_scripts_dir}backup/engine/kopia_restore.sh"; kopiaRestoreSnapshot "$@"; } kopiaSnapshotsJson() { source "${install_scripts_dir}backup/engine/kopia_snapshots.sh"; kopiaSnapshotsJson "$@"; } +_linkdingManage() { source "${install_containers_dir}linkding/scripts/linkding_auth.sh"; _linkdingManage "$@"; } listDockerComposeFiles() { source "${install_scripts_dir}config/docker/docker_list_compose_files.sh"; listDockerComposeFiles "$@"; } localDnsAppHosts() { source "${install_scripts_dir}network/dns/setup_local_dns.sh"; localDnsAppHosts "$@"; } localDnsApplyAdguard() { source "${install_scripts_dir}network/dns/setup_local_dns.sh"; localDnsApplyAdguard "$@"; } @@ -1171,6 +2342,8 @@ monitoringInstalledApps() { source "${install_scripts_dir}network/monitoring/mon monitoringIsInstalled() { source "${install_scripts_dir}network/monitoring/monitoring.sh"; monitoringIsInstalled "$@"; } monitoringToggleAppConfig() { source "${install_scripts_dir}network/monitoring/monitoring.sh"; monitoringToggleAppConfig "$@"; } moveFile() { source "${install_scripts_dir}function/file/move_file.sh"; moveFile "$@"; } +_nextcloudOcc() { source "${install_containers_dir}nextcloud/scripts/nextcloud_auth.sh"; _nextcloudOcc "$@"; } +_nextcloudOccWithPass() { source "${install_containers_dir}nextcloud/scripts/nextcloud_auth.sh"; _nextcloudOccWithPass "$@"; } openFifoReader() { source "${install_scripts_dir}crontab/task/crontab_task_processor.sh"; openFifoReader "$@"; } passwordValidation() { source "${install_scripts_dir}function/validation/password.sh"; passwordValidation "$@"; } peerAdd() { source "${install_scripts_dir}peer/peer_add.sh"; peerAdd "$@"; } @@ -1243,6 +2416,7 @@ replaceRandomUsernames() { source "${install_scripts_dir}config/password/passwor replaceVAPIDKeys() { source "${install_scripts_dir}config/password/password_replace vapid.sh"; replaceVAPIDKeys "$@"; } resetToMenu() { source "${install_scripts_dir}menu/menu_reset_to_menu.sh"; resetToMenu "$@"; } resolveDockerInstallUser() { source "${install_scripts_dir}checks/requirements/check_install_type.sh"; resolveDockerInstallUser "$@"; } +restartCrowdsec() { source "${install_containers_dir}crowdsec/crowdsec.sh"; restartCrowdsec "$@"; } resticAllLocationIndices() { source "${install_scripts_dir}backup/engine/restic_env.sh"; resticAllLocationIndices "$@"; } resticBackupAppAllLocations() { source "${install_scripts_dir}backup/engine/restic_backup.sh"; resticBackupAppAllLocations "$@"; } resticBackupAppToLocation() { source "${install_scripts_dir}backup/engine/restic_backup.sh"; resticBackupAppToLocation "$@"; } @@ -1313,6 +2487,14 @@ setupBasicScanVariables() { source "${install_scripts_dir}network/variables/basi setupCheckDomainPointsHere() { source "${install_scripts_dir}setup/setup_apply.sh"; setupCheckDomainPointsHere "$@"; } setupDNSIP() { source "${install_scripts_dir}network/dns/setup_dns_ip.sh"; setupDNSIP "$@"; } setupGenerateName() { source "${install_scripts_dir}setup/setup_apply.sh"; setupGenerateName "$@"; } +setupHeadscale() { source "${install_containers_dir}headscale/scripts/headscale_setup.sh"; setupHeadscale "$@"; } +setupHeadscaleCheckRemote() { source "${install_containers_dir}headscale/scripts/headscale_check_remote.sh"; setupHeadscaleCheckRemote "$@"; } +setupHeadscaleGenerateAuthKey() { source "${install_containers_dir}headscale/scripts/headscale_generate_auth.sh"; setupHeadscaleGenerateAuthKey "$@"; } +setupHeadscaleGetHostname() { source "${install_containers_dir}headscale/scripts/headscale_get_hostname.sh"; setupHeadscaleGetHostname "$@"; } +setupHeadscaleLocal() { source "${install_containers_dir}headscale/scripts/headscale_setup_local.sh"; setupHeadscaleLocal "$@"; } +setupHeadscaleLocalhost() { source "${install_containers_dir}headscale/scripts/headscale_setup_localhost.sh"; setupHeadscaleLocalhost "$@"; } +setupHeadscaleRemote() { source "${install_containers_dir}headscale/scripts/headscale_setup_remote.sh"; setupHeadscaleRemote "$@"; } +setupHeadscaleUser() { source "${install_containers_dir}headscale/scripts/headscale_user.sh"; setupHeadscaleUser "$@"; } setupHeadscaleVariables() { source "${install_scripts_dir}network/variables/headscale_variables.sh"; setupHeadscaleVariables "$@"; } setupTaskDir() { source "${install_scripts_dir}crontab/task/crontab_task_processor.sh"; setupTaskDir "$@"; } setupWizardMarkComplete() { source "${install_scripts_dir}setup/setup_lock.sh"; setupWizardMarkComplete "$@"; } @@ -1326,6 +2508,7 @@ startLoad() { source "${install_scripts_dir}start/start_load.sh"; startLoad "$@" startOther() { source "${install_scripts_dir}start/start_other.sh"; startOther "$@"; } startPreInstall() { source "${install_scripts_dir}start/start_preinstall.sh"; startPreInstall "$@"; } startScan() { source "${install_scripts_dir}start/start_scan.sh"; startScan "$@"; } +stopCrowdsec() { source "${install_containers_dir}crowdsec/crowdsec.sh"; stopCrowdsec "$@"; } switchMigrateBackupApps() { source "${install_scripts_dir}docker/type_switcher/swap_docker_type.sh"; switchMigrateBackupApps "$@"; } switchMigrateRestoreApps() { source "${install_scripts_dir}docker/type_switcher/swap_docker_type.sh"; switchMigrateRestoreApps "$@"; } tagsManagerGetTagContent() { source "${install_scripts_dir}config/tags/manager/tags_manager_content.sh"; tagsManagerGetTagContent "$@"; } @@ -1345,11 +2528,13 @@ tagsProcessorSpeedtestPass() { source "${install_scripts_dir}config/tags/process tagsProcessorStandardReplacements() { source "${install_scripts_dir}config/tags/processors/tags_processor_standard_replacements.sh"; tagsProcessorStandardReplacements "$@"; } tagsProcessorTraefikControl() { source "${install_scripts_dir}config/tags/processors/tags_processor_traefik_control.sh"; tagsProcessorTraefikControl "$@"; } tagsProcessorTrustedDomains() { source "${install_scripts_dir}config/tags/processors/tags_processor_trusted_domains.sh"; tagsProcessorTrustedDomains "$@"; } +tailscaleInstallToContainer() { source "${install_containers_dir}headscale/scripts/tailscale_install.sh"; tailscaleInstallToContainer "$@"; } toolArgsGet() { source "${install_scripts_dir}docker/app/functions/function_app_tool.sh"; toolArgsGet "$@"; } toolsMenu() { source "${install_scripts_dir}menu/tools/manage_main.sh"; toolsMenu "$@"; } traefikSetupLabelsMiddlewares() { source "${install_scripts_dir}network/traefik/traefik_middlewares.sh"; traefikSetupLabelsMiddlewares "$@"; } traefikSetupLoginCredentials() { source "${install_scripts_dir}network/traefik/traefik_login_credentials.sh"; traefikSetupLoginCredentials "$@"; } traefikUpdateWhitelist() { source "${install_scripts_dir}network/traefik/traefik_whitelist.sh"; traefikUpdateWhitelist "$@"; } +uninstallCrowdsec() { source "${install_containers_dir}crowdsec/crowdsec.sh"; uninstallCrowdsec "$@"; } uninstallDockerRootless() { source "${install_scripts_dir}docker/install/rootless/rootless_uninstall.sh"; uninstallDockerRootless "$@"; } updateAppConfig() { source "${install_scripts_dir}webui/data/generators/apps/webui_app_config.sh"; updateAppConfig "$@"; } updateConfigOption() { source "${install_scripts_dir}config/core/config_update_option.sh"; updateConfigOption "$@"; } diff --git a/scripts/source/files/generate_function_manifest.sh b/scripts/source/files/generate_function_manifest.sh index efa1802..0cd61de 100644 --- a/scripts/source/files/generate_function_manifest.sh +++ b/scripts/source/files/generate_function_manifest.sh @@ -39,7 +39,9 @@ if [[ "${BASH_SOURCE[0]}" == "${0}" && "$1" == "run" ]]; then SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ARRAYS_DIR="$SCRIPT_DIR/arrays" -SCRIPTS_DIR="$(dirname "$(dirname "$SCRIPT_DIR")")" +SCRIPTS_DIR="$(dirname "$(dirname "$SCRIPT_DIR")")" # …/scripts +INSTALL_DIR="$(dirname "$SCRIPTS_DIR")" # …/install (parent of scripts) +CONTAINERS_DIR="$INSTALL_DIR/containers" # sibling of scripts OUTPUT="$ARRAYS_DIR/function_manifest.sh" RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[0;33m'; NC='\033[0m' @@ -163,32 +165,66 @@ declare -a eager_files total_files=0 total_fns=0 -# Find all .sh under scripts/ (no symlinks, no hidden). -while IFS= read -r -d '' file; do - rel=$(realpath --relative-to="$SCRIPTS_DIR" "$file") - should_skip "$rel" && continue +# fn_to_root parallels fn_to_file: tracks whether the source file lives under +# scripts/ ("scripts") or containers/ ("containers") so the stub emission can +# pick the right ${install_*_dir} prefix. Same for eager_root for LP_EAGER_FILES. +declare -A fn_to_root +declare -A eager_root - total_files=$((total_files + 1)) +# Walk one root. $1 = directory, $2 = root label ("scripts" or "containers"), +# $3 = max depth for find (-maxdepth N). The scan also honours the skip-list +# (paths relative to the root, so scripts/ skip entries don't match container +# files and vice versa). +scan_root() { + local root_dir="$1" root_label="$2" depth="$3" + while IFS= read -r -d '' file; do + local rel + rel=$(realpath --relative-to="$root_dir" "$file") + # Skip-list keys are scoped per root. should_skip() only handles the + # scripts/ ones today; containers/ skip-list is inline here. + if [[ "$root_label" == "scripts" ]]; then + should_skip "$rel" && continue + else + # Container-side skips: anything under a resources/ subdir is data + # not code; the existing sourceScanFiles already prunes those. + case "$rel" in + */resources/*) continue ;; + esac + fi - is_eager=0 - while IFS= read -r tag; do - case "$tag" in - fn:*) - name="${tag#fn:}" - if [[ -n "${fn_to_file[$name]:-}" && "${fn_to_file[$name]}" != "$rel" ]]; then - fn_collisions[$name]="${fn_collisions[$name]:-${fn_to_file[$name]}}"$'\t'"$rel" - fi - fn_to_file[$name]="$rel" - total_fns=$((total_fns + 1)) - ;; - eager:) - is_eager=1 - ;; - esac - done < <(analyze_file "$file") + total_files=$((total_files + 1)) - (( is_eager )) && eager_files+=("$rel") -done < <(find "$SCRIPTS_DIR" -type f -name '*.sh' -print0) + local is_eager=0 + while IFS= read -r tag; do + case "$tag" in + fn:*) + local name="${tag#fn:}" + if [[ -n "${fn_to_file[$name]:-}" && "${fn_to_file[$name]}" != "$rel" ]]; then + fn_collisions[$name]="${fn_collisions[$name]:-${fn_to_file[$name]}}"$'\t'"$rel" + fi + fn_to_file[$name]="$rel" + fn_to_root[$name]="$root_label" + total_fns=$((total_fns + 1)) + ;; + eager:) + is_eager=1 + ;; + esac + done < <(analyze_file "$file") + + if (( is_eager )); then + eager_files+=("$rel") + eager_root["$rel"]="$root_label" + fi + done < <(find "$root_dir" -maxdepth "$depth" -type f -name '*.sh' -print0) +} + +# scripts/ — deep walk, the existing behaviour. +scan_root "$SCRIPTS_DIR" scripts 99 +# containers/ — match the sourceScanFiles "containers" maxdepth of 3. +if [[ -d "$CONTAINERS_DIR" ]]; then + scan_root "$CONTAINERS_DIR" containers 3 +fi # Emit the manifest. { @@ -200,33 +236,48 @@ done < <(find "$SCRIPTS_DIR" -type f -name '*.sh' -print0) printf '# Function name → relative path. Used by the lazy loader (LP_LAZY=1)\n' printf '# to install an autoload stub for each public function. First call to a\n' printf '# stub sources the real file, which redefines the function with the real\n' - printf '# body; subsequent calls hit the real one directly.\n' + printf '# body; subsequent calls hit the real one directly. Path is relative to\n' + printf '# install_scripts_dir for "scripts" entries, install_containers_dir for\n' + printf '# "containers" entries — see LP_FN_ROOT below.\n' printf 'declare -gA LP_FN_MAP=(\n' - # Sort for stable diff output. while IFS= read -r name; do printf ' [%s]="%s"\n' "$name" "${fn_to_file[$name]}" done < <(printf '%s\n' "${!fn_to_file[@]}" | sort) printf ')\n\n' + printf '# Per-function root selector — "scripts" or "containers". Mirrors\n' + printf '# LP_FN_MAP; used by the loader / debugging tools.\n' + printf 'declare -gA LP_FN_ROOT=(\n' + while IFS= read -r name; do + printf ' [%s]="%s"\n' "$name" "${fn_to_root[$name]}" + done < <(printf '%s\n' "${!fn_to_root[@]}" | sort) + printf ')\n\n' - printf '# Files with top-level side effects (variable assignments, source calls,\n' - printf '# command invocations outside any function). Lazy mode MUST source these\n' + printf '# Files with top-level side effects. Lazy mode MUST source these\n' printf '# unconditionally — deferring them would skip the side effect, not just\n' - printf '# defer a function definition.\n' + printf '# defer a function definition. Stored as ":" so the\n' + printf '# loader picks the right base dir; existing entries without a prefix\n' + printf '# (pre-Phase-5 manifests) default to scripts/.\n' printf 'LP_EAGER_FILES=(\n' while IFS= read -r f; do - printf ' "%s"\n' "$f" + # No `local` here — we're inside a `{ … } > FILE` command group, not + # a function. `local` errors out at this scope in bash. + root="${eager_root[$f]:-scripts}" + printf ' "%s:%s"\n' "$root" "$f" done < <(printf '%s\n' "${eager_files[@]}" | sort -u) printf ')\n\n' printf '# Autoload stubs — one per public function. First call sources the\n' printf '# real file (which redefines this stub with the real body), then\n' printf '# re-invokes. Sourced inline instead of eval-in-loop because bash\n' - printf '# parses one large file faster than it evals 700 small snippets.\n' - printf '# Only emitted when the manifest is read; behaviour-neutral when the\n' - printf '# loader does not flip into LP_LAZY=1 mode.\n' + printf '# parses one large file faster than it evals snippets at startup.\n' while IFS= read -r name; do - printf '%s() { source "${install_scripts_dir}%s"; %s "$@"; }\n' \ - "$name" "${fn_to_file[$name]}" "$name" + root="${fn_to_root[$name]}" + case "$root" in + containers) base_var='install_containers_dir' ;; + *) base_var='install_scripts_dir' ;; + esac + printf '%s() { source "${%s}%s"; %s "$@"; }\n' \ + "$name" "$base_var" "${fn_to_file[$name]}" "$name" done < <(printf '%s\n' "${!fn_to_file[@]}" | sort) } > "$OUTPUT" diff --git a/scripts/source/loading/initilize_files.sh b/scripts/source/loading/initilize_files.sh index e549619..2b80528 100755 --- a/scripts/source/loading/initilize_files.sh +++ b/scripts/source/loading/initilize_files.sh @@ -70,20 +70,32 @@ sourceInitilize() else source "$manifest" fi - # Eager-source the side-effect files. These define vars or run - # commands at top level; lazy stubs would skip those side effects. - local _eager + # Eager-source the side-effect files. Entries are `:` + # where root selects the base dir ("scripts" → install_scripts_dir, + # "containers" → install_containers_dir). Pre-Phase-5 manifests + # without a `:` default to scripts/. + local _eager _root _path _base for _eager in "${LP_EAGER_FILES[@]}"; do - [[ -f "${install_scripts_dir}${_eager}" ]] || continue + if [[ "$_eager" == *:* ]]; then + _root="${_eager%%:*}" + _path="${_eager#*:}" + else + _root="scripts"; _path="$_eager" + fi + case "$_root" in + containers) _base="$install_containers_dir" ;; + *) _base="$install_scripts_dir" ;; + esac + [[ -f "${_base}${_path}" ]] || continue if [[ "$LP_LOAD_TRACE" == "1" ]]; then local _t0=$EPOCHREALTIME - source "${install_scripts_dir}${_eager}" + source "${_base}${_path}" local _t1=$EPOCHREALTIME local _ms _ms=$(awk -v a="$_t0" -v b="$_t1" 'BEGIN{printf "%.3f", (b-a)*1000}') - printf '%s\t%s\n' "$_ms" "${_eager} (LAZY-EAGER)" >> "$LP_LOAD_TRACE_FILE" + printf '%s\t%s\n' "$_ms" "${_root}/${_path} (LAZY-EAGER)" >> "$LP_LOAD_TRACE_FILE" else - source "${install_scripts_dir}${_eager}" + source "${_base}${_path}" fi done else @@ -115,8 +127,21 @@ sourceInitilize() done fi - # Loading of all files + # Loading of all files. Three scans: + # libreportal_configs CFG_* vars from configs/* (~180 ms) + # app_configs CFG__* vars from containers/* (~37 ms) + # containers Per-app installer functions (~70 ms) + # + # Under LP_LAZY=1 with a present manifest, the container scan is replaced + # by autoload stubs in function_manifest.sh — sourcing every container + # installer eagerly would defeat the lazy optimisation. The two config + # scans still run because bash can't lazy-load variables (Phase 6 will + # tackle this with a precompiled cache file). sourceScanFiles "libreportal_configs"; sourceScanFiles "app_configs"; - sourceScanFiles "containers"; + if [[ "$LP_LAZY" == "1" ]] && declare -p LP_FN_MAP >/dev/null 2>&1; then + : # containers covered by autoload stubs; skip the eager scan + else + sourceScanFiles "containers"; + fi }