{"id":48412225,"url":"https://github.com/bpetlert/networkd-broker","last_synced_at":"2026-05-22T23:04:50.372Z","repository":{"id":43201443,"uuid":"202208330","full_name":"bpetlert/networkd-broker","owner":"bpetlert","description":"An event broker daemon for systemd-networkd","archived":false,"fork":false,"pushed_at":"2025-12-15T13:43:33.000Z","size":504,"stargazers_count":29,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-12-15T19:21:18.771Z","etag":null,"topics":["arch","arch-linux","dbus","dispatcher","event-broker-daemon","linux","network","networkd-broker","networkd-dispatcher","rust","rust-lang","systemd","systemd-networkd"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bpetlert.png","metadata":{"files":{"readme":"README.adoc","changelog":null,"contributing":null,"funding":null,"license":"COPYING","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2019-08-13T19:07:16.000Z","updated_at":"2025-12-15T13:43:37.000Z","dependencies_parsed_at":"2023-02-01T18:01:29.212Z","dependency_job_id":"09baa4cd-b7c4-40f5-ba7d-1e8293bacbcd","html_url":"https://github.com/bpetlert/networkd-broker","commit_stats":null,"previous_names":[],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/bpetlert/networkd-broker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bpetlert%2Fnetworkd-broker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bpetlert%2Fnetworkd-broker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bpetlert%2Fnetworkd-broker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bpetlert%2Fnetworkd-broker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bpetlert","download_url":"https://codeload.github.com/bpetlert/networkd-broker/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bpetlert%2Fnetworkd-broker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31461588,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-05T21:22:52.476Z","status":"online","status_checked_at":"2026-04-06T02:00:07.287Z","response_time":112,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["arch","arch-linux","dbus","dispatcher","event-broker-daemon","linux","network","networkd-broker","networkd-dispatcher","rust","rust-lang","systemd","systemd-networkd"],"created_at":"2026-04-06T06:08:59.130Z","updated_at":"2026-04-06T06:08:59.181Z","avatar_url":"https://github.com/bpetlert.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"= Networkd-broker\n:toc:\n:toc-placement!:\n:xrefstyle: full\nifndef::env-github[:icons: font]\nifdef::env-github[]\n:status:\n:caution-caption: :fire:\n:important-caption: :exclamation:\n:note-caption: :paperclip:\n:tip-caption: :bulb:\n:warning-caption: :warning:\nendif::[]\n\nimage:https://img.shields.io/github/v/tag/bpetlert/networkd-broker?include_prereleases\u0026label=release\u0026style=flat-square[Release,link=https://github.com/bpetlert/networkd-broker/releases/latest]\nimage:https://img.shields.io/aur/version/networkd-broker?style=flat-square[\"AUR: networkd-broker\",link=https://aur.archlinux.org/packages/networkd-broker/]\nimage:https://img.shields.io/github/license/bpetlert/networkd-broker?style=flat-square[\"License: GPL-3.0-or-later\",link=./COPYING]\n\nThe networkd-broker is an event broker daemon for systemd-networkd.\nIt will execute scripts in the `/etc/networkd/broker.d/\u003cSTATE\u003e.d` directory in alphabetical order in response to network events.\n\ntoc::[]\n\nThis work is based on https://gitlab.com/craftyguy/networkd-dispatcher[networkd-dispatcher], written in Rust, for the purpose of reducing runtime dependencies.\nThis also helps reduce memory footprint (~30MB \u0026longrightarrow;\n~8MB) and improve startup time (~30secs ⟶ ~1sec for spinning hard disk drive).\n\n== Installation\n\n=== Arch Linux\n\nIt is available on AUR as https://aur.archlinux.org/packages/networkd-broker/[networkd-broker].\nTo build and install arch package from GIT source:\n\n[source,console]\n$ git clone https://github.com/bpetlert/networkd-broker.git\n$ cd networkd-broker\n$ makepkg -p PKGBUILD.local\n$ pacman -U networkd-broker-xxxx-1-x86_64.pkg.tar\n\nThen enable/start networkd-broker.service\n\n[source,console]\n$ systemctl enable --now networkd-broker.service\n\n== Configuration\n\nTo change the options of networkd-broker service e.g. enable debug, run `systemctl edit networkd-broker.service`\n\n./etc/systemd/system/networkd-broker.service.d/override.conf\n[source,ini]\n----\n[Service]\nEnvironment='RUST_LOG=networkd_broker=debug'\n----\n\nOr enable `--startup-triggers`.\nStart this service after `systemd-networkd.service` to ensure network devices are already configured or renamed.\n\n./etc/systemd/system/networkd-broker.service.d/override.conf\n[source,ini]\n----\n[Unit]\nWants=systemd-networkd.service\nAfter=systemd-networkd.service\n\n[Service]\nExecStart=\nExecStart=/usr/bin/networkd-broker --startup-triggers\n----\n\n== Usage\n\nThe scripts for any network event need to be putted (or symlink) in its corresponding directory as shown below.\nEach script must be a regular executable file owned by root.\nThe default execution timeout of each script is 20 seconds.\nIt can be overridden by `--timeout` option in service configuration.\nAny of the scripts which has filename (exclude extension) end with '-nowait' is run immediately, without waitting for the termination of previous scripts.\ne.g. `script-nowait`, `script-nowait.sh`\n\n.Directories of Commonly Used Network Events\n[source,console]\n----\n/etc/networkd\n└── broker.d\n    ├── carrier.d\n    ├── degraded.d\n    ├── dormant.d\n    ├── no-carrier.d\n    ├── off.d\n    └── routable.d\n----\n\nThe scripts are run in alphabetical order, one at a time with two arguments and a set of environment variables being passed.\nEach script run asynchronously from `networkd-broker` process.\n\n[[table-script-arguments]]\n.Script's Arguments\n|===\n| Argument | Description\n\n| `STATE`\n| Current link status is one of the following: `carrier`, `degraded`, `dormant`, `no-carrier`, `off`, `routable`;\nsee `man networkctl` for more details.\n\n| `IFACE`\n| Link name that operation just happened on\n|===\n\nThe following environment variables are being passed to each script:\n\n.Script's Environment Variables\n|===\n| Environment Variable | Description\n\n| `NWD_DEVICE_IFACE`\n| Link name that operation just happened on, same value as `IFACE`\n\n| `NWD_BROKER_ACTION`\n| Current link status, same value as `STATE`\n\n| `NWD_JSON`\n| All the link details are encoded in JSON format.\n|===\n\n[TIP]\n.Add Uncommonly Used Network Events\n====\nThere are link's `STATE` which are not list in \u003c\u003ctable-script-arguments\u003e\u003e.\nTo find out which link state that can be added, using the following command:\n[source,console]\n----\n$ journalctl -u networkd-broker.service | grep \"Respond to\" | grep -v -E \"(carrier)|(degraded)|(dormant)|(no-carrier)|(off)|(routable)\"\n\n...  INFO networkd_broker::broker: Respond to 'enslaved' event of 'vethbece646'\n----\n\nThe result shows that event `enslaved` can be used for device `vethbece646`.\nTo use this event, crate directory `/etc/networkd/broker.d/enslaved.d` and put scripts in it.\n====\n\n=== Example Usage\n\nThe script below activate/deactivate https://wiki.archlinux.org/index.php/Chrony[Chrony] correspond to link state of `wlp3s0` link.\nThis is useful if your computer is not connected to the internet on startup and use `offline` option for NTP sources.\nThe script must be put (or symlink) in `/etc/networkd/broker.d/routable.d`, and `/etc/networkd/broker.d/no-carrier.d`.\n\n.chrony-switch\n[source,bash]\n----\n#!/usr/bin/env bash\n\nSTATE=$1\nIFACE=$2\nDEV=wlp3s0\n\nif [[ \"$IFACE\" != \"$DEV\" ]]; then\n  exit 2\nfi\n\nif [[ \"$STATE\" = \"routable\" ]]; then\n  chronyc online \u003e /dev/null\n  chronyc burst 4/4 \u003e /dev/null\n  sleep 10\n  chronyc makestep \u003e /dev/null\n  echo \"Activate chrony\"\n  exit 0\nelif [[ \"$STATE\" = \"no-carrier\" ]]; then\n  chronyc offline \u003e /dev/null\n  echo \"Deactivate chrony\"\n  exit 0\nfi\n\nexit 0\n----\n\n./etc/networkd\n[source,console]\n----\n/etc/networkd\n└── broker.d\n    ├── carrier.d\n    ├── degraded.d\n    ├── dormant.d\n    ├── no-carrier.d\n    │   └── 10-chrony-switch -\u003e /usr/local/bin/chrony-switch\n    ├── off.d\n    └── routable.d\n        └── 10-chrony-switch-nowait -\u003e /usr/local/bin/chrony-switch\n----\n\n./etc/systemd/system/networkd-broker.service.d/override.conf\n[source,ini]\n----\n[Unit]\nWants=systemd-networkd.service chronyd.service\nAfter=systemd-networkd.service chronyd.service\n\n[Service]\nExecStart=\nExecStart=/usr/bin/networkd-broker --startup-triggers\n----\n\n== Design\n\n[link=https://raw.githubusercontent.com/bpetlert/networkd-broker/main/docs/assets/networkd-broker.svg?sanitize=true\u0026raw=true]\nimage::https://raw.githubusercontent.com/bpetlert/networkd-broker/main/docs/assets/networkd-broker.svg?sanitize=true\u0026raw=true[Sequence Diagram]\n\n== License\n\n*link:./COPYING[GNU General Public License v3.0 or later]*\n\nhttps://github.com/bpetlert/networkd-broker[networkd-broker]: +\nCopyright (C) 2019 mailto:bpetlert@gmail.com[Bhanupong Petchlert]\n\nhttps://gitlab.com/craftyguy/networkd-dispatcher[networkd-dispatcher]: +\nCopyright (C) 2018 mailto:clayton@craftyguy.net[Clayton Craft]\n\nhttps://github.com/wavexx/networkd-notify[networkd-notify]: +\nCopyright (C) 2016 mailto:wavexx@thregr.org[Yuri D'Elia]\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbpetlert%2Fnetworkd-broker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbpetlert%2Fnetworkd-broker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbpetlert%2Fnetworkd-broker/lists"}