Release / tsunagi-linux-aarch64 (push) Successful in 2m39s
Release / tsunagi-linux-x86_64 (push) Successful in 2m32s
Release / tsunagi-macos-aarch64 (push) Canceled after 0s
Release / tsunagi-windows-x86_64 (push) Canceled after 0s
Release / Publish release (push) Canceled after 0s
Reworks the Linux packaging so the service runs as an unprivileged, dedicated "tsunagi" user instead of root — the point of a native package is to set things up properly for that OS's users — and adds Arch Linux packages beside the deb. Both package families are built from the already-compiled static binary; nothing is recompiled. Service model (shared systemd unit, dist/linux/tsunagi.service): - User=tsunagi with AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE, so it creates the TUN and binds low ports without root. - StateDirectory/CacheDirectory/RuntimeDirectory give it /var/lib/tsunagi, /var/cache/tsunagi and /run/tsunagi, and the agent is pointed at them (and the socket at /run/tsunagi/agent.sock) through TSUNAGI_* env in the unit. - The polkit rule now grants the resolve1 actions to the "tsunagi" group; the service user is in it, and admins can add themselves. CLI: when no state dir is chosen, the control commands prefer the system service's socket at /run/tsunagi/agent.sock when it exists, so `sudo tsunagi status`/`join` reach the packaged daemon with no flags. A per-user agent (its socket absent from /run) still uses its own. Packaging: - deb (build-deb.sh): postinst now creates the tsunagi system user+group; unit installed to /lib/systemd/system, binary to /usr/bin. - Arch (new dist/arch/build-pkg.sh): a dependency-free .pkg.tar.zst assembled with bsdtar + zstd (no makepkg, no Arch host) — .PKGINFO, a .INSTALL scriptlet that creates the user and reloads systemd, and a gzipped .MTREE; unit to /usr/lib/systemd/system. - The polkit rule moved to dist/linux (shared by deb, Arch and the tarball), and the tarball install.sh now creates the user and installs the unit + rule. - Both release workflows build the deb and the Arch package on the two Linux matrix entries (deb_arch/pkg_arch), install libarchive-tools+zstd for it, and attach both to the release (Gitea API loop / gh). Not exercised in this session: the .deb and .pkg.tar.zst build and install only on Linux (no dpkg-deb/bsdtar+pacman locally); CLI build, clippy, fmt and tests pass, and all shell/YAML is syntax-checked. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
37 lines
1.2 KiB
Desktop File
37 lines
1.2 KiB
Desktop File
[Unit]
|
|
Description=tsunagi mesh agent
|
|
Documentation=https://github.com/Ultradesu/tsunagi
|
|
After=network-online.target
|
|
Wants=network-online.target
|
|
|
|
[Service]
|
|
Type=simple
|
|
# Runs as a dedicated unprivileged user, not root. The two capabilities are all
|
|
# it needs: CAP_NET_ADMIN to create and configure the TUN interface, and
|
|
# CAP_NET_BIND_SERVICE for low ports. The packages create the `tsunagi` user.
|
|
User=tsunagi
|
|
Group=tsunagi
|
|
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
|
|
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
|
|
|
|
# systemd creates and owns these for the service user, and the agent is pointed
|
|
# at them: state in /var/lib/tsunagi, cache in /var/cache/tsunagi, and the
|
|
# control socket in /run/tsunagi, which stays private to the service user.
|
|
StateDirectory=tsunagi
|
|
StateDirectoryMode=0700
|
|
CacheDirectory=tsunagi
|
|
RuntimeDirectory=tsunagi
|
|
RuntimeDirectoryMode=0755
|
|
Environment=TSUNAGI_STATE_DIR=%S/tsunagi
|
|
Environment=TSUNAGI_CACHE_DIR=%C/tsunagi
|
|
Environment=TSUNAGI_CONTROL_SOCKET=%t/tsunagi/agent.sock
|
|
|
|
# The tarball installer puts the binary here; the deb and the Arch package
|
|
# rewrite this to /usr/bin where they install it.
|
|
ExecStart=/usr/local/bin/tsunagi up
|
|
Restart=on-failure
|
|
RestartSec=5
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|