From 10ba31acb4316b044cc8fcc42836ca22bae5a92a Mon Sep 17 00:00:00 2001 From: Jan De Landtsheer Date: Wed, 1 Oct 2025 18:06:13 +0200 Subject: [PATCH] docs: regenerate scripts/functionlist.md; refresh NOTES with jump-points and roadmap; extend rfs-flists with RESP backend design. config: add RESP placeholders to rfs.conf.example. components: keep previous non-destructive git clone logic. --- config/rfs.conf.example | 24 ++++- docs/NOTES.md | 77 ++++++++++++- docs/rfs-flists.md | 42 ++++++++ scripts/functionlist.md | 234 +++++++++++++++++++++++++++++----------- 4 files changed, 315 insertions(+), 62 deletions(-) diff --git a/config/rfs.conf.example b/config/rfs.conf.example index 861a068..43b6cb4 100644 --- a/config/rfs.conf.example +++ b/config/rfs.conf.example @@ -54,4 +54,26 @@ READ_SECRET_KEY="REPLACE_ME_READ" # - ROUTE_REGION: region string for Garage (default: garage) ROUTE_ENDPOINT="https://hub.grid.tf" ROUTE_PATH="/zos/store" -ROUTE_REGION="garage" \ No newline at end of file +ROUTE_REGION="garage" +# RESP/DB-style blob store (design-time placeholders; optional) +# Enable to allow pack scripts or future rfs CLI to upload blobs to a RESP-compatible store. +# This does not change the existing S3 flow; RESP acts as an additional backend. +# +# Example URI semantics (see docs/rfs-flists.md additions): +# resp://host:port/db?prefix=blobs +# resp+tls://host:port/db?prefix=blobs&ca=/etc/ssl/certs/ca.pem +# resp+sentinel://sentinelHost:26379/mymaster?prefix=blobs +# +# Minimal keys for a direct RESP endpoint +RESP_ENABLED="false" +RESP_ENDPOINT="localhost:6379" # host:port +RESP_DB="0" # integer DB index +RESP_PREFIX="zos/blobs" # namespace/prefix for content-addressed keys +RESP_USERNAME="" # optional +RESP_PASSWORD="" # optional +RESP_TLS="false" # true/false +RESP_CA="" # path to CA bundle when RESP_TLS=true + +# Optional: Sentinel topology (overrides RESP_ENDPOINT for discovery) +RESP_SENTINEL="" # sentinelHost:port (comma-separated for multiple) +RESP_MASTER="" # Sentinel master name (e.g., "mymaster") \ No newline at end of file diff --git a/docs/NOTES.md b/docs/NOTES.md index 8c025be..e142dcb 100644 --- a/docs/NOTES.md +++ b/docs/NOTES.md @@ -203,4 +203,79 @@ Change Log - Enforce passwordless root using passwd -d -R in finalization. - Normalize INSTALL_DIR/COMPONENTS_DIR/KERNEL_DIR/DIST_DIR to absolute paths post-config load. - Add validation diagnostics prints (input/PWD/PROJECT_ROOT/INSTALL_DIR/resolved). - - Ensure shadow package in container for passwd/chpasswd; keep openssl and openssl-dev; remove perl earlier. \ No newline at end of file + - Ensure shadow package in container for passwd/chpasswd; keep openssl and openssl-dev; remove perl earlier. +Updates 2025-10-01 + +- Function index regenerated: see [scripts/functionlist.md](scripts/functionlist.md) for an authoritative map of all functions with current line numbers. Use it alongside the quick links below to jump into code fast. +- Key jump-points (current lines): + - Finalization: [bash.initramfs_finalize_customization()](scripts/lib/initramfs.sh:568) + - CPIO creation: [bash.initramfs_create_cpio()](scripts/lib/initramfs.sh:691) + - Validation: [bash.initramfs_validate()](scripts/lib/initramfs.sh:820) + - Kernel embed config: [bash.kernel_modify_config_for_initramfs()](scripts/lib/kernel.sh:130) + - Stage orchestrator entry: [bash.main_build_process()](scripts/build.sh:214) + - Repo-wide index: [scripts/functionlist.md](scripts/functionlist.md) + +Roadmap / TODO (tracked in tool todo list) + +- Zosception (zinit service graph and ordering) + - Define additional services and ordering for nested/recursive orchestration. + - Likely integration points: + - Networking readiness before RFS: [config/zinit/network.yaml](config/zinit/network.yaml) + - Early udev coldplug: [config/zinit/udev-trigger.yaml](config/zinit/udev-trigger.yaml) + - Post-RFS coldplug: [config/zinit/udev-rfs.yaml](config/zinit/udev-rfs.yaml) + - Ensure dependency edges are correct in the service DAG image (see docs/img_*.png). + +- Add zosstorage to initramfs + - Source: + - If packaged: add to [config/packages.list](config/packages.list). + - If built from source: extend [bash.components_parse_sources_conf()](scripts/lib/components.sh:13) and add a build_* function; install via [bash.initramfs_copy_components()](scripts/lib/initramfs.sh:102). + - Zinit unit: + - Add YAML under [config/zinit/](config/zinit/) and hook into the network-ready path. + - Ordering: + - Start after "network" and before/with RFS mounts if it provides storage functionality used by rfs. + +- RFS blob store backends (design + docs; http and s3 exist) + - Current S3 store URI construction: [bash.rfs_common_build_s3_store_uri()](scripts/rfs/common.sh:137) + - Flist manifest store patching: [bash.rfs_common_patch_flist_stores()](scripts/rfs/common.sh:385) + - Route URL patching: [bash.rfs_common_patch_flist_route_url()](scripts/rfs/common.sh:494) + - Packers entrypoints: + - [scripts/rfs/pack-modules.sh](scripts/rfs/pack-modules.sh:1) + - [scripts/rfs/pack-firmware.sh](scripts/rfs/pack-firmware.sh:1) + - Proposed additional backend: RESP/DB-style store + - Goal: Allow rfs to push/fetch content-addressed blobs via a RESP-compatible endpoint (e.g., Redis/KeyDB/Dragonfly-like), or a thin HTTP/RESP adapter. + - Draft URI scheme examples: + - resp://host:port/db?tls=0&prefix=blobs + - resp+tls://host:port/db?prefix=blobs&ca=/etc/ssl/certs/ca.pem + - resp+sentinel://sentinelHost:26379/mymaster?prefix=blobs + - Minimum operations: + - PUT blob: SETEX prefix/ab/cd/hash ttl file-bytes or HSET prefix/hash data file-bytes + - GET blob: GET or HGET + - HEAD/exists: EXISTS + - Optional: pipelined/mget for batch prefetch + - Client integration layers: + - Pack-time: extend rfs CLI store resolver (design doc first; scripts/rfs/common.sh can map scheme→uploader if CLI not ready). + - Manifest post-process: still supported; stores table may include multiple URIs (s3 + resp) for redundancy. + - Caching and retries: + - Local on-disk cache under dist/.rfs-cache keyed by hash with LRU GC. + - Exponential backoff on GET failures; fall back across stores in order. + - Auth: + - RESP: optional username/password in URI; TLS with cert pinning parameters. + - Keep secrets in config/rfs.conf or env; do not embed write creds in manifests (read-credential routes only). + - Deliverables: + - Design section in docs/rfs-flists.md (to be added) + - Config keys in config/rfs.conf.example for RESP endpoints + - Optional shim uploader script if CLI support lags. + +- Documentation refresh tasks + - Cross-check this file’s clickable references against [scripts/functionlist.md](scripts/functionlist.md) after changes in lib files. + - Keep “Branding behavior” and “Absolute Path Normalization” pointers aligned with: + - [bash.common.sh normalization](scripts/lib/common.sh:244) + - [bash.initramfs_finalize_customization()](scripts/lib/initramfs.sh:568) + +Diagnostics-first reminder + +- Use DEBUG=1 and stage markers for minimal rebuilds. +- Quick commands: + - Show stages: ./scripts/build.sh --show-stages + - Minimal rebuild after zinit/init edits: [scripts/rebuild-after-zinit.sh](scripts/rebuild-after-zinit.sh) + - Validate archive: [bash.initramfs_create_cpio()](scripts/lib/initramfs.sh:691), then [bash.initramfs_test_archive()](scripts/lib/initramfs.sh:953) diff --git a/docs/rfs-flists.md b/docs/rfs-flists.md index bdd24b6..19fdb49 100644 --- a/docs/rfs-flists.md +++ b/docs/rfs-flists.md @@ -165,3 +165,45 @@ Use the helper to inspect a manifest, optionally listing entries and testing a l - scripts/rfs/verify-flist.sh -m dist/flists/firmware-latest.fl --tree - Inspect + mount test to a temp dir: - sudo scripts/rfs/verify-flist.sh -m dist/flists/modules-6.12.44-Zero-OS.fl --mount + +## Additional blob store backends (design) + +This extends the existing S3/HTTP approach with a RESP/DB-style backend option for rfs blob storage. It is a design-only addition; CLI and scripts will be extended in a follow-up. + +Scope +- Keep S3 flow intact via [scripts/rfs/common.sh](scripts/rfs/common.sh:137), [scripts/rfs/common.sh](scripts/rfs/common.sh:385), and [scripts/rfs/common.sh](scripts/rfs/common.sh:494). +- Introduce RESP URIs that can be encoded in config and, later, resolved by rfs or a thin uploader shim invoked by: + - [scripts/rfs/pack-modules.sh](scripts/rfs/pack-modules.sh:1) + - [scripts/rfs/pack-firmware.sh](scripts/rfs/pack-firmware.sh:1) + +URI schemes (draft) +- resp://host:port/db?prefix=blobs +- resp+tls://host:port/db?prefix=blobs&ca=/etc/ssl/certs/ca.pem +- resp+sentinel://sentinelHost:26379/mymaster?prefix=blobs +- Credentials may be provided via URI userinfo or config (recommended: config only). + +Operations (minimal set) +- PUT blob: write content-addressed key (e.g., prefix/ab/cd/hash) +- GET blob: fetch by exact key +- Exists/HEAD: presence test by key +- Optional batching: pipelined MGET for prefetch + +Config keys (see example additions in config/rfs.conf.example) +- RESP_ENDPOINT (host:port), RESP_DB (integer), RESP_PREFIX (path namespace) +- RESP_USERNAME/RESP_PASSWORD (optional), RESP_TLS=0/1 (+ RESP_CA if needed) +- RESP_SENTINEL and RESP_MASTER for sentinel deployments + +Manifests and routes +- Keep S3 store in flist stores table (fallback) while enabling route.url patching to HTTP/S3 for read-only access: + - Patch stores table as today via [scripts/rfs/common.sh](scripts/rfs/common.sh:385) + - Patch route.url as today via [scripts/rfs/common.sh](scripts/rfs/common.sh:494) +- RESP may be used primarily for pack-time blob uploads or as an additional store the CLI can consume later. + +Security +- Do not embed write credentials in manifests. +- Read-only credentials may be embedded in route.url if required, mirroring S3 pattern. + +Next steps +- Implement RESP uploader shim called from pack scripts; keep the CLI S3 flow unchanged. +- Extend config loader in [scripts/rfs/common.sh](scripts/rfs/common.sh:82) to parse RESP_* variables. +- Add verification routines to sanity-check connectivity before pack. diff --git a/scripts/functionlist.md b/scripts/functionlist.md index bafb772..c73b6b7 100644 --- a/scripts/functionlist.md +++ b/scripts/functionlist.md @@ -1,55 +1,141 @@ -# Function List - scripts/lib Library +# Function List - Repository (scripts and libraries) -This document lists all functions currently defined under [scripts/lib](scripts/lib) with their source locations. +This document lists functions defined under scripts/ and scripts/lib with source locations. +Regenerated from repository on 2025-10-01. -## alpine.sh - Alpine Linux operations -File: [scripts/lib/alpine.sh](scripts/lib/alpine.sh) -- [alpine_extract_miniroot()](scripts/lib/alpine.sh:14) - Download and extract Alpine miniroot -- [alpine_setup_chroot()](scripts/lib/alpine.sh:70) - Setup chroot mounts and resolv.conf -- [alpine_cleanup_chroot()](scripts/lib/alpine.sh:115) - Unmount chroot mounts -- [alpine_install_packages()](scripts/lib/alpine.sh:142) - Install packages from packages.list -- [alpine_aggressive_cleanup()](scripts/lib/alpine.sh:211) - Reduce image size by removing docs/locales/etc -- [alpine_configure_repos()](scripts/lib/alpine.sh:321) - Configure APK repositories -- [alpine_configure_system()](scripts/lib/alpine.sh:339) - Configure hostname, hosts, timezone, profile -- [alpine_install_firmware()](scripts/lib/alpine.sh:392) - Install required firmware packages +## Top-level build scripts + +File: [scripts/build.sh](scripts/build.sh) +- [show_usage()](scripts/build.sh:49) +- [parse_arguments()](scripts/build.sh:88) +- [setup_build_environment()](scripts/build.sh:133) +- [verify_configuration_files()](scripts/build.sh:174) +- [main_build_process()](scripts/build.sh:214) +- [stage_alpine_extract()](scripts/build.sh:223) +- [stage_alpine_configure()](scripts/build.sh:227) +- [stage_alpine_packages()](scripts/build.sh:232) +- [stage_alpine_firmware()](scripts/build.sh:236) +- [stage_components_build()](scripts/build.sh:240) +- [stage_components_verify()](scripts/build.sh:244) +- [stage_kernel_modules()](scripts/build.sh:248) +- [stage_zinit_setup()](scripts/build.sh:265) +- [stage_init_script()](scripts/build.sh:269) +- [stage_components_copy()](scripts/build.sh:273) +- [stage_modules_setup()](scripts/build.sh:277) +- [stage_modules_copy()](scripts/build.sh:286) +- [stage_rfs_flists()](scripts/build.sh:299) +- [stage_cleanup()](scripts/build.sh:366) +- [stage_validation()](scripts/build.sh:370) +- [stage_initramfs_create()](scripts/build.sh:374) +- [stage_initramfs_test()](scripts/build.sh:385) +- [stage_kernel_build()](scripts/build.sh:398) +- [stage_boot_tests()](scripts/build.sh:415) +- [main()](scripts/build.sh:470) + +File: [scripts/clean.sh](scripts/clean.sh) +- [show_usage()](scripts/clean.sh:21) +- [parse_arguments()](scripts/clean.sh:50) +- [clean_build_artifacts()](scripts/clean.sh:90) +- [clean_downloads()](scripts/clean.sh:127) +- [clean_container_images()](scripts/clean.sh:155) +- [show_space_recovery()](scripts/clean.sh:176) +- [verify_cleanup()](scripts/clean.sh:203) +- [main()](scripts/clean.sh:240) + +File: [scripts/dev-container.sh](scripts/dev-container.sh) +- [show_usage()](scripts/dev-container.sh:19) +- [ensure_builder_image()](scripts/dev-container.sh:44) +- [dev_container_start()](scripts/dev-container.sh:70) +- [dev_container_stop()](scripts/dev-container.sh:109) +- [dev_container_shell()](scripts/dev-container.sh:121) +- [dev_container_build()](scripts/dev-container.sh:139) +- [dev_container_clean()](scripts/dev-container.sh:168) +- [dev_container_status()](scripts/dev-container.sh:180) +- [dev_container_logs()](scripts/dev-container.sh:202) +- [main()](scripts/dev-container.sh:214) + +File: [scripts/make-grub-usb.sh](scripts/make-grub-usb.sh) +- [error()](scripts/make-grub-usb.sh:45) +- [info()](scripts/make-grub-usb.sh:46) +- [warn()](scripts/make-grub-usb.sh:47) +- [die()](scripts/make-grub-usb.sh:48) +- [require_root()](scripts/make-grub-usb.sh:50) +- [command_exists()](scripts/make-grub-usb.sh:54) +- [parse_args()](scripts/make-grub-usb.sh:56) +- [confirm_dangerous()](scripts/make-grub-usb.sh:81) +- [check_prereqs()](scripts/make-grub-usb.sh:93) +- [resolve_defaults()](scripts/make-grub-usb.sh:101) +- [umount_partitions()](scripts/make-grub-usb.sh:116) +- [partition_device_gpt()](scripts/make-grub-usb.sh:139) +- [format_esp()](scripts/make-grub-usb.sh:158) +- [mount_esp()](scripts/make-grub-usb.sh:165) +- [install_grub()](scripts/make-grub-usb.sh:171) +- [copy_kernel_initrd()](scripts/make-grub-usb.sh:180) +- [write_grub_cfg()](scripts/make-grub-usb.sh:190) +- [cleanup()](scripts/make-grub-usb.sh:226) +- [main()](scripts/make-grub-usb.sh:235) + +File: [scripts/rebuild-after-zinit.sh](scripts/rebuild-after-zinit.sh) +- [log()](scripts/rebuild-after-zinit.sh:17) +- [in_container()](scripts/rebuild-after-zinit.sh:67) +- [check_dir_changed()](scripts/rebuild-after-zinit.sh:81) +- [list_some_changes()](scripts/rebuild-after-zinit.sh:89) +- [compute_full_kver()](scripts/rebuild-after-zinit.sh:131) +- [modules_dir_for_full()](scripts/rebuild-after-zinit.sh:146) + +File: [scripts/test.sh](scripts/test.sh) +- [show_usage()](scripts/test.sh:20) +- [parse_arguments()](scripts/test.sh:46) +- [run_tests()](scripts/test.sh:105) +- [main()](scripts/test.sh:182) + +## Library scripts -## common.sh - Core utilities File: [scripts/lib/common.sh](scripts/lib/common.sh) - [log_info()](scripts/lib/common.sh:31) - [log_warn()](scripts/lib/common.sh:36) - [log_error()](scripts/lib/common.sh:41) - [log_debug()](scripts/lib/common.sh:46) - [safe_execute()](scripts/lib/common.sh:54) -- [section_header()](scripts/lib/common.sh:79) -- [command_exists()](scripts/lib/common.sh:89) -- [in_container()](scripts/lib/common.sh:94) -- [check_dependencies()](scripts/lib/common.sh:99) -- [safe_mkdir()](scripts/lib/common.sh:142) -- [safe_rmdir()](scripts/lib/common.sh:149) -- [safe_copy()](scripts/lib/common.sh:158) -- [is_absolute_path()](scripts/lib/common.sh:166) -- [resolve_path()](scripts/lib/common.sh:171) -- [get_file_size()](scripts/lib/common.sh:181) -- [wait_for_file()](scripts/lib/common.sh:191) -- [cleanup_on_exit()](scripts/lib/common.sh:205) +- [safe_execute_stream()](scripts/lib/common.sh:77) +- [section_header()](scripts/lib/common.sh:87) +- [command_exists()](scripts/lib/common.sh:97) +- [in_container()](scripts/lib/common.sh:102) +- [check_dependencies()](scripts/lib/common.sh:107) +- [safe_mkdir()](scripts/lib/common.sh:150) +- [safe_rmdir()](scripts/lib/common.sh:157) +- [safe_copy()](scripts/lib/common.sh:166) +- [is_absolute_path()](scripts/lib/common.sh:174) +- [resolve_path()](scripts/lib/common.sh:179) +- [get_file_size()](scripts/lib/common.sh:189) +- [wait_for_file()](scripts/lib/common.sh:199) +- [cleanup_on_exit()](scripts/lib/common.sh:213) + +File: [scripts/lib/alpine.sh](scripts/lib/alpine.sh) +- [alpine_extract_miniroot()](scripts/lib/alpine.sh:14) +- [alpine_setup_chroot()](scripts/lib/alpine.sh:70) +- [alpine_cleanup_chroot()](scripts/lib/alpine.sh:115) +- [alpine_install_packages()](scripts/lib/alpine.sh:142) +- [alpine_aggressive_cleanup()](scripts/lib/alpine.sh:211) +- [alpine_configure_repos()](scripts/lib/alpine.sh:321) +- [alpine_configure_system()](scripts/lib/alpine.sh:339) +- [alpine_install_firmware()](scripts/lib/alpine.sh:392) -## components.sh - Component management File: [scripts/lib/components.sh](scripts/lib/components.sh) - [components_parse_sources_conf()](scripts/lib/components.sh:13) - [components_download_git()](scripts/lib/components.sh:72) -- [components_download_release()](scripts/lib/components.sh:104) -- [components_process_extra_options()](scripts/lib/components.sh:144) -- [components_build_component()](scripts/lib/components.sh:183) -- [components_setup_rust_env()](scripts/lib/components.sh:217) -- [build_zinit()](scripts/lib/components.sh:252) -- [build_rfs()](scripts/lib/components.sh:299) -- [build_mycelium()](scripts/lib/components.sh:346) -- [install_rfs()](scripts/lib/components.sh:386) -- [install_corex()](scripts/lib/components.sh:409) -- [components_verify_installation()](scripts/lib/components.sh:436) -- [components_cleanup()](scripts/lib/components.sh:472) +- [components_download_release()](scripts/lib/components.sh:174) +- [components_process_extra_options()](scripts/lib/components.sh:214) +- [components_build_component()](scripts/lib/components.sh:253) +- [components_setup_rust_env()](scripts/lib/components.sh:287) +- [build_zinit()](scripts/lib/components.sh:322) +- [build_rfs()](scripts/lib/components.sh:369) +- [build_mycelium()](scripts/lib/components.sh:417) +- [install_rfs()](scripts/lib/components.sh:457) +- [install_corex()](scripts/lib/components.sh:480) +- [components_verify_installation()](scripts/lib/components.sh:507) +- [components_cleanup()](scripts/lib/components.sh:543) -## docker.sh - Container runtime management File: [scripts/lib/docker.sh](scripts/lib/docker.sh) - [docker_detect_runtime()](scripts/lib/docker.sh:14) - [docker_verify_rootless()](scripts/lib/docker.sh:33) @@ -58,36 +144,34 @@ File: [scripts/lib/docker.sh](scripts/lib/docker.sh) - [docker_start_rootless()](scripts/lib/docker.sh:116) - [docker_run_build()](scripts/lib/docker.sh:154) - [docker_commit_builder()](scripts/lib/docker.sh:196) -- [docker_cleanup()](scripts/lib/docker.sh:208) +- [docker_cleanup()](scripts/lib/docker.sh:209) - [docker_check_capabilities()](scripts/lib/docker.sh:248) - [docker_setup_rootless()](scripts/lib/docker.sh:279) -## initramfs.sh - Initramfs assembly File: [scripts/lib/initramfs.sh](scripts/lib/initramfs.sh) - [initramfs_setup_zinit()](scripts/lib/initramfs.sh:13) -- [initramfs_install_init_script()](scripts/lib/initramfs.sh:70) -- [initramfs_copy_components()](scripts/lib/initramfs.sh:97) -- [initramfs_setup_modules()](scripts/lib/initramfs.sh:225) -- [initramfs_resolve_module_dependencies()](scripts/lib/initramfs.sh:313) -- [initramfs_create_module_scripts()](scripts/lib/initramfs.sh:422) -- [initramfs_strip_and_upx()](scripts/lib/initramfs.sh:486) -- [initramfs_finalize_customization()](scripts/lib/initramfs.sh:569) -- [initramfs_create_cpio()](scripts/lib/initramfs.sh:642) -- [initramfs_validate()](scripts/lib/initramfs.sh:710) -- [initramfs_test_archive()](scripts/lib/initramfs.sh:809) -- [initramfs_copy_resolved_modules()](scripts/lib/initramfs.sh:846) +- [initramfs_install_init_script()](scripts/lib/initramfs.sh:75) +- [initramfs_copy_components()](scripts/lib/initramfs.sh:102) +- [initramfs_setup_modules()](scripts/lib/initramfs.sh:230) +- [initramfs_resolve_module_dependencies()](scripts/lib/initramfs.sh:312) + - [resolve_single_module()](scripts/lib/initramfs.sh:348) +- [initramfs_create_module_scripts()](scripts/lib/initramfs.sh:421) +- [initramfs_strip_and_upx()](scripts/lib/initramfs.sh:485) +- [initramfs_finalize_customization()](scripts/lib/initramfs.sh:568) +- [initramfs_create_cpio()](scripts/lib/initramfs.sh:691) +- [initramfs_validate()](scripts/lib/initramfs.sh:820) +- [initramfs_test_archive()](scripts/lib/initramfs.sh:953) +- [initramfs_copy_resolved_modules()](scripts/lib/initramfs.sh:991) -## kernel.sh - Kernel building File: [scripts/lib/kernel.sh](scripts/lib/kernel.sh) - [kernel_get_full_version()](scripts/lib/kernel.sh:14) - [kernel_download_source()](scripts/lib/kernel.sh:28) - [kernel_apply_config()](scripts/lib/kernel.sh:82) -- [kernel_modify_config_for_initramfs()](scripts/lib/kernel.sh:129) +- [kernel_modify_config_for_initramfs()](scripts/lib/kernel.sh:130) - [kernel_build_with_initramfs()](scripts/lib/kernel.sh:174) -- [kernel_build_modules()](scripts/lib/kernel.sh:228) -- [kernel_cleanup()](scripts/lib/kernel.sh:284) +- [kernel_build_modules()](scripts/lib/kernel.sh:243) +- [kernel_cleanup()](scripts/lib/kernel.sh:298) -## stages.sh - Build stage tracking File: [scripts/lib/stages.sh](scripts/lib/stages.sh) - [stages_init()](scripts/lib/stages.sh:12) - [stage_is_completed()](scripts/lib/stages.sh:33) @@ -97,16 +181,46 @@ File: [scripts/lib/stages.sh](scripts/lib/stages.sh) - [stage_run()](scripts/lib/stages.sh:99) - [stages_status()](scripts/lib/stages.sh:134) -## testing.sh - Boot testing File: [scripts/lib/testing.sh](scripts/lib/testing.sh) - [testing_qemu_boot()](scripts/lib/testing.sh:14) - [testing_qemu_basic_boot()](scripts/lib/testing.sh:55) - [testing_qemu_serial_boot()](scripts/lib/testing.sh:90) -- [testing_qemu_interactive_boot()](scripts/lib/testing.sh:113) +- [testing_qemu_interactive_boot()](scripts/lib/testing.sh:114) - [testing_cloud_hypervisor_boot()](scripts/lib/testing.sh:135) -- [testing_cloud_hypervisor_basic()](scripts/lib/testing.sh:171) +- [testing_cloud_hypervisor_basic()](scripts/lib/testing.sh:172) - [testing_cloud_hypervisor_serial()](scripts/lib/testing.sh:206) -- [testing_analyze_boot_log()](scripts/lib/testing.sh:227) +- [testing_analyze_boot_log()](scripts/lib/testing.sh:228) - [testing_run_all()](scripts/lib/testing.sh:299) +## RFS tooling +File: [scripts/rfs/common.sh](scripts/rfs/common.sh) +- [rfs_common_project_root()](scripts/rfs/common.sh:12) +- [rfs_common_load_build_kernel_version()](scripts/rfs/common.sh:42) +- [rfs_common_load_rfs_s3_config()](scripts/rfs/common.sh:82) +- [rfs_common_build_s3_store_uri()](scripts/rfs/common.sh:137) +- [rfs_common_locate_rfs()](scripts/rfs/common.sh:171) +- [rfs_common_require_sqlite3()](scripts/rfs/common.sh:198) +- [rfs_common_locate_modules_dir()](scripts/rfs/common.sh:214) +- [rfs_common_locate_firmware_dir()](scripts/rfs/common.sh:244) +- [rfs_common_validate_modules_metadata()](scripts/rfs/common.sh:264) +- [rfs_common_install_all_alpine_firmware_packages()](scripts/rfs/common.sh:298) +- [rfs_common_patch_flist_stores()](scripts/rfs/common.sh:385) +- [rfs_common_build_route_url()](scripts/rfs/common.sh:453) +- [rfs_common_patch_flist_route_url()](scripts/rfs/common.sh:494) +- [rfs_common_prepare_output()](scripts/rfs/common.sh:525) +- [rfs_common_firmware_tag()](scripts/rfs/common.sh:533) + +File: [scripts/rfs/pack-modules.sh](scripts/rfs/pack-modules.sh) +- [section()](scripts/rfs/pack-modules.sh:15) + +File: [scripts/rfs/pack-firmware.sh](scripts/rfs/pack-firmware.sh) +- [section()](scripts/rfs/pack-firmware.sh:17) + +File: [scripts/rfs/verify-flist.sh](scripts/rfs/verify-flist.sh) +- [usage()](scripts/rfs/verify-flist.sh:11) +- [section()](scripts/rfs/verify-flist.sh:26) + +Notes: +- Line numbers reflect current repository state; re-run generation after edits. +- Nested/local functions are included under their parent section when applicable.