From 91608086305b72baad3916e813a15c480d398d13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Daniel=20Colmenares=20Oviedo?= Date: Fri, 24 Oct 2025 03:21:29 -0400 Subject: [PATCH] filesystems/nbd-client-kmod: Add rc script * Rename ${FILESDIR}/gnbd.in -> ${FILESDIR}/gnbd-bin.in --- filesystems/nbd-client-kmod/Makefile | 6 +- filesystems/nbd-client-kmod/files/gnbd-bin.in | 3 + filesystems/nbd-client-kmod/files/gnbd.in | 173 +++++++++++++++++- 3 files changed, 179 insertions(+), 3 deletions(-) create mode 100644 filesystems/nbd-client-kmod/files/gnbd-bin.in mode change 100644 => 100755 filesystems/nbd-client-kmod/files/gnbd.in diff --git a/filesystems/nbd-client-kmod/Makefile b/filesystems/nbd-client-kmod/Makefile index aa93420df2c6..83fd639561fa 100644 --- a/filesystems/nbd-client-kmod/Makefile +++ b/filesystems/nbd-client-kmod/Makefile @@ -1,5 +1,6 @@ PORTNAME= nbd-client DISTVERSION= g20251023 +PORTREVISION= 1 CATEGORIES= filesystems PKGNAMESUFFIX= -kmod @@ -19,17 +20,18 @@ USE_GITHUB= yes GH_ACCOUNT= ryan-moeller GH_PROJECT= kernel-nbd-client GH_TAGNAME= e5ab6371101c35a0b96e3459adca5beff2983e94 +USE_RC_SUBR= gnbd MAKE_ENV= GEOM_CLASS_DIR="${PREFIX}/lib/geom" \ MANDIR="${PREFIX}/share/man/man" -SUB_FILES= gnbd +SUB_FILES= gnbd-bin pre-install: @${MKDIR} ${STAGEDIR}${PREFIX}/lib/geom post-install: - ${INSTALL_SCRIPT} ${WRKDIR}/gnbd ${STAGEDIR}${PREFIX}/sbin/gnbd + ${INSTALL_SCRIPT} ${WRKDIR}/gnbd-bin ${STAGEDIR}${PREFIX}/sbin/gnbd ${INSTALL_DATA} ${WRKSRC}/devd.conf.sample ${STAGEDIR}${PREFIX}/etc/devd/${PORTNAME}.conf.sample .include diff --git a/filesystems/nbd-client-kmod/files/gnbd-bin.in b/filesystems/nbd-client-kmod/files/gnbd-bin.in new file mode 100644 index 000000000000..94d021b26b05 --- /dev/null +++ b/filesystems/nbd-client-kmod/files/gnbd-bin.in @@ -0,0 +1,3 @@ +#!/bin/sh + +exec env GEOM_LIBRARY_PATH="%%LOCALBASE%%/lib/geom" /sbin/geom nbd "$@" diff --git a/filesystems/nbd-client-kmod/files/gnbd.in b/filesystems/nbd-client-kmod/files/gnbd.in old mode 100644 new mode 100755 index 94d021b26b05..bf54610c7437 --- a/filesystems/nbd-client-kmod/files/gnbd.in +++ b/filesystems/nbd-client-kmod/files/gnbd.in @@ -1,3 +1,174 @@ #!/bin/sh -exec env GEOM_LIBRARY_PATH="%%LOCALBASE%%/lib/geom" /sbin/geom nbd "$@" +# PROVIDE: gnbd +# REQUIRE: NETWORKING +# +# Configuration settings for gnbd in /etc/rc.conf: +# +# gnbd_enable (bool): Enable gnbd. (default=NO) +# gnbd_devices (list): List of devices. +# gnbd__host (str): Required. Host to connect to. +# gnbd__conns (int): Use this many parallel connections. +# gnbd__port (int): Port to connect to. +# gnbd__exportname (str): Connect to the named export. +# gnbd__cacert (str): Verify TLS connections against the PEM-formatted +# CA certificate at the given path. +# gnbd__cert (str): Make a TLS connection using the PEM-formatted +# client certificate at the given path. +# gnbd__key (str): Make a TLS connection using the PEM-formatted +# client key at the given path. +# gnbd__waitsec (int): Retry until connections are re-established, waiting +# this many seconds between successive retries. +# +# Commands for gnbd: +# +# start: Connect to . +# stop: Disconnect from . +# restart: Reconnect to . +# Tip: Use the devd.conf(5) file included with this port. +# status: Get status of each . +# +# Examples: +# +# service gnbd start - Connect to all devices. +# service gnbd stop - Disconnect from all devices. +# service gnbd start - Connect to a specific device. + +. /etc/rc.subr + +name="gnbd" +desc="NBD client for FreeBSD GEOM framework" +rcvar="${name}_enable" +start_precmd="gnbd_prestart" +start_cmd="gnbd_start" +stop_cmd="gnbd_stop" +restart_cmd="gnbd_restart" +status_cmd="gnbd_status" +gnbd_bin="%%PREFIX%%/sbin/${name}" + +load_rc_config $name + +: ${gnbd_enable:="NO"} + +gnbd_prestart() +{ + ${gnbd_bin} load +} + +gnbd_start() +{ + local device="$1" + + local host conns port exportname cacert cert key + local var + + for var in host conns port exportname cacert cert key; do + eval ${var}="\${gnbd_${device}_${var}}" + + local value + + eval value="\$${var}" + + if [ -n "${value}" ]; then + debug "${var}=${value}" + fi + done + + if [ -z "${host}" ]; then + echo "gnbd_${device}_host: host is not configured, ignoring this device..." + return 1 + fi + + local gnbd_args= + + if [ -n "${conns}" ]; then + gnbd_args="-c ${conns}" + fi + + if [ -n "${port}" ]; then + gnbd_args="${gnbd_args} -p ${port}" + fi + + if [ -n "${exportname}" ]; then + gnbd_args="${gnbd_args} -n \"${exportname}\"" + fi + + if [ -n "${cacert}" ]; then + gnbd_args="${gnbd_args} -A \"${cacert}\"" + fi + + if [ -n "${cert}" ]; then + gnbd_args="${gnbd_args} -C \"${cert}\"" + fi + + if [ -n "${key}" ]; then + gnbd_args="${gnbd_args} -K \"${key}\"" + fi + + if [ -n "${gnbd_args}" ]; then + debug "gnbd args: ${gnbd_args}" + fi + + if [ ! -c "/dev/${device}" ]; then + eval ${gnbd_bin} connect ${gnbd_args} ${host} + fi +} + +gnbd_stop() +{ + local device="$1" + + if [ -c "/dev/${device}" ]; then + ${gnbd_bin} disconnect ${device} + fi +} + +gnbd_restart() +{ + local device="$1" + + local waitsec + + eval waitsec="\${gnbd_${device}_waitsec}" + + local gnbd_args= + + if [ -n "${waitsec}" ]; then + gnbd_args="-r ${waitsec}" + + debug "waitsec=${waitsec}" + fi + + if [ -n "${gnbd_args}" ]; then + debug "gnbd args: ${gnbd_args}" + fi + + eval ${gnbd_bin} reconnect ${gnbd_args} ${device} +} + +gnbd_status() +{ + local device="$1" + + if [ -c "/dev/${device}" ]; then + ${gnbd_bin} status -s "${device}" + fi +} + +cmd="$1" + +if [ $# -gt 0 ]; then + shift +fi + +if [ -n "$1" ]; then + gnbd_devices="$1" +fi + +if [ -z "${gnbd_devices}" ]; then + warn "No devices are configured, configure one to make this rc script useful!" +fi + +for device in ${gnbd_devices}; do + run_rc_command "${cmd}" "${device}" +done