Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 12 Jan 2026 08:50:32 +0000
From:      Michael Osipov <michaelo@FreeBSD.org>
To:        ports-committers@FreeBSD.org, dev-commits-ports-all@FreeBSD.org, dev-commits-ports-main@FreeBSD.org
Subject:   git: 935d6bded138 - main - [NEW PORT] dns/register-dnsclient Dynamically register hostnames with a DNS server using GSS-TSIG
Message-ID:  <6964b5d8.cf3b.17a90888@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch main has been updated by michaelo:

URL: https://cgit.FreeBSD.org/ports/commit/?id=935d6bded1381342a77b69f341967928b5299329

commit 935d6bded1381342a77b69f341967928b5299329
Author:     Michael Osipov <michaelo@FreeBSD.org>
AuthorDate: 2026-01-01 21:48:28 +0000
Commit:     Michael Osipov <michaelo@FreeBSD.org>
CommitDate: 2026-01-12 08:49:40 +0000

    [NEW PORT] dns/register-dnsclient Dynamically register hostnames with a DNS server using GSS-TSIG
    
    Differential Revision:  https://reviews.freebsd.org/D54447
---
 dns/Makefile                                       |  1 +
 dns/register-dnsclient/Makefile                    | 35 ++++++++++++
 dns/register-dnsclient/files/crontab.in            |  1 +
 dns/register-dnsclient/files/pkg-install.in        | 21 +++++++
 dns/register-dnsclient/files/register-dnsclient.in | 64 ++++++++++++++++++++++
 .../files/register-dnsclient.nsupdate.sample       |  5 ++
 dns/register-dnsclient/pkg-descr                   |  2 +
 dns/register-dnsclient/pkg-plist                   |  3 +
 8 files changed, 132 insertions(+)

diff --git a/dns/Makefile b/dns/Makefile
index 190723bd4586..afb718d62c0f 100644
--- a/dns/Makefile
+++ b/dns/Makefile
@@ -209,6 +209,7 @@
     SUBDIR += rbllookup
     SUBDIR += rbllookup-ng
     SUBDIR += rdap
+    SUBDIR += register-dnsclient
     SUBDIR += renewck
     SUBDIR += rpsl2acl
     SUBDIR += rubygem-dnsruby
diff --git a/dns/register-dnsclient/Makefile b/dns/register-dnsclient/Makefile
new file mode 100644
index 000000000000..fec4660ba51a
--- /dev/null
+++ b/dns/register-dnsclient/Makefile
@@ -0,0 +1,35 @@
+PORTNAME=		register-dnsclient
+PORTVERSION=	20260101
+CATEGORIES=		dns
+DISTFILES=
+
+MAINTAINER=		michaelo@FreeBSD.org
+COMMENT=		Dynamically register hostnames with a DNS server using GSS-TSIG
+
+LICENSE=	APACHE20
+
+RUN_DEPENDS=		nsupdate:dns/bind-tools
+
+NO_ARCH=		yes
+NO_BUILD=		yes
+
+SUB_FILES=		crontab pkg-install ${PORTNAME}
+SUB_LIST=		PORTNAME=${PORTNAME} GSSAPIBASE=${GSSAPIBASEDIR}
+
+PLIST_SUB=		PORTNAME=${PORTNAME}
+
+OPTIONS_DEFAULT=	GSSAPI_BASE
+OPTIONS_SINGLE=		GSSAPI
+OPTIONS_SINGLE_GSSAPI=	GSSAPI_BASE GSSAPI_HEIMDAL GSSAPI_MIT
+
+GSSAPI_BASE_USES=		gssapi
+GSSAPI_HEIMDAL_USES=	gssapi:heimdal
+GSSAPI_MIT_USES=		gssapi:mit
+
+do-install:
+	@${MKDIR} ${STAGEDIR}${PREFIX}/etc/cron.d
+	${INSTALL_SCRIPT} ${WRKDIR}/${PORTNAME} ${STAGEDIR}${PREFIX}/sbin
+	${INSTALL_DATA} ${FILESDIR}/${PORTNAME}.nsupdate.sample ${STAGEDIR}${PREFIX}/etc
+	${INSTALL_DATA} ${WRKDIR}/crontab ${STAGEDIR}${PREFIX}/etc/cron.d/${PORTNAME}
+
+.include <bsd.port.mk>
diff --git a/dns/register-dnsclient/files/crontab.in b/dns/register-dnsclient/files/crontab.in
new file mode 100644
index 000000000000..410e7f8e30b2
--- /dev/null
+++ b/dns/register-dnsclient/files/crontab.in
@@ -0,0 +1 @@
+@daily					root	%%LOCALBASE%%/sbin/%%PORTNAME%%
diff --git a/dns/register-dnsclient/files/pkg-install.in b/dns/register-dnsclient/files/pkg-install.in
new file mode 100644
index 000000000000..5a7956ec7d1a
--- /dev/null
+++ b/dns/register-dnsclient/files/pkg-install.in
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+PREFIX=${PKG_PREFIX:-%%LOCALBASE%%}
+
+err() {
+    echo "$@" >&2
+    exit 1
+}
+
+case $2 in
+    POST-INSTALL)
+        DOMAIN=$(hostname -d)
+        HOSTNAME=$(hostname -f)
+        PRIMARY_IF=$(route -n get default | awk '/interface:/{print $2}')
+        [ -z "$PRIMARY_IF" ] && err "Could not determine primary interface (no default route)"
+        PRIMARY_IP=$(ifconfig "$PRIMARY_IF" inet | awk '/inet /{print $2; exit}')
+        [ -z "$PRIMARY_IP" ] && err "No IPv4 address found on $PRIMARY_IF"
+        echo "Updating $PREFIX/etc/%%PORTNAME%%.nsupdate with your hostname ($HOSTNAME) and primary IPv4 address ($PRIMARY_IP)"
+        sed -i "" -e "s#%%ZONE%%#$DOMAIN#" -e "s#%%HOSTNAME%%#$HOSTNAME#" -e "s#%%PRIMARY_IP%%#$PRIMARY_IP#" $PREFIX/etc/%%PORTNAME%%.nsupdate
+        ;;
+esac
diff --git a/dns/register-dnsclient/files/register-dnsclient.in b/dns/register-dnsclient/files/register-dnsclient.in
new file mode 100644
index 000000000000..af2674d3aaef
--- /dev/null
+++ b/dns/register-dnsclient/files/register-dnsclient.in
@@ -0,0 +1,64 @@
+#!/bin/sh
+# %%PORTNAME%%
+
+name=$(basename $0)
+
+if [ ! -t 1 ]
+then
+    tmp_output="$(mktemp /tmp/$name.XXXXXXXXXX)"
+    exec 3>&1 4>&2
+    exec > $tmp_output 2>&1
+fi
+
+clean_exit() {
+    local rc=$1
+
+    if [ ! -t 1 ]
+    then
+        exec 1>&3 3>&-
+        exec 2>&4 4>&-
+        if [ $rc -ne 0 ]
+        then
+            [ -s $tmp_output ] && cat $tmp_output
+            cp /dev/null $tmp_output
+            rm -f $tmp_output
+            exit $rc
+        fi
+        cp /dev/null $tmp_output
+        rm -f $tmp_output
+        exit $rc
+    else
+        exit $rc
+    fi
+}
+
+export KRB5CCNAME=/tmp/krb5cc_$name
+KRB5_CLIENT_PRINCIPAL="$(hostname -s)\$"
+
+%%GSSAPIBASE%%/bin/kinit -k $KRB5_CLIENT_PRINCIPAL
+rc=$?
+if [ $rc -ne 0 ]
+then
+    KRB5_CLIENT_PRINCIPAL="$(hostname -s | tr \"[:lower:]\" \"[:upper:]\")\$"
+    >&2 echo "$name: retrying with $KRB5_CLIENT_PRINCIPAL"
+    %%GSSAPIBASE%%/bin/kinit -k $KRB5_CLIENT_PRINCIPAL
+    rc=$?
+    if [ $rc -ne 0 ]
+    then
+        >&2 echo "$name: kinit failed"
+        rc=1
+    fi
+fi
+
+[ $rc -ne 0 ] && clean_exit $rc
+
+%%LOCALBASE%%/bin/nsupdate -g %%LOCALBASE%%/etc/$name.nsupdate
+rc=$?
+if [ $rc -ne 0 ]
+then
+    >&2 echo "$name: nsupdate failed"
+    rc=2
+fi
+
+clean_exit $rc
+
diff --git a/dns/register-dnsclient/files/register-dnsclient.nsupdate.sample b/dns/register-dnsclient/files/register-dnsclient.nsupdate.sample
new file mode 100644
index 000000000000..2ba397ac9f4b
--- /dev/null
+++ b/dns/register-dnsclient/files/register-dnsclient.nsupdate.sample
@@ -0,0 +1,5 @@
+zone %%ZONE%%
+update delete %%HOSTNAME%%. A
+update add %%HOSTNAME%%. 3600 A %%PRIMARY_IP%%
+send
+
diff --git a/dns/register-dnsclient/pkg-descr b/dns/register-dnsclient/pkg-descr
new file mode 100644
index 000000000000..cde890534085
--- /dev/null
+++ b/dns/register-dnsclient/pkg-descr
@@ -0,0 +1,2 @@
+Dynamically register hostnames with a DNS server like Active Directory DNS
+using GSS-TSIG.
diff --git a/dns/register-dnsclient/pkg-plist b/dns/register-dnsclient/pkg-plist
new file mode 100644
index 000000000000..94624321430d
--- /dev/null
+++ b/dns/register-dnsclient/pkg-plist
@@ -0,0 +1,3 @@
+sbin/%%PORTNAME%%
+@sample etc/%%PORTNAME%%.nsupdate.sample
+etc/cron.d/%%PORTNAME%%


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6964b5d8.cf3b.17a90888>