From a4715debe8bd21ab724a2f6531f4126d837a54cb Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Fri, 27 Feb 2026 13:54:06 +0100 Subject: [PATCH 01/10] cli: fix 'container upgrade ' command completion Signed-off-by: Joachim Wiberg --- src/klish-plugin-infix/xml/containers.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/klish-plugin-infix/xml/containers.xml b/src/klish-plugin-infix/xml/containers.xml index 4b73f607..4360e1b5 100644 --- a/src/klish-plugin-infix/xml/containers.xml +++ b/src/klish-plugin-infix/xml/containers.xml @@ -178,7 +178,7 @@ - + doas container upgrade $KLISH_PARAM_name From 8fac3720fb89c535a27a2aaf2f45e13ac498b353 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sun, 1 Mar 2026 03:28:58 +0100 Subject: [PATCH 02/10] board/common: fix container force option for upgrade Signed-off-by: Joachim Wiberg --- board/common/rootfs/usr/sbin/container | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/board/common/rootfs/usr/sbin/container b/board/common/rootfs/usr/sbin/container index 4c7dfbb8..1791e935 100755 --- a/board/common/rootfs/usr/sbin/container +++ b/board/common/rootfs/usr/sbin/container @@ -23,7 +23,7 @@ dir="" all="" env="" port="" -force= +force=${force:-} # Variable shared across subshells export meta_sha="" @@ -227,7 +227,7 @@ fetch() if out=$(eval "$cmd" 2>&1); then log "$file downloaded successfully." - if check "$file"; then + if [ -n "$force" ] || check "$file"; then echo "$dst" return 0 fi @@ -1108,7 +1108,8 @@ case $cmd in # Remove the old image if it's not used by any other containers if [ -n "$old_image_id" ]; then # Check if the old image is still in use by any containers - if ! podman ps -a --format '{{.ImageID}}' | grep -q "^${old_image_id}$"; then + old_image_id=${old_image_id:0:12} + if ! podman ps -a --format '{{.ImageID}}' | grep -q "^${old_image_id}"; then log "Removing old image $old_image_id" podman rmi "$old_image_id" 2>/dev/null || true else @@ -1251,7 +1252,7 @@ case $cmd in echo "done" # Set force flag to ensure fresh pull/fetch of image - force="-f" + export force="-f" # For remote images, force re-pull case "$img" in @@ -1273,14 +1274,17 @@ case $cmd in # Recreate container by running the script echo ">> Recreating container ..." if ! "$script"; then + force= echo ">> Failed recreating container $name" exit 1 fi + force= # Remove the old image if it's not used by any other containers if [ -n "$old_image_id" ]; then # Check if the old image is still in use by any containers - if ! podman ps -a --format '{{.ImageID}}' | grep -q "^${old_image_id}$"; then + old_image_id=${old_image_id:0:12} + if ! podman ps -a --format '{{.ImageID}}' | grep -q "^${old_image_id}"; then log "Removing old image $old_image_id" podman rmi "$old_image_id" 2>/dev/null || true else From a5687bda7ff5b6a3f4b6007231528d6eeee6f35e Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sun, 1 Mar 2026 04:08:14 +0100 Subject: [PATCH 03/10] cli: add support for --reset-volumes on container upgrade The weird `if env | grep -q 'reset-volumes'` construct is due to Klish not sanitizing names before constructing variables, which leads to env variables with '-' in them, not allowed in POSIX sh. Signed-off-by: Joachim Wiberg --- board/common/rootfs/usr/sbin/container | 18 ++++++++++++++++++ src/klish-plugin-infix/xml/containers.xml | 8 +++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/board/common/rootfs/usr/sbin/container b/board/common/rootfs/usr/sbin/container index 1791e935..4bc99d9a 100755 --- a/board/common/rootfs/usr/sbin/container +++ b/board/common/rootfs/usr/sbin/container @@ -24,6 +24,7 @@ all="" env="" port="" force=${force:-} +reset_volumes= # Variable shared across subshells export meta_sha="" @@ -897,6 +898,9 @@ while [ "$1" != "" ]; do shift restart=$1 ;; + -R | --reset-volumes) + reset_volumes=true + ;; -s | --simple) simple=true ;; @@ -1251,6 +1255,20 @@ case $cmd in container stop "$name" echo "done" + # If --reset-volumes requested, delete named volumes so they re-initialize from new image + if [ -n "$reset_volumes" ]; then + printf ">> Resetting named volumes (all configuration will be lost): " + grep -oE -- '-v [^ ]+' "$script" | awk '{print $2}' | cut -d: -f1 | \ + while read -r vol_name; do + if podman volume exists "$vol_name" 2>/dev/null; then + printf "%s " "$vol_name" + log "Removing volume $vol_name" + podman volume rm -f "$vol_name" >/dev/null || true + fi + done + echo "done" + fi + # Set force flag to ensure fresh pull/fetch of image export force="-f" diff --git a/src/klish-plugin-infix/xml/containers.xml b/src/klish-plugin-infix/xml/containers.xml index 4360e1b5..8691a75b 100644 --- a/src/klish-plugin-infix/xml/containers.xml +++ b/src/klish-plugin-infix/xml/containers.xml @@ -179,8 +179,14 @@ + + + - doas container upgrade $KLISH_PARAM_name + if env | grep -q 'reset-volumes' >/dev/null; then + opt="-R" + fi + doas container $opt upgrade $KLISH_PARAM_name From cbe8315508581346844eb4caf89255a9f8616ed9 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sun, 1 Mar 2026 06:56:50 +0100 Subject: [PATCH 04/10] cli: simplify 'show bfd [peer_addr]' -> 'show bfd [peer]' Signed-off-by: Joachim Wiberg --- src/klish-plugin-infix/xml/infix.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/klish-plugin-infix/xml/infix.xml b/src/klish-plugin-infix/xml/infix.xml index bce73835..79b4b00e 100644 --- a/src/klish-plugin-infix/xml/infix.xml +++ b/src/klish-plugin-infix/xml/infix.xml @@ -461,7 +461,7 @@ echo "Public: $pub" peer - + @@ -471,7 +471,7 @@ echo "Public: $pub" BRIEF_ARG="brief" fi # Pass subcommand, optional peer address, and brief flag - show bfd ${KLISH_PARAM_subcommand:+"$KLISH_PARAM_subcommand"} ${KLISH_PARAM_peer_addr:+"$KLISH_PARAM_peer_addr"} ${BRIEF_ARG:+"$BRIEF_ARG"} |pager + show bfd ${KLISH_PARAM_subcommand:+"$KLISH_PARAM_subcommand"} ${KLISH_PARAM_peer:+"$KLISH_PARAM_peer"} ${BRIEF_ARG:+"$BRIEF_ARG"} |pager From b341d372677a279f2b55551db5b70bbc57c73db0 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sun, 1 Mar 2026 04:22:12 +0100 Subject: [PATCH 05/10] Update URL from kernelkit.org to www.kernelkit.org DNS does not allow CNAME records at an apex domain (e.g. kernelkit.org), so GitHub Pages cannot reliably redirect kernelkit.github.io to it. A www subdomain can carry a CNAME pointing directly to kernelkit.github.io, giving GitHub full control over the mapping and making the redirect work. Signed-off-by: Joachim Wiberg --- README.md | 4 ++-- board/aarch64/bananapi-bpi-r3/README.md | 4 ++-- board/aarch64/raspberrypi-rpi64/README.md | 12 ++++++------ board/arm/microchip-sama7g54-ek/README.md | 2 +- board/arm/raspberrypi-rpi2/README.md | 2 +- board/common/image/image-itb-gns3a/generate.sh | 2 +- board/common/image/image-readme/README.md | 2 +- board/common/rootfs/etc/motd | 2 +- configs/aarch64_defconfig | 4 ++-- configs/aarch64_minimal_defconfig | 4 ++-- configs/arm_defconfig | 4 ++-- configs/arm_minimal_defconfig | 4 ++-- configs/riscv64_defconfig | 4 ++-- configs/x86_64_defconfig | 4 ++-- configs/x86_64_minimal_defconfig | 4 ++-- doc/ChangeLog.md | 4 ++-- doc/discovery.md | 4 ++-- doc/management.md | 2 +- doc/scripting-prod.md | 2 +- doc/scripting.md | 2 +- doc/testing.md | 2 +- doc/upgrade.md | 2 +- mkdocs.yml | 2 +- test/case/statd/system/system/rootfs/etc/os-release | 4 ++-- 24 files changed, 41 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index dd1511d3..03aaa26b 100644 --- a/README.md +++ b/README.md @@ -167,8 +167,8 @@ APIs. [0]: https://www.kernel.org [1]: https://buildroot.org/ "Buildroot Homepage" [2]: https://www.sysrepo.org/ "Sysrepo Homepage" -[3]: https://kernelkit.org/infix/latest/cli/introduction/ -[4]: https://kernelkit.org/infix/ +[3]: https://www.kernelkit.org/infix/latest/cli/introduction/ +[4]: https://www.kernelkit.org/infix/ [5]: https://github.com/kernelkit/infix/releases [Latest Build]: https://github.com/kernelkit/infix/releases/tag/latest "Latest build" [License]: https://en.wikipedia.org/wiki/GPL_license diff --git a/board/aarch64/bananapi-bpi-r3/README.md b/board/aarch64/bananapi-bpi-r3/README.md index fa1a9537..be92ea28 100644 --- a/board/aarch64/bananapi-bpi-r3/README.md +++ b/board/aarch64/bananapi-bpi-r3/README.md @@ -262,8 +262,8 @@ make aarch64 ./utils/mkimage.sh -odt emmc bananapi-bpi-r3 ``` -[0]: https://kernelkit.org/posts/flashing-sdcard/ -[1]: https://kernelkit.org/infix/latest/ +[0]: https://www.kernelkit.org/posts/flashing-sdcard/ +[1]: https://www.kernelkit.org/infix/latest/ [2]: https://github.com/kernelkit/infix/releases/download/latest-boot/infix-bpi-r3-sdcard.img [3]: https://github.com/kernelkit/infix/releases/download/latest-boot/infix-bpi-r3-emmc.img [4]: https://github.com/kernelkit/infix/releases/download/latest-boot/bpi-r3-emmc-boot-2025.01-latest.tar.gz diff --git a/board/aarch64/raspberrypi-rpi64/README.md b/board/aarch64/raspberrypi-rpi64/README.md index 4619d12c..711bc2eb 100644 --- a/board/aarch64/raspberrypi-rpi64/README.md +++ b/board/aarch64/raspberrypi-rpi64/README.md @@ -312,13 +312,13 @@ While capable of basic routing tasks, be aware of limitations: For applications requiring multiple ports or high performance, consider dedicated networking hardware like the [Banana Pi R3][12]. -[0]: https://kernelkit.org/posts/flashing-sdcard/ -[1]: https://kernelkit.org/infix/latest/ +[0]: https://www.kernelkit.org/posts/flashing-sdcard/ +[1]: https://www.kernelkit.org/infix/latest/ [2]: https://github.com/kernelkit/infix/releases/download/latest-boot/infix-rpi64-sdcard.img -[3]: https://kernelkit.org/infix/latest/container/#content-mounts -[4]: https://kernelkit.org/infix/latest/scripting-restconf/ +[3]: https://www.kernelkit.org/infix/latest/container/#content-mounts +[4]: https://www.kernelkit.org/infix/latest/scripting-restconf/ [8]: https://github.com/kernelkit/infix/releases/tag/latest-boot -[9]: https://kernelkit.org/infix/latest/networking/#wifi +[9]: https://www.kernelkit.org/infix/latest/networking/#wifi [10]: https://www.raspberrypi.com/products/raspberry-pi-touch-display/ [11]: https://www.raspberrypi.com/documentation/ -[12]: https://kernelkit.org/infix/latest/hardware/#banana-pi-bpi-r3 +[12]: https://www.kernelkit.org/infix/latest/hardware/#banana-pi-bpi-r3 diff --git a/board/arm/microchip-sama7g54-ek/README.md b/board/arm/microchip-sama7g54-ek/README.md index 11926ab3..3dcabb3e 100644 --- a/board/arm/microchip-sama7g54-ek/README.md +++ b/board/arm/microchip-sama7g54-ek/README.md @@ -112,5 +112,5 @@ Connect a USB-to-serial adapter to the board's debug UART header. > [!WARNING] > Use only 3.3V serial adapters. -[0]: https://kernelkit.org/posts/flashing-sdcard/ +[0]: https://www.kernelkit.org/posts/flashing-sdcard/ [1]: https://www.microchip.com/en-us/development-tool/EV21H18A diff --git a/board/arm/raspberrypi-rpi2/README.md b/board/arm/raspberrypi-rpi2/README.md index fc9f6021..d1eb8920 100644 --- a/board/arm/raspberrypi-rpi2/README.md +++ b/board/arm/raspberrypi-rpi2/README.md @@ -91,5 +91,5 @@ Serial settings: 115200 8N1 > [!WARNING] > Use only 3.3V serial adapters. 5V adapters will damage your Raspberry Pi! -[0]: https://kernelkit.org/posts/flashing-sdcard/ +[0]: https://www.kernelkit.org/posts/flashing-sdcard/ [1]: https://www.raspberrypi.com/products/raspberry-pi-2-model-b/ diff --git a/board/common/image/image-itb-gns3a/generate.sh b/board/common/image/image-itb-gns3a/generate.sh index ada7ce95..d26a8cbe 100755 --- a/board/common/image/image-itb-gns3a/generate.sh +++ b/board/common/image/image-itb-gns3a/generate.sh @@ -12,7 +12,7 @@ cat <"${gns3a}" "category": "router", "description": "${ARTIFACT} development appliance", "vendor_name": "Kernelkit", - "vendor_url": "https://kernelkit.org", + "vendor_url": "https://www.kernelkit.org", "product_name": "${ARTIFACT} devel", "registry_version": 6, "status": "experimental", diff --git a/board/common/image/image-readme/README.md b/board/common/image/image-readme/README.md index e92f0792..3bca7838 100644 --- a/board/common/image/image-readme/README.md +++ b/board/common/image/image-readme/README.md @@ -50,7 +50,7 @@ The default credentials for the demo builds is Password: .-------. | . . | Infix OS — Immutable.Friendly.Secure - |-. v .-| https://kernelkit.org + |-. v .-| https://www.kernelkit.org '-'---'-' Run the command 'cli' for interactive OAM diff --git a/board/common/rootfs/etc/motd b/board/common/rootfs/etc/motd index 9b18acdf..828153d0 100644 --- a/board/common/rootfs/etc/motd +++ b/board/common/rootfs/etc/motd @@ -1,4 +1,4 @@ .-------. | . . | Infix OS — Immutable.Friendly.Secure -|-. v .-| https://kernelkit.org +|-. v .-| https://www.kernelkit.org '-'---'-' diff --git a/configs/aarch64_defconfig b/configs/aarch64_defconfig index 48ace6e3..5fcaf15f 100644 --- a/configs/aarch64_defconfig +++ b/configs/aarch64_defconfig @@ -143,10 +143,10 @@ BR2_PACKAGE_MARVELL_CN9130_CRB=y BR2_PACKAGE_MARVELL_ESPRESSOBIN=y BR2_PACKAGE_RASPBERRYPI_RPI64=y BR2_PACKAGE_STYX_DCP_SC_28P=y -INFIX_VENDOR_HOME="https://kernelkit.org" +INFIX_VENDOR_HOME="https://www.kernelkit.org" INFIX_DESC="Infix is an immutable, friendly, and secure operating system that turns any ARM or x86 device into a powerful, manageable network appliance. Deploy on anything from $35 Raspberry Pi boards to enterprise switches as routers, IoT gateways, or edge devices. Infix models Linux networking features using YANG so you can manage your devices using NETCONF/RESTCONF APIs and focus on your business logic running in isolated containers." INFIX_HOME="https://github.com/kernelkit/infix/" -INFIX_DOC="https://kernelkit.org/infix/" +INFIX_DOC="https://www.kernelkit.org/infix/" INFIX_SUPPORT="mailto:kernelkit@googlegroups.com" BR2_PACKAGE_FEATURE_GPS=y BR2_PACKAGE_FEATURE_WIFI_MEDIATEK=y diff --git a/configs/aarch64_minimal_defconfig b/configs/aarch64_minimal_defconfig index e99e1446..e535b535 100644 --- a/configs/aarch64_minimal_defconfig +++ b/configs/aarch64_minimal_defconfig @@ -121,10 +121,10 @@ BR2_PACKAGE_MARVELL_CN9130_CRB=y BR2_PACKAGE_MARVELL_ESPRESSOBIN=y BR2_PACKAGE_RASPBERRYPI_RPI64=y BR2_PACKAGE_STYX_DCP_SC_28P=y -INFIX_VENDOR_HOME="https://kernelkit.org" +INFIX_VENDOR_HOME="https://www.kernelkit.org" INFIX_DESC="Infix is an immutable, friendly, and secure operating system that turns any ARM or x86 device into a powerful, manageable network appliance. Deploy on anything from $35 Raspberry Pi boards to enterprise switches as routers, IoT gateways, or edge devices. Infix models Linux networking features using YANG so you can manage your devices using NETCONF/RESTCONF APIs and focus on your business logic running in isolated containers." INFIX_HOME="https://github.com/kernelkit/infix/" -INFIX_DOC="https://kernelkit.org/infix/" +INFIX_DOC="https://www.kernelkit.org/infix/" INFIX_SUPPORT="mailto:kernelkit@googlegroups.com" BR2_PACKAGE_FEATURE_GPS=y BR2_PACKAGE_CONFD=y diff --git a/configs/arm_defconfig b/configs/arm_defconfig index a216f070..081b4698 100644 --- a/configs/arm_defconfig +++ b/configs/arm_defconfig @@ -139,10 +139,10 @@ BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SIGNATURE_SUPPORT=y BR2_PACKAGE_HOST_UBOOT_TOOLS_FDT_ADD_PUBKEY=y BR2_PACKAGE_MICROCHIP_SAMA7G54_EK=y BR2_PACKAGE_RASPBERRYPI_RPI2=y -INFIX_VENDOR_HOME="https://kernelkit.org" +INFIX_VENDOR_HOME="https://www.kernelkit.org" INFIX_DESC="Infix is an immutable, friendly, and secure operating system that turns any ARM or x86 device into a powerful, manageable network appliance. Deploy on anything from $35 Raspberry Pi boards to enterprise switches as routers, IoT gateways, or edge devices. Infix models Linux networking features using YANG so you can manage your devices using NETCONF/RESTCONF APIs and focus on your business logic running in isolated containers." INFIX_HOME="https://github.com/kernelkit/infix/" -INFIX_DOC="https://kernelkit.org/infix/" +INFIX_DOC="https://www.kernelkit.org/infix/" INFIX_SUPPORT="mailto:kernelkit@googlegroups.com" BR2_PACKAGE_FEATURE_GPS=y BR2_PACKAGE_FEATURE_WIFI_MEDIATEK=y diff --git a/configs/arm_minimal_defconfig b/configs/arm_minimal_defconfig index b0536ac2..f57a0263 100644 --- a/configs/arm_minimal_defconfig +++ b/configs/arm_minimal_defconfig @@ -121,10 +121,10 @@ BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SIGNATURE_SUPPORT=y BR2_PACKAGE_HOST_UBOOT_TOOLS_FDT_ADD_PUBKEY=y BR2_PACKAGE_MICROCHIP_SAMA7G54_EK=y BR2_PACKAGE_RASPBERRYPI_RPI2=y -INFIX_VENDOR_HOME="https://kernelkit.org" +INFIX_VENDOR_HOME="https://www.kernelkit.org" INFIX_DESC="Infix is an immutable, friendly, and secure operating system that turns any ARM or x86 device into a powerful, manageable network appliance. Deploy on anything from $35 Raspberry Pi boards to enterprise switches as routers, IoT gateways, or edge devices. Infix models Linux networking features using YANG so you can manage your devices using NETCONF/RESTCONF APIs and focus on your business logic running in isolated containers." INFIX_HOME="https://github.com/kernelkit/infix/" -INFIX_DOC="https://kernelkit.org/infix/" +INFIX_DOC="https://www.kernelkit.org/infix/" INFIX_SUPPORT="mailto:kernelkit@googlegroups.com" BR2_PACKAGE_FEATURE_GPS=y BR2_PACKAGE_CONFD=y diff --git a/configs/riscv64_defconfig b/configs/riscv64_defconfig index 41ef8450..a7421e15 100644 --- a/configs/riscv64_defconfig +++ b/configs/riscv64_defconfig @@ -170,10 +170,10 @@ BR2_PACKAGE_HOST_BMAP_TOOLS=y BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SUPPORT=y BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SIGNATURE_SUPPORT=y BR2_PACKAGE_HOST_UBOOT_TOOLS_FDT_ADD_PUBKEY=y -INFIX_VENDOR_HOME="https://kernelkit.org" +INFIX_VENDOR_HOME="https://www.kernelkit.org" INFIX_DESC="Infix is an immutable, friendly, and secure operating system that turns any ARM or x86 device into a powerful, manageable network appliance. Deploy on anything from $35 Raspberry Pi boards to enterprise switches as routers, IoT gateways, or edge devices. Infix models Linux networking features using YANG so you can manage your devices using NETCONF/RESTCONF APIs and focus on your business logic running in isolated containers." INFIX_HOME="https://github.com/kernelkit/infix/" -INFIX_DOC="https://kernelkit.org/infix/" +INFIX_DOC="https://www.kernelkit.org/infix/" INFIX_SUPPORT="mailto:kernelkit@googlegroups.com" BR2_PACKAGE_FEATURE_GPS=y BR2_PACKAGE_FEATURE_WIFI=y diff --git a/configs/x86_64_defconfig b/configs/x86_64_defconfig index 74bcd717..8dbb20f7 100644 --- a/configs/x86_64_defconfig +++ b/configs/x86_64_defconfig @@ -142,10 +142,10 @@ BR2_PACKAGE_HOST_MTOOLS=y BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SUPPORT=y BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SIGNATURE_SUPPORT=y BR2_PACKAGE_HOST_UBOOT_TOOLS_FDT_ADD_PUBKEY=y -INFIX_VENDOR_HOME="https://kernelkit.org" +INFIX_VENDOR_HOME="https://www.kernelkit.org" INFIX_DESC="Infix is an immutable, friendly, and secure operating system that turns any ARM or x86 device into a powerful, manageable network appliance. Deploy on anything from $35 Raspberry Pi boards to enterprise switches as routers, IoT gateways, or edge devices. Infix models Linux networking features using YANG so you can manage your devices using NETCONF/RESTCONF APIs and focus on your business logic running in isolated containers." INFIX_HOME="https://github.com/kernelkit/infix/" -INFIX_DOC="https://kernelkit.org/infix/" +INFIX_DOC="https://www.kernelkit.org/infix/" INFIX_SUPPORT="mailto:kernelkit@googlegroups.com" BR2_PACKAGE_FEATURE_GPS=y BR2_PACKAGE_FEATURE_WIFI=y diff --git a/configs/x86_64_minimal_defconfig b/configs/x86_64_minimal_defconfig index a985feac..7d1d55f4 100644 --- a/configs/x86_64_minimal_defconfig +++ b/configs/x86_64_minimal_defconfig @@ -120,10 +120,10 @@ BR2_PACKAGE_HOST_MTOOLS=y BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SUPPORT=y BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SIGNATURE_SUPPORT=y BR2_PACKAGE_HOST_UBOOT_TOOLS_FDT_ADD_PUBKEY=y -INFIX_VENDOR_HOME="https://kernelkit.org" +INFIX_VENDOR_HOME="https://www.kernelkit.org" INFIX_DESC="Infix is an immutable, friendly, and secure operating system that turns any ARM or x86 device into a powerful, manageable network appliance. Deploy on anything from $35 Raspberry Pi boards to enterprise switches as routers, IoT gateways, or edge devices. Infix models Linux networking features using YANG so you can manage your devices using NETCONF/RESTCONF APIs and focus on your business logic running in isolated containers." INFIX_HOME="https://github.com/kernelkit/infix/" -INFIX_DOC="https://kernelkit.org/infix/" +INFIX_DOC="https://www.kernelkit.org/infix/" INFIX_SUPPORT="mailto:kernelkit@googlegroups.com" BR2_PACKAGE_FEATURE_GPS=y BR2_PACKAGE_CONFD=y diff --git a/doc/ChangeLog.md b/doc/ChangeLog.md index ed6871d4..30c13e48 100644 --- a/doc/ChangeLog.md +++ b/doc/ChangeLog.md @@ -106,7 +106,7 @@ Noteworthy changes and additions in this release are marked below in bold text. - Prevent MOTD from showing on non-shell user login attempts - Fix mDNS reflector. -[wifi]: https://kernelkit.org/infix/latest/wifi/ +[wifi]: https://www.kernelkit.org/infix/latest/wifi/ [sd card image]: https://github.com/kernelkit/infix/releases/download/latest-boot/infix-rpi64-sdcard.img @@ -724,7 +724,7 @@ renamed to ease maintenance, more info below. not supported (yet) in Infix, issue #709 - The default builds now include the curiOS nftables container image, which can be used for advanced firewall setups. For an introduction - see + see ### Fixes diff --git a/doc/discovery.md b/doc/discovery.md index e4595c98..06e7e165 100644 --- a/doc/discovery.md +++ b/doc/discovery.md @@ -295,7 +295,7 @@ linux-pc:# ssh admin@infix-c0-ff-ee.local (admin@infix-c0-ff-ee.local) Password: .-------. | . . | Infix OS — Immutable.Friendly.Secure -|-. v .-| https://kernelkit.org +|-. v .-| https://www.kernelkit.org '-'---'- Run the command 'cli' for interactive OAM @@ -335,7 +335,7 @@ linux-pc:# ssh admin@infix.local (admin@infix.local) Password: .-------. | . . | Infix OS — Immutable.Friendly.Secure -|-. v .-| https://kernelkit.org +|-. v .-| https://www.kernelkit.org '-'---'- Run the command 'cli' for interactive OAM diff --git a/doc/management.md b/doc/management.md index 1c3cb094..486cd684 100644 --- a/doc/management.md +++ b/doc/management.md @@ -87,7 +87,7 @@ example login: admin Password: .-------. | . . | Infix OS — Immutable.Friendly.Secure -|-. v .-| https://kernelkit.org +|-. v .-| https://www.kernelkit.org '-'---'-' Run the command 'cli' for interactive OAM diff --git a/doc/scripting-prod.md b/doc/scripting-prod.md index 3836e51e..70fd1da4 100644 --- a/doc/scripting-prod.md +++ b/doc/scripting-prod.md @@ -336,7 +336,7 @@ It should now be possible to access the switch from the PC via SSH (or NETCONF). admin@fe80::0053:00ff:fe06:1101%eth1's password: .-------. | . . | Infix OS — Immutable.Friendly.Secure -|-. v .-| https://kernelkit.org +|-. v .-| https://www.kernelkit.org '-'---'-' Run the command 'cli' for interactive OAM diff --git a/doc/scripting.md b/doc/scripting.md index 2c93a053..9505fa17 100644 --- a/doc/scripting.md +++ b/doc/scripting.md @@ -88,7 +88,7 @@ Warning: Permanently added 'fe80::ff:fe00:0%eth0' (ED25519) to the list of known admin@fe80::ff:fe00:0%eth0's password: ***** .-------. | . . | Infix OS — Immutable.Friendly.Secure -|-. v .-| https://kernelkit.org +|-. v .-| https://www.kernelkit.org '-'---'-' Run the command 'cli' for interactive OAM diff --git a/doc/testing.md b/doc/testing.md index a41d9e6a..9a71917f 100644 --- a/doc/testing.md +++ b/doc/testing.md @@ -152,7 +152,7 @@ infix-00-00-00 login: admin Password: .-------. | . . | Infix OS — Immutable.Friendly.Secure -|-. v .-| https://kernelkit.org +|-. v .-| https://www.kernelkit.org '-'---'-' Run the command 'cli' for interactive OAM diff --git a/doc/upgrade.md b/doc/upgrade.md index 88dd91b8..2c744316 100644 --- a/doc/upgrade.md +++ b/doc/upgrade.md @@ -170,7 +170,7 @@ example login: admin Password: .-------. | . . | Infix OS — Immutable.Friendly.Secure -|-. v .-| https://kernelkit.org +|-. v .-| https://www.kernelkit.org '-'---'-' Run the command 'cli' for interactive OAM diff --git a/mkdocs.yml b/mkdocs.yml index 73768a6e..c468c751 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -170,6 +170,6 @@ plugins: extra: generator: false - homepage: https://kernelkit.org/ + homepage: https://www.kernelkit.org/ version: provider: mike diff --git a/test/case/statd/system/system/rootfs/etc/os-release b/test/case/statd/system/system/rootfs/etc/os-release index 0d4c87b1..2a788ddf 100644 --- a/test/case/statd/system/system/rootfs/etc/os-release +++ b/test/case/statd/system/system/rootfs/etc/os-release @@ -10,7 +10,7 @@ IMAGE_ID="infix-x86_64" ARCHITECTURE="x86_64" HOME_URL=https://github.com/kernelkit/infix/ VENDOR_NAME="KernelKit" -VENDOR_HOME="https://kernelkit.org" -DOCUMENTATION_URL="https://kernelkit.org/infix/" +VENDOR_HOME="https://www.kernelkit.org" +DOCUMENTATION_URL="https://www.kernelkit.org/infix/" SUPPORT_URL="mailto:kernelkit@googlegroups.com" INFIX_DESC="Infix is an immutable, friendly, and secure operating system that turns any ARM or x86 device into a powerful, manageable network appliance. Deploy on anything from 5 Raspberry Pi boards to enterprise switches as routers, IoT gateways, or edge devices. Infix models Linux networking features using YANG so you can manage your devices using NETCONF/RESTCONF APIs and focus on your business logic running in isolated containers." From c3d396b5feb1a77a3b9d26bf948d83518f8e7e4e Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sun, 1 Mar 2026 04:58:28 +0100 Subject: [PATCH 06/10] copy: fix null dst dereference and uninit uri_i in curl() Found by Coverity Scan Signed-off-by: Joachim Wiberg --- src/bin/copy.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/bin/copy.c b/src/bin/copy.c index 763a6aba..80334450 100644 --- a/src/bin/copy.c +++ b/src/bin/copy.c @@ -466,7 +466,7 @@ static int curl(char *op, const char *path, const char *uri) { char *argv[10] = { "curl", "-L", NULL }; int err = 1, i = 2; - int path_i, uri_i, user_i = 0; + int path_i, uri_i = 0, user_i = 0; argv[i++] = op; @@ -492,7 +492,8 @@ static int curl(char *op, const char *path, const char *uri) out: free(argv[path_i]); - free(argv[uri_i]); + if (uri_i) + free(argv[uri_i]); if (user_i) free(argv[user_i]); return err; @@ -752,7 +753,7 @@ static int copy(const char *src, const char *dst) * meaningful name instead: the datastore's on-disk filename, or the * source file's own basename. */ - if (is_ssh_uri(dst) && dst[strlen(dst) - 1] == '/') { + if (dst && is_ssh_uri(dst) && dst[strlen(dst) - 1] == '/') { const char *bn, *slash; if (srcds && srcds->path) { From 131177f3c9aad658b41aa277703be5d7285734c9 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sun, 1 Mar 2026 04:58:47 +0100 Subject: [PATCH 07/10] confd: check return value and drop redundant assignment Found by Coverity Scan: - check rename() return value - drop redundant ripd_enabled assignment Signed-off-by: Joachim Wiberg --- src/confd/src/routing.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/confd/src/routing.c b/src/confd/src/routing.c index 50d8a7bc..5fa199fc 100644 --- a/src/confd/src/routing.c +++ b/src/confd/src/routing.c @@ -458,7 +458,8 @@ static void frr_daemons_write(int ospfd, int ripd, int bfdd) fp); fclose(fp); - rename(next, FRR_DAEMONS); + if (rename(next, FRR_DAEMONS)) + ERROR("Failed to rename %s to %s: %m", next, FRR_DAEMONS); } int routing_change(sr_session_ctx_t *session, struct lyd_node *config, struct lyd_node *diff, sr_event_t event, struct confd *confd) @@ -519,7 +520,6 @@ int routing_change(sr_session_ctx_t *session, struct lyd_node *config, struct ly num = parse_rip(session, lydx_get_child(cplane, "rip"), fp); if (num > 0) { touch(RIPD_SIGNAL_NEXT); - ripd_enabled = 1; netd_enabled = 1; } } From abe571d32c87499370d69214f3fee5182741e9bb Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sun, 1 Mar 2026 05:08:09 +0100 Subject: [PATCH 08/10] confd: silence Coverity false positive resource leak Signed-off-by: Joachim Wiberg --- src/confd/src/hardware.c | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/confd/src/hardware.c b/src/confd/src/hardware.c index 5857ceb1..73c11c8c 100644 --- a/src/confd/src/hardware.c +++ b/src/confd/src/hardware.c @@ -695,18 +695,17 @@ int hardware_change(sr_session_ctx_t *session, struct lyd_node *config, struct l wifi_find_interfaces_on_radio(interfaces_config, name, &wifi_iface_list, &wifi_iface_count); - - if (!wifi_iface_count) - continue; - - /* Generate AP config (hostapd) for all APs on this radio */ - rc = wifi_gen_aps_on_radio(name, interfaces_config, cwifi_radio, config); - if (rc != SR_ERR_OK) - ERROR("Failed to generate AP config for radio %s", name); - /* Free the interface list */ - free(wifi_iface_list); - wifi_iface_list = NULL; - wifi_iface_count = 0; + if (wifi_iface_list) { + if (wifi_iface_count) { + /* Generate AP config (hostapd) for all APs on this radio */ + rc = wifi_gen_aps_on_radio(name, interfaces_config, cwifi_radio, config); + if (rc != SR_ERR_OK) + ERROR("Failed to generate AP config for radio %s", name); + } + free(wifi_iface_list); + wifi_iface_list = NULL; + wifi_iface_count = 0; + } } else if (!strcmp(class, "infix-hardware:gps")) { if (event != SR_EV_DONE) continue; From 386ca9618efca9ef48e9bc171cb9cb8dc89efe56 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sun, 1 Mar 2026 07:46:06 +0100 Subject: [PATCH 09/10] confd: ensure DHCP client is not started before netd This is a follow-up to c559b8f2 (new-frr) where netd now is responsible for funneling static routes, as well as routes from DHCP clients, into the kernel via Frr. For this to work, in particular at boot, any DHCP client must wait for netd to have started or any default routes learned will be lost. Signed-off-by: Joachim Wiberg --- src/confd/src/dhcp-client.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/confd/src/dhcp-client.c b/src/confd/src/dhcp-client.c index ba40193a..1d0f347a 100644 --- a/src/confd/src/dhcp-client.c +++ b/src/confd/src/dhcp-client.c @@ -144,7 +144,7 @@ static void add(const char *ifname, struct lyd_node *cfg) fprintf(fp, "# Generated by Infix confd\n"); fprintf(fp, "metric=%s\n", metric); - fprintf(fp, "service name:dhcp-client :%s \\\n" + fprintf(fp, "service name:dhcp-client :%s \\\n" " [2345] udhcpc -f -p /run/dhcp-client-%s.pid -t 3 -T 5 -A 30 %s -S -R \\\n" " %s%s \\\n" " -i %s %s %s \\\n" From fb9a1fa1a5a5267fbd1f5b71e8ab238a1e68967b Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sun, 1 Mar 2026 05:20:26 +0100 Subject: [PATCH 10/10] Update ChangeLog for v26.02 release Signed-off-by: Joachim Wiberg --- doc/ChangeLog.md | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/doc/ChangeLog.md b/doc/ChangeLog.md index 30c13e48..1550faa1 100644 --- a/doc/ChangeLog.md +++ b/doc/ChangeLog.md @@ -3,25 +3,29 @@ Change Log All notable changes to the project are documented in this file. -[v26.02.0][UNRELEASED] - +[v26.02.0][] - 2026-03-01 ------------------------- +> [!NOTE] +> The blog and User Guide have a new address: + ### Changes - Upgrade Linux kernel to 6.18.15 (LTS) - Upgrade Buildroot to 2025.02.11 (LTS) - Upgrade FRR to 10.5.1 -- Add support for Microchip SAMA7G54-EK Evaluation Kit, Arm Cortex-A7 -- Add GPS/GNSS receiver support with NTP reference clock integration +- Add support for [Microchip SAMA7G54][SAMA7G54-EK] Evaluation Kit, Arm Cortex-A7 - Add support for [Banana Pi R3 Mini][BPI-R3-MINI], a 2 port router with 2 WiFi chip, uses the same bootloader as BPI-R3 (eMMC-version) +- Add GPS/GNSS receiver support with NTP reference clock integration +- Add `reset-volumes` option to `container upgrade foo` command ### Fixes -N/A +- Fix CLI `copy` command problem to copy to scp/sftp destinations [BPI-R3-MINI]: https://wiki.banana-pi.org/Banana_Pi_BPI-R3_Mini - +[SAMA7G54-EK]: https://www.microchip.com/en-us/development-tool/ev21h18a [v26.01.0][] - 2026-02-03 ------------------------- @@ -1927,7 +1931,8 @@ Supported YANG models in addition to those used by sysrepo and netopeer: - N/A [buildroot]: https://buildroot.org/ -[UNRELEASED]: https://github.com/kernelkit/infix/compare/v26.01.0...HEAD +[UNRELEASED]: https://github.com/kernelkit/infix/compare/v26.02.0...HEAD +[v26.02.0]: https://github.com/kernelkit/infix/compare/v26.01.0...v26.02.0 [v26.01.0]: https://github.com/kernelkit/infix/compare/v25.11.0...v26.01.0 [v25.11.0]: https://github.com/kernelkit/infix/compare/v25.10.0...v25.11.0 [v25.10.0]: https://github.com/kernelkit/infix/compare/v25.09.0...v26.10.0