networkd-broker icon indicating copy to clipboard operation
networkd-broker copied to clipboard

An event broker daemon for systemd-networkd

= Networkd-broker :toc: :toc-placement!: :xrefstyle: full ifndef::env-github[:icons: font] ifdef::env-github[] :status: :caution-caption: :fire: :important-caption: :exclamation: :note-caption: :paperclip: :tip-caption: :bulb: :warning-caption: :warning: endif::[]

image:https://img.shields.io/github/v/tag/bpetlert/networkd-broker?include_prereleases&label=release&style=flat-square[Release,link=https://github.com/bpetlert/networkd-broker/releases/latest] image:https://img.shields.io/aur/version/networkd-broker?style=flat-square["AUR: networkd-broker",link=https://aur.archlinux.org/packages/networkd-broker/] image:https://img.shields.io/github/license/bpetlert/networkd-broker?style=flat-square["License: GPL-3.0-or-later",link=./COPYING]

The networkd-broker is an event broker daemon for systemd-networkd. It will execute scripts in the /etc/networkd/broker.d/<STATE>.d directory in alphabetical order in response to network events.

toc::[]

This work is based on https://gitlab.com/craftyguy/networkd-dispatcher[networkd-dispatcher], written in Rust, for the purpose of reducing runtime dependencies. This also helps reduce memory footprint (~30MB ⟶ ~8MB) and improve startup time (~30secs ⟶ ~1sec for spinning hard disk drive).

== Installation

=== Arch Linux

It is available on AUR as https://aur.archlinux.org/packages/networkd-broker/[networkd-broker]. To build and install arch package from GIT source:

[source,console] $ git clone https://github.com/bpetlert/networkd-broker.git $ cd networkd-broker $ makepkg -p PKGBUILD.local $ pacman -U networkd-broker-xxxx-1-x86_64.pkg.tar

Then enable/start networkd-broker.service

[source,console] $ systemctl enable --now networkd-broker.service

== Configuration

To change the options of networkd-broker service e.g. enable debug, run systemctl edit networkd-broker.service

./etc/systemd/system/networkd-broker.service.d/override.conf [source,ini]

[Service] Environment='RUST_LOG=networkd_broker=debug'

Or enable --startup-triggers. Start this service after systemd-networkd.service to ensure network devices are already configured or renamed.

./etc/systemd/system/networkd-broker.service.d/override.conf [source,ini]

[Unit] Wants=systemd-networkd.service After=systemd-networkd.service

[Service] ExecStart= ExecStart=/usr/bin/networkd-broker --startup-triggers

== Usage

The scripts for any network event need to be putted (or symlink) in its corresponding directory as shown below. Each script must be a regular executable file owned by root. The default execution timeout of each script is 20 seconds. It can be overridden by --timeout option in service configuration. Any of the scripts which has filename (exclude extension) end with '-nowait' is run immediately, without waitting for the termination of previous scripts. e.g. script-nowait, script-nowait.sh

.Directories of Commonly Used Network Events [source,console]

/etc/networkd └── broker.d ├── carrier.d ├── degraded.d ├── dormant.d ├── no-carrier.d ├── off.d └── routable.d

The scripts are run in alphabetical order, one at a time with two arguments and a set of environment variables being passed. Each script run asynchronously from networkd-broker process.

[[table-script-arguments]] .Script's Arguments |=== | Argument | Description

| STATE | Current link status is one of the following: carrier, degraded, dormant, no-carrier, off, routable; see man networkctl for more details.

| IFACE | Link name that operation just happened on |===

The following environment variables are being passed to each script:

.Script's Environment Variables |=== | Environment Variable | Description

| NWD_DEVICE_IFACE | Link name that operation just happened on, same value as IFACE

| NWD_BROKER_ACTION | Current link status, same value as STATE

| NWD_JSON | All the link details are encoded in JSON format. |===

[TIP] .Add Uncommonly Used Network Events

There are link's STATE which are not list in <>. To find out which link state that can be added, using the following command: [source,console]

$ journalctl -u networkd-broker.service | grep "Respond to" | grep -v -E "(carrier)|(degraded)|(dormant)|(no-carrier)|(off)|(routable)"

... INFO networkd_broker::broker: Respond to 'enslaved' event of 'vethbece646'

The result shows that event enslaved can be used for device vethbece646. To use this event, crate directory /etc/networkd/broker.d/enslaved.d and put scripts in it.

=== Example Usage

The script below activate/deactivate https://wiki.archlinux.org/index.php/Chrony[Chrony] correspond to link state of wlp3s0 link. This is useful if your computer is not connected to the internet on startup and use offline option for NTP sources. The script must be put (or symlink) in /etc/networkd/broker.d/routable.d, and /etc/networkd/broker.d/no-carrier.d.

.chrony-switch [source,bash]

#!/usr/bin/env bash

STATE=$1 IFACE=$2 DEV=wlp3s0

if [[ "$IFACE" != "$DEV" ]]; then exit 2 fi

if [[ "$STATE" = "routable" ]]; then chronyc online > /dev/null chronyc burst 4/4 > /dev/null sleep 10 chronyc makestep > /dev/null echo "Activate chrony" exit 0 elif [[ "$STATE" = "no-carrier" ]]; then chronyc offline > /dev/null echo "Deactivate chrony" exit 0 fi

exit 0

./etc/networkd [source,console]

/etc/networkd └── broker.d ├── carrier.d ├── degraded.d ├── dormant.d ├── no-carrier.d │  └── 10-chrony-switch -> /usr/local/bin/chrony-switch ├── off.d └── routable.d └── 10-chrony-switch-nowait -> /usr/local/bin/chrony-switch

./etc/systemd/system/networkd-broker.service.d/override.conf [source,ini]

[Unit] Wants=systemd-networkd.service chronyd.service After=systemd-networkd.service chronyd.service

[Service] ExecStart= ExecStart=/usr/bin/networkd-broker --startup-triggers

== Design

[link=https://raw.githubusercontent.com/bpetlert/networkd-broker/main/docs/assets/networkd-broker.svg?sanitize=true&raw=true] image::https://raw.githubusercontent.com/bpetlert/networkd-broker/main/docs/assets/networkd-broker.svg?sanitize=true&raw=true[Sequence Diagram]

== License

link:./COPYING[GNU General Public License v3.0 or later]

https://github.com/bpetlert/networkd-broker[networkd-broker]: + Copyright (C) 2019 mailto:[email protected][Bhanupong Petchlert]

https://gitlab.com/craftyguy/networkd-dispatcher[networkd-dispatcher]: + Copyright (C) 2018 mailto:[email protected][Clayton Craft]

https://github.com/wavexx/networkd-notify[networkd-notify]: + Copyright (C) 2016 mailto:[email protected][Yuri D'Elia]