diff options
| author | Michael Osipov <michaelo@FreeBSD.org> | 2026-01-01 21:48:28 +0000 |
|---|---|---|
| committer | Michael Osipov <michaelo@FreeBSD.org> | 2026-01-12 08:49:40 +0000 |
| commit | 935d6bded1381342a77b69f341967928b5299329 (patch) | |
| tree | 8e9d7d88a65f5efd3054810ee1e8669a73eb2cd8 /dns/register-dnsclient | |
| parent | 4ac834f54961e497827a80eed756cc5cfdadd8d3 (diff) | |
Diffstat (limited to 'dns/register-dnsclient')
| -rw-r--r-- | dns/register-dnsclient/Makefile | 35 | ||||
| -rw-r--r-- | dns/register-dnsclient/files/crontab.in | 1 | ||||
| -rw-r--r-- | dns/register-dnsclient/files/pkg-install.in | 21 | ||||
| -rw-r--r-- | dns/register-dnsclient/files/register-dnsclient.in | 64 | ||||
| -rw-r--r-- | dns/register-dnsclient/files/register-dnsclient.nsupdate.sample | 5 | ||||
| -rw-r--r-- | dns/register-dnsclient/pkg-descr | 2 | ||||
| -rw-r--r-- | dns/register-dnsclient/pkg-plist | 3 |
7 files changed, 131 insertions, 0 deletions
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%% |
