Commit Graph
793 Commits
Author SHA1 Message Date
Joachim Wiberg 024b51cc6a statd: add support for ip forwarding operational state
This patch unlocks "routing interfaces" support in the ietf-routing yang
model.  An array of interface with IP forwarding enabled.

Note, because of #515 we skip IPv6 forwarding for now.  This will in the
near future be handled by a per-interface force_forwarding sysctl flag.

The 'show interface [ifname]' admin-exec command has been extended with
a Flags field for a quick overview of which interfaces have forwarding
currently enabled.

Fixes #647

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-12-05 11:12:03 +01:00
Joachim Wiberg 1cbc9a49a2 confd: initial support for rip
Fixes #582

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-12-05 10:58:35 +01:00
Joachim Wiberg 7edc3c19f7 confd: add support for toggling OSPF debug logs
Fixes #1281

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-12-02 17:06:10 +01:00
Joachim Wiberg d23f9ea25b confd: fix SSH host key generation warnings
Validate keys in gen_hostkey() before passing empty keys to shell scripts,
preventing:

Nov 04 2024 10:54:25 confd[2697]: SSH key (genkey) does not exist, generating...
Nov 04 2024 10:54:25 confd[2697]: writing RSA key
Nov 04 2024 10:54:26 confd[2697]: do_convert_from_pkcs8: /tmp/tmp.FH1Hr1 is not a recognised public key format

Also, fix base64 content formatting with proper 64-character line wrapping
using printf+fold instead of echo.

Use PKCS#1 RSA format for public keys as required by netopeer2-server, while
keeping PKCS#8 format for private keys.  Use proper ssh-keygen format flag
(PKCS8) for correct conversion.

Fixes #1289

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-12-02 09:50:24 +01:00
Joachim Wiberg b9a56924ac confd: drop ietf/infix prefix from function names
SIMPLIFY, Simplify, simplify ... as my uni English professor always said.

> “Perfection is achieved not when there is nothing more to add, but when
>  there is nothing left to take away.” -- Antoine de Saint-Exupéry

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-11-20 20:23:25 +01:00
Joachim Wiberg c398e42ca9 confd: drop leading ietf/infix prefix in source files
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-11-20 20:23:24 +01:00
Joachim Wiberg ed6db59e68 confd: extend syslogd support with property-based filtering
This is the last commit in the series that extend syslog matching and sorting
to the level of sysklogd 2.7.0 and later.  Like hostname filtering, property
based filtering is not supported natively in the IETF RFC, and the modeling is
unfortunately a bit clunky.  The most confusing part is probably 'negate'
which is the '!' operator that inverts the matching, e.g., !icase_regex match
everthing *not* in the regexp.

Fixes #1091

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-11-20 14:05:37 +01:00
Joachim Wiberg 18e80ceb11 confd: extend syslogd support with hostname-based filtering
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-11-20 14:05:36 +01:00
Joachim Wiberg c1b57c17bd confd: extend syslogd with regexp matching and advanced severity ops
Unlock more of the optional features in ietf-syslog.yang: select-match and
select-adv-compare, for regexp and advanced severity comparison operators.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-11-20 12:00:06 +01:00
Joachim Wiberg 52320a973a confd: add support for dhcpv4 vendor-class option
The vendor-class option was previously hard-coded to "Infix vXX.YY.Z",
but since this option usually describes the type of the device asking
for a lease, the default has been changed to use the product-name.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-11-20 09:33:59 +01:00
Joachim Wiberg 90f619bfa6 confd: add deterministic hostname management via /etc/hostname.d/
Resolve race condition between DHCP and configured hostname by introducing
priority-based hostname management using /etc/hostname.d/ directory pattern.

Priority order (highest wins):
  90-dhcp-<iface>  - DHCP assigned hostname
  50-configured    - YANG /system/hostname config
  10-default       - Bootstrap/factory default

The new /usr/libexec/infix/hostname helper reads all sources and applies the
highest priority hostname.  It exits early if hostname unchanged, preventing
unnecessary service restarts.

Fixes #1112

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-11-18 19:07:25 +01:00
Joachim Wiberg a568f31309 confd: add support for dhcpv6 client
Basic DHCPv6 support as a per-interface ipv6 setting, not in line with
the IETF YANG model, which has this as a root container.

Note, this also fixes DHCPv4 option inference after the relocation of
/dhcp-client to /interfaces, in 764bd8e.

Fixes #1110

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-11-18 13:28:15 +01:00
Joachim Wiberg 77de4d749a confd: add support for configuring ospf interface priority
Since we just un-deviated this node to be able to create operational
data for ospf interfaces, we should also allow users to set it.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-11-12 22:28:19 +01:00
Joachim Wiberg f79c0ee903 statd: extend ospf operational data to replace vtysh commands in cli
Collect more data from FRR to the OSPF and BFD operational datastore.
Refactor CLI commands to use the YANG datastore instead of vtysh.

Additionally, the BFD command(s) have been moved to the top level of
admin-exec, which is where vtysh has them.

Finally, preparing for future OSPFv3 support, all commands have been
given a new context under 'show ip ospf'.  Deprecation warnings have
been added to the existing 'show ospf' commands.

Also, for consistency, all commands names in plural have been changed to
their singular form: routes -> route, interfaes -> interface, etc.  This
is what vtysh, Cisco, and others do as well.

Fixes #1190

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-11-12 22:28:18 +01:00
Joachim Wiberg b1f83e5ce7 confd: add must expression to verify ospf backbone is not nssa/stub
Silently drop any area-type setting for ospf backbone in a migrate
script to prevent any field issues after upgrading to this fix.

Fixes #1247

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-11-12 22:28:18 +01:00
Joachim Wiberg a76b1adc1e confd: enable IFF_MULTICAST on GRE tunnel interfaces
Required for protocol daemons like ospfd to join multicast groups.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-11-07 14:46:54 +01:00
Joachim Wiberg 777650bbca confd: add tunnel ttl, tos, and pmtu-discovery settings
Adds support for configuring TTL, ToS/DSCP, and Path MTU Discovery
on GRE and VXLAN tunnels. TTL defaults to 64 instead of inherit to
prevent issues with routing protocols like OSPF that use TTL=1.

Refactors tunnel YANG models by merging local-remote into a unified
tunnel-common grouping for cleaner organization.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-11-07 14:46:54 +01:00
Joachim Wiberg 80e8ccf273 confd: fix inference from CLI, follow-up to ed235583
The callback refactoring forgot to call ietf_interfaces_cand_init(),
breaking inference of interface types and DHCP client options.

Also fixes UPDATE event handling for ietf-keystore and infix-meta.

Fixes #1244

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-11-06 17:42:39 +01:00
Joachim Wiberg 15a6f69e03 confd: drop 'enabled' node from IPv4 autoconf container
Neither the IPv6 autonconf container, nor the recently moved DHCP client
container have an 'enabled' flag.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-11-06 16:36:57 +01:00
Joachim Wiberg 7f555fd2bd confd: relocate /dhcp-client to /interfaces/interface/ipv4/dhcp
Please note, this change drops not only the global enabled flag, but also the
per-interface enabled flag, converting it to a presence container.  The name
of the container is also shortened from dhcp-client -> dhcp.  A pattern that
expected to be reused also for the DHCPv6 client.

Fixes #1109

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-11-06 16:36:56 +01:00
Joachim Wiberg 5496258e54 confd: minor, silence libyang warning when built w/o containers
Silence confd[3582]: libyang[0]: Invalid argument ctx_node (lyd_find_xpath())
warning in syslog.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-11-06 09:08:22 +01:00
Joachim Wiberg f08947092b confd: fix update of /cfg/startup-config.cfg
Follow-up to ed23558

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-11-05 20:41:59 +01:00
Joachim Wiberg 33999ceebc confd: fix annoying warning in log
This fixes the annoying libyang warning after commit da29771.

    confd[3375]: libyang[0]: Invalid argument ctx_node (lyd_find_xpath()).

This happens when the diff is used in the wrong event when it is NULL.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-11-05 20:41:58 +01:00
Joachim Wiberg 79ad653150 confd: minor coding style fixes and refactoring
Collapse, simplify, and break up ietf_keystore_change() into multiple
functions.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-11-05 20:41:58 +01:00
Mattias Walström 10ef03c971 confd: Remove debug prints 2025-11-01 16:57:49 +01:00
Joachim WibergandGitHub f82534d828 Merge pull request #1216 from kernelkit/coverity-fixes 2025-10-31 18:18:46 +01:00
Joachim WibergandGitHub ed2355833e Merge pull request #1209 from kernelkit/confd-refactor-callbacks
Major refactor of how sysrepo callbacks is used in confd

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 17:49:53 +01:00
Joachim Wiberg 089b160029 confd: fix possible NULL pointer deref.
Found by Coverity Scan

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 16:59:30 +01:00
Joachim Wiberg 24755e7e5f board/aarch64: add broken-flow-control interface quirk
Add new interface quirk to allow skipping disabling of flow control on
all RPi 3B/4B devices that have the smsc95xx driver.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 13:26:08 +01:00
Joachim Wiberg 4b55e38741 board/aarch64: use %m modifier in default xPi hostnames
The xPi's usually don't have a VPD so the chassis mac-address probed at
boot is usually null in /run/system.json.  This commit adds a fallbkack
mechanism to populate this field so it can be used for unique hostnames
even on these boards.

Ths ietf-hardware.yang model does not have a notion of physical address,
so we augment one tht is generic enought to be used for other hardware
components than Ethernet, similar to what ietf-interfaces.yang use.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 13:26:08 +01:00
Joachim Wiberg d1fda087ec statd: refactor, use parent node for sensor relationships
For more advanced hardware with multiple sensor types per device
(e.g., SFP modules with temperature, voltage, current, and power
sensors), use the YANG parent/child relationship to group related
sensors together for better presentation.

Changes:
 - Remove parent/parent-rel-pos deviations from infix-hardware.yang
 - Create parent components (class: module) for multi-sensor devices
 - Add parent references to child sensor components
 - Add human-readable descriptions from hwmon labels
 - Extend hwmon discovery to support voltage, current, and power
 - Normalize sensor names: strip vendor prefixes (mt7915_phy0 -> phy0)
 - Remove redundant TYPE column, clarify units (V -> VDC, add spaces)
 - Simplify child sensor display by stripping parent prefix
 - Fix "show system" to only show CPU temperature and fan speed

Example output from "show hardware":

  NAME                     VALUE               STATUS
  ===================================================
  sfp1:
    Rx Power               0.000 W             ok
    Tx Power               0.001 W             ok
    Vcc                    3.35 VDC            ok
    Bias                   0.006 A             ok
    Temperature            30.3 °C             ok

  sfp2:
    Rx Power               0.000 W             ok
    Tx Power               0.001 W             ok
    Vcc                    3.34 VDC            ok
    Bias                   0.006 A             ok
    Temperature            32.0 °C             ok

  cpu                      42.8 °C             ok
  phy0                     47.0 °C             ok
  phy1                     53.0 °C             ok

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 13:26:04 +01:00
Joachim Wiberg 08c9c97823 confd: add system resource usage to ietf-system.yang
This commit adds resource usage: memory, loadavg, and filesystem usage
by augmenting ietf-system:/system-state.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 13:26:03 +01:00
Joachim Wiberg 8b10cce172 confd: add support for temperature sensors in ietf-hardware.yang
- Remove class deviation to allow iana-hardware:sensor
 - Populate sensor operational data from /sys/class/thermal
 - Extend 'show hardware'

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 13:26:03 +01:00
Joachim Wiberg 6aaf612095 board/common: simplify USB port discovery and fix duplicate entries
This commit refactors USB port probing to:

- Eliminate duplicates: previously, 'authorized' and 'authorized_default'
  were listed as separate USB port entries (confusing).  Now each USB
  port is represented once, with the path pointing to the USB device
  directory, confd appends the appropriate attribute file as needed

- Add support for Raspberry Pi 4B and CM4 USB port(s) using a generic
  discovery function that scans /sys/bus/usb/devices for USB root hubs.
  This should work seamlessly across all platforms

- For backwards compatibility and better UX:
   - Single USB port systems: Named "USB" (no number)
   - Multi-port systems: Named "USB1", "USB2", etc.

- Device tree-based discovery is tried first (for boards like Alder with
  explicit DT USB port definitions), with fallback to generic discovery
  for boards without DT

Fixes: #315

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 13:26:00 +01:00
Joachim Wiberg 9b057ad547 Support for Raspberry Pi 3B (BCM2837)
The BCM2837 core is used not just in the RPi 3B but also in the Zero 2W,
both device trees have been added to the board config.

The BCM2711 support has been extended to include RPi 400 and CM4 I/O.

To support the BCM2837 family more firmware options habe been enabled,
since the RPi3 does not have bootcode.bin flashed in the SoC.  The SD
card image now uses a hybrid GPT/MBR format so the RPi3 bootcode.bin
can read all files from the first VFAT partition.

The default device tree for Linux is now chosen by the U-Boot probe and
the only exception is the "laundry room" detector that looks for a RPi4
with a 7" touch screen, which then selects the DSI enabled RPi4 variant.
This is enough to properly load an RPi 3B and a CM4 based router board.

The BCM2837 does not have PCI/PCIe or a built-in MAC so it relies on the
USB to Ethernet LAN78xx which does not support disabling pause frames.
I have opted for checking for EOPNOTSUPP instead of adding yet another
quirk, because it is likely to be a common limitation of more drivers
and chipsets, and this code is best-effort anyway.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-31 13:25:59 +01:00
Mattias Walström 98b30d7d45 confd: Remove core hooks
Not needed anymore, the configuration change is sequential in change_cb.
2025-10-30 13:14:49 +01:00
Mattias Walström 5cdcf1f4fe confd: Add support for dependency tracking between modules
Sysrepo lack the functionallity for if change in model A also
should demand actions of model B. Previous we have handled this by
having callbacks for keystore changes in for example infix-services
to be able to reconfigure SSH on asymmetric key changes.

This commit instead add a pass where dependencies are found and added
to the diff.
2025-10-30 13:14:49 +01:00
Mattias Walström da29771398 confd: Refactor how sysrepo callbacks are handled
Sysrepo only care about model changes, but we want the system
configuration. Therefore add a common callback for all modules
and handle dependencies between the modules, if someone should be
run before another for example.
2025-10-30 12:28:03 +01:00
Joachim WibergandGitHub 9d271eb7c6 Merge pull request #1033 from kernelkit/yang-add-services
Add new operational support for services

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-29 09:59:33 +01:00
Joachim Wiberg 7e37fc49a3 confd: prevent IP addresses on bridge ports
Bridge ports should not have IP addresses configured. The IP address
should be configured on the bridge interface itself, not its member ports.

Add YANG must expression to enforce this rule at configuration time.

Fixes #1122

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-28 19:35:32 +01:00
Joachim Wiberg cb5d804a88 confd: add dhcp-server validation of address pool and/or static host
A valid DHCP server setup for a subnet is one of pool and/or at least one
static host entry/lease.  If pool is enabled the pool must have a start
and an end address.

To allow setting up a DHCP server with no pool and at least one static host
entry/lease, we make the pool a presence container, otherwise the pool will
always be set and trigger the below inference.

When an interactive CLI/Web user enables the address pool we infer a default
range .100-.250, but only for /24, C-class networks.  This is what most users
know and expect.

The YANG model now validates that:
- If an address pool is created, both start-address and end-address must be set
- Each subnet must have either a pool or at least one static host entry
- The pool container is now a presence container, so "no pool" fully deletes it

Fixes #1121

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-28 19:34:53 +01:00
Richard Alpe cc86463233 confd: use keyless services list, allow duplicate PIDs
Multiple services can have PID 0 when stopped/done, making PID
unsuitable as a unique key. There could also be multiple services with
the same name (I would assume?).

Signed-off-by: Richard Alpe <richard@bit42.se>
2025-10-28 15:35:44 +01:00
Richard Alpe c119436f97 confd: augment new services container to ietf-system
This patch adds operational data support for system services. The
data is in a generic format but is intended to be able to represent
finit information (initctl) nicely.

The reason for augmenting this to ietf-system and not to
infix-services is that we consider this generic system information
which is totally disconnected from what ever services infix might
provide.

In this first state we only support pid, name, description and state.
Making the data look something like:

  "infix-system:services": {
    "service": [
      {
        "pid": 1185,
        "name": "udevd",
        "status": "running",
        "description": "Device event daemon (udev)"
      }]

Signed-off-by: Richard Alpe <richard@bit42.se>
2025-10-27 15:30:29 +01:00
Joachim Wiberg 671fc93ce0 confd: add support for upgrade action (rpc)
Already supported in the CLI.  This makes it official, and quite handy
for users that run mutable containers.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-23 15:23:55 +02:00
Joachim Wiberg ea2c4be237 container: refactor and cleanup per review comments
Shell script:

 - Factor out big portions of code into more logical helper functions
 - Simplify calling setup script by checking for remote image first
 - Simplify meta/sha up-to-date handling and clarify terminology
 - Consistent use of -f instead of -e in file-exists checks
 - Fix unsafe use of 'mktemp -u'

C code:
 - Clarify meta/sha terminology: rename meta-sha256 -> meta-image-sha256
 - Refactor weird archive_offset() function to local_path() helper
 - Factor out helper function calc_sha()
 - Check len of sha256 >= 64

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-23 15:23:55 +02:00
Joachim Wiberg 0eddd1ba64 container: refactor cleanup on instance removal
This commit reverts 477f7ae and bb19d06, which intended to fix an issue
with lingering old images, see #1098.  However, as detailed in #1147,
this caused severe side effects while working with multiple larger
containers.  Basically, the prune operation of one container removed
images of other containers that are just being created in parallel.

Instead of using the podman prune command we can use the meta datain the
start script to pinpoint exactly which image(s) to remove, including any
downloaded OCI archives when the container instance is removed.

Fixes #1147

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-23 15:23:53 +02:00
Joachim Wiberg 68bb01545c container: optimize startup of preexisting containers
This commit adds metadata to track loaded OCI archives to allow skipping
'delete + load' of OCI images when restarting either the container or the
system as a whole.  The sha256 of all loaded OCI archives is stored in a
sidecar file in our downloads directory.  Then we verify the checksum of
the OCI archives against their same-named sidecar to determine if the OCI
archive is already loaded or not.

Additionally, the instance using the image is labled with metadata to detect
changes in the container configuration.  This in turn allow skipping the
delete + create phase also of the instance.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-23 15:23:52 +02:00
Joachim Wiberg e5da7f0473 confd: create container script even if disabled
Not only great for debugging, but also allows users to start their
containers manually in another way.  But yeah, mostly for debug.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-23 15:23:51 +02:00
Joachim Wiberg a880939a2e confd: add new container and volume name type
This rectifies an omission from the initial yang model.  Not all
charachters are supported in container and volume names.  E.g.,
simply attempting to create a volume or container with a space
in the name causes this error message from podman:

 podman: Error: running volume create option: names must match [a-zA-Z0-9][a-zA-Z0-9_.-]*: invalid argument

In addition to the regexp, the new 'ident' type also enforces a
minimum and maximum length.  Sure, technically a single char is
allowed, but let's be reasonable, and who in their right mind
wants an identifier > 64 chars?  We have description for that.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-10-23 15:23:51 +02:00
Mattias Walström bc24a8b64e yang: Make possible to add WiFi interfaces to bridge 2025-10-23 13:05:26 +02:00