Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions board/common/post-build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -146,3 +146,14 @@ mkuserguide()
if [ "$BR2_PACKAGE_WEBUI" = "y" ]; then
mkuserguide
fi

# The common rootfs skeleton carries confs for optional daemons, drop
# them when the daemon is not part of this image.
if [ "$BR2_PACKAGE_TTYD" != "y" ]; then
rm -f "$TARGET_DIR/etc/finit.d/available/ttyd.conf" \
"$TARGET_DIR/etc/nginx/available/ttyd.conf"
fi

# Drop dangling Finit enabled/*.conf symlinks, e.g., optional services
# not part of this image, they cause noise at every initctl reload.
find "$TARGET_DIR/etc/finit.d/enabled" -xtype l -delete 2>/dev/null
18 changes: 13 additions & 5 deletions board/common/rootfs/usr/libexec/infix/has-quirk
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#!/bin/bash
#!/bin/sh

IFQUIRKSFILE=${IFQUIRKSFILE:-/etc/product/interface-quirks.json}

Expand Down Expand Up @@ -26,10 +26,18 @@ ethtoolmatch()
{
local pattern="${1#@ethtool:}"

grep -qFxvf \
<(ethtool -i "$ifname") \
<(echo -n "$pattern" | awk -v FS="=" -v RS=";" '{ printf("%s: %s\n", $1, $2); }') \
&& return
# All key=val pairs of the pattern must match a "key: val" line
ethtool -i "$ifname" | awk -v pat="$pattern" '
BEGIN {
n = split(pat, kv, ";");
for (i = 1; i <= n; i++) {
eq = index(kv[i], "=");
want[substr(kv[i], 1, eq - 1) ": " substr(kv[i], eq + 1)] = 1;
}
}
($0 in want) { delete want[$0]; found++; }
END { exit(found < n); }
' || return

match "@ethtool:$pattern"
}
Expand Down
2 changes: 1 addition & 1 deletion configs/aarch64_defconfig
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_EUDEV=y
BR2_ROOTFS_DEVICE_TABLE="system/device_table.txt ${BR2_EXTERNAL_INFIX_PATH}/board/common/xattrs"
BR2_ROOTFS_MERGED_USR=y
# BR2_TARGET_ENABLE_ROOT_LOGIN is not set
BR2_SYSTEM_BIN_SH_BASH=y
BR2_TARGET_GENERIC_GETTY_PORT="@console"
BR2_TARGET_GENERIC_GETTY_TERM="xterm"
BR2_SYSTEM_DHCP="eth0"
Expand Down Expand Up @@ -98,6 +97,7 @@ BR2_PACKAGE_TRACEROUTE=y
BR2_PACKAGE_ULOGD=y
BR2_PACKAGE_WHOIS=y
BR2_PACKAGE_WIREGUARD_TOOLS=y
BR2_PACKAGE_BASH=y
BR2_PACKAGE_BASH_COMPLETION=y
BR2_PACKAGE_NEOFETCH=y
BR2_PACKAGE_SUDO=y
Expand Down
2 changes: 1 addition & 1 deletion configs/aarch64_minimal_defconfig
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_EUDEV=y
BR2_ROOTFS_DEVICE_TABLE="system/device_table.txt ${BR2_EXTERNAL_INFIX_PATH}/board/common/xattrs"
BR2_ROOTFS_MERGED_USR=y
# BR2_TARGET_ENABLE_ROOT_LOGIN is not set
BR2_SYSTEM_BIN_SH_BASH=y
BR2_TARGET_GENERIC_GETTY_PORT="@console"
BR2_TARGET_GENERIC_GETTY_TERM="xterm"
BR2_SYSTEM_DHCP="eth0"
Expand Down Expand Up @@ -82,6 +81,7 @@ BR2_PACKAGE_SOCAT=y
BR2_PACKAGE_TCPDUMP=y
BR2_PACKAGE_WHOIS=y
BR2_PACKAGE_WIREGUARD_TOOLS=y
BR2_PACKAGE_BASH=y
BR2_PACKAGE_BASH_COMPLETION=y
BR2_PACKAGE_SUDO=y
BR2_PACKAGE_GETENT=y
Expand Down
2 changes: 1 addition & 1 deletion configs/arm_defconfig
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_EUDEV=y
BR2_ROOTFS_DEVICE_TABLE="system/device_table.txt ${BR2_EXTERNAL_INFIX_PATH}/board/common/xattrs"
BR2_ROOTFS_MERGED_USR=y
# BR2_TARGET_ENABLE_ROOT_LOGIN is not set
BR2_SYSTEM_BIN_SH_BASH=y
BR2_TARGET_GENERIC_GETTY_PORT="@console"
BR2_TARGET_GENERIC_GETTY_TERM="xterm"
BR2_SYSTEM_DHCP="eth0"
Expand Down Expand Up @@ -97,6 +96,7 @@ BR2_PACKAGE_TRACEROUTE=y
BR2_PACKAGE_ULOGD=y
BR2_PACKAGE_WHOIS=y
BR2_PACKAGE_WIREGUARD_TOOLS=y
BR2_PACKAGE_BASH=y
BR2_PACKAGE_BASH_COMPLETION=y
BR2_PACKAGE_NEOFETCH=y
BR2_PACKAGE_SUDO=y
Expand Down
2 changes: 1 addition & 1 deletion configs/arm_minimal_defconfig
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_EUDEV=y
BR2_ROOTFS_DEVICE_TABLE="system/device_table.txt ${BR2_EXTERNAL_INFIX_PATH}/board/common/xattrs"
BR2_ROOTFS_MERGED_USR=y
# BR2_TARGET_ENABLE_ROOT_LOGIN is not set
BR2_SYSTEM_BIN_SH_BASH=y
BR2_TARGET_GENERIC_GETTY_PORT="@console"
BR2_TARGET_GENERIC_GETTY_TERM="xterm"
BR2_SYSTEM_DHCP="eth0"
Expand Down Expand Up @@ -84,6 +83,7 @@ BR2_PACKAGE_SOCAT=y
BR2_PACKAGE_TCPDUMP=y
BR2_PACKAGE_WHOIS=y
BR2_PACKAGE_WIREGUARD_TOOLS=y
BR2_PACKAGE_BASH=y
BR2_PACKAGE_BASH_COMPLETION=y
BR2_PACKAGE_SUDO=y
BR2_PACKAGE_GETENT=y
Expand Down
2 changes: 1 addition & 1 deletion configs/riscv64_defconfig
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_EUDEV=y
BR2_ROOTFS_DEVICE_TABLE="system/device_table.txt ${BR2_EXTERNAL_INFIX_PATH}/board/common/xattrs"
BR2_ROOTFS_MERGED_USR=y
# BR2_TARGET_ENABLE_ROOT_LOGIN is not set
BR2_SYSTEM_BIN_SH_BASH=y
BR2_TARGET_GENERIC_GETTY_PORT="@console"
BR2_TARGET_GENERIC_GETTY_TERM="xterm"
BR2_SYSTEM_DHCP="eth0"
Expand Down Expand Up @@ -108,6 +107,7 @@ BR2_PACKAGE_TRACEROUTE=y
BR2_PACKAGE_ULOGD=y
BR2_PACKAGE_WHOIS=y
BR2_PACKAGE_WIREGUARD_TOOLS=y
BR2_PACKAGE_BASH=y
BR2_PACKAGE_BASH_COMPLETION=y
BR2_PACKAGE_NEOFETCH=y
BR2_PACKAGE_SUDO=y
Expand Down
2 changes: 1 addition & 1 deletion configs/x86_64_defconfig
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_EUDEV=y
BR2_ROOTFS_DEVICE_TABLE="system/device_table.txt ${BR2_EXTERNAL_INFIX_PATH}/board/common/xattrs"
BR2_ROOTFS_MERGED_USR=y
# BR2_TARGET_ENABLE_ROOT_LOGIN is not set
BR2_SYSTEM_BIN_SH_BASH=y
BR2_TARGET_GENERIC_GETTY_PORT="@console"
BR2_TARGET_GENERIC_GETTY_TERM="xterm"
BR2_SYSTEM_DHCP="eth0"
Expand Down Expand Up @@ -97,6 +96,7 @@ BR2_PACKAGE_TRACEROUTE=y
BR2_PACKAGE_ULOGD=y
BR2_PACKAGE_WHOIS=y
BR2_PACKAGE_WIREGUARD_TOOLS=y
BR2_PACKAGE_BASH=y
BR2_PACKAGE_BASH_COMPLETION=y
BR2_PACKAGE_NEOFETCH=y
BR2_PACKAGE_SUDO=y
Expand Down
2 changes: 1 addition & 1 deletion configs/x86_64_minimal_defconfig
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_EUDEV=y
BR2_ROOTFS_DEVICE_TABLE="system/device_table.txt ${BR2_EXTERNAL_INFIX_PATH}/board/common/xattrs"
BR2_ROOTFS_MERGED_USR=y
# BR2_TARGET_ENABLE_ROOT_LOGIN is not set
BR2_SYSTEM_BIN_SH_BASH=y
BR2_TARGET_GENERIC_GETTY_PORT="@console"
BR2_TARGET_GENERIC_GETTY_TERM="xterm"
BR2_SYSTEM_DHCP="eth0"
Expand Down Expand Up @@ -81,6 +80,7 @@ BR2_PACKAGE_SOCAT=y
BR2_PACKAGE_TCPDUMP=y
BR2_PACKAGE_WHOIS=y
BR2_PACKAGE_WIREGUARD_TOOLS=y
BR2_PACKAGE_BASH=y
BR2_PACKAGE_BASH_COMPLETION=y
BR2_PACKAGE_SUDO=y
BR2_PACKAGE_GETENT=y
Expand Down
40 changes: 40 additions & 0 deletions doc/ChangeLog.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,55 @@ All notable changes to the project are documented in this file.

- Upgrade Linux kernel to 6.18.42 (LTS)
- Upgrade Buildroot to 2025.02.15 (LTS)
- Upgrade mdns-alias to [v1.3][ma13]: fixes crash on hostname change while
disconnected from Avahi, treats entry group failures and CNAME collisions
as transient (retried instead of exiting), and quieter logs by default
- Add support for firewall address-set (ipset): named sets of IP addresses and
networks, usable as zone sources for per-IP access control, issue #1189
- Build RPi64 SD card images in release builds
- Include .pkg files in release builds
- The `statd` service now logs at `notice` level by default, like other
services, and supports `-v <level>` to adjust verbosity at runtime
- `/bin/sh` is now provided by Busybox ash instead of Bash, speeding up
boot and configuration changes, issue #961. Same rationale as Debian's
dash-as-/bin/sh. Bash remains available for interactive use and for
scripts using `#!/bin/bash`

### Fixes

- Fix annoying "cannot deselect all services" or reset to YANG default in the
web interface's firewall configuration page
- Fix sporadic slow response, or timeouts, when reading device status while
mDNS neighbors are being discovered, e.g., after an mDNS restart. Updates
to the neighbor table are now batched, and politely retried when other users
or services keep the system busy, logged as:

statd[3558]: mdns: operational datastore busy, retrying ...

- Fix interface setup failures after an interrupted or failed configuration
change. Leftover interfaces could break all subsequent changes to the
interface configuration, until reboot, logged as:

dagger[2599]: Aborting: /run/net/131/action/init/br0/50-init.ip failed with exitcode 1
confd[2599]: Failed to apply interface configuration

with `RTNETLINK answers: File exists` in the failing script's log.
Creating and deleting interfaces is now tolerant to such leftovers
- Fix slow response, or timeouts, when configuring the system or reading
status while a periodic status snapshot is in progress. On slower systems
with a big configuration, the snapshot, taken every five minutes, could
hold up other users for minutes. Snapshots now run in a separate
low-priority process, `statd-journal`, reading status in small chunks to
let other users interleave
- Fix noisy logs on minimal builds, repeated on every configuration change:

finit[1]: Skipping /etc/finit.d/enabled/webui.conf, dangling symlink: No such file or directory
finit[1]: service_register():/etc/finit.d/enabled/ttyd.conf: skipping ttyd: No such file or directory

Optional services not included in the image are now skipped when enabled
in the configuration, and leftover confs are dropped at build time

[ma13]: https://github.com/troglobit/mdns-alias/releases/tag/v1.3

[v26.06.0][] - 2026-07-01
-------------------------
Expand Down
2 changes: 1 addition & 1 deletion package/mdns-alias/mdns-alias.hash
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# From GitHub release
sha256 9f194fa0b6e34fd915054394ef5b820a4f6b1755ace5ed1011bfba6df550accf mdns-alias-1.2.tar.gz
sha256 8186f0758f184cbdcab1033e4945117a587356c323e53bcdd19d47911ee2567b mdns-alias-1.3.tar.gz

# Locally generated
sha256 3d6f910b5e198f3daab48047b8ee6949040f7abee3927daf2e231f265faf7d91 LICENSE
2 changes: 1 addition & 1 deletion package/mdns-alias/mdns-alias.mk
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
#
################################################################################

MDNS_ALIAS_VERSION = 1.2
MDNS_ALIAS_VERSION = 1.3
MDNS_ALIAS_SITE = https://github.com/troglobit/mdns-alias/releases/download/v$(MDNS_ALIAS_VERSION)
MDNS_ALIAS_LICENSE = ISC
MDNS_ALIAS_LICENSE_FILES = LICENSE
Expand Down
2 changes: 1 addition & 1 deletion package/statd/statd.conf
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
#set DEBUG=1
service name:statd [12345] <pid/confd> statd -f -p /run/statd.pid -n -- Status daemon
service name:statd [12345] <pid/confd> statd -- Status daemon
2 changes: 1 addition & 1 deletion src/confd/bin/dagger
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ action_exec()
EOF
$TIME -f "$TIMEFMT" -o $meta.time $work >>"$work.log" 2>&1 || code=$?

echo -ne "\t" >>$meta
printf '\t' >>$meta
# busybox's time(1) will happily write "Command exited
# with non-zero status" and similar messages to the
# output, even when -f is used. Work around that by only
Expand Down
2 changes: 1 addition & 1 deletion src/confd/bin/wait-interface
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ fi
ifname=$1
timeout=$2
while true; do
if ip link show $ifname &>/dev/null; then
if ip link show $ifname >/dev/null 2>&1; then
break
fi

Expand Down
6 changes: 6 additions & 0 deletions src/confd/src/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,12 @@ int finit_enable(const char *svc)
(int)(at - svc), svc);
}

if (!fexist(src)) {
/* Optional service not part of this image, avoid dangling symlink */
INFO("%s is not available in this image, cannot enable", svc);
return 0;
}

snprintf(dst, sizeof(dst), FINIT_RCSD "/enabled/%s.conf", svc);
if (symlink(src, dst) && errno != EEXIST) {
ERRNO("failed enabling %s", svc);
Expand Down
4 changes: 2 additions & 2 deletions src/confd/src/ieee802-ethernet-interface.c
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ static int netdag_gen_ethtool_flow_control(struct dagger *net, struct lyd_node *
return -EIO;

/* Check if the NIC supports pause frames at all */
fprintf(fp, "[[ -n $(ethtool --json %s | jq '.[] | select(.\"supported-pause-frame-use\" == \"No\")') ]] && exit 0\n", ifname);
fprintf(fp, "[ -n \"$(ethtool --json %s | jq '.[] | select(.\"supported-pause-frame-use\" == \"No\")')\" ] && exit 0\n", ifname);

/* Disable flow control */
fprintf(fp, "ethtool --pause %s autoneg %s rx off tx off\n",
Expand Down Expand Up @@ -189,7 +189,7 @@ static int netdag_gen_ethtool_autoneg(struct dagger *net, struct lyd_node *cif)
if (!fp)
return -EIO;

fprintf(fp, "[[ -n $(ethtool --json %s | jq '.[] | select(.\"supports-auto-negotiation\" == false)') ]] && exit 0\n", ifname);
fprintf(fp, "[ -n \"$(ethtool --json %s | jq '.[] | select(.\"supports-auto-negotiation\" == false)')\" ] && exit 0\n", ifname);

duplex = lydx_get_cattr(eth, "duplex");

Expand Down
Loading