Merge pull request #1412 from kernelkit/initviz

Optimize boot time and consolidate confd into a single daemon                                                             

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
This commit is contained in:
Joachim Wiberg
2026-03-20 19:17:47 +01:00
committed by GitHub
162 changed files with 3749 additions and 4855 deletions
+1 -1
View File
@@ -55,7 +55,7 @@ jobs:
sudo apt-get -y update
sudo apt-get -y install pkg-config libjansson-dev libev-dev \
libcrypt-dev libglib2.0-dev libpcre2-dev \
libuev-dev
libuev-dev libavahi-client-dev
- name: Build dependencies
run: |
+4 -3
View File
@@ -85,12 +85,12 @@ interfaces {
admin@infix-12-34-56:/config/interface/eth0/> <b>leave</b>
admin@infix-12-34-56:/> <b>show interfaces</b>
<u>INTERFACE PROTOCOL STATE DATA </u>
eth0 ethernet UP 52:54:00:12:34:56
ipv4 192.168.2.200/24 (static)
ipv6 fe80::5054:ff:fe12:3456/64 (link-layer)
lo ethernet UP 00:00:00:00:00:00
ipv4 127.0.0.1/8 (static)
ipv6 ::1/128 (static)
eth0 ethernet UP 52:54:00:12:34:56
ipv4 192.168.2.200/24 (static)
ipv6 fe80::5054:ff:fe12:3456/64 (link-layer)
admin@infix-12-34-56:/> <b>copy running startup</b>
</code></pre>
@@ -114,6 +114,7 @@ containers for any custom functionality you need.
- **x86_64** - Run in VMs or on mini PCs for development and testing
- **Marvell CN9130 CRB, EspressoBIN** - High-performance ARM64 platforms
- **Microchip SparX-5i** - Enterprise switching capabilities
- **Microchip SAMA7G54-EK** - ARM Cortex-A7
- **NXP i.MX8MP EVK** - Highly capable ARM64 SoC
- **StarFive VisionFive2** - RISC-V architecture support
+1
View File
@@ -502,6 +502,7 @@ CONFIG_USB_OTG=y
CONFIG_USB_XHCI_HCD=m
CONFIG_USB_XHCI_MVEBU=m
CONFIG_USB_EHCI_HCD=m
CONFIG_USB_EHCI_ROOT_HUB_TT=y
CONFIG_USB_EHCI_HCD_PLATFORM=m
CONFIG_USB_OHCI_HCD=m
CONFIG_USB_OHCI_HCD_PLATFORM=m
@@ -2,9 +2,6 @@ config BR2_PACKAGE_RASPBERRYPI_RPI64
bool "Raspberry Pi 64-bit (RPi3 and later)"
depends on BR2_aarch64
select SDCARD_AUX
select BR2_PACKAGE_FEATURE_WIFI
select BR2_PACKAGE_BRCMFMAC_SDIO_FIRMWARE_RPI
select BR2_PACKAGE_BRCMFMAC_SDIO_FIRMWARE_RPI_WIFI
select BR2_PACKAGE_LINUX_FIRMWARE_RTL_8169
help
Raspberry Pi 64-bit adds support for the Raspberry Pi family of
+1
View File
@@ -4,4 +4,5 @@ Arm 32-bit
Board Specific Documentation
----------------------------
- [Microchip SAMA7G54-EK (32-bit)](microchip-sama7g54-ek/)
- [Raspberry Pi 2 Model B (32-bit)](raspberrypi-rpi2/)
+15 -65
View File
@@ -1,20 +1,19 @@
CONFIG_SYSVIPC=y
CONFIG_POSIX_MQUEUE=y
CONFIG_AUDIT=y
CONFIG_NO_HZ_IDLE=y
CONFIG_HIGH_RES_TIMERS=y
CONFIG_BPF_SYSCALL=y
CONFIG_BPF_JIT=y
CONFIG_PREEMPT=y
CONFIG_BSD_PROCESS_ACCT=y
CONFIG_BSD_PROCESS_ACCT_V3=y
CONFIG_TASKSTATS=y
CONFIG_TASK_DELAY_ACCT=y
CONFIG_TASK_XACCT=y
CONFIG_TASK_IO_ACCOUNTING=y
# CONFIG_CPU_ISOLATION is not set
CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y
CONFIG_LOG_BUF_SHIFT=18
CONFIG_LOG_BUF_SHIFT=16
CONFIG_MEMCG=y
CONFIG_BLK_CGROUP=y
CONFIG_CFS_BANDWIDTH=y
@@ -31,19 +30,15 @@ CONFIG_SCHED_AUTOGROUP=y
CONFIG_BLK_DEV_INITRD=y
CONFIG_KALLSYMS_ALL=y
CONFIG_PROFILING=y
CONFIG_ARCH_MULTI_V6=y
CONFIG_ARCH_VIRT=y
CONFIG_ARCH_BCM=y
CONFIG_ARCH_BCM2835=y
# CONFIG_ARM_ERRATA_643719 is not set
CONFIG_SMP=y
CONFIG_CPU_FREQ=y
CONFIG_CPU_FREQ_STAT=y
CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE=y
CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
CONFIG_CPU_FREQ_GOV_POWERSAVE=y
CONFIG_CPU_FREQ_GOV_USERSPACE=y
CONFIG_CPU_FREQ_GOV_ONDEMAND=y
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
CONFIG_CPUFREQ_DT=y
CONFIG_ARM_RASPBERRYPI_CPUFREQ=y
CONFIG_VFP=y
CONFIG_NEON=y
CONFIG_KERNEL_MODE_NEON=y
@@ -55,7 +50,11 @@ CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y
CONFIG_PARTITION_ADVANCED=y
# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
CONFIG_ZSWAP=y
CONFIG_ZSWAP_DEFAULT_ON=y
CONFIG_ZSWAP_SHRINKER_DEFAULT_ON=y
# CONFIG_COMPAT_BRK is not set
# CONFIG_BALLOON_COMPACTION is not set
CONFIG_KSM=y
CONFIG_CMA=y
CONFIG_NET=y
@@ -259,7 +258,6 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
CONFIG_DEVTMPFS=y
CONFIG_DEVTMPFS_MOUNT=y
# CONFIG_STANDALONE is not set
CONFIG_RASPBERRYPI_FIRMWARE=y
CONFIG_FW_CFG_SYSFS=y
CONFIG_FW_CFG_SYSFS_CMDLINE=y
CONFIG_OF_OVERLAY=y
@@ -301,63 +299,29 @@ CONFIG_VETH=m
CONFIG_VIRTIO_NET=y
CONFIG_NLMON=y
CONFIG_NET_VRF=y
CONFIG_BCMGENET=y
CONFIG_SMSC911X=y
CONFIG_USB_LAN78XX=y
CONFIG_USB_USBNET=y
CONFIG_USB_NET_SMSC95XX=y
CONFIG_INPUT_MOUSEDEV=m
CONFIG_INPUT_EVDEV=y
CONFIG_INPUT_TOUCHSCREEN=y
CONFIG_TOUCHSCREEN_EDT_FT5X06=m
# CONFIG_LEGACY_PTYS is not set
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_8250_EXTENDED=y
CONFIG_SERIAL_8250_SHARE_IRQ=y
CONFIG_SERIAL_8250_BCM2835AUX=y
CONFIG_SERIAL_AMBA_PL011=y
CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
CONFIG_SERIAL_DEV_BUS=y
CONFIG_VIRTIO_CONSOLE=y
CONFIG_I2C_CHARDEV=y
CONFIG_I2C_BCM2835=m
CONFIG_SPI=y
CONFIG_SPI_BCM2835=y
CONFIG_SPI_BCM2835AUX=y
CONFIG_SENSORS_RASPBERRYPI_HWMON=m
CONFIG_THERMAL=y
CONFIG_BCM2711_THERMAL=y
CONFIG_BCM2835_THERMAL=m
CONFIG_WATCHDOG=y
CONFIG_I6300ESB_WDT=y
CONFIG_BCM2835_WDT=y
CONFIG_MFD_SYSCON=y
CONFIG_REGULATOR=y
CONFIG_REGULATOR_FIXED_VOLTAGE=y
CONFIG_REGULATOR_GPIO=y
CONFIG_MEDIA_SUPPORT=y
CONFIG_DRM=y
CONFIG_DRM_LOAD_EDID_FIRMWARE=y
CONFIG_DRM_SIMPLEDRM=y
CONFIG_DRM_PANEL_SIMPLE=m
CONFIG_DRM_TOSHIBA_TC358762=m
CONFIG_DRM_V3D=m
CONFIG_DRM_VC4=m
CONFIG_DRM_VC4_HDMI_CEC=y
CONFIG_FB=y
CONFIG_BACKLIGHT_CLASS_DEVICE=y
CONFIG_SOUND=y
CONFIG_SND=y
CONFIG_SND_SOC=y
CONFIG_SND_BCM2835_SOC_I2S=y
CONFIG_HID_GENERIC=m
CONFIG_USB=y
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
CONFIG_USB_OTG=y
CONFIG_USB_EHCI_HCD=m
CONFIG_USB_EHCI_ROOT_HUB_TT=y
CONFIG_USB_EHCI_HCD_PLATFORM=m
CONFIG_USB_OHCI_HCD=m
CONFIG_USB_OHCI_HCD_PLATFORM=m
CONFIG_USB_STORAGE=y
CONFIG_USB_DWC2=y
CONFIG_NOP_USB_XCEIV=y
CONFIG_USB_GADGET=y
CONFIG_USB_ETH=m
CONFIG_USB_ETH_EEM=y
@@ -365,8 +329,6 @@ CONFIG_USB_G_SERIAL=m
CONFIG_MMC=y
CONFIG_MMC_SDHCI=y
CONFIG_MMC_SDHCI_PLTFM=y
CONFIG_MMC_SDHCI_IPROC=y
CONFIG_MMC_BCM2835=y
CONFIG_NEW_LEDS=y
CONFIG_LEDS_CLASS=y
CONFIG_LEDS_GPIO=y
@@ -380,20 +342,13 @@ CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
CONFIG_LEDS_TRIGGER_TRANSIENT=y
CONFIG_LEDS_TRIGGER_CAMERA=y
CONFIG_DMADEVICES=y
CONFIG_DMA_BCM2835=y
CONFIG_VIRTIO_PCI=y
CONFIG_VIRTIO_BALLOON=y
CONFIG_VIRTIO_INPUT=y
CONFIG_VIRTIO_MMIO=y
CONFIG_STAGING=y
CONFIG_SND_BCM2835=m
CONFIG_CLK_RASPBERRYPI=y
CONFIG_MAILBOX=y
CONFIG_BCM2835_MBOX=y
# CONFIG_IOMMU_SUPPORT is not set
CONFIG_RASPBERRYPI_POWER=y
CONFIG_PWM=y
CONFIG_PWM_BCM2835=y
CONFIG_EXT2_FS=y
CONFIG_EXT2_FS_POSIX_ACL=y
CONFIG_EXT4_FS=y
@@ -426,18 +381,13 @@ CONFIG_DMA_CMA=y
CONFIG_CMA_SIZE_MBYTES=32
CONFIG_PRINTK_TIME=y
CONFIG_DEBUG_KERNEL=y
CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y
CONFIG_MAGIC_SYSRQ=y
CONFIG_DEBUG_FS=y
CONFIG_PANIC_ON_OOPS=y
CONFIG_PANIC_TIMEOUT=20
CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC=y
CONFIG_HARDLOCKUP_DETECTOR=y
CONFIG_BOOTPARAM_HARDLOCKUP_PANIC=y
CONFIG_BOOTPARAM_HUNG_TASK_PANIC=y
CONFIG_WQ_WATCHDOG=y
CONFIG_WQ_CPU_INTENSIVE_REPORT=y
CONFIG_TEST_LOCKUP=m
# CONFIG_RCU_TRACE is not set
CONFIG_FUNCTION_TRACER=y
CONFIG_MEMTEST=y
# CONFIG_RUNTIME_TESTING_MENU is not set
@@ -16,3 +16,28 @@
&thermal_sensor {
status = "disabled";
};
/*
* Enable SDMMC high speed mode, please note that neither 'mmc-ddr-1_8v'
* or 'mmc-hs200-1_8v' work, even though [1] states they are supported,
* the errata [2] tells a different story: "Using mode SDR104, HS200 or
* HS400 may lead to tuning issues, data read errors or clock switching
* failures." — empirical testing has proved this on a rev 5 board.
*
* [1]: https://github.com/linux4sam/linux-at91/commit/5b35500
* [2]: https://ww1.microchip.com/downloads/en/DeviceDoc/SAMA7G5-Series-Silicon-Errata-and-Data-Sheet-Clarification-DS80001016A.pdf
*/
&sdmmc0 {
/delete-property/ sdhci-caps-mask;
cap-mmc-highspeed;
cap-mmc-hw-reset;
};
&sdmmc1 {
/delete-property/ no-1-8-v;
/delete-property/ sdhci-caps-mask;
};
&sdmmc2 {
/delete-property/ sdhci-caps-mask;
};
@@ -1,12 +0,0 @@
[system]
compatible=infix-sama7g54-ek
bootloader=uboot
statusfile=/mnt/aux/rauc.status
[slot.rootfs.0]
device=/dev/disk/by-partlabel/primary
bootname=primary
[slot.rootfs.1]
device=/dev/disk/by-partlabel/secondary
bootname=secondary
@@ -1,6 +1,8 @@
# Common U-Boot extras for SAMA7G54-EK
CONFIG_EFI_PARTITION=y
CONFIG_ENV_IMPORT_FDT=y
# CONFIG_ENV_IS_IN_FAT is not set
CONFIG_ENV_IS_NOWHERE=y
CONFIG_FIT=y
CONFIG_FIT_SIGNATURE=y
CONFIG_RSA=y
-3
View File
@@ -2,9 +2,6 @@ config BR2_PACKAGE_RASPBERRYPI_RPI2
bool "Raspberry Pi 2 Model B (32-bit ARMv7)"
depends on BR2_arm
select SDCARD_AUX
select BR2_PACKAGE_FEATURE_WIFI
select BR2_PACKAGE_BRCMFMAC_SDIO_FIRMWARE_RPI
select BR2_PACKAGE_BRCMFMAC_SDIO_FIRMWARE_RPI_WIFI
help
Support for the 32-bit ARMv7 Raspberry Pi 2B single-board computer
(SBC) with BCM2836 quad-core Cortex-A7 processor.
+26 -8
View File
@@ -1,13 +1,19 @@
# Raspberry Pi 2 Model B specific kernel configuration
define RASPBERRYPI_RPI2_LINUX_CONFIG_FIXUPS
$(call KCONFIG_ENABLE_OPT,CONFIG_ARCH_BCM)
$(call KCONFIG_ENABLE_OPT,CONFIG_ARCH_BCM2835)
$(call KCONFIG_ENABLE_OPT,CONFIG_SOUND)
$(call KCONFIG_ENABLE_OPT,CONFIG_SND)
$(call KCONFIG_ENABLE_OPT,CONFIG_SND_SOC)
$(call KCONFIG_SET_OPT,CONFIG_SND_BCM2835_SOC_I2S,y)
$(call KCONFIG_SET_OPT,CONFIG_SND_BCM2835,m)
$(call KCONFIG_ENABLE_OPT,CONFIG_INPUT_MOUSE)
$(call KCONFIG_ENABLE_OPT,CONFIG_INPUT_KEYBOARD)
$(call KCONFIG_ENABLE_OPT,CONFIG_INPUT_TOUCHSCREEN)
$(call KCONFIG_SET_OPT,CONFIG_INPUT_MOUSEDEV,m)
$(call KCONFIG_SET_OPT,CONFIG_HID_GENERIC,m)
$(call KCONFIG_SET_OPT,CONFIG_TOUCHSCREEN_EDT_FT5X06,m)
$(call KCONFIG_ENABLE_OPT,CONFIG_ARCH_BCM)
$(call KCONFIG_ENABLE_OPT,CONFIG_ARCH_BCM2835)
@@ -15,46 +21,58 @@ define RASPBERRYPI_RPI2_LINUX_CONFIG_FIXUPS
$(call KCONFIG_ENABLE_OPT,CONFIG_BCM2835_WDT)
$(call KCONFIG_ENABLE_OPT,CONFIG_DMA_BCM2835)
$(call KCONFIG_ENABLE_OPT,CONFIG_RASPBERRYPI_FIRMWARE)
$(call KCONFIG_ENABLE_OPT,CONFIG_RASPBERRYPI_POWER)
$(call KCONFIG_ENABLE_OPT,CONFIG_ARM_RASPBERRYPI_CPUFREQ)
$(call KCONFIG_ENABLE_OPT,CONFIG_CLK_RASPBERRYPI)
$(call KCONFIG_ENABLE_OPT,CONFIG_PINCTRL_BCM2835)
$(call KCONFIG_ENABLE_OPT,CONFIG_GPIO_BCM2835)
$(call KCONFIG_ENABLE_OPT,CONFIG_PWM_BCM2835)
$(call KCONFIG_SET_OPT,CONFIG_BRCMFMAC,m)
$(call KCONFIG_ENABLE_OPT,CONFIG_BRCMFMAC_SDIO)
$(call KCONFIG_SET_OPT,CONFIG_I2C_BCM2835,m)
$(call KCONFIG_SET_OPT,CONFIG_SPI_BCM2835,y)
$(call KCONFIG_SET_OPT,CONFIG_SPI_BCM2835AUX,y)
$(call KCONFIG_SET_OPT,CONFIG_SENSORS_RASPBERRYPI_HWMON,m)
$(call KCONFIG_SET_OPT,CONFIG_BCM2711_THERMAL,y)
$(call KCONFIG_SET_OPT,CONFIG_BCM2835_THERMAL,m)
$(call KCONFIG_ENABLE_OPT,CONFIG_MMC_BCM2835)
$(call KCONFIG_ENABLE_OPT,CONFIG_RASPBERRYPI_POWER)
$(call KCONFIG_SET_OPT,CONFIG_MMC_SDHCI_IPROC,y)
$(call KCONFIG_ENABLE_OPT,CONFIG_SERIAL_8250)
$(call KCONFIG_ENABLE_OPT,CONFIG_SERIAL_8250_CONSOLE)
$(call KCONFIG_ENABLE_OPT,CONFIG_SERIAL_8250_BCM2835AUX)
$(call KCONFIG_ENABLE_OPT,CONFIG_SERIAL_8250_EXTENDED)
$(call KCONFIG_ENABLE_OPT,CONFIG_SERIAL_8250_SHARE_IRQ)
$(call KCONFIG_ENABLE_OPT,CONFIG_SERIAL_AMBA_PL011)
$(call KCONFIG_ENABLE_OPT,CONFIG_SERIAL_AMBA_PL011_CONSOLE)
$(call KCONFIG_ENABLE_OPT,CONFIG_NET_VENDOR_BROADCOM)
$(call KCONFIG_SET_OPT,CONFIG_BCMGENET,y)
$(call KCONFIG_SET_OPT,CONFIG_SMSC911X,y)
$(call KCONFIG_ENABLE_OPT,CONFIG_USB_USBNET)
$(call KCONFIG_SET_OPT,CONFIG_USB_LAN78XX,y)
$(call KCONFIG_SET_OPT,CONFIG_USB_NET_SMSC95XX,y)
$(call KCONFIG_SET_OPT,CONFIG_REGULATOR_GPIO,y)
$(call KCONFIG_ENABLE_OPT,CONFIG_COMMON_CLK_BCM2835)
$(call KCONFIG_ENABLE_OPT,CONFIG_CLK_RASPBERRYPI)
$(call KCONFIG_ENABLE_OPT,CONFIG_DRM)
$(call KCONFIG_ENABLE_OPT,CONFIG_DRM_KMS_HELPER)
$(call KCONFIG_SET_OPT,CONFIG_DRM_SIMPLEDRM,y)
$(call KCONFIG_SET_OPT,CONFIG_DRM_V3D,m)
$(call KCONFIG_SET_OPT,CONFIG_DRM_VC4,m)
$(call KCONFIG_SET_OPT,CONFIG_STAGING,y)
$(call KCONFIG_SET_OPT,CONFIG_SND_BCM2835,m)
$(call KCONFIG_ENABLE_OPT,CONFIG_DRM_VC4_HDMI_CEC)
$(call KCONFIG_ENABLE_OPT,CONFIG_DRM_LOAD_EDID_FIRMWARE)
$(call KCONFIG_ENABLE_OPT,CONFIG_DRM_PANEL_BRIDGE)
$(call KCONFIG_ENABLE_OPT,CONFIG_DRM_BRIDGE)
$(call KCONFIG_SET_OPT,CONFIG_DRM_TOSHIBA_TC358762,m)
$(call KCONFIG_SET_OPT,CONFIG_DRM_PANEL_SIMPLE,m)
$(call KCONFIG_SET_OPT,CONFIG_STAGING,y)
$(call KCONFIG_ENABLE_OPT,CONFIG_FB)
$(call KCONFIG_ENABLE_OPT,CONFIG_FRAMEBUFFER_CONSOLE)
$(call KCONFIG_ENABLE_OPT,CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY)
$(call KCONFIG_ENABLE_OPT,CONFIG_DRM_FBDEV_EMULATION)
$(call KCONFIG_SET_OPT,CONFIG_TOUCHSCREEN_EDT_FT5X06,m)
$(call KCONFIG_ENABLE_OPT,CONFIG_BACKLIGHT_CLASS_DEVICE)
$(call KCONFIG_ENABLE_OPT,CONFIG_USB_DWC2)
$(call KCONFIG_ENABLE_OPT,CONFIG_NOP_USB_XCEIV)
endef
$(eval $(ix-board))
+28
View File
@@ -0,0 +1,28 @@
[system]
compatible=infix-arm
bootloader=uboot
statusfile=/mnt/aux/rauc.status
mountprefix=/var/lib/rauc/mnt
bundle-formats=-plain
max-bundle-download-size=1073741824
[log.event-log]
filename=/var/log/upgrade-json.log
format=json-pretty
max-size=1M
max-files=5
[keyring]
directory=/etc/rauc/keys
[slot.rootfs.0]
device=/dev/disk/by-partlabel/primary
bootname=primary
[slot.rootfs.1]
device=/dev/disk/by-partlabel/secondary
bootname=secondary
[slot.net.0]
device=/dev/ram0
bootname=net
+15 -6
View File
@@ -1,7 +1,7 @@
#
# Automatically generated make config: don't edit
# Busybox version: 1.36.1
# Sun Feb 9 12:25:37 2025
# Busybox version: 1.37.0
# Mon Feb 9 07:51:08 2026
#
CONFIG_HAVE_DOT_CONFIG=y
@@ -17,6 +17,7 @@ CONFIG_SHOW_USAGE=y
CONFIG_FEATURE_VERBOSE_USAGE=y
# CONFIG_FEATURE_COMPRESS_USAGE is not set
CONFIG_LFS=y
CONFIG_TIME64=y
CONFIG_PAM=y
CONFIG_FEATURE_DEVPTS=y
CONFIG_FEATURE_UTMP=y
@@ -469,6 +470,7 @@ CONFIG_FEATURE_FIND_NEWER=y
CONFIG_FEATURE_FIND_SAMEFILE=y
CONFIG_FEATURE_FIND_EXEC=y
CONFIG_FEATURE_FIND_EXEC_PLUS=y
CONFIG_FEATURE_FIND_EXEC_OK=y
CONFIG_FEATURE_FIND_USER=y
CONFIG_FEATURE_FIND_GROUP=y
CONFIG_FEATURE_FIND_NOT=y
@@ -795,6 +797,7 @@ CONFIG_FLASH_ERASEALL=y
CONFIG_FLASH_LOCK=y
CONFIG_FLASH_UNLOCK=y
CONFIG_FLASHCP=y
CONFIG_GETFATTR=y
CONFIG_HDPARM=y
CONFIG_FEATURE_HDPARM_GET_IDENTITY=y
# CONFIG_FEATURE_HDPARM_HDIO_SCAN_HWIF is not set
@@ -933,6 +936,7 @@ CONFIG_IPRULE=y
CONFIG_IPNEIGH=y
CONFIG_FEATURE_IP_ADDRESS=y
CONFIG_FEATURE_IP_LINK=y
CONFIG_FEATURE_IP_LINK_CAN=y
CONFIG_FEATURE_IP_ROUTE=y
CONFIG_FEATURE_IP_ROUTE_DIR="/etc/iproute2"
CONFIG_FEATURE_IP_TUNNEL=y
@@ -1007,6 +1011,7 @@ CONFIG_FEATURE_WGET_HTTPS=y
CONFIG_WHOIS=y
CONFIG_ZCIP=y
CONFIG_UDHCPD=y
CONFIG_FEATURE_UDHCPD_BOOTP=y
CONFIG_FEATURE_UDHCPD_BASE_IP_ON_MAC=y
CONFIG_FEATURE_UDHCPD_WRITE_LEASES_EARLY=y
CONFIG_DHCPD_LEASES_FILE="/var/lib/misc/udhcpd.leases"
@@ -1016,7 +1021,12 @@ CONFIG_UDHCPC=y
CONFIG_FEATURE_UDHCPC_ARPING=y
CONFIG_FEATURE_UDHCPC_SANITIZEOPT=y
CONFIG_UDHCPC_DEFAULT_SCRIPT="/usr/share/udhcpc/default.script"
CONFIG_UDHCPC6_DEFAULT_SCRIPT=""
# CONFIG_UDHCPC6 is not set
# CONFIG_FEATURE_UDHCPC6_RFC3646 is not set
# CONFIG_FEATURE_UDHCPC6_RFC4704 is not set
# CONFIG_FEATURE_UDHCPC6_RFC4833 is not set
# CONFIG_FEATURE_UDHCPC6_RFC5970 is not set
#
# Common options for DHCP applets
@@ -1027,7 +1037,7 @@ CONFIG_UDHCP_DEBUG=0
CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS=80
CONFIG_FEATURE_UDHCP_RFC3397=y
CONFIG_FEATURE_UDHCP_8021Q=y
CONFIG_IFUPDOWN_UDHCPC_CMD_OPTIONS="-b -R -n -O search"
CONFIG_IFUPDOWN_UDHCPC_CMD_OPTIONS=""
#
# Print Utilities
@@ -1132,7 +1142,7 @@ CONFIG_SH_IS_ASH=y
CONFIG_BASH_IS_NONE=y
CONFIG_SHELL_ASH=y
CONFIG_ASH=y
CONFIG_ASH_OPTIMIZE_FOR_SIZE=y
# CONFIG_ASH_OPTIMIZE_FOR_SIZE is not set
CONFIG_ASH_INTERNAL_GLOB=y
CONFIG_ASH_BASH_COMPAT=y
# CONFIG_ASH_BASH_SOURCE_CURDIR is not set
@@ -1146,7 +1156,6 @@ CONFIG_ASH_IDLE_TIMEOUT=y
CONFIG_ASH_ECHO=y
CONFIG_ASH_PRINTF=y
CONFIG_ASH_TEST=y
CONFIG_ASH_SLEEP=y
CONFIG_ASH_HELP=y
CONFIG_ASH_GETOPTS=y
CONFIG_ASH_CMDCMD=y
@@ -1197,7 +1206,7 @@ CONFIG_FEATURE_SH_MATH_64=y
CONFIG_FEATURE_SH_MATH_BASE=y
CONFIG_FEATURE_SH_EXTRA_QUIET=y
# CONFIG_FEATURE_SH_STANDALONE is not set
# CONFIG_FEATURE_SH_NOFORK is not set
CONFIG_FEATURE_SH_NOFORK=y
CONFIG_FEATURE_SH_READ_FRAC=y
# CONFIG_FEATURE_SH_HISTFILESIZE is not set
CONFIG_FEATURE_SH_EMBEDDED_SCRIPTS=y
+4
View File
@@ -44,6 +44,10 @@ if [ -n "${ID_LIKE}" ]; then
ID="${ID} ${ID_LIKE}"
fi
# Initialize default hostname for hostname.d pattern
mkdir -p "$TARGET_DIR/etc/hostname.d"
cp "$TARGET_DIR/etc/hostname" "$TARGET_DIR/etc/hostname.d/10-default"
# This is a symlink to /usr/lib/os-release, so we remove this to keep
# original Buildroot information.
ixmsg "Creating /etc/os-release"
@@ -1,3 +1,3 @@
task name:ixinit log:tag:ixinit [S] <pid/syslogd> \
task name:ixinit [S] <pid/syslogd> \
/usr/libexec/finit/runparts -bp /usr/libexec/infix/init.d \
-- Probing system
@@ -1 +0,0 @@
task [S] <service/confd/ready> /usr/libexec/infix/mkcert -- Verifying self-signed https certificate
@@ -1,3 +1,3 @@
service name:netopeer notify:none log env:/etc/default/confd \
[12345] <pid/confd> netopeer2-server -F -t $CONFD_TIMEOUT -v 1 \
service name:netopeer notify:none log:null env:/etc/default/confd \
[12345] <pid/confd,usr/bootstrap> netopeer2-server -F -t $CONFD_TIMEOUT -v 1 \
-- NETCONF server
@@ -1,3 +1,3 @@
service name:rousette notify:none log:null <pid/confd> env:/etc/default/confd \
[12345] rousette --syslog -t $CONFD_TIMEOUT \
service <!pid/confd,usr/bootstrap> notify:none log:null env:/etc/default/confd \
[12345] rousette --syslog --log-level info -t $CONFD_TIMEOUT \
-- RESTCONF server
+1 -1
View File
@@ -1,5 +1,5 @@
# Override Finit plugin
service cgroup.system name:dbus notify:none pid:!/run/messagebus.pid \
[S123456789] <pid/syslogd> /usr/bin/dbus-daemon --nofork --system --syslog-only \
[S123456789] <usr/bootstrap> /usr/bin/dbus-daemon --nofork --system --syslog-only \
-- D-Bus message bus daemon
@@ -1 +0,0 @@
../available/mkcert.conf
+16 -23
View File
@@ -10,49 +10,43 @@
HOSTNAME_D="/etc/hostname.d"
# Ensure directory exists
mkdir -p "$HOSTNAME_D"
# Find the highest priority file (reverse sort, take first)
hostname_file=$(ls -1 "$HOSTNAME_D" 2>/dev/null | sort -r | head -1)
if [ -z "$hostname_file" ]; then
# Find highest priority file (reverse lexicographic)
set -- "$HOSTNAME_D"/*
if [ ! -e "$1" ]; then
logger -it confd "No hostname sources found in $HOSTNAME_D"
exit 1
fi
# Read hostname from the file (first line only, strip whitespace)
new_hostname=$(cat "$HOSTNAME_D/$hostname_file" | head -1 | tr -d '\n\r\t ')
if [ -z "$new_hostname" ]; then
logger -it confd "Empty hostname in $hostname_file"
file=$(printf '%s\n' "$@" | sort -r | head -n1)
IFS= read -r new < "$file"
new=$(printf '%s' "$new" | tr -d '\r\n\t ')
if [ -z "$new" ]; then
logger -it confd "Empty hostname in $file"
exit 1
fi
if [ ${#new_hostname} -gt 64 ]; then
logger -it confd "Hostname too long (${#new_hostname} > 64) in $hostname_file"
if [ ${#new} -gt 64 ]; then
logger -it confd "Hostname too long (${#new} > 64) in $file"
exit 1
fi
# Check if hostname has actually changed
current_hostname=$(hostname)
if [ "$new_hostname" = "$current_hostname" ]; then
if [ "$new" = "$(hostname)" ]; then
# No change needed, exit silently
exit 0
fi
# Set the hostname
logger -it confd "Setting hostname to '$new_hostname' from $hostname_file"
hostname "$new_hostname"
# Update /etc/hostname (for persistence across reboots)
echo "$new_hostname" > /etc/hostname
if hostname "$new"; then
echo "$new" > /etc/hostname
fi
# Update /etc/hosts (127.0.1.1 entry for proper name resolution)
if grep -q "^127\.0\.1\.1" /etc/hosts; then
sed -i -E "s/^(127\.0\.1\.1\s+).*/\1$new_hostname/" /etc/hosts
sed -i -E "s/^(127\.0\.1\.1\s+).*/\1$new/" /etc/hosts
else
# Add entry if it doesn't exist
echo "127.0.1.1 $new_hostname" >> /etc/hosts
echo "127.0.1.1 $new" >> /etc/hosts
fi
# Notify services of hostname change, skip while in bootstrap
@@ -63,7 +57,6 @@ fi
initctl -bq status lldpd && lldpcli configure system hostname "$new_hostname" 2>/dev/null
initctl -bq touch mdns-alias 2>/dev/null
initctl -bq touch netbrowse 2>/dev/null
# If called from dhcp script we need to reload to activate new name in syslogd
# Otherwise we're called from confd, which does the reload when all is done.
@@ -521,6 +521,52 @@ def probe_dtsystem(out):
return 0
def probe_wifi_radios(out):
"""Probe wifi radios via sysfs/iw and store in output dict."""
# feature-wifi is the only Buildroot package that enables CONFIG_MAC80211/
# CONFIG_CFG80211, so this directory exists iff WiFi support is built in.
# feature-wifi also selects BR2_PACKAGE_IW, so iw(8) is always available
# when this directory exists -- no separate iw check needed.
ieee80211 = "/sys/class/ieee80211"
if not os.path.exists(ieee80211):
return
radios = sorted(os.listdir(ieee80211))
if not radios:
return
out["wifi-radios"] = []
for phy in radios:
info = {"name": phy, "bands": []}
try:
result = subprocess.run(
["iw", "phy", phy, "info"],
capture_output=True, text=True, timeout=5
)
if result.returncode != 0:
continue
except Exception:
continue
freqs = []
for line in result.stdout.splitlines():
stripped = line.strip()
if stripped.startswith("* ") and "MHz" in stripped:
try:
freqs.append(int(float(stripped.split()[1])))
except (ValueError, IndexError):
pass
if any(2400 <= f <= 2500 for f in freqs):
info["bands"].append({"name": "2.4GHz"})
if any(5150 <= f <= 5900 for f in freqs):
info["bands"].append({"name": "5GHz"})
if any(5955 <= f <= 7115 for f in freqs):
info["bands"].append({"name": "6GHz"})
out["wifi-radios"].append(info)
def main():
out = {
"vendor": None,
@@ -546,6 +592,8 @@ def main():
if err:
return err
probe_wifi_radios(out)
if not out["factory-password-hash"]:
sys.stdout.write("\n\n\033[31mCRITICAL BOOTSTRAP ERROR\n" +
"NO FACTORY PASSWORD FOUND\033[0m\n\n")
@@ -1,18 +0,0 @@
#!/bin/sh
# Initialize default hostname for hostname.d pattern
# This runs very early in boot to set up the default hostname entry
HOSTNAME_D="/etc/hostname.d"
# Ensure directory exists
mkdir -p "$HOSTNAME_D"
# If no default exists yet, create it from /etc/hostname (from squashfs)
if [ ! -f "$HOSTNAME_D/10-default" ] && [ -f /etc/hostname ]; then
cp /etc/hostname "$HOSTNAME_D/10-default"
fi
# Apply hostname using the deterministic helper
if [ -x /usr/libexec/infix/hostname ]; then
/usr/libexec/infix/hostname
fi
@@ -1,20 +0,0 @@
#!/bin/sh
# Check if /cfg/startup-config.cfg needs to be migrated to new syntax.
# Backup of the original is created in /cfg/backup/ for old versions,
# the migrate tool inserts old version in name before .cfg extension.
CONFIG_FILE="/cfg/startup-config.cfg"
BACKUP_FILE="/cfg/backup/startup-config.cfg"
BACKUP_DIR="$(dirname "$BACKUP_FILE")"
mkdir -p "$BACKUP_DIR"
chown root:wheel "$BACKUP_DIR"
chmod 0770 "$BACKUP_DIR"
if [ ! -f "$CONFIG_FILE" ]; then
logger -I $$ -k -p user.notice -t $(basename "$0") "No $(basename "$CONFIG_FILE" .cfg) yet, likely factory reset."
exit 0
elif migrate -cq "$CONFIG_FILE"; then
exit 0
fi
migrate -i -b "$BACKUP_FILE" "$CONFIG_FILE"
+13 -20
View File
@@ -1,7 +1,12 @@
#!/bin/sh
# Generate a self-signed TLS certificate. Called from confd keystore
# on first boot (or factory reset) when the gencert entry has empty
# keys. Output is written to a temporary directory that confd reads
# and then removes after importing into the keystore.
KEY=/cfg/ssl/private/self-signed.key
CRT=/cfg/ssl/certs/self-signed.crt
TMPDIR=/tmp/ssl
KEY=$TMPDIR/self-signed.key
CRT=$TMPDIR/self-signed.crt
country=US
state=California
@@ -20,23 +25,11 @@ if [ -z "$cn" ]; then
fi
fi
generate()
{
mkdir -p /cfg/ssl/private /cfg/ssl/certs
chmod 700 /cfg/ssl/private
mkdir -p "$TMPDIR"
chmod 700 "$TMPDIR"
gencert --country "$country" --state "$state" --city "$city" --organisation "$org" \
--organisation-unit "$unit" --common-name "$cn" \
--out-certificate $CRT --out-key $KEY
}
gencert --country "$country" --state "$state" --city "$city" --organisation "$org" \
--organisation-unit "$unit" --common-name "$cn" \
--out-certificate "$CRT" --out-key "$KEY"
CN=$(openssl x509 -noout -subject -in "${CRT}" 2>/dev/null |sed 's/.*CN=//')
if [ -z "$CN" ] || [ "$CN" != "$cn" ]; then
generate "$cn"
fi
cp "${KEY}" "/etc/ssl/private/"
cp "${CRT}" "/etc/ssl/certs/"
initctl cond set mkcert
exit 0
exit $?
+3
View File
@@ -146,8 +146,11 @@ INFIX_HOME="https://github.com/kernelkit/infix/"
INFIX_DOC="https://www.kernelkit.org/infix/"
INFIX_SUPPORT="mailto:kernelkit@googlegroups.com"
BR2_PACKAGE_FEATURE_GPS=y
BR2_PACKAGE_FEATURE_WIFI=y
BR2_PACKAGE_FEATURE_WIFI_MEDIATEK=y
BR2_PACKAGE_FEATURE_WIFI_REALTEK=y
BR2_PACKAGE_BRCMFMAC_SDIO_FIRMWARE_RPI=y
BR2_PACKAGE_BRCMFMAC_SDIO_FIRMWARE_RPI_WIFI=y
BR2_PACKAGE_CONFD=y
BR2_PACKAGE_NETD=y
BR2_PACKAGE_CONFD_TEST_MODE=y
+2 -3
View File
@@ -20,9 +20,8 @@ BR2_TARGET_AT91BOOTSTRAP3_CUSTOM_TARBALL=y
BR2_TARGET_AT91BOOTSTRAP3_CUSTOM_TARBALL_LOCATION="$(call github,linux4sam,at91bootstrap,v4.0.9)/at91bootstrap-v4.0.9.tar.gz"
BR2_TARGET_AT91BOOTSTRAP3_DEFCONFIG="sama7g5ekemmc_uboot"
BR2_TARGET_UBOOT=y
BR2_TARGET_UBOOT_BUILD_SYSTEM_KCONFIG=y
BR2_TARGET_UBOOT_CUSTOM_TARBALL=y
BR2_TARGET_UBOOT_CUSTOM_TARBALL_LOCATION="$(call github,linux4sam,u-boot-at91,linux4microchip-2025.04)/u-boot-at91-linux4microchip-2025.04.tar.gz"
BR2_TARGET_UBOOT_CUSTOM_VERSION=y
BR2_TARGET_UBOOT_CUSTOM_VERSION_VALUE="2025.01"
BR2_TARGET_UBOOT_BOARD_DEFCONFIG="sama7g5ek_mmc"
BR2_TARGET_UBOOT_CONFIG_FRAGMENT_FILES="$(BR2_EXTERNAL_INFIX_PATH)/board/common/uboot/extras.config $(BR2_EXTERNAL_INFIX_PATH)/board/arm/microchip-sama7g54-ek/uboot/extras.config $(BR2_EXTERNAL_INFIX_PATH)/board/arm/microchip-sama7g54-ek/uboot/emmc-extras.config"
BR2_TARGET_UBOOT_NEEDS_DTC=y
+2 -3
View File
@@ -20,9 +20,8 @@ BR2_TARGET_AT91BOOTSTRAP3_CUSTOM_TARBALL=y
BR2_TARGET_AT91BOOTSTRAP3_CUSTOM_TARBALL_LOCATION="$(call github,linux4sam,at91bootstrap,v4.0.9)/at91bootstrap-v4.0.9.tar.gz"
BR2_TARGET_AT91BOOTSTRAP3_DEFCONFIG="sama7g5eksd_uboot"
BR2_TARGET_UBOOT=y
BR2_TARGET_UBOOT_BUILD_SYSTEM_KCONFIG=y
BR2_TARGET_UBOOT_CUSTOM_TARBALL=y
BR2_TARGET_UBOOT_CUSTOM_TARBALL_LOCATION="$(call github,linux4sam,u-boot-at91,linux4microchip-2025.04)/u-boot-at91-linux4microchip-2025.04.tar.gz"
BR2_TARGET_UBOOT_CUSTOM_VERSION=y
BR2_TARGET_UBOOT_CUSTOM_VERSION_VALUE="2025.01"
BR2_TARGET_UBOOT_BOARD_DEFCONFIG="sama7g5ek_mmc1"
BR2_TARGET_UBOOT_CONFIG_FRAGMENT_FILES="$(BR2_EXTERNAL_INFIX_PATH)/board/common/uboot/extras.config $(BR2_EXTERNAL_INFIX_PATH)/board/arm/microchip-sama7g54-ek/uboot/extras.config $(BR2_EXTERNAL_INFIX_PATH)/board/arm/microchip-sama7g54-ek/uboot/sd-extras.config"
BR2_TARGET_UBOOT_NEEDS_DTC=y
+13 -7
View File
@@ -31,11 +31,24 @@ All notable changes to the project are documented in this file.
- `no ssh known-hosts <host>` — remove a stale or changed host key entry
- Add OSPF point-to-multipoint (P2MP) and hybrid interface type support. This
also includes support for setting static neighbors, issue #1426
- Add support for user-configurable HTTPS certificate: select any certificate
stored in the keystore via `services web certificate <name>`. The default
auto-generated self-signed certificate is now stored in the keystore rather
than in `/cfg/ssl` and existing certificates are auto-migrated on upgrade
### Fixes
- Fix #892: suppress rousette RESTCONF server warnings from syslog
- Fix #1387: `infix.local` now resolves to exactly one device per LAN. Previously
all Infix devices claimed both `hostname.local` and `infix.local`, causing avahi
to append `#2`, `#3` suffixes to the shared alias on busy networks. Assignment
is now first-come-first-served using standard mDNS conflict resolution
- Fix #1416: `show firewall` command show an error when the firewall is disabled
- Fix regression in MVEBU SafeXcel Crypto Engine for Marvell Armada SOCs (37xx,
7k, 8k, and CN913x series). Firmware package lost in v26.01.0
- Fix #1438: default route from DHCP client not set at boot, regression
introduced in v26.02.0
- Fix #1446: suppress netopeer2-server NETCONF server warnings from syslog
- Fix DHCP client not sending hostname to server (e.g. for `dnsmasq` lease
registration). All board factory configs had the hostname option without
`value: auto`, so `udhcpc` only requested the option instead of sending it.
@@ -46,13 +59,6 @@ All notable changes to the project are documented in this file.
options 3 (router) and 6 (dns-server) on every DHCP transaction. Add
`dhcp-authoritative` so clients with unexpired leases are not NAKed after
a router crash or factory reset that clears the lease database
- Fix #1387: `infix.local` now resolves to exactly one device per LAN. Previously
all Infix devices claimed both `hostname.local` and `infix.local`, causing avahi
to append `#2`, `#3` suffixes to the shared alias on busy networks. Assignment
is now first-come-first-served using standard mDNS conflict resolution
- Fix #1416: `show firewall` command show an error when the firewall is disabled
- Fix regression in MVEBU SafeXcel Crypto Engine for Marvell Armada SOCs (37xx,
7k, 8k, and CN913x series). Firmware package lost in v26.01.0
[BPI-R64]: https://docs.banana-pi.org/en/BPI-R64/BananaPi_BPI-R64
[RPI-400]: https://www.raspberrypi.com/products/raspberry-pi-400/
+33 -2
View File
@@ -59,6 +59,8 @@ them:
XPath: `/ietf-system:system/authentication/user/password`
- **Default SSH and NETCONF hostkey:** `genkey` (regenerated at factory reset)
XPath: `/ietf-keystore:keystore/asymmetric-keys/asymmetric-key[name='genkey']`
- **Default HTTPS certificate:** `gencert` (self-signed, regenerated at factory reset)
XPath: `/ietf-keystore:keystore/asymmetric-keys/asymmetric-key[name='gencert']`
- **Hostname format specifiers:**
XPath: `/ietf-system:system/hostname`
- `%i`: OS ID, from `/etc/os-release`, from Menuconfig branding
@@ -219,8 +221,12 @@ Notice how both the public and private keys are left empty here, this
cause them to be always automatically regenerated after each factory reset.
Keeping the `factory-config` snippet like this means we can use the same
file on multiple devices, without risking them sharing the same host
keys. Sometimes you may want the same host keys, but that is the easy
use-case and not documented here.
keys or TLS certificates. Sometimes you may want the same keys, but
that is the easy use-case and not documented here.
The `genkey` entry is the default SSH host key, and `gencert` is the
default self-signed HTTPS certificate used by the web server (nginx).
Both are regenerated on factory reset when their keys are empty.
```json
"ietf-keystore:keystore": {
@@ -233,6 +239,18 @@ use-case and not documented here.
"private-key-format": "ietf-crypto-types:rsa-private-key-format",
"cleartext-private-key": "",
"certificates": {}
},
{
"name": "gencert",
"public-key-format": "infix-crypto-types:x509-public-key-format",
"public-key": "",
"private-key-format": "infix-crypto-types:rsa-private-key-format",
"cleartext-private-key": "",
"certificates": {
"certificate": [
{ "name": "self-signed", "cert-data": "" }
]
}
}
]
}
@@ -292,9 +310,22 @@ use-case and not documented here.
"port": 22
}
]
},
"infix-services:web": {
"certificate": "gencert",
"enabled": true,
"console": { "enabled": true },
"netbrowse": { "enabled": true },
"restconf": { "enabled": true }
}
```
The `certificate` leaf references an asymmetric key in the keystore
that has an associated certificate. The default `gencert` entry uses
a self-signed certificate. To use a custom (e.g., CA-signed)
certificate, create a new keystore entry with
`x509-public-key-format` and point the web `certificate` leaf to it.
## Integration
When integrating your software stack with Infix there may be protocols
+44 -56
View File
@@ -40,16 +40,14 @@ admin@host:/config/interface/eth0/> up
admin@host:/config/>
```
----
> **Note:** commands in configure context are automatically generated
> from the system's YANG models, hence different products likely have a
> different set of commands. However, both the `ietf-interfaces.yang`
> and `ietf-ip.yang` models, for instance, that provide the networking
> **Note**
>
> Commands in configure context are automatically generated from the
> system's YANG models, hence different products likely have a different
> set of commands. However, both the `ietf-interfaces.yang` and
> `ietf-ip.yang` models, for instance, that provide the networking
> support are common to all systems.
----
## Set IP Address on an Interface
```
@@ -74,7 +72,6 @@ interfaces {
}
```
## Saving Changes
Apply the changes (from candidate to `running-config`):
@@ -85,12 +82,12 @@ admin@host:/> show running-config
...
interfaces {
interface eth0 {
type ethernetCsmacd;
ipv4 {
address 192.168.2.200 {
prefix-length 24;
}
}
type ethernetCsmacd;
ipv4 {
address 192.168.2.200 {
prefix-length 24;
}
}
}
...
```
@@ -106,12 +103,10 @@ admin@host:/> copy running-config startup-config
The `startup-config` can also be inspected with the `show` command to
verify the changes are saved.
----
> **Note:** all commands need to be spelled out, no short forms are
> allowed in the CLI. Use the `TAB` key to make your life easier.
----
> **Important**
>
> All commands need to be spelled out, no short forms are allowed in the
> CLI. Use the `TAB` key to make your life easier.
## Changing Hostname
@@ -128,12 +123,10 @@ admin@example:/>
Notice how the hostname in the prompt does not change until the change
is committed.
----
> **Note:** critical services like syslog, mDNS, LLDP, and similar that
> advertise the hostname, are restarted when the hostname is changed.
----
> **Note**
>
> Critical services like syslog, mDNS, LLDP, and similar that advertise
> the hostname, are restarted when the hostname is changed.
## Changing Password
@@ -142,14 +135,14 @@ User management, including passwords, is also a part of `ietf-system`.
```
admin@host:/config/> edit system authentication user admin
admin@host:/config/system/authentication/user/admin/> change password
New password:
Retype password:
New password:
Retype password:
admin@host:/config/system/authentication/user/admin/> leave
```
The `change password` command starts an interactive dialogue that asks
for the new password, with a confirmation, and then salts and encrypts
the password with sha512crypt.
the password with sha512crypt.
It is also possible to use the `set password ...` command. This allows
setting an already hashed password. To manually hash a password, use
@@ -157,13 +150,11 @@ the `do password encrypt` command. This launches the admin-exec command
to hash, and optionally salt, your password. This encrypted string can
then be used with `set password ...`.
----
> **Tip:** if you are having trouble thinking of a password, there is
> also `do password generate`, which generates random but readable
> strings using the UNIX command `pwgen`.
----
> **Tip**
>
> If you are having trouble thinking of a password, there is also `do
> password generate`, which generates random but readable strings using
> the UNIX command `pwgen`.
## SSH Authorized Key
@@ -185,11 +176,11 @@ key-data AAAAB3NzaC1yc2EAAAADAQABAAABgQC8iBL42yeMBioFay7lty1C4ZDTHcHyo739gc91rTT
admin@host:/config/system/authentication/user/admin/authorized-key/example@host/> leave
```
----
> **Note:** the `ssh-keygen` program already base64 encodes the public
> key data, so there is no need to use the `text-editor` command, `set`
> does the job.
> **Note**
>
> The `ssh-keygen` program already base64 encodes the public key data,
> so there is no need to use the `text-editor` command, `set` does the
> job.
----
@@ -229,13 +220,12 @@ admin@host:/config/> leave
See the bridging example below for more.
----
> **Note:** in the CLI you do not have to create the `veth0b` interface.
> The system _infers_ this for you. When setting up a VETH pair using
> NETCONF, however, you must include the `veth0b` interface.
----
> **Tip**
>
> In the CLI you do not have to create the `veth0b` interface. The
> system _infers_ this for you. This does not apply when setting up a
> VETH pair using NETCONF or RESTCONF, then you must submit a complete
> configuration.
## Creating a Bridge
@@ -291,10 +281,8 @@ the VETH pair from the previous example) are now bridged. Any traffic
ingressing one port will egress the other. Only reserved IEEE multicast
is filtered, except LLDP frames as shown above.
----
> **Note:** the bridge can be named anything, provided the interface
> name is not already taken. However, for any name outside the pattern
> `br[0-9]+`, you have to set the interface type manually to `bridge`.
----
> **Important**
>
> The bridge can be named anything, provided the interface name is not
> already taken. However, for any name outside the pattern `br[0-9]+`,
> you have to set the interface type manually to `bridge`.
+22 -25
View File
@@ -34,13 +34,11 @@ admin@host-12-34-56:/> show # Try: Tab or ?
admin@host-12-34-56:/> # Try: Tab or ?
```
----
> **Note:** even on an empty command line, you can tap the `Tab` or `?` keys.
> **Tip**
>
> Even on an empty command line, you can tap the `Tab` or `?` keys.
> See [`help keybindings`](keybindings.md) for more tips!
----
## Key Concepts
The two modes in the CLI are the admin-exec and the configure context.
@@ -78,15 +76,15 @@ and *running* that can be managed and inspected using the `copy`,
`show`, and `configure` commands. The traditional names used in the CLI
for these are listed below:
- `factory-config` the default configuration from factory for the
device, i.e., what the system returns to after a `factory-reset`
- `startup-config` created from `factory-config` at first boot after
factory reset. Loaded as the system configuration on each boot
- `running-config` what is actively running on the system. If no
changes have been made since boot, it is the same as `startup-config`
- `candidate-config` is created from `running-config` when entering the
configure context. Any changes made here can be discarded (`abort`,
`rollback`) or committed (`commit`, `leave`) to `running-config`
- `factory-config` the default configuration from factory for the
device, i.e., what the system returns to after a `factory-reset`
- `startup-config` created from `factory-config` at first boot after
factory reset. Loaded as the system configuration on each boot
- `running-config` what is actively running on the system. If no
changes have been made since boot, it is the same as `startup-config`
- `candidate-config` is created from `running-config` when entering the
configure context. Any changes made here can be discarded (`abort`,
`rollback`) or committed (`commit`, `leave`) to `running-config`
Edit the *running* configuration using the `configure` command. This
copies *running* to *candidate*, a temporary datastore, where changes
@@ -131,16 +129,13 @@ In *configure context* the following commands are available:
| `do command` | Call admin-exec command: `do show log` |
| `commit` | |
## Example Session
----
> **Tip**
>
> Remember to use the `TAB` and `?` keys to speed up your navigation.
> See [`help keybindings`](keybindings.md) for more tips!
----
In this example we enter configure context to add an IPv4 address to
interface `eth0`, then we apply the changes using the `leave` command.
@@ -151,8 +146,8 @@ save the changes for the next reboot.
admin@host-12-34-56:/> configure
admin@host-12-34-56:/config/> edit interface eth0
admin@host-12-34-56:/config/interface/eth0/> set ipv4 <TAB>
address autoconf bind-ni-name enabled
forwarding mtu neighbor
address autoconf bind-ni-name dhcp
enabled forwarding mtu neighbor
admin@host-12-34-56:/config/interface/eth0/> set ipv4 address 192.168.2.200 prefix-length 24
admin@host-12-34-56:/config/interface/eth0/> show
type ethernetCsmacd;
@@ -193,10 +188,12 @@ admin@host-12-34-56:/> copy startup-config running-config
Or restart the device, for example if the change to the configuration
caused you to lose contact with the system (it happens to the best of
us). The system will start up from the last "save gave".
us). The system will start up from the last "save game".
> **Tip:** when restoring a backup of a configuration, or having manually
> edited a config file, you can validate it using system's YANG models,
> it is *not* applied if validation is successful:
> **Tip:** Restoring Backups
>
> When restoring a backup of a configuration, or having manually edited
> a config file, you can validate it using the system's YANG models, it
> is *not* applied if validation is successful:
>
> `copy /media/backup/old.cfg running-config validate`
+1 -2
View File
@@ -33,7 +33,7 @@ CLI has several keybindings, most significant first:
| Ctrl-t | | Transpose/Swap characters before and at cursor |
| Meta-# | Alt-Shift-3 | Prepend # to current line and submit to history |
## What is Meta?
## What is Meta
The Meta key is called Alt on most modern keyboards. If you have
neither, first tap the Esc key instead of holding down Alt/Meta.
@@ -53,4 +53,3 @@ See possible arguments, with brief help text, to a command:
...
Type the command, then tap the `?` key.
-1
View File
@@ -18,7 +18,6 @@ A subnet can be entered in two ways:
An optional `split LEN` can be given as argument, the new length value
must be bigger than the current prefix length. See example below.
## Examples
Its most commonly used features are to understand how many addresses an
+3 -5
View File
@@ -23,10 +23,8 @@ keybindings are really useful to learn!
| `help text-editor` | Help with the built-in text-editor command |
| `help keybindings` | Lists available keybindings & other helpful tricks |
----
> In `configure` context the `help setting` command shows the YANG
> **Tip:** Online Help
>
> In `configure` context the `help <setting>` command shows the YANG
> description text for each node and container. To reach the admin
> exec help from configure context, e.g., `do help text-editor`
----
+2 -2
View File
@@ -10,7 +10,7 @@ use the `upgrade` command and a URI to a ftp/tftp/sftp or http/https server
that hosts the file:
```
admin@host:/> upgrade tftp://192.168.122.1/firmware-x86_64-v23.11.pkg
admin@example:/> upgrade tftp://192.168.122.1/firmware-x86_64-v23.11.pkg
installing
0% Installing
0% Determining slot states
@@ -31,7 +31,7 @@ installing
99% Updating slots done.
100% Installing done.
Installing `tftp://192.168.122.1/firmware-x86_64-v23.11.pkg` succeeded
admin@host:/>
admin@example:/>
```
The secondary partition (`rootfs.1`) has now been upgraded and will be used as
File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 416 KiB

After

Width:  |  Height:  |  Size: 428 KiB

+54 -4
View File
@@ -11,6 +11,7 @@ The keystore supports two types of cryptographic keys:
1. **Asymmetric Keys** — public/private key pairs used for:
- SSH host authentication (RSA keys)
- HTTPS/TLS certificates (X.509 keys)
- WireGuard VPN tunnels (X25519 keys)
2. **Symmetric Keys** — shared secrets used for:
@@ -22,10 +23,11 @@ managed via CLI, NETCONF, or RESTCONF.
### Supported Formats
| **Asymmetric Key Format** | **Use Case** | **Key Type** |
|----------------------------------------------------------|---------------|--------------|
| `rsa-private-key-format` / `ssh-public-key-format` | SSH host keys | RSA |
| `x25519-private-key-format` / `x25519-public-key-format` | WireGuard VPN | Curve25519 |
| **Asymmetric Key Format** | **Use Case** | **Key Type** |
|----------------------------------------------------------|--------------------|--------------|
| `rsa-private-key-format` / `ssh-public-key-format` | SSH host keys | RSA |
| `rsa-private-key-format` / `x509-public-key-format` | TLS certificates | RSA + X.509 |
| `x25519-private-key-format` / `x25519-public-key-format` | WireGuard VPN | Curve25519 |
| **Symmetric Key Format** | **Use Case** |
|-----------------------------|-----------------------------------|
@@ -46,6 +48,53 @@ keystore with the name `genkey`.
See [SSH Management](management.md) for details on generating and importing
custom SSH host keys.
### TLS Certificates
TLS certificates are used by the web server (nginx) for HTTPS connections.
The default certificate is a self-signed certificate automatically generated
on first boot and stored in the keystore with the name `gencert`. Like SSH
host keys, the certificate is regenerated on factory reset when its keys are
empty.
The web server's `certificate` leaf references which keystore entry to use:
```json
"infix-services:web": {
"certificate": "gencert",
"enabled": true
}
```
To use a custom (e.g., CA-signed) certificate, create a new asymmetric key
entry with `x509-public-key-format`, populate it with your certificate and
private key, then point the web `certificate` leaf to it:
```json
"ietf-keystore:keystore": {
"asymmetric-keys": {
"asymmetric-key": [
{
"name": "my-cert",
"public-key-format": "infix-crypto-types:x509-public-key-format",
"public-key": "<base64-encoded-cert>",
"private-key-format": "infix-crypto-types:rsa-private-key-format",
"cleartext-private-key": "<base64-encoded-key>",
"certificates": {
"certificate": [
{ "name": "ca-signed", "cert-data": "<base64-encoded-cert>" }
]
}
}
]
}
}
```
> [!NOTE]
> The `public-key` and `cert-data` fields contain base64-encoded PEM data
> with the `-----BEGIN/END-----` markers stripped. The system reconstructs
> the PEM files when writing them to disk for nginx.
### WireGuard Keys
WireGuard uses X25519 elliptic curve cryptography for key exchange. Each
@@ -116,6 +165,7 @@ wg-psk octet-string zYr83O4Ykj9i1gN+/aaosJxQx...
<span class="title">Asymmetric Keys</span>
<span class="header">NAME TYPE PUBLIC KEY </span>
genkey rsa MIIBCgKCAQEAnj0YinjhYDgYbEGuh7...
gencert x509 MIIDXTCCAkWgAwIBAgIJAJC1HiIAZA...
wg-tunnel x25519 bN1CwZ1lTP6KsrCwZ1lTP6KsrCwZ1...
</code></pre>
+18
View File
@@ -136,6 +136,7 @@ the unit's neighbors, collected via mDNS (see
<pre class="cli"><code>admin@example:/> <b>configure</b>
admin@example:/config/> <b>edit web</b>
admin@example:/config/web/> <b>help</b>
certificate Reference to asymmetric key in central keystore.
enabled Enable or disable on all web services.
console Web console interface.
netbrowse mDNS Network Browser.
@@ -191,6 +192,23 @@ admin@example:/config/web/restconf/> <b>no enabled</b>
admin@example:/config/web/restconf/>
</code></pre>
### HTTPS Certificate
The Web server uses a TLS certificate from the central
[keystore](keystore.md). By default it uses `gencert`, a self-signed
certificate that is automatically generated on first boot.
To use a different certificate, e.g., one signed by a CA, first add
it to the keystore as an asymmetric key with `x509-public-key-format`,
then point the web `certificate` leaf to it:
<pre class="cli"><code>admin@example:/config/web/> <b>set certificate my-cert</b>
admin@example:/config/web/>
</code></pre>
See [Keystore](keystore.md#tls-certificates) for details on managing
TLS certificates.
## System Upgrade
See [Upgrade & Boot Order](upgrade.md) for information on upgrading.
+51 -12
View File
@@ -243,20 +243,59 @@ spanning tree matches the expected one.
Integration to Infix
--------------------
When the test environment is started with Qeneth, it doesn't use the
base image directly. Instead, it creates a copy and inserts a `test-mode`
flag into it. During the bootstrap phase, the system checks for the
presence of the test-mode flag (file).
If the flag exists, a 'test-config.cfg' file is generated. In the
following step, the system loads the 'test-config' instead of the
standard `startup-config` (or `factory-config`). This configuration
is simple and safe, equivalent to the one used in 'Secure Mode'
(also known as 'failure-config').
### Test Mode
Additionally, the configuration enables extra RPCs related to system
restart and configuration overrides, allowing tests to be run even on
systems where the factory configuration may potentially create L2 loops.
Infix supports a *test mode* that makes devices safe and predictable to
test against. When active, each boot starts from a known-good
`test-config` (equivalent to the failure/secure config) instead of the
stored startup or factory configuration. This prevents any persistent
configuration from interfering with tests and avoids L2 loops that a
factory config might create. It also enables two extra RPCs used by
Infamy:
- `infix-test:test/reset` — reload the `test-config` into the running
datastore (called by `env.attach()` at the start of each test)
- `infix-test:test/override-startup` — boot from the startup datastore
once, instead of the `test-config` (used by tests that verify
save-and-reboot behaviour)
Test mode is activated by the presence of an empty file named
`test-mode` on the device's `aux` partition (`/mnt/aux/test-mode`).
### Test Mode on Virtual Devices
When the test environment is started with Qeneth, the `inject-test-mode`
script (`test/inject-test-mode`) is run automatically. It copies the
base disk image and writes the `test-mode` marker into the `aux`
partition of that copy, which is then used as the Qeneth backing image.
### Test Mode on Physical Devices
For a physical device, log in as `root` (or `admin`) and create the
marker file on the `aux` partition, then reboot:
```
# touch /mnt/aux/test-mode
# reboot
```
Alternatively, if you want to prepare the disk image before flashing,
use the `inject-test-mode` script:
```
$ test/inject-test-mode -b infix-<board>.img -o infix-<board>-test.img
```
Flash `infix-<board>-test.img` to the device instead of the plain
image. The device will boot into test mode on first power-on.
> [!NOTE]
> Test mode persists across reboots until the marker file is removed
> (`rm /mnt/aux/test-mode`). A device in test mode always starts from
> the `test-config`, so any configuration changes are lost on reboot
> unless `startup_override()` is called first (or the marker is removed
> and a normal startup config is saved).
[9PM]: https://github.com/rical/9pm
[Qeneth]: https://github.com/wkz/qeneth
+7 -1
View File
@@ -37,7 +37,7 @@ $ make TEST_MODE=host test
...
```
This typically used when testing on physical hardware. By default the
This is typically used when testing on physical hardware. By default the
topology will be sourced from `/etc/infamy.dot`, but this can be
overwritten by setting the `TOPOLOGY` variable:
@@ -46,6 +46,12 @@ $ make TEST_MODE=host TOPOLOGY=~/my-topology.dot test
...
```
> [!IMPORTANT]
> Physical devices must be put into *test mode* before running tests.
> See [Test Mode](test-arch.md#test-mode) in the architecture document
> for details. The short version: log in to the device and run
> `touch /mnt/aux/test-mode && reboot`.
### `make run` Devices
Some tests only require a single DUT. These can therefore be run
+1
View File
@@ -20,6 +20,7 @@ source "$BR2_EXTERNAL_INFIX_PATH/package/firewall/Config.in"
source "$BR2_EXTERNAL_INFIX_PATH/package/greenpak-programmer/Config.in"
source "$BR2_EXTERNAL_INFIX_PATH/package/ifupdown-ng/Config.in"
source "$BR2_EXTERNAL_INFIX_PATH/package/iito/Config.in"
source "$BR2_EXTERNAL_INFIX_PATH/package/initviz/Config.in"
source "$BR2_EXTERNAL_INFIX_PATH/package/k8s-logger/Config.in"
source "$BR2_EXTERNAL_INFIX_PATH/package/keyack/Config.in"
source "$BR2_EXTERNAL_INFIX_PATH/package/klish-plugin-infix/Config.in"
+8 -24
View File
@@ -1,27 +1,11 @@
#set DEBUG=1
run name:bootstrap log:prio:user.notice norestart <usr/ixinit> \
[S] /usr/libexec/confd/bootstrap \
-- Bootstrapping YANG datastore
run name:error :1 log:console norestart if:<run/bootstrap/failure> \
[S] /usr/libexec/confd/error --
service name:confd log:prio:daemon.err <run/bootstrap/success> \
[S12345] sysrepo-plugind -f -p /run/confd.pid -n -v warning \
# Single daemon handles gen-config, datastore init, config load, and plugins
# log:prio:daemon.err
service log:console env:/etc/default/confd \
[S12345] <usr/ixinit> confd -f -v warning \
-F /etc/factory-config.cfg \
-S /cfg/startup-config.cfg \
-E /etc/failure-config.cfg \
-t $CONFD_TIMEOUT \
-- Configuration daemon
# Bootstrap system with startup-config
run name:startup log:prio:user.notice norestart <pid/confd> env:/etc/default/confd \
[S] /usr/libexec/confd/load -t $CONFD_TIMEOUT startup-config \
-- Loading startup-config
# Run if loading startup-config fails for some reason
run name:failure log:prio:user.crit norestart env:/etc/default/confd \
if:<run/startup/failure> \
[S] <pid/confd> /usr/libexec/confd/load -t $CONFD_TIMEOUT failure-config \
-- Loading failure-config
run name:error :2 log:console norestart \
if:<run/failure/failure> \
[S] /usr/libexec/confd/error --
+3 -3
View File
@@ -4,13 +4,13 @@
#
################################################################################
CONFD_VERSION = 1.7
CONFD_VERSION = 1.8
CONFD_SITE_METHOD = local
CONFD_SITE = $(BR2_EXTERNAL_INFIX_PATH)/src/confd
CONFD_LICENSE = BSD-3-Clause
CONFD_LICENSE_FILES = LICENSE
CONFD_REDISTRIBUTE = NO
CONFD_DEPENDENCIES = host-sysrepo sysrepo rousette netopeer2 jansson libite sysrepo libsrx libglib2
CONFD_DEPENDENCIES = host-sysrepo sysrepo rousette netopeer2 jansson libite sysrepo libsrx libglib2 libev
CONFD_AUTORECONF = YES
CONFD_CONF_OPTS += --disable-silent-rules --with-crypt=$(BR2_PACKAGE_CONFD_DEFAULT_CRYPT)
CONFD_SYSREPO_SHM_PREFIX = sr_buildroot$(subst /,_,$(CONFIG_DIR))_confd
@@ -42,7 +42,7 @@ define CONFD_INSTALL_EXTRA
done
cp $(CONFD_PKGDIR)/tmpfiles.conf $(TARGET_DIR)/etc/tmpfiles.d/confd.conf
mkdir -p $(TARGET_DIR)/etc/avahi/services
cp $(CONFD_PKGDIR)/avahi.service $(TARGET_DIR)/etc/avahi/services/netconf.service
cp $(CONFD_PKGDIR)/netconf.service $(TARGET_DIR)/etc/avahi/services/
endef
NETOPEER2_SEARCHPATH=$(TARGET_DIR)/usr/share/yang/modules/netopeer2/
+2 -3
View File
@@ -1,3 +1,2 @@
# Create initial /etc/resolv.conf after successful bootstrap, regardless
# of startup-config or failure-config. Condition set by confd.
task [S12345] <usr/bootstrap> resolvconf -u -- Update DNS configuration
# Update /etc/resolv.conf after successful bootstrap and reconf.
task [S12345] <usr/bootstrap,pid/dnsmasq> resolvconf -u --
@@ -0,0 +1,54 @@
From 184c079c08387d1b0f74de25b63c56304d2156d0 Mon Sep 17 00:00:00 2001
From: bazub <github@zubko.cc>
Date: Tue, 3 Mar 2026 20:31:33 +0000
Subject: [PATCH 1/3] Remove redundant global path var and fix memory
corruption
Organization: Wires
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
src/conf.c | 13 ++-----------
1 file changed, 2 insertions(+), 11 deletions(-)
diff --git a/src/conf.c b/src/conf.c
index d0abb61d..6e8ec834 100644
--- a/src/conf.c
+++ b/src/conf.c
@@ -121,9 +121,6 @@ static uev_t etcw;
static TAILQ_HEAD(, conf_change) conf_change_list = TAILQ_HEAD_INITIALIZER(conf_change_list);
-static char *path;
-static char *shell;
-
static int parse_conf(char *file, int is_rcsd);
static void drop_changes(void);
@@ -377,8 +374,6 @@ void conf_parse_cmdline(int argc, char *argv[])
fstab = strdup(ptr);
finit_conf = strdup(FINIT_CONF);
finit_rcsd = strdup(FINIT_RCSD);
- path = getenv("PATH");
- shell = getenv("SHELL");
for (int i = 1; i < argc; i++)
parse_arg(argv[i]);
@@ -404,13 +399,9 @@ void conf_reset_env(void)
free(node);
}
- if (path)
- setenv("PATH", path, 1);
- else
+ if (!getenv("PATH"))
setenv("PATH", _PATH_STDPATH, 1);
- if (shell)
- setenv("SHELL", shell, 1);
- else
+ if (!getenv("SHELL"))
setenv("SHELL", _PATH_BSHELL, 1);
setenv("LOGNAME", "root", 1);
setenv("USER", "root", 1);
--
2.43.0
@@ -0,0 +1,318 @@
From 662293e194811213b9b387163dfe8499e3300ccf Mon Sep 17 00:00:00 2001
From: bazub <github@zubko.cc>
Date: Fri, 6 Mar 2026 20:36:23 +0000
Subject: [PATCH 2/3] Use explicit plugin names to prevent subtle macro
processing bugs
Organization: Wires
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
plugins/alsa-utils.c | 6 +++---
plugins/bootmisc.c | 2 +-
plugins/dbus.c | 4 ++--
plugins/hook-scripts.c | 2 +-
plugins/modprobe.c | 2 +-
plugins/modules-load.c | 2 +-
plugins/netlink.c | 2 +-
plugins/pidfile.c | 2 +-
plugins/procps.c | 4 ++--
plugins/resolvconf.c | 2 +-
plugins/rtc.c | 6 +++---
plugins/sys.c | 2 +-
plugins/tty.c | 1 +
plugins/urandom.c | 6 +++---
plugins/usr.c | 2 +-
plugins/x11-common.c | 4 ++--
16 files changed, 25 insertions(+), 24 deletions(-)
diff --git a/plugins/alsa-utils.c b/plugins/alsa-utils.c
index 6b2c3603..a8a967b0 100644
--- a/plugins/alsa-utils.c
+++ b/plugins/alsa-utils.c
@@ -38,7 +38,7 @@
static void save(void *arg)
{
if (rescue) {
- dbg("Skipping %s plugin in rescue mode.", __FILE__);
+ dbg("Skipping %s plugin in rescue mode.", "alsa-utils");
return;
}
@@ -51,7 +51,7 @@ static void save(void *arg)
static void restore(void *arg)
{
if (rescue) {
- dbg("Skipping %s plugin in rescue mode.", __FILE__);
+ dbg("Skipping %s plugin in rescue mode.", "alsa-utils");
return;
}
@@ -62,7 +62,7 @@ static void restore(void *arg)
}
static plugin_t plugin = {
- .name = __FILE__,
+ .name = "alsa-utils",
.hook[HOOK_BASEFS_UP] = { .cb = restore },
.hook[HOOK_SHUTDOWN] = { .cb = save }
};
diff --git a/plugins/bootmisc.c b/plugins/bootmisc.c
index 701f73f0..a8ba3808 100644
--- a/plugins/bootmisc.c
+++ b/plugins/bootmisc.c
@@ -172,7 +172,7 @@ static void setup(void *arg)
}
static plugin_t plugin = {
- .name = __FILE__,
+ .name = "bootmisc",
.hook[HOOK_MOUNT_POST] = { .cb = clean },
.hook[HOOK_BASEFS_UP] = { .cb = setup },
.depends = { "pidfile" },
diff --git a/plugins/dbus.c b/plugins/dbus.c
index bbf55bc2..a8a155a1 100644
--- a/plugins/dbus.c
+++ b/plugins/dbus.c
@@ -106,7 +106,7 @@ static void setup(void *arg)
char *cmd;
if (rescue) {
- dbg("Skipping %s plugin in rescue mode.", __FILE__);
+ dbg("Skipping %s plugin in rescue mode.", "dbus");
return;
}
@@ -164,7 +164,7 @@ static void setup(void *arg)
}
static plugin_t plugin = {
- .name = __FILE__,
+ .name = "dbus",
.hook[HOOK_SVC_PLUGIN] = { .cb = setup },
};
diff --git a/plugins/hook-scripts.c b/plugins/hook-scripts.c
index 9aa78173..e75808c5 100644
--- a/plugins/hook-scripts.c
+++ b/plugins/hook-scripts.c
@@ -79,7 +79,7 @@ static void hscript_shutdown(void *arg)
}
static plugin_t plugin = {
- .name = __FILE__,
+ .name = "hook-scripts",
.hook[HOOK_BANNER] = { .cb = hscript_banner },
.hook[HOOK_ROOTFS_UP] = { .cb = hscript_rootfs_up },
.hook[HOOK_MOUNT_ERROR] = { .cb = hscript_mount_error },
diff --git a/plugins/modprobe.c b/plugins/modprobe.c
index b6b7e7bb..e52bf228 100644
--- a/plugins/modprobe.c
+++ b/plugins/modprobe.c
@@ -228,7 +228,7 @@ static void coldplug(void *arg)
}
static plugin_t plugin = {
- .name = __FILE__,
+ .name = "modprobe",
.hook[HOOK_BASEFS_UP] = { .cb = coldplug },
.depends = { "bootmisc", }
};
diff --git a/plugins/modules-load.c b/plugins/modules-load.c
index 53aef82f..e2e45c72 100644
--- a/plugins/modules-load.c
+++ b/plugins/modules-load.c
@@ -213,7 +213,7 @@ static void load(void *arg)
}
static plugin_t plugin = {
- .name = __FILE__,
+ .name = "modules-load",
.hook[HOOK_SVC_PLUGIN] = { .cb = load },
};
diff --git a/plugins/netlink.c b/plugins/netlink.c
index a70b01e8..625cbd1b 100644
--- a/plugins/netlink.c
+++ b/plugins/netlink.c
@@ -426,7 +426,7 @@ static void nl_enumerate(void *arg)
}
static plugin_t plugin = {
- .name = __FILE__,
+ .name = "netlink",
.hook[HOOK_SVC_RECONF] = { .cb = nl_reconf },
.hook[HOOK_SVC_PLUGIN] = { .cb = nl_enumerate },
.io = {
diff --git a/plugins/pidfile.c b/plugins/pidfile.c
index ae0fdeea..f1232ab6 100644
--- a/plugins/pidfile.c
+++ b/plugins/pidfile.c
@@ -335,7 +335,7 @@ static void pidfile_init(void *arg)
* SIGSTP:ed (in state PAUSED) waiting for <net/iface/lo>.
*/
static plugin_t plugin = {
- .name = __FILE__,
+ .name = "pidfile",
.hook[HOOK_BASEFS_UP] = { .cb = pidfile_init },
.hook[HOOK_SVC_RECONF] = { .cb = pidfile_reconf },
.depends = { "netlink" }, /* bootmisc depends on us */
diff --git a/plugins/procps.c b/plugins/procps.c
index 826e38ad..5a178d75 100644
--- a/plugins/procps.c
+++ b/plugins/procps.c
@@ -43,7 +43,7 @@ static void setup(void *arg)
glob_t gl;
if (rescue) {
- dbg("Skipping %s plugin in rescue mode.", __FILE__);
+ dbg("Skipping %s plugin in rescue mode.", "procps");
return;
}
@@ -69,7 +69,7 @@ static void setup(void *arg)
}
static plugin_t plugin = {
- .name = __FILE__,
+ .name = "procps",
.hook[HOOK_BASEFS_UP] = {
.cb = setup
},
diff --git a/plugins/resolvconf.c b/plugins/resolvconf.c
index 1ac29dae..b98e9214 100644
--- a/plugins/resolvconf.c
+++ b/plugins/resolvconf.c
@@ -51,7 +51,7 @@ static void setup(void *arg)
}
static plugin_t plugin = {
- .name = __FILE__,
+ .name = "resolvconf",
.hook[HOOK_BASEFS_UP] = {
.cb = setup
},
diff --git a/plugins/rtc.c b/plugins/rtc.c
index faf69415..cf734763 100644
--- a/plugins/rtc.c
+++ b/plugins/rtc.c
@@ -236,7 +236,7 @@ static void rtc_save(void *arg)
int fd, rc = 0;
if (rescue) {
- dbg("Skipping %s plugin in rescue mode.", __FILE__);
+ dbg("Skipping %s plugin in rescue mode.", "rtc");
return;
}
@@ -266,7 +266,7 @@ static void rtc_restore(void *arg)
int fd, rc = 0;
if (rescue) {
- dbg("Skipping %s plugin in rescue mode.", __FILE__);
+ dbg("Skipping %s plugin in rescue mode.", "rtc");
return;
}
@@ -321,7 +321,7 @@ static void update(uev_t *w, void *arg, int events)
static plugin_t plugin = {
- .name = __FILE__,
+ .name = "rtc",
.hook[HOOK_BASEFS_UP] = {
.cb = rtc_restore
},
diff --git a/plugins/sys.c b/plugins/sys.c
index 438fdfd5..484adc05 100644
--- a/plugins/sys.c
+++ b/plugins/sys.c
@@ -180,7 +180,7 @@ static void sys_init(void *arg)
}
static plugin_t plugin = {
- .name = __FILE__,
+ .name = "sys",
.hook[HOOK_BASEFS_UP] = { .cb = sys_init },
.depends = { "bootmisc", },
};
diff --git a/plugins/tty.c b/plugins/tty.c
index b3255f9f..c6a750b0 100644
--- a/plugins/tty.c
+++ b/plugins/tty.c
@@ -43,6 +43,7 @@
static void tty_watcher(void *arg, int fd, int events);
static plugin_t plugin = {
+ .name = "tty",
.io = {
.cb = tty_watcher,
.flags = PLUGIN_IO_READ,
diff --git a/plugins/urandom.c b/plugins/urandom.c
index 410d0660..9bb6252b 100644
--- a/plugins/urandom.c
+++ b/plugins/urandom.c
@@ -87,7 +87,7 @@ static void setup(void *arg)
int fd, err;
if (rescue) {
- dbg("Skipping %s plugin in rescue mode.", __FILE__);
+ dbg("Skipping %s plugin in rescue mode.", "urandom");
return;
}
@@ -188,7 +188,7 @@ static void save(void *arg)
mode_t prev;
if (rescue) {
- dbg("Skipping %s plugin in rescue mode.", __FILE__);
+ dbg("Skipping %s plugin in rescue mode.", "urandom");
return;
}
@@ -202,7 +202,7 @@ static void save(void *arg)
}
static plugin_t plugin = {
- .name = __FILE__,
+ .name = "urandom",
.hook[HOOK_BASEFS_UP] = { .cb = setup },
.hook[HOOK_SHUTDOWN] = { .cb = save },
.depends = { "bootmisc", }
diff --git a/plugins/usr.c b/plugins/usr.c
index d30d9440..496facc2 100644
--- a/plugins/usr.c
+++ b/plugins/usr.c
@@ -104,7 +104,7 @@ static void usr_init(void *arg)
}
static plugin_t plugin = {
- .name = __FILE__,
+ .name = "usr",
.hook[HOOK_BASEFS_UP] = { .cb = usr_init },
.depends = { "bootmisc", },
};
diff --git a/plugins/x11-common.c b/plugins/x11-common.c
index f65331a0..75825a36 100644
--- a/plugins/x11-common.c
+++ b/plugins/x11-common.c
@@ -39,7 +39,7 @@
static void setup(void *arg)
{
if (rescue) {
- dbg("Skipping %s plugin in rescue mode.", __FILE__);
+ dbg("Skipping %s plugin in rescue mode.", "x11-common");
return;
}
@@ -48,7 +48,7 @@ static void setup(void *arg)
}
static plugin_t plugin = {
- .name = __FILE__,
+ .name = "x11-common",
.hook[HOOK_SVC_PLUGIN] = { .cb = setup },
};
--
2.43.0
@@ -0,0 +1,66 @@
From c01faef99b7e4ff9c39f29ad5648db61a4742539 Mon Sep 17 00:00:00 2001
From: Joachim Wiberg <troglobit@gmail.com>
Date: Thu, 19 Mar 2026 06:37:50 +0100
Subject: [PATCH 3/3] service: clear condition before stopping rdeps on reload
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Organization: Wires
When a service without SIGHUP reload support (noreload) is touched and
'initctl reload' is called, service_update_rdeps() correctly identifies
its reverse dependencies but only marks them dirty. It does not clear
the service's condition, so when service_step_all() runs:
- rdeps supporting SIGHUP hit the sm_in_reload() guard and break early,
left running while their dependency is being killed.
- rdeps without SIGHUP support may receive SIGTERM too late, after the
dependency has already died and broken their connection, causing them
to exit from RUNNING state and have their restart counter incremented.
Fix by calling cond_clear() on the service's condition immediately in
service_update_rdeps(), before service_step_all() runs. cond_clear()
calls cond_update() which calls service_step() inline on all affected
services, which see COND_OFF and transition to STOPPING_STATE — all
before SIGTERM is ever sent to the dependency itself.
This mirrors the pattern already used in api.c:do_reload() for direct
'initctl reload <svc>' calls.
Fixes: avahi/mdns stop causing mdns-alias restart counter increment
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
src/service.c | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/src/service.c b/src/service.c
index b2c6c15b..016b5d2f 100644
--- a/src/service.c
+++ b/src/service.c
@@ -2418,7 +2418,21 @@ void service_update_rdeps(void)
if (!svc_is_noreload(svc))
continue; /* Yup, no need to stop start rdeps */
- svc_mark_affected(mkcond(svc, cond, sizeof(cond)));
+ /*
+ * Clear the condition immediately, before service_step_all()
+ * runs. cond_clear() calls cond_update() which calls
+ * service_step() on all affected services right now. Those
+ * services see COND_OFF and get service_stop() called,
+ * transitioning to STOPPING_STATE before we ever send SIGTERM
+ * to this service. Without this, the condition is only cleared
+ * after the service dies, by which time reverse-dependencies
+ * may have already crashed due to the lost connection.
+ * See also: api.c do_reload() which does the same for direct
+ * 'initctl reload <svc>' calls.
+ */
+ mkcond(svc, cond, sizeof(cond));
+ cond_clear(cond);
+ svc_mark_affected(cond);
}
}
--
2.43.0
+22
View File
@@ -0,0 +1,22 @@
config BR2_PACKAGE_INITVIZ
bool "initviz"
depends on BR2_USE_MMU # fork()
help
InitViz is a performance analysis and visualization tool for the
boot process and system services. It consists of the bootchartd
data collection daemon (bootchartd) that runs during boot to
capture system activity, and InitViz the host visualization tool.
InitViz is a reimplementation and successor to the bootchart2
project, offering a more feature-rich solution compared to the
bootchartd subset available as a BusyBox applet.
To profile the boot process, append the following to the kernel
command line:
init=/sbin/bootchartd initcall_debug printk.time=y quiet
The collected data can be visualized using the host-initviz
tool, initviz.py, which is currently not built here.
https://github.com/finit-project/InitViz
+3
View File
@@ -0,0 +1,3 @@
# Locally calculated
sha256 28a059ca6d3cbc5f65809a18167d089fd0dc2be13cd6c640c56ddae47be01849 initviz-1.0.0-rc1.tar.gz
sha256 54e1afa760fa3649fa47c7838ac937771e74af695d4cf7d907bc61c107c83dc9 COPYING
+26
View File
@@ -0,0 +1,26 @@
################################################################################
#
# initviz
#
################################################################################
INITVIZ_VERSION = 1.0.0-rc1
INITVIZ_SITE = https://github.com/finit-project/InitViz/releases/download/$(INITVIZ_VERSION)
INITVIZ_SOURCE = initviz-$(INITVIZ_VERSION).tar.gz
INITVIZ_LICENSE = GPL-2.0-or-later
INITVIZ_LICENSE_FILES = COPYING
# Target package: bootchartd collector daemon
define INITVIZ_BUILD_CMDS
$(TARGET_MAKE_ENV) $(TARGET_CONFIGURE_OPTS) \
$(MAKE) -C $(@D) collector
endef
define INITVIZ_INSTALL_TARGET_CMDS
$(TARGET_MAKE_ENV) $(MAKE) -C $(@D) \
DESTDIR=$(TARGET_DIR) \
EARLY_PREFIX= \
install-collector
endef
$(eval $(generic-package))
+1 -1
View File
@@ -1 +1 @@
service <!> log [2345] /usr/bin/klishd -d -- CLI backend daemon
service <!> log:null [12345] /usr/bin/klishd -d -- CLI backend daemon
+1 -1
View File
@@ -1,5 +1,5 @@
# Avahi advertises the system default hostname, this service advertises
# /etc/hostname (-H) and, optionally, network.local as CNAMEs. Changes
# to /etc/default/mdns-alias will cause Finit to restart not reload.
service <service/mdns/running> env:-/etc/default/mdns-alias \
service <pid/mdns> env:-/etc/default/mdns-alias \
[2345] mdns-alias -H $MDNS_ALIAS_ARGS --
@@ -1,7 +1,7 @@
From a4136d889237dadb9253ea7eb668a525dd779e6d Mon Sep 17 00:00:00 2001
From 65a99da7e857d1f6fd111d0428622563fd895810 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Kundr=C3=A1t?= <jan.kundrat@cesnet.cz>
Date: Thu, 12 Jun 2025 10:33:42 +0100
Subject: [PATCH 01/38] Log HTTP headers and the input data payload
Subject: [PATCH 01/42] Log HTTP headers and the input data payload
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
@@ -12,6 +12,7 @@ Hažlinský just found.
Change-Id: I2a930a02c7d30c051390fe73e6af9849edd580b4
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
src/restconf/Server.cpp | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
@@ -1,7 +1,7 @@
From 6c5b482ea5c9fbc1149a0864b05d1bb1fa7100bf Mon Sep 17 00:00:00 2001
From 729bb0619d7cb14ca3bf97f56d3c6550bd2e75f0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Pecka?= <tomas.pecka@cesnet.cz>
Date: Fri, 13 Jun 2025 10:47:55 +0200
Subject: [PATCH 02/38] restconf: prevent throwing exception in
Subject: [PATCH 02/42] restconf: prevent throwing exception in
withRestconfExceptions wrapper
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
@@ -23,6 +23,7 @@ handle such situations.
Bug: https://github.com/CESNET/rousette/issues/19
Change-Id: Ifbd74b9bdc0ca66c4e5449a7673ef2f12ae9215e
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
src/restconf/Server.cpp | 2 +-
tests/restconf-plain-patch.cpp | 24 ++++++++++++++++++++++++
@@ -1,7 +1,7 @@
From 41c9d9cab47a88ee6c70ab8009b789226c0982fe Mon Sep 17 00:00:00 2001
From f548df0c693ffd1625fbcb843c6f914972315179 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Kundr=C3=A1t?= <jan.kundrat@cesnet.cz>
Date: Tue, 17 Jun 2025 12:46:27 +0200
Subject: [PATCH 03/38] CI: switch to the new cloud's Swift URL
Subject: [PATCH 03/42] CI: switch to the new cloud's Swift URL
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
@@ -9,6 +9,7 @@ Organization: Wires
Change-Id: I69f8351394262a2a9b691422592741bfb40a8e38
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
ci/build.sh | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
@@ -1,7 +1,7 @@
From ec8673126929b6459fcd99c84a79993a725b40e1 Mon Sep 17 00:00:00 2001
From 8c441795f1050412fc953518917f3d494edd6be1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Pecka?= <tomas.pecka@cesnet.cz>
Date: Fri, 13 Jun 2025 10:47:55 +0200
Subject: [PATCH 04/38] restconf: crash instead of a deadlock when the handler
Subject: [PATCH 04/42] restconf: crash instead of a deadlock when the handler
throws
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
@@ -38,6 +38,7 @@ Signed-off-by: Jan Kundrát <jan.kundrat@cesnet.cz>
Bug: https://github.com/CESNET/rousette/issues/19
Change-Id: I2c090b9a76b062101ba422a7d50e8e699779e203
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
src/restconf/Server.cpp | 28 ++++++++++++++++++++++++++++
src/restconf/Server.h | 4 ++++
@@ -1,7 +1,7 @@
From 37ca95c387d76c3f296a4e44b211772a1ca155ab Mon Sep 17 00:00:00 2001
From 130a5f43c3cb06e0a97e8eb580f97a526c8c9d8a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Kundr=C3=A1t?= <jan.kundrat@cesnet.cz>
Date: Wed, 18 Jun 2025 12:01:04 +0200
Subject: [PATCH 05/38] doc: let's stop calling this "an almost-RESTCONF
Subject: [PATCH 05/42] doc: let's stop calling this "an almost-RESTCONF
server"
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
@@ -10,6 +10,7 @@ Organization: Wires
Change-Id: If55ace481c78d838a811ded76a564f8fb59f9233
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
@@ -1,7 +1,7 @@
From 4eae6200aa812950ebbac1660a1899f4edf41e11 Mon Sep 17 00:00:00 2001
From 7b8c1d90594dbc65eeb0ea767e3a50b92db8aea3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Kundr=C3=A1t?= <jan.kundrat@cesnet.cz>
Date: Wed, 7 Aug 2024 19:07:35 +0200
Subject: [PATCH 06/38] close long-lived connections on SIGTERM
Subject: [PATCH 06/42] close long-lived connections on SIGTERM
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
@@ -24,6 +24,7 @@ hope it is).
Change-Id: If442134783ba1d699de47c51a9068378f53e8339
Co-authored-by: Tomas Pecka <tomas.pecka@cesnet.cz>
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
CMakeLists.txt | 1 +
src/clock.cpp | 7 +--
@@ -1,7 +1,7 @@
From ca2894d4888c673d227fc196a25f83ded20e8f04 Mon Sep 17 00:00:00 2001
From be28d13811e617d9cdb74bd6d27f4c8634fe4d02 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Pecka?= <tomas.pecka@cesnet.cz>
Date: Mon, 30 Jun 2025 15:38:02 +0200
Subject: [PATCH 07/38] restconf: refactor server stop
Subject: [PATCH 07/42] restconf: refactor server stop
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
@@ -21,6 +21,7 @@ does not seem like it should be called from *every* io_service.)
Change-Id: I2f33c38a78dce4081a03326c9a9bb25817fc9d2f
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
src/restconf/Server.cpp | 13 +++++--------
1 file changed, 5 insertions(+), 8 deletions(-)
@@ -1,7 +1,7 @@
From 9961430bacdd8dbac64a01b2a2ffb6a4b7e806b6 Mon Sep 17 00:00:00 2001
From edc6f47fe49d9873f9c7257d66fbf8b362a6c7ac Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Pecka?= <tomas.pecka@cesnet.cz>
Date: Tue, 13 May 2025 13:48:35 +0200
Subject: [PATCH 08/38] tests: use std::string::starts_with
Subject: [PATCH 08/42] tests: use std::string::starts_with
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
@@ -11,6 +11,7 @@ We are C++20, so we can use line, which is more readable.
Change-Id: I40d4038b421f6bc1fcf320f609b50d5ce7018a45
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
tests/restconf_utils.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
@@ -1,7 +1,7 @@
From 746c0cdfef6808f393be7946630b8acbb0636706 Mon Sep 17 00:00:00 2001
From 8f6ce5d8efd7e5ce4adb6e188dbec14ad86fa0e8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Pecka?= <tomas.pecka@cesnet.cz>
Date: Tue, 22 Jul 2025 17:47:50 +0200
Subject: [PATCH 09/38] tests: add SSE event watcher for comments
Subject: [PATCH 09/42] tests: add SSE event watcher for comments
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
@@ -12,6 +12,7 @@ which should be ignored, i.e., lines starting with colon.
Change-Id: If54f0af05b4884aab01325f12fd0a6859791b41b
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
tests/event_watchers.cpp | 7 ++++++-
tests/event_watchers.h | 4 +++-
@@ -1,7 +1,7 @@
From 5becffe8a1dd47c8836ce1800a1b72acdf86021f Mon Sep 17 00:00:00 2001
From fc240be374f70b0f006bb83152364678ffdbfa86 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Pecka?= <tomas.pecka@cesnet.cz>
Date: Mon, 12 May 2025 14:56:54 +0200
Subject: [PATCH 10/38] http: send keep-alive pings from EventStream
Subject: [PATCH 10/42] http: send keep-alive pings from EventStream
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
@@ -32,6 +32,7 @@ to the server when the server sends these "keep-alive comments".
Change-Id: I57e510d0b61ac7ed032c582779780c64768b7d53
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
src/clock.cpp | 4 +-
src/http/EventStream.cpp | 44 +++++++++++++--
@@ -1,7 +1,7 @@
From ff4ff1c193083feca76d9f0f4485e4b175c373c2 Mon Sep 17 00:00:00 2001
From 1375ecb15ef534ca2856f46f957686ccc23ab7fc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Pecka?= <tomas.pecka@cesnet.cz>
Date: Wed, 23 Jul 2025 14:27:26 +0200
Subject: [PATCH 11/38] refactor: event streams use named constructors
Subject: [PATCH 11/42] refactor: event streams use named constructors
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
@@ -18,6 +18,7 @@ This way, the code is more readable and the intention should be clearer.
Change-Id: Iac96c49c20670dfe924d7c8db33328ed9c2fc9dd
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
src/clock.cpp | 3 +--
src/http/EventStream.cpp | 20 ++++++++++++++++++++
@@ -1,7 +1,7 @@
From f4602a03adc9134a9b7a9d338e900b40557da6c4 Mon Sep 17 00:00:00 2001
From fd0dbd116f249cd8a4d00b677ed2976b19a28b1e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Kundr=C3=A1t?= <jan.kundrat@cesnet.cz>
Date: Thu, 7 Aug 2025 12:14:02 +0200
Subject: [PATCH 12/38] refactor: a better convention for weak_from_this->lock
Subject: [PATCH 12/42] refactor: a better convention for weak_from_this->lock
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
@@ -11,6 +11,7 @@ It is not a "client", so let's stop calling it a "client". My bad.
Change-Id: Id8dc4d92c3ade8d86697366d0102e84bd466f504
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
src/http/EventStream.cpp | 44 ++++++++++++++++++++--------------------
1 file changed, 22 insertions(+), 22 deletions(-)
@@ -1,7 +1,7 @@
From 4e9b535a59861f25c0602eaa1fc39126d7cd9899 Mon Sep 17 00:00:00 2001
From cb0c00ceba7ac4b225382ffacef919f2573dc5cb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Kundr=C3=A1t?= <jan.kundrat@cesnet.cz>
Date: Thu, 7 Aug 2025 12:21:54 +0200
Subject: [PATCH 13/38] fix a possible bad_weak_ptr exception
Subject: [PATCH 13/42] fix a possible bad_weak_ptr exception
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
@@ -10,6 +10,7 @@ Organization: Wires
Change-Id: I8c7f7a943a1d848f15527988cb76c2a0a10089e6
Fixes: 4eae6200 (close long-lived connections on SIGTERM)
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
src/http/EventStream.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
@@ -1,7 +1,7 @@
From 6bca750f866b5b14c4d9c3da68e5c8f1e4eee36c Mon Sep 17 00:00:00 2001
From 91e8e41b5f22629820799b48977a90f57f01f424 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Pecka?= <tomas.pecka@cesnet.cz>
Date: Mon, 19 May 2025 12:11:09 +0200
Subject: [PATCH 14/38] http: add optional callbacks to EventStream
Subject: [PATCH 14/42] http: add optional callbacks to EventStream
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
@@ -15,6 +15,7 @@ disconnects.
Change-Id: Icfc2959e38b812b7c18f45976415209b29151c7b
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
src/http/EventStream.cpp | 18 +++++++++++++++---
src/http/EventStream.h | 10 ++++++++--
@@ -1,7 +1,7 @@
From f6ee629de8abef42a24c42b185052b0c8e78bd6b Mon Sep 17 00:00:00 2001
From 39f43493339984e3a3c256bc818f11aee71375f9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Pecka?= <tomas.pecka@cesnet.cz>
Date: Mon, 19 May 2025 12:23:16 +0200
Subject: [PATCH 15/38] restconf: add internal RPC handler dispatcher
Subject: [PATCH 15/42] restconf: add internal RPC handler dispatcher
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
@@ -15,6 +15,7 @@ ietf-subscribed-notifications:establish-subscription RPC is coming soon.
Change-Id: I99121a511011229e4098f95e91601b39d333444a
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
src/restconf/Server.cpp | 24 ++++++++++++++++++++----
tests/restconf-rpc.cpp | 18 ++++++++++++++++++
@@ -1,7 +1,7 @@
From b7966613b43b01402c9f0af286a0b3237161779d Mon Sep 17 00:00:00 2001
From fe57a9ac8024e4115c45d9c256d5048e17fe9fdb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Pecka?= <tomas.pecka@cesnet.cz>
Date: Tue, 2 Sep 2025 15:33:43 +0200
Subject: [PATCH 16/38] tests: processing incomplete events in SSE client
Subject: [PATCH 16/42] tests: processing incomplete events in SSE client
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
@@ -14,6 +14,7 @@ a complete event, once available.
Change-Id: Ied07e69e8b518f20fcc82134a4c041e7ec3a06d6
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
tests/restconf_utils.cpp | 53 +++++++++++++++++++++++-----------------
tests/restconf_utils.h | 3 ++-
@@ -1,7 +1,7 @@
From 1067e05674633b97d64b428686aff44822230c5f Mon Sep 17 00:00:00 2001
From 5686bf2fcf351e999043fe3e6e788e1ed502116a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Pecka?= <tomas.pecka@cesnet.cz>
Date: Mon, 8 Sep 2025 20:24:15 +0200
Subject: [PATCH 17/38] EventStream: fix possible heap-use-after-free
Subject: [PATCH 17/42] EventStream: fix possible heap-use-after-free
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
@@ -65,6 +65,7 @@ before actually resuming the response.
Change-Id: Ifdb1f8610cacffca3bb49da17aa9b1d267cdd472
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
src/http/EventStream.cpp | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)
@@ -1,7 +1,7 @@
From fff342945eb3c8deb6f7aa67aca54f9c9f87f3ec Mon Sep 17 00:00:00 2001
From 07131a39ca9c5a27fe7b1a5c628f3519c2efc0e5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Kundr=C3=A1t?= <jan.kundrat@cesnet.cz>
Date: Thu, 11 Sep 2025 18:56:31 +0200
Subject: [PATCH 18/38] Use a working version of nghttp2-asio
Subject: [PATCH 18/42] Use a working version of nghttp2-asio
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
@@ -15,6 +15,7 @@ Link: https://github.com/nghttp2/nghttp2-asio/pull/9
Link: https://github.com/nghttp2/nghttp2-asio/pull/25
Change-Id: Iec9619ce45e7e76f0781d39966d0b6c7cc6fa778
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
.zuul.yaml | 2 +-
README.md | 3 ++-
@@ -1,7 +1,7 @@
From ffc52b2e454ae4ac4fa1948cb76a9469026d453e Mon Sep 17 00:00:00 2001
From f71d4467409885078395c8d59c4390ddc1782d33 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Kundr=C3=A1t?= <jan.kundrat@cesnet.cz>
Date: Mon, 6 Oct 2025 22:35:27 +0200
Subject: [PATCH 19/38] ping: use a monotonic timer
Subject: [PATCH 19/42] ping: use a monotonic timer
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
@@ -16,6 +16,7 @@ deprecated, use the other function.
Change-Id: I40383721ecb0f12bfcb3f638124a32150a29bf48
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
src/http/EventStream.cpp | 2 +-
src/http/EventStream.h | 4 ++--
@@ -1,7 +1,7 @@
From 4493316404f31354ea18bc92a1706a3834ad972b Mon Sep 17 00:00:00 2001
From f842f027aa462486c1cc5cb9c47e0398b3242fe7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Kundr=C3=A1t?= <jan.kundrat@cesnet.cz>
Date: Mon, 6 Oct 2025 22:50:11 +0200
Subject: [PATCH 20/38] tests: use a monotonic timer
Subject: [PATCH 20/42] tests: use a monotonic timer
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
@@ -9,6 +9,7 @@ Organization: Wires
Change-Id: I89cdd08082b025643dac81788ca174d3c2177089
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
tests/restconf-eventstream.cpp | 2 +-
tests/restconf_utils.cpp | 6 +++---
@@ -1,7 +1,7 @@
From 8077a63ac97529d56782d2315f23c44f6036b85f Mon Sep 17 00:00:00 2001
From 462dca24ef3cb3ae8bb5c6f7a349b94308281f9c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Kundr=C3=A1t?= <jan.kundrat@cesnet.cz>
Date: Thu, 23 Oct 2025 18:17:37 +0200
Subject: [PATCH 21/38] port to libyang v4
Subject: [PATCH 21/42] port to libyang v4
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
@@ -41,6 +41,7 @@ Depends-on: https://gerrit.cesnet.cz/c/CzechLight/dependencies/+/8990
Bug: https://github.com/CESNET/libyang/pull/2448
Depends-on: https://github.com/sysrepo/sysrepo/commit/6dc5641762962b93d54a54443e2fd43aa319a7a6
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
CMakeLists.txt | 6 +++---
src/restconf/Server.cpp | 2 +-
@@ -1,7 +1,7 @@
From b4bf655502d949a5f351e6acd313f47eecefb062 Mon Sep 17 00:00:00 2001
From 4b08c23436972e80760abe397806867a1d4d486c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Pecka?= <tomas.pecka@cesnet.cz>
Date: Mon, 13 Oct 2025 12:26:46 +0200
Subject: [PATCH 22/38] restconf: prevent lock order inversion
Subject: [PATCH 22/42] restconf: prevent lock order inversion
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
@@ -29,6 +29,7 @@ callbacks to EventStream"), I am not sure.
See-also: 6bca750f866b5b14c4d9c3da68e5c8f1e4eee36c ("http: add optional callbacks to EventStream")
Change-Id: Ib6626c127ff2eb5feb1d17dece28e70265749df4
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
src/http/EventStream.cpp | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
@@ -1,7 +1,7 @@
From 27cbe6750bdfc9f346421e55ebe555b8c036d77c Mon Sep 17 00:00:00 2001
From 24a35b1f1424826202ecaebf7aa04dccdf6ad2f4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Pecka?= <tomas.pecka@cesnet.cz>
Date: Tue, 11 Nov 2025 15:01:21 +0100
Subject: [PATCH 23/38] refactor: do not pollute scope with unnecessary
Subject: [PATCH 23/42] refactor: do not pollute scope with unnecessary
variables
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
@@ -13,6 +13,7 @@ nothing.
Change-Id: I5b9b1a077d44d088084c3b2b93359ab7464ec8aa
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
src/restconf/Server.cpp | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
@@ -1,7 +1,7 @@
From 5592ae49cd7607fdcb2c9e554a521b53545e761b Mon Sep 17 00:00:00 2001
From 228aa9ea848d437565b5f90972a0c4b23b279337 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Pecka?= <tomas.pecka@cesnet.cz>
Date: Tue, 21 Oct 2025 17:23:44 +0200
Subject: [PATCH 24/38] restconf: validate input for internal rpcs
Subject: [PATCH 24/42] restconf: validate input for internal rpcs
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
@@ -23,6 +23,7 @@ the RPC.
Change-Id: I55296895e6993b4ca27d21ce2a64ec2d159a35fc
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
src/restconf/Server.cpp | 36 +++++++++++++++++++++++++++++-------
1 file changed, 29 insertions(+), 7 deletions(-)
@@ -1,7 +1,7 @@
From c2413237501eea3125fe31a9701919d14402737f Mon Sep 17 00:00:00 2001
From 163ebff977aff8fea8e342f35314697f89e5bb82 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Pecka?= <tomas.pecka@cesnet.cz>
Date: Tue, 11 Nov 2025 17:30:33 +0100
Subject: [PATCH 25/38] tests: allow read from parts
Subject: [PATCH 25/42] tests: allow read from parts
ietf-subscribed-notifications for anonymous user
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
@@ -16,6 +16,7 @@ access for users.
Change-Id: I50e49c8c60b7e6be47c51f3d8cd546fbb6f49294
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
tests/restconf-reading.cpp | 5 ++++-
tests/restconf_utils.cpp | 4 ++++
@@ -1,7 +1,7 @@
From aa04b0a99fb51aed998aa9f1ab0a527cc09e647f Mon Sep 17 00:00:00 2001
From 0f13a7262ddf58f400a53cfedb038344abb929f0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Pecka?= <tomas.pecka@cesnet.cz>
Date: Mon, 19 May 2025 12:11:09 +0200
Subject: [PATCH 26/38] restconf: establish-subscription RPC for subscribed
Subject: [PATCH 26/42] restconf: establish-subscription RPC for subscribed
notifications
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
@@ -21,6 +21,7 @@ the follow-up patch.
Change-Id: I0217e5abc56cfd73859dbcc610fb1f342dc33a10
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
CMakeLists.txt | 8 +-
src/restconf/DynamicSubscriptions.cpp | 177 ++++++++++++++
@@ -1,7 +1,7 @@
From e2c8036130a2265476579ffa9f4354741b54bbd5 Mon Sep 17 00:00:00 2001
From b2be7b3b43cb95b5bfc1e0b774de7dbac4376809 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Pecka?= <tomas.pecka@cesnet.cz>
Date: Mon, 13 Oct 2025 16:10:51 +0200
Subject: [PATCH 27/38] refactor: restconf stream request types
Subject: [PATCH 27/42] refactor: restconf stream request types
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
@@ -21,6 +21,7 @@ will not have it.
See-also: 97ceef119c900c37bbaa27860c3b43cfa6d69f95 ("restconf: refactor uri parser for stream URIs")
Change-Id: Idc1e05f7ff05cea84b5806f60e217605f75e7a9f
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
src/restconf/Server.cpp | 2 +-
src/restconf/uri.cpp | 15 ++++++++-------
@@ -1,7 +1,7 @@
From b3a55ae0a1ef9e092b0c8f0d7c3dbd7baa708cc8 Mon Sep 17 00:00:00 2001
From 5f4c781728d888d3e1c8db9c1c78c545caae824c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Pecka?= <tomas.pecka@cesnet.cz>
Date: Tue, 29 Jul 2025 11:39:21 +0200
Subject: [PATCH 28/38] restconf: endpoint for subscribed notifications
Subject: [PATCH 28/42] restconf: endpoint for subscribed notifications
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
@@ -27,6 +27,7 @@ of boost::asio is not enough.
Change-Id: I07dcdd3fb9ef4f05f93ae6dda0e0d71094a0bbfc
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
CMakeLists.txt | 1 +
src/restconf/DynamicSubscriptions.cpp | 127 ++++++++++++-
@@ -1,7 +1,7 @@
From 9c39cdd8a8a6bb8fb94d4f943313ec8c4a1823d7 Mon Sep 17 00:00:00 2001
From dc462f432a2360f4ed9c7b5e2a17051074674f01 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Pecka?= <tomas.pecka@cesnet.cz>
Date: Mon, 10 Nov 2025 19:58:36 +0100
Subject: [PATCH 29/38] restconf: dynamic subscriptions shutdown method
Subject: [PATCH 29/42] restconf: dynamic subscriptions shutdown method
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
@@ -13,6 +13,7 @@ cannot call its terminate() method.
Change-Id: I4532bbafff7c7386a18ed0636f1102842d2749fa
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
src/restconf/DynamicSubscriptions.cpp | 10 ++++++++++
src/restconf/DynamicSubscriptions.h | 1 +
@@ -1,7 +1,7 @@
From 3154d9209dc876fee43d9e83907ab44e06008c65 Mon Sep 17 00:00:00 2001
From ac1097419badcee117d5c90331db9fa5771bb842 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Pecka?= <tomas.pecka@cesnet.cz>
Date: Tue, 14 Oct 2025 12:25:20 +0200
Subject: [PATCH 30/38] restconf: terminate subsc. notification streams after
Subject: [PATCH 30/42] restconf: terminate subsc. notification streams after
60s with no client
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
@@ -18,6 +18,7 @@ is 60 seconds.
Change-Id: Id399d108069704fa8ab79b9ef6ab855dd62cfc8d
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
src/restconf/DynamicSubscriptions.cpp | 72 ++++++++++++++++++---
src/restconf/DynamicSubscriptions.h | 22 ++++++-
@@ -1,7 +1,7 @@
From 22cfcbf52be604afe0caafc892f4b7befe03b9db Mon Sep 17 00:00:00 2001
From f8d6053c6777476384d9c32564e5faf355edbafa Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Pecka?= <tomas.pecka@cesnet.cz>
Date: Tue, 8 Apr 2025 17:00:59 +0200
Subject: [PATCH 31/38] restconf: add {kill,delete}-subscription RPCs
Subject: [PATCH 31/42] restconf: add {kill,delete}-subscription RPCs
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
@@ -21,6 +21,7 @@ disconnects.
Change-Id: I443d6fd88f2797045b5ae0a7d7e1a761fe74e7cb
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
src/restconf/DynamicSubscriptions.cpp | 44 +++++
src/restconf/DynamicSubscriptions.h | 2 +
@@ -1,7 +1,7 @@
From c5558b12ee67280b6281b639c3d8652cec3c7fa6 Mon Sep 17 00:00:00 2001
From da35875a545a4709da0662bb6ea104dcdba85582 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Pecka?= <tomas.pecka@cesnet.cz>
Date: Wed, 19 Mar 2025 14:39:05 +0100
Subject: [PATCH 32/38] restconf: add subscribed notifications filtering
Subject: [PATCH 32/42] restconf: add subscribed notifications filtering
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
@@ -12,6 +12,7 @@ filters.
Change-Id: Iee973a6a2d03b4a0d90f952afe5436ce701787ae
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
CMakeLists.txt | 2 +-
src/restconf/DynamicSubscriptions.cpp | 13 ++++-
@@ -1,7 +1,7 @@
From fe91af1eb38888d7eacb36cb5a299bd3163f7c60 Mon Sep 17 00:00:00 2001
From 36b8ec2f65a456bf97b97ed4b3d74bb323cf85b8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Pecka?= <tomas.pecka@cesnet.cz>
Date: Tue, 14 Oct 2025 17:22:00 +0200
Subject: [PATCH 33/38] cmake: wrap long line
Subject: [PATCH 33/42] cmake: wrap long line
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
@@ -9,6 +9,7 @@ Organization: Wires
Change-Id: Id94e18d581dbfbe2e6d386be6a232544f9344eec
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
CMakeLists.txt | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
@@ -1,7 +1,7 @@
From 817debab72d10f2f30e83f1630bebdcdf3ec9455 Mon Sep 17 00:00:00 2001
From f633e7ffd39955051d886b7977e8a8ecfffda2b4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Pecka?= <tomas.pecka@cesnet.cz>
Date: Mon, 10 Mar 2025 15:33:08 +0100
Subject: [PATCH 34/38] restconf: support replays in subscribed notifications
Subject: [PATCH 34/42] restconf: support replays in subscribed notifications
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
@@ -9,6 +9,7 @@ Organization: Wires
Change-Id: Idfc3ceb99c8111c5575c1c8b94d539f234fa43be
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
CMakeLists.txt | 1 +
src/restconf/DynamicSubscriptions.cpp | 24 ++++-
@@ -1,7 +1,7 @@
From 7d6b1a463fdacefaf7a7057564f6f4d4a8cb4632 Mon Sep 17 00:00:00 2001
From f58dc52c4e7445a06484bce0bbfeac831004ce02 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Pecka?= <tomas.pecka@cesnet.cz>
Date: Tue, 25 Mar 2025 11:06:26 +0100
Subject: [PATCH 35/38] restconf: refactor getting datastore from string
Subject: [PATCH 35/42] restconf: refactor getting datastore from string
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
@@ -11,6 +11,7 @@ This will be useful when processing YANG push requests.
Change-Id: I1e76335c8d674e81890d6cd1e973adaf521eb205
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
src/restconf/uri.cpp | 19 +++++--------------
src/restconf/utils/sysrepo.cpp | 16 ++++++++++++++++
@@ -1,7 +1,7 @@
From c1d5d143020ddc51c3886b82e87d463cf3211fca Mon Sep 17 00:00:00 2001
From 8a541a83176eb44fbe501a91b7a4ef0576f60ba3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Kundr=C3=A1t?= <jan.kundrat@cesnet.cz>
Date: Fri, 21 Nov 2025 10:44:47 +0100
Subject: [PATCH 36/38] build: remove duplicate line
Subject: [PATCH 36/42] build: remove duplicate line
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
@@ -10,6 +10,7 @@ Organization: Wires
Fixes: 817debab restconf: support replays in subscribed notifications
Change-Id: I4d2ea8429a4cb7b77f8739aff7a26a03cf535756
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
CMakeLists.txt | 1 -
1 file changed, 1 deletion(-)
@@ -1,7 +1,7 @@
From ed62a496744de0e0dc31171167d5d6f69f54af93 Mon Sep 17 00:00:00 2001
From 538dbbff9604c00fd3875c88d0ed19074dfa0bfb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Kundr=C3=A1t?= <jan.kundrat@cesnet.cz>
Date: Fri, 21 Nov 2025 12:54:44 +0100
Subject: [PATCH 37/38] remove obsolete targets
Subject: [PATCH 37/42] remove obsolete targets
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
@@ -9,6 +9,7 @@ Organization: Wires
Change-Id: Idde217a4ae1bc6f03657d9609e0ec1b0a47a9747
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
CMakeLists.txt | 9 --------
src/clock.cpp | 62 --------------------------------------------------
@@ -1,7 +1,7 @@
From 5a1d0dac28c1a78e90d3906693228584adcf3ab1 Mon Sep 17 00:00:00 2001
From 6adfafa9324ee0bfd50d0dab7c7657138a4a55a0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Kundr=C3=A1t?= <jan.kundrat@cesnet.cz>
Date: Thu, 20 Nov 2025 16:13:43 +0100
Subject: [PATCH 38/38] port to libyang v4.2
Subject: [PATCH 38/42] port to libyang v4.2
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
@@ -10,6 +10,7 @@ Organization: Wires
Depends-on: https://gerrit.cesnet.cz/c/CzechLight/dependencies/+/9012
Change-Id: I1ac6b25a3c1034f06917594732f066fd77d4b26b
Signed-off-by: Mattias Walström <lazzer@gmail.com>
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
CMakeLists.txt | 2 +-
src/restconf/Server.cpp | 10 +++++-----
@@ -0,0 +1,88 @@
From c617503c76dcfe75e73c5f1af3dd6c17c2ca3fd4 Mon Sep 17 00:00:00 2001
From: Joachim Wiberg <troglobit@gmail.com>
Date: Sun, 28 Sep 2025 06:04:12 +0200
Subject: [PATCH 39/42] Add '--log-level LEVEL' command line option
Organization: Wires
The default 'trace' log level is quite verbose for production systems.
This commit changes the default to 'info' and adds a command line option
to control the log level.
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
src/restconf/main.cpp | 30 ++++++++++++++++++++++++++++--
1 file changed, 28 insertions(+), 2 deletions(-)
diff --git a/src/restconf/main.cpp b/src/restconf/main.cpp
index b1e2bc6..66c782d 100644
--- a/src/restconf/main.cpp
+++ b/src/restconf/main.cpp
@@ -19,6 +19,7 @@
#include <spdlog/sinks/ansicolor_sink.h>
#include <sys/types.h>
#include <sys/stat.h>
+#include <iostream>
#include <docopt.h>
#include <spdlog/spdlog.h>
#include <sysrepo-cpp/Session.hpp>
@@ -27,11 +28,12 @@
static const char usage[] =
R"(Rousette - RESTCONF server
Usage:
- rousette [--syslog] [--timeout <SECONDS>] [--help]
+ rousette [--syslog] [--timeout <SECONDS>] [--log-level <LEVEL>] [--help]
Options:
-h --help Show this screen.
-t --timeout <SECONDS> Change default timeout in sysrepo (if not set, use sysrepo internal).
--syslog Log to syslog.
+ --log-level <LEVEL> Set log level (trace, debug, info, warn, error, critical, off) [default: info].
)";
#ifdef HAVE_SYSTEMD
@@ -76,10 +78,34 @@ int main(int argc, char* argv [])
{
auto args = docopt::docopt(usage, {argv + 1, argv + argc}, true,""/* version */, true);
auto timeout = std::chrono::milliseconds{0};
+ auto logLevel = spdlog::level::info;
if (args["--timeout"]) {
timeout = std::chrono::milliseconds{args["--timeout"].asLong() * 1000};
}
+
+ if (args["--log-level"]) {
+ auto levelStr = args["--log-level"].asString();
+ if (levelStr == "trace") {
+ logLevel = spdlog::level::trace;
+ } else if (levelStr == "debug") {
+ logLevel = spdlog::level::debug;
+ } else if (levelStr == "info") {
+ logLevel = spdlog::level::info;
+ } else if (levelStr == "warn" || levelStr == "warning") {
+ logLevel = spdlog::level::warn;
+ } else if (levelStr == "error" || levelStr == "err") {
+ logLevel = spdlog::level::err;
+ } else if (levelStr == "critical") {
+ logLevel = spdlog::level::critical;
+ } else if (levelStr == "off") {
+ logLevel = spdlog::level::off;
+ } else {
+ std::cerr << "Invalid log level: " << levelStr << std::endl;
+ std::cerr << "Valid levels: trace, debug, info, warn, error, critical, off" << std::endl;
+ return 1;
+ }
+ }
if (args["--syslog"].asBool()) {
auto syslog_sink = std::make_shared<spdlog::sinks::syslog_sink_mt>("rousette", LOG_PID, LOG_USER, true);
auto logger = std::make_shared<spdlog::logger>("rousette", syslog_sink);
@@ -95,7 +121,7 @@ int main(int argc, char* argv [])
auto logger = std::make_shared<spdlog::logger>("rousette", stdout_sink);
spdlog::set_default_logger(logger);
}
- spdlog::set_level(spdlog::level::trace);
+ spdlog::set_level(logLevel);
/* We will parse URIs using boost::spirit's alnum/alpha/... matchers which are locale-dependent.
* Let's use something stable no matter what the system is using
--
2.43.0
@@ -0,0 +1,46 @@
From 3d4262c6c2e334fa6577a69e0483a19f638e43fd Mon Sep 17 00:00:00 2001
From: Joachim Wiberg <troglobit@gmail.com>
Date: Thu, 19 Mar 2026 17:21:20 +0100
Subject: [PATCH 40/42] sr: lower log message severity to debug
Organization: Wires
On non-CzechLight hardware this message fires on every startup. It is
not a warning condition, and at debug level it won't clutter the log at
the default info level. Also lower the NACM startup diagnostic from
info to debug for the same reason.
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
src/auth/Nacm.cpp | 2 +-
src/sr/OpticalEvents.cpp | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/auth/Nacm.cpp b/src/auth/Nacm.cpp
index 284fa85..a4cc8cc 100644
--- a/src/auth/Nacm.cpp
+++ b/src/auth/Nacm.cpp
@@ -98,7 +98,7 @@ Nacm::Nacm(sysrepo::Connection conn)
m_srSub.onModuleChange(
"ietf-netconf-acm", [&](auto session, auto, auto, auto, auto, auto) {
m_anonymousEnabled = validAnonymousNacmRules(session, ANONYMOUS_USER_GROUP);
- spdlog::info("NACM config validation: Anonymous user access {}", m_anonymousEnabled ? "enabled" : "disabled");
+ spdlog::debug("NACM config validation: Anonymous user access {}", m_anonymousEnabled ? "enabled" : "disabled");
return sysrepo::ErrorCode::Ok;
},
std::nullopt,
diff --git a/src/sr/OpticalEvents.cpp b/src/sr/OpticalEvents.cpp
index 3f78ddc..a2cefe7 100644
--- a/src/sr/OpticalEvents.cpp
+++ b/src/sr/OpticalEvents.cpp
@@ -47,7 +47,7 @@ OpticalEvents::OpticalEvents(sysrepo::Session session)
}
}
- spdlog::warn("Telemetry disabled. No CzechLight YANG modules found.");
+ spdlog::debug("Telemetry disabled. No CzechLight YANG modules found.");
}
sysrepo::ErrorCode OpticalEvents::onChange(sysrepo::Session session, const std::string& module)
--
2.43.0
@@ -0,0 +1,134 @@
From 2877c5a6a139b15e42f99c5aba4127b427154707 Mon Sep 17 00:00:00 2001
From: Joachim Wiberg <troglobit@gmail.com>
Date: Thu, 19 Mar 2026 17:21:25 +0100
Subject: [PATCH 41/42] restconf: add audit trail for datastore write
operations
Organization: Wires
Log an info message before and after committing changes to sysrepo,
matching the style of netopeer2's audit trail.
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
src/restconf/Server.cpp | 14 ++++++++++++++
src/restconf/utils/sysrepo.cpp | 17 +++++++++++++++++
src/restconf/utils/sysrepo.h | 1 +
3 files changed, 32 insertions(+)
diff --git a/src/restconf/Server.cpp b/src/restconf/Server.cpp
index 3c7c3c7..15eec92 100644
--- a/src/restconf/Server.cpp
+++ b/src/restconf/Server.cpp
@@ -17,10 +17,12 @@
#include "restconf/Exceptions.h"
#include "restconf/NotificationStream.h"
#include "auth/Http.h"
+#include "NacmIdentities.h"
#include "restconf/Server.h"
#include "restconf/YangSchemaLocations.h"
#include "restconf/uri.h"
#include "restconf/utils/dataformat.h"
+#include "restconf/utils/sysrepo.h"
#include "restconf/utils/yang.h"
#include "sr/OpticalEvents.h"
@@ -594,8 +596,10 @@ void processPost(std::shared_ptr<RequestContext> requestCtx, const std::chrono::
createdNodes.begin()->newMeta(*modNetconf, "operation", "create");
yangInsert(*requestCtx, *createdNodes.begin());
+ spdlog::info("user \"{}\" committing changes to {} ...", requestCtx->sess.getNacmUser().value_or(ANONYMOUS_USER), datastoreToString(requestCtx->sess.activeDatastore()));
requestCtx->sess.editBatch(*edit, sysrepo::DefaultOperation::Merge);
requestCtx->sess.applyChanges(timeout);
+ spdlog::info("user \"{}\" committed changes to {}.", requestCtx->sess.getNacmUser().value_or(ANONYMOUS_USER), datastoreToString(requestCtx->sess.activeDatastore()));
requestCtx->res.write_head(201,
{
@@ -682,8 +686,10 @@ void processYangPatchImpl(const std::shared_ptr<RequestContext>& requestCtx, con
}
if (mergedEdits) {
+ spdlog::info("user \"{}\" committing changes to {} ...", requestCtx->sess.getNacmUser().value_or(ANONYMOUS_USER), datastoreToString(requestCtx->sess.activeDatastore()));
requestCtx->sess.editBatch(*mergedEdits, sysrepo::DefaultOperation::Merge);
requestCtx->sess.applyChanges(timeout);
+ spdlog::info("user \"{}\" committed changes to {}.", requestCtx->sess.getNacmUser().value_or(ANONYMOUS_USER), datastoreToString(requestCtx->sess.activeDatastore()));
}
}
@@ -726,12 +732,16 @@ void processPutOrPlainPatch(std::shared_ptr<RequestContext> requestCtx, const st
validateInputMetaAttributes(ctx, *edit);
if (requestCtx->req.method() == "PUT") {
+ spdlog::info("user \"{}\" committing changes to {} ...", requestCtx->sess.getNacmUser().value_or(ANONYMOUS_USER), datastoreToString(requestCtx->sess.activeDatastore()));
requestCtx->sess.replaceConfig(edit, std::nullopt, timeout);
+ spdlog::info("user \"{}\" committed changes to {}.", requestCtx->sess.getNacmUser().value_or(ANONYMOUS_USER), datastoreToString(requestCtx->sess.activeDatastore()));
requestCtx->res.write_head(edit ? 201 : 204, {CORS});
} else {
+ spdlog::info("user \"{}\" committing changes to {} ...", requestCtx->sess.getNacmUser().value_or(ANONYMOUS_USER), datastoreToString(requestCtx->sess.activeDatastore()));
requestCtx->sess.editBatch(*edit, sysrepo::DefaultOperation::Merge);
requestCtx->sess.applyChanges(timeout);
+ spdlog::info("user \"{}\" committed changes to {}.", requestCtx->sess.getNacmUser().value_or(ANONYMOUS_USER), datastoreToString(requestCtx->sess.activeDatastore()));
requestCtx->res.write_head(204, {CORS});
}
requestCtx->res.end();
@@ -763,8 +773,10 @@ void processPutOrPlainPatch(std::shared_ptr<RequestContext> requestCtx, const st
yangInsert(*requestCtx, *replacementNode);
}
+ spdlog::info("user \"{}\" committing changes to {} ...", requestCtx->sess.getNacmUser().value_or(ANONYMOUS_USER), datastoreToString(requestCtx->sess.activeDatastore()));
requestCtx->sess.editBatch(*edit, sysrepo::DefaultOperation::Merge);
requestCtx->sess.applyChanges(timeout);
+ spdlog::info("user \"{}\" committed changes to {}.", requestCtx->sess.getNacmUser().value_or(ANONYMOUS_USER), datastoreToString(requestCtx->sess.activeDatastore()));
if (requestCtx->req.method() == "PUT") {
requestCtx->res.write_head(nodeExisted ? 204 : 201, {CORS});
@@ -1219,8 +1231,10 @@ Server::Server(
deletedNode->newMeta(*netconf, "operation", "delete");
}
+ spdlog::info("user \"{}\" committing changes to {} ...", sess.getNacmUser().value_or(ANONYMOUS_USER), datastoreToString(sess.activeDatastore()));
sess.editBatch(*edit, sysrepo::DefaultOperation::Merge);
sess.applyChanges(timeout);
+ spdlog::info("user \"{}\" committed changes to {}.", sess.getNacmUser().value_or(ANONYMOUS_USER), datastoreToString(sess.activeDatastore()));
} catch (const sysrepo::ErrorWithCode& e) {
if (e.code() == sysrepo::ErrorCode::Unauthorized) {
throw ErrorResponse(403, "application", "access-denied", "Access denied.", restconfRequest.path);
diff --git a/src/restconf/utils/sysrepo.cpp b/src/restconf/utils/sysrepo.cpp
index 9f14cc7..d3bcc39 100644
--- a/src/restconf/utils/sysrepo.cpp
+++ b/src/restconf/utils/sysrepo.cpp
@@ -38,4 +38,21 @@ sysrepo::Datastore datastoreFromString(const std::string& datastore)
throw std::runtime_error("Unknown datastore '" + datastore + "'");
}
+
+std::string datastoreToString(sysrepo::Datastore datastore)
+{
+ switch (datastore) {
+ case sysrepo::Datastore::Running:
+ return "running";
+ case sysrepo::Datastore::Operational:
+ return "operational";
+ case sysrepo::Datastore::Candidate:
+ return "candidate";
+ case sysrepo::Datastore::Startup:
+ return "startup";
+ case sysrepo::Datastore::FactoryDefault:
+ return "factory-default";
+ }
+ throw std::runtime_error("Unknown datastore");
+}
}
diff --git a/src/restconf/utils/sysrepo.h b/src/restconf/utils/sysrepo.h
index 0eced9e..b8dd399 100644
--- a/src/restconf/utils/sysrepo.h
+++ b/src/restconf/utils/sysrepo.h
@@ -27,4 +27,5 @@ public:
};
sysrepo::Datastore datastoreFromString(const std::string& datastore);
+std::string datastoreToString(sysrepo::Datastore datastore);
}
--
2.43.0
@@ -0,0 +1,37 @@
From 87f1984ea8d07d7e55c0ad08e24ba9adeefd6aca Mon Sep 17 00:00:00 2001
From: Joachim Wiberg <troglobit@gmail.com>
Date: Thu, 19 Mar 2026 17:54:11 +0100
Subject: [PATCH 42/42] restconf: strip redundant fields from syslog/journald
log messages
Organization: Wires
When logging to syslog or journald, the timestamp, program name, and log
level are all provided by the logging infrastructure itself. Use a bare
message-only pattern to avoid the duplication.
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
src/restconf/main.cpp | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/restconf/main.cpp b/src/restconf/main.cpp
index 66c782d..63f8760 100644
--- a/src/restconf/main.cpp
+++ b/src/restconf/main.cpp
@@ -110,11 +110,13 @@ int main(int argc, char* argv [])
auto syslog_sink = std::make_shared<spdlog::sinks::syslog_sink_mt>("rousette", LOG_PID, LOG_USER, true);
auto logger = std::make_shared<spdlog::logger>("rousette", syslog_sink);
spdlog::set_default_logger(logger);
+ spdlog::set_pattern("%v");
#ifdef HAVE_SYSTEMD
} else if (is_journald_active()) {
auto sink = std::make_shared<journald_sink<std::mutex>>();
auto logger = std::make_shared<spdlog::logger>("rousette", sink);
spdlog::set_default_logger(logger);
+ spdlog::set_pattern("%v");
#endif
} else {
auto stdout_sink = std::make_shared<spdlog::sinks::ansicolor_stdout_sink_mt>();
--
2.43.0
@@ -1,2 +1,2 @@
service <!> name:mdns env:-/etc/default/avahi \
service <!pid/confd,usr/bootstrap> name:mdns env:-/etc/default/avahi \
[2345] avahi-daemon -s $AVAHI_ARGS -- Avahi mDNS-SD daemon
@@ -1 +1 @@
service [S12345] <!pid/syslogd> dnsmasq -k -u root -- DHCP/DNS proxy
service [S12345] <!service/dbus/ready> dnsmasq -k -u root -- DHCP/DNS proxy
@@ -1,2 +1,2 @@
service <usr/mkcert> env:-/etc/default/nginx \
service <usr/mkcert,service/confd/ready> env:-/etc/default/nginx \
[2345] nginx -g 'daemon off;' $NGINX_ARGS -- Web server
+1 -1
View File
@@ -1,3 +1,3 @@
#set DEBUG=1
service name:statd log [S12345] <pid/confd> statd -f -p /run/statd.pid -n -- Status daemon
service name:statd [12345] <pid/confd> statd -f -p /run/statd.pid -n -- Status daemon

Some files were not shown because too many files have changed in this diff Show More