Autonomous OBS packaging pipeline for network diagnostic and benchmarking tools not commonly packaged by Linux distributions. Packages are built and published automatically when upstream releases a new version — install them with your native package manager (zypper, apt, dnf).
- Packages
- Supported Distributions
- Installation
- How Auto-Update Works
- Maintainer Guide
- Repository Structure
| Package | Description | Upstream |
|---|---|---|
| nic-xray | Ethernet physical connectivity diagnostic tool | ciroiriarte/nic-xray |
| switch-xray | Switch port diagnostics and documentation via SNMP | ciroiriarte/switch-xray |
| ttl | Traceroute/mtr-style TUI (requires Rust >= 1.88) | lance0/ttl |
| xfr | Network bandwidth testing TUI (requires Rust >= 1.88) | lance0/xfr |
| Distribution | Repository Alias | Arch | nic-xray | switch-xray | ttl | xfr |
|---|---|---|---|---|---|---|
| openSUSE Tumbleweed | openSUSE_Tumbleweed |
x86_64, aarch64 | ✓ | ✓ | ✓ | ✓ |
| openSUSE Slowroll | openSUSE_Slowroll |
x86_64 | ✓ | ✓ | ✓ | ✓ |
| openSUSE Leap 16.0 | openSUSE_Leap_16.0 |
x86_64, aarch64 | ✓ | ✓ | ✓ | ✓ |
| openSUSE Leap 15.6 | openSUSE_Leap_15.6 |
x86_64, aarch64 | ✓ | ✓ | — | — |
| Rocky Linux 9 | Rocky_9 |
x86_64, aarch64 | ✓ | ✓ | ✓ | ✓ |
| Rocky Linux 10 | Rocky_10 |
x86_64, aarch64 | ✓ | ✓ | ✓ | ✓ |
| Ubuntu 22.04 LTS | Ubuntu_22.04 |
x86_64, aarch64 | ✓ | ✓ | — | — |
| Ubuntu 24.04 LTS | Ubuntu_24.04 |
x86_64, aarch64 | ✓ | ✓ | — | — |
Note:
ttlandxfrrequire Rust >= 1.88, which is not yet available in Leap 15.6 or Ubuntu repos. Builds will automatically succeed once a compatible Rust version ships.
zypper addrepo https://download.opensuse.org/repositories/home:/ciriarte:/network-tools/openSUSE_Tumbleweed/ obs-network-tools
zypper refresh
zypper install nic-xray switch-xray ttl xfrReplace openSUSE_Tumbleweed with your repository alias.
echo "deb https://download.opensuse.org/repositories/home:/ciriarte:/network-tools/Ubuntu_24.04/ ./" \
| sudo tee /etc/apt/sources.list.d/obs-network-tools.list
curl -fsSL "https://download.opensuse.org/repositories/home:/ciriarte:/network-tools/Ubuntu_24.04/Release.key" \
| sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/obs-network-tools.gpg
sudo apt update
sudo apt install nic-xray switch-xrayReplace Ubuntu_24.04 with Ubuntu_22.04 for Ubuntu 22.04 LTS.
dnf config-manager --add-repo \
https://download.opensuse.org/repositories/home:/ciriarte:/network-tools/Rocky_9/home:ciriarte:network-tools.repo
dnf install nic-xray switch-xray ttl xfrReplace Rocky_9 with Rocky_10 for Rocky Linux 10.
Note:
nic-xraydepends onlldpd, available via EPEL:dnf install epel-release
All three packages are fully autonomous — when upstream pushes a new tag, the pipeline picks it up within 24 hours with no manual steps.
The GitHub Actions workflows (nic-xray, switch-xray) run daily and:
- Query the GitHub API for the latest release tag on the upstream repo.
- Compare with the current version in the package
.changesfile. - If changed: update
_service, changelogs, commit to this repo, and push to OBS.
OBS then runs its source services (tar_scm + set_version + recompress) to fetch, package, and build.
Rust packages require pre-committed source and vendor tarballs because OBS build workers have no internet access. The GitHub Actions workflows (ttl, xfr) run daily and:
- Query the GitHub API for the latest tag on lance0/ttl or lance0/xfr.
- If changed: install Rust, clone at the new tag, run
cargo vendor. - Build the source tarball and vendor archive (
vendor.tar.zst). - Update spec, changelogs, commit to this repo, and push to OBS.
Prerequisites
Install and configure the osc CLI client:
# openSUSE
zypper install osc
# Ubuntu/Debian
apt install osc
# Configure credentials
osc config https://api.opensuse.org
# Enter your OBS username and password when promptedRequired GitHub secrets
Add these secrets to the repository (Settings > Secrets > Actions):
| Secret | Value |
|---|---|
OBS_PASSWORD |
OBS account password for ciriarte |
OBS project setup (one-time)
Create the OBS project and configure repositories:
osc meta prj -e home:ciriarte:network-toolsUse the following project metadata XML:
<project name="home:ciriarte:network-tools">
<title>Network Tools</title>
<description>Packaging pipeline for network diagnostic and benchmarking tools</description>
<person userid="ciriarte" role="maintainer"/>
<repository name="openSUSE_Tumbleweed">
<path project="openSUSE:Factory" repository="snapshot"/>
<arch>x86_64</arch>
<arch>aarch64</arch>
</repository>
<repository name="openSUSE_Slowroll">
<path project="openSUSE:Slowroll" repository="standard"/>
<arch>x86_64</arch>
<!-- aarch64 omitted: openSUSE:Slowroll has no aarch64 path in OBS -->
</repository>
<repository name="openSUSE_Leap_16.0">
<!-- devel:languages:rust provides Rust >= 1.88 for ttl and xfr -->
<path project="devel:languages:rust" repository="16.0"/>
<path project="openSUSE:Leap:16.0" repository="standard"/>
<arch>x86_64</arch>
<arch>aarch64</arch>
</repository>
<repository name="openSUSE_Leap_15.6">
<path project="devel:languages:rust" repository="15.6"/>
<path project="openSUSE:Leap:15.6" repository="standard"/>
<arch>x86_64</arch>
<arch>aarch64</arch>
</repository>
<repository name="Rocky_9">
<path project="RockyLinux:9" repository="standard"/>
<arch>x86_64</arch>
<arch>aarch64</arch>
</repository>
<repository name="Rocky_10">
<path project="RockyLinux:10" repository="standard"/>
<arch>x86_64</arch>
<arch>aarch64</arch>
</repository>
<repository name="Ubuntu_22.04">
<path project="Ubuntu:22.04" repository="standard"/>
<arch>x86_64</arch>
<arch>aarch64</arch>
</repository>
<repository name="Ubuntu_24.04">
<path project="Ubuntu:24.04" repository="standard"/>
<arch>x86_64</arch>
<arch>aarch64</arch>
</repository>
</project>Deploying package changes to OBS
First-time setup (any package):
osc co home:ciriarte:network-tools
mkdir -p home:ciriarte:network-tools/<package>
cp packages/<package>/* home:ciriarte:network-tools/<package>/
cd home:ciriarte:network-tools/<package>
osc add *
osc commit -m "Initial package"Updating an existing package:
cd home:ciriarte:network-tools/<package>
osc up
cp /path/to/obs-network-tools/packages/<package>/* .
osc commit -m "Update to version X.Y"Manual version updates
Version updates are normally handled automatically by GitHub Actions. To trigger an update immediately, run the workflow manually from the Actions tab.
nic-xray (local alternative):
./scripts/update-nic-xray-version.sh --pushttl / xfr (fully manual, e.g. without GitHub Actions):
# Example: updating ttl to v0.20.0
git clone --branch v0.20.0 https://github.com/lance0/ttl ttl-src
cd ttl-src && cargo vendor
mkdir -p .cargo
printf '[source.crates-io]\nreplace-with = "vendored-sources"\n\n[source.vendored-sources]\ndirectory = "vendor"\n' \
> .cargo/config.toml
cd ..
tar -czf ttl-0.20.0.tar.gz --exclude='.git' --exclude='vendor' \
--transform='s|^ttl-src|ttl-0.20.0|' ttl-src/
tar -I "zstd" -cf vendor.tar.zst -C ttl-src .cargo/config.toml vendor/
cp ttl-0.20.0.tar.gz vendor.tar.zst packages/ttl/
# Then update ttl.spec (Version, %changelog), ttl.dsc, ttl.changes, debian.changelog
# and commit to git + OBSThe same pattern applies to xfr (substitute xfr and github.com/lance0/xfr).
Verification
After pushing to OBS, verify the builds:
# Check build results
osc results home:ciriarte:network-tools nic-xray
osc results home:ciriarte:network-tools switch-xray
osc results home:ciriarte:network-tools ttl
osc results home:ciriarte:network-tools xfr
# Watch live build log (example: Tumbleweed x86_64)
osc buildlog home:ciriarte:network-tools nic-xray openSUSE_Tumbleweed x86_64On each installed system:
# RPM (openSUSE / Rocky Linux)
rpm -qi nic-xray
# Deb (Ubuntu)
dpkg -s nic-xray
# Functional tests
sudo nic-xray
sudo switch-xray --help
ttl --help
xfr --helpClick to expand
obs-network-tools/
├── CLAUDE.md # Project instructions for Claude Code
├── README.md # This file
├── .github/workflows/
│ ├── update-nic-xray.yml # Daily: detect new tag, update changelogs, push to OBS
│ ├── update-switch-xray.yml # Daily: detect new tag, update changelogs, push to OBS
│ ├── update-ttl.yml # Daily: detect new tag, vendor deps, rebuild tarballs, push to OBS
│ └── update-xfr.yml # Daily: detect new tag, vendor deps, rebuild tarballs, push to OBS
├── scripts/
│ └── update-nic-xray-version.sh # Manual alternative to the nic-xray workflow above
└── packages/
├── nic-xray/
│ ├── _service # tar_scm: fetch pinned tag from github.com/ciroiriarte/nic-xray
│ ├── nic-xray.spec # RPM spec (openSUSE + Rocky Linux)
│ ├── nic-xray.changes # openSUSE changelog
│ ├── nic-xray.dsc # Debian source package descriptor
│ ├── debian.control # Debian/Ubuntu package metadata
│ ├── debian.changelog # Debian/Ubuntu changelog
│ └── debian.rules # Debian build rules
├── switch-xray/
│ ├── _service # tar_scm: fetch pinned tag from github.com/ciroiriarte/switch-xray
│ ├── switch-xray.spec # RPM spec (openSUSE + Rocky Linux)
│ ├── switch-xray.changes # openSUSE changelog
│ ├── switch-xray.dsc # Debian source package descriptor
│ ├── debian.control # Debian/Ubuntu package metadata
│ ├── debian.changelog # Debian/Ubuntu changelog
│ └── debian.rules # Debian build rules
├── ttl/
│ ├── _service # cargo_vendor (manual mode, documents vendoring requirement)
│ ├── ttl-0.19.0.tar.gz # Source tarball (committed)
│ ├── vendor.tar.zst # Vendored Rust dependencies (includes .cargo/config.toml)
│ ├── ttl.spec # RPM spec (openSUSE + Rocky Linux)
│ ├── ttl.changes # openSUSE changelog
│ ├── ttl.dsc # Debian source package descriptor
│ ├── debian.control # Debian/Ubuntu package metadata
│ ├── debian.changelog # Debian/Ubuntu changelog
│ ├── debian.rules # Debian build rules
│ └── debian.postinst # Post-install: setcap cap_net_raw+ep
└── xfr/
├── _service # cargo_vendor (manual mode, documents vendoring requirement)
├── xfr-0.8.0.tar.gz # Source tarball (committed)
├── vendor.tar.zst # Vendored Rust dependencies (includes .cargo/config.toml)
├── xfr.spec # RPM spec (openSUSE + Rocky Linux)
├── xfr.changes # openSUSE changelog
├── xfr.dsc # Debian source package descriptor
├── debian.control # Debian/Ubuntu package metadata
├── debian.changelog # Debian/Ubuntu changelog
└── debian.rules # Debian build rules
This packaging pipeline is maintained by Ciro Iriarte. The packaged software is distributed under its respective upstream licenses.