From a572774ca24168f8cdf1e068eb736ab937e2c86f Mon Sep 17 00:00:00 2001 From: Luis-ADFA Date: Mon, 3 Aug 2026 18:31:03 -0600 Subject: [PATCH] ADFA-5008 feat(kiwix): seed k2go_welcome.zim, drop test.zim (post-install) --- .gitattributes | 1 + iiab-android | 32 ++++++++++++++++++ static/zim/README.md | 16 +++++++++ static/zim/k2go_welcome.zim | Bin 0 -> 18993 bytes .../ROOTFS_SIZE_PILOT_ANALYSIS.md | 0 5 files changed, 49 insertions(+) create mode 100644 static/zim/README.md create mode 100644 static/zim/k2go_welcome.zim rename ROOTFS_SIZE_PILOT_ANALYSIS.md => tools/ROOTFS_SIZE_PILOT_ANALYSIS.md (100%) diff --git a/.gitattributes b/.gitattributes index 79847f7f..fcaecb86 100644 --- a/.gitattributes +++ b/.gitattributes @@ -30,3 +30,4 @@ *.zip binary *.tar.gz binary *.meta4 binary +*.zim binary diff --git a/iiab-android b/iiab-android index edfb19c3..f6ff2ae8 100644 --- a/iiab-android +++ b/iiab-android @@ -414,6 +414,35 @@ install_demo_contents() { ok "Demo content processing finished!" } +#----------------------------- +# K2Go welcome ZIM (post-install) +#----------------------------- +# Runs AFTER Ansible, so it never touches state during the role run. The +# upstream iiab/iiab kiwix role drops a placeholder test.zim "when +# kiwix_zims.matched == 0"; here we remove it, drop in our multilingual welcome +# ZIM (shipped in the cloned repo under static/zim/), and rebuild the Kiwix +# library ONCE so library.xml reflects the final state. +install_welcome_zim() { + is_role_enabled "kiwix" || { log "Kiwix off; skipping welcome ZIM."; return 0; } + local src="${K2GO_OPT_DIR}/static/zim/k2go_welcome.zim" + local zim_dir="/library/zims/content" + # Ansible already created this dir when kiwix installed; we never create it. + [ -d "$zim_dir" ] || { warn "No $zim_dir (kiwix not installed?); skipping."; return 0; } + + rm -f "$zim_dir/test.zim" # drop the upstream placeholder + if [ -f "$src" ]; then + cp -a "$src" "$zim_dir/k2go_welcome.zim" # ships in the cloned repo + else + warn "Welcome ZIM not found at $src; nothing installed." + fi + + if command -v iiab-make-kiwix-lib >/dev/null 2>&1; then + iiab-make-kiwix-lib # rebuild library.xml once + else + warn "iiab-make-kiwix-lib not found; library not rebuilt." + fi +} + #----------------------------- # Install IIAB-oA Dashboard #----------------------------- @@ -655,6 +684,9 @@ else log "Skipping the demo content installation (ENABLE_DEMO_CONTENTS=0)." fi +# Replace the upstream placeholder test.zim with the K2Go welcome ZIM. +install_welcome_zim + # Install dashboard install_iiaboa_dashboard diff --git a/static/zim/README.md b/static/zim/README.md new file mode 100644 index 00000000..dd877234 --- /dev/null +++ b/static/zim/README.md @@ -0,0 +1,16 @@ +# static/zim — bundled ZIM assets + +Small ZIM files that ship **with the K2Go repo** and are copied into +`/library/zims/content` at install time (see `install_welcome_zim` in the +top-level `iiab-android` wrapper). + +## k2go_welcome.zim + +A tiny multilingual welcome page (the K2Go logo ringed by "Welcome" in 33 +languages; the footer tagline auto-detects the device language via +`navigator.language`). It replaces the upstream placeholder `test.zim` that +iiab/iiab's kiwix role would otherwise install, so a fresh box always opens on a +branded welcome instead of a blank library. + +`*.zim` is marked `binary` in `.gitattributes`. If the file ever grows large, +consider Git LFS. diff --git a/static/zim/k2go_welcome.zim b/static/zim/k2go_welcome.zim new file mode 100644 index 0000000000000000000000000000000000000000..b9251827cdebc85fd0e56b879c184892f4c4e2aa GIT binary patch literal 18993 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 S#?D$~;LW_|-