Sun Oct 18 12:41:34 2020 UTC ()
Initial import of tinydyndns-run, a package that creates the config
files, supporting scripts, and NetBSD-style rc.d scripts needed to
run tinydyndns.


(schmonz)
diff -r0 -r1.1 pkgsrc/net/tinydyndns-run/DESCR
diff -r0 -r1.1 pkgsrc/net/tinydyndns-run/Makefile
diff -r0 -r1.1 pkgsrc/net/tinydyndns-run/PLIST
diff -r0 -r1.1 pkgsrc/net/tinydyndns-run/files/README.pkgsrc
diff -r0 -r1.1 pkgsrc/net/tinydyndns-run/files/tinydyn.sh
diff -r0 -r1.1 pkgsrc/net/tinydyndns-run/files/tinydyndns-call-update.sh
diff -r0 -r1.1 pkgsrc/net/tinydyndns-run/files/tinydyndns-make-client.sh
diff -r0 -r1.1 pkgsrc/net/tinydyndns-run/files/tinydyndns-passwd.sh
diff -r0 -r1.1 pkgsrc/net/tinydyndns-run/files/tinydyndns-pop3d.sh
diff -r0 -r1.1 pkgsrc/net/tinydyndns-run/files/tinydyndns-pwhash.py
diff -r0 -r1.1 pkgsrc/net/tinydyndns-run/files/tinydyndns.sh
diff -r0 -r1.1 pkgsrc/net/tinydyndns-run/files/tinydynpop3d.sh

File Added: pkgsrc/net/tinydyndns-run/DESCR
This package creates the config files, supporting scripts, and
NetBSD-style rc.d scripts needed to run tinydyndns.

File Added: pkgsrc/net/tinydyndns-run/Makefile
# $NetBSD: Makefile,v 1.1 2020/10/18 12:41:33 schmonz Exp $
#

DISTNAME=		tinydyndns-run-20201018
CATEGORIES=		net
MASTER_SITES=		# empty
DISTFILES=		# empty

MAINTAINER=		schmonz@NetBSD.org
COMMENT=		Configures tinydyndns to serve and update records
LICENSE=		2-clause-bsd

DEPENDS+=		qmail-[0-9]*:../../mail/qmail
DEPENDS+=		tinydyndns-[0-9]*:../../net/tinydyndns
DEPENDS+=		cvm-[0-9]*:../../security/cvm
DEPENDS+=		daemontools-[0-9]*:../../sysutils/daemontools

WRKSRC=			${WRKDIR}
NO_BUILD=		yes
NO_CHECKSUM=		yes

PKG_SYSCONFSUBDIR=	tinydyn
PKG_SYSCONFDIR_PERMS=	${REAL_ROOT_USER} ${REAL_ROOT_GROUP} 3755

CONF_FILES_MODE=	0600
CONF_FILES+=		${PREFIX}/share/examples/${PKGBASE}/passwd \
			${PKG_SYSCONFDIR}/passwd

PKG_USERS+=		${TINYDYN_USER}:${DJBDNS_DJBDNS_GROUP}
RCD_SCRIPTS=		tinydyn tinydyndns tinydynpop3d
FILES_SUBST+=		TINYDYN_USER=${TINYDYN_USER:Q}
FILES_SUBST+=		DJBDNS_LOG_USER=${DJBDNS_LOG_USER:Q}
FILES_SUBST+=		PKGNAME=${PKGNAME:Q}
FILES_SUBST+=		CUT=${CUT:Q}

BUILD_DEFS+=		TINYDYN_USER DJBDNS_LOG_USER
BUILD_DEFS+=		DJBDNS_DJBDNS_GROUP

SUBST_CLASSES+=		rcd
SUBST_STAGE.rcd=	pre-configure
SUBST_FILES.rcd=	README.pkgsrc
SUBST_VARS.rcd=		PKG_SYSCONFDIR RCD_SCRIPTS_DIR

SUBST_CLASSES+=		scripts
SUBST_STAGE.scripts=	pre-configure
SUBST_FILES.scripts=	tinydyndns-call-update tinydyndns-make-client
SUBST_FILES.scripts+=	tinydyndns-passwd tinydyndns-pop3d
SUBST_VARS.scripts=	SH PKGNAME ECHO PKG_SYSCONFDIR PREFIX HEAD
SUBST_VARS.scripts+=	ID GREP CAT SED MV CHMOD NOLOGIN
SUBST_VARS.scripts+=	TINYDYN_USER

PYTHON_VERSIONS_INCOMPATIBLE=	27
REPLACE_PYTHON=		tinydyndns-pwhash

INSTALLATION_DIRS=	bin share/doc/${PKGBASE} share/examples/${PKGBASE}

post-extract:
	${CP} ${FILESDIR}/README.pkgsrc ${WRKSRC}/
	for f in tinydyndns-call-update tinydyndns-make-client \
		tinydyndns-passwd tinydyndns-pop3d; do \
		${CP} ${FILESDIR}/$$f.sh ${WRKSRC}/$$f; \
	done
	${CP} ${FILESDIR}/tinydyndns-pwhash.py ${WRKSRC}/tinydyndns-pwhash

do-install:
	${INSTALL_DATA} ${WRKSRC}/README.pkgsrc ${DESTDIR}${PREFIX}/share/doc/${PKGBASE}
	for f in tinydyndns-call-update tinydyndns-make-client \
		tinydyndns-passwd tinydyndns-pop3d tinydyndns-pwhash; do \
		${INSTALL_SCRIPT} ${WRKSRC}/$$f ${DESTDIR}${PREFIX}/bin; \
	done
	${TOUCH} ${DESTDIR}${PREFIX}/share/examples/${PKGBASE}/passwd; \
	${CHMOD} 600 ${DESTDIR}${PREFIX}/share/examples/${PKGBASE}/passwd

.include "../../lang/python/application.mk"
.include "../../mk/bsd.pkg.mk"

File Added: pkgsrc/net/tinydyndns-run/PLIST
@comment $NetBSD: PLIST,v 1.1 2020/10/18 12:41:33 schmonz Exp $
bin/tinydyndns-call-update
bin/tinydyndns-make-client
bin/tinydyndns-passwd
bin/tinydyndns-pop3d
bin/tinydyndns-pwhash
share/doc/tinydyndns-run/README.pkgsrc
share/examples/tinydyndns-run/passwd

File Added: pkgsrc/net/tinydyndns-run/files/README.pkgsrc
 Getting started
 ===============

Assuming NetBSD-style rc(8), to enable...

Dynamic-capable authoritative DNS service:
- Choose the domain for dynamic hostnames and the server IP.
- Run "echo your.dyn.domain > @PKG_SYSCONFDIR@/domain".
- Set tinydyndns=YES (and tinydyndns_ip) in /etc/rc.conf.
- Run "@RCD_SCRIPTS_DIR@/tinydyndns start".
- Arrange for the domain to be delegated to your new DNS server.

Dynamic DNS updates via POP3:
- Set tinydynpop3d=YES in /etc/rc.conf.
- Run "@RCD_SCRIPTS_DIR@/tinydynpop3d start".

A new dynamic-DNS hostname:
- Run "tinydyndns-passwd <hostname> <password>".
- Configure a POP3 client with the same username (hostname) and password.

Without a POP3 client:
- Copy the output of "tinydyndns-make-client <hostname>" to the desired system.
- Store the password in the client script (or perhaps a password vault).
- Run the client script from cron, when your IP changes, or as you prefer.


 Getting help
 ============

You've installed an automated and customized tinydyndns-run package.
If you're having trouble getting the tinydyndns daemons to run, ask
the package's maintainer:

<URL:mailto:schmonz-pkgsrc-tinydyndns@schmonz.com>

File Added: pkgsrc/net/tinydyndns-run/files/tinydyn.sh
#!@RCD_SCRIPTS_SHELL@
#
# $NetBSD: tinydyn.sh,v 1.1 2020/10/18 12:41:33 schmonz Exp $
#
# @PKGNAME@ master script for administrators to control tinydyndns
# services.
#

# KEYWORD: nostart

if [ -f /etc/rc.subr ]; then
	. /etc/rc.subr
fi

rcd_dir=`@DIRNAME@ $0`

# NOTE: run_rc_command sets $rc_arg
#
forward_commands() {
	tinydyndnsrcd $COMMAND_LIST
}

reverse_commands() {
	REVCOMMAND_LIST=
	for file in $COMMAND_LIST; do
		REVCOMMAND_LIST="$file $REVCOMMAND_LIST"
	done

	tinydyndnsrcd $REVCOMMAND_LIST
}

tinydyndnsrcd() {
	# Backward compat with NetBSD <1.6:
	[ -z "$rc_arg" ] && rc_arg=$_arg

	for service in "$@"; do
		if [ -f /etc/rc.subr ]; then
			load_rc_config $service
			if checkyesno $service; then
				$rcd_dir/${service} $rc_arg
			fi
		else
			$rcd_dir/${service} $rc_arg
		fi
	done
}

COMMAND_LIST="tinydyndns tinydynpop3d"

name="tinydyndns"
start_cmd="forward_commands"
stop_cmd="reverse_commands"
status_cmd="forward_commands"
extra_commands="status"

if [ -f /etc/rc.subr ]; then
	run_rc_command "$1"
else
	_arg="$1"
	${start_cmd}
fi

File Added: pkgsrc/net/tinydyndns-run/files/tinydyndns-call-update.sh
#!@SH@
#
# $NetBSD: tinydyndns-call-update.sh,v 1.1 2020/10/18 12:41:33 schmonz Exp $
#
# @PKGNAME@ program to update DNS record for POP3 authenticated user

if [ $# -eq 0 ]; then
	@ECHO@ "usage: $0 program" >&2
	exit 1
fi

@ECHO@ "login: ${USER}: ${TCPREMOTEIP}" >&7
cd @PKG_SYSCONFDIR@
@PREFIX@/bin/setlock data.cdb \
	@PREFIX@/bin/tinydyndns-update ${USER}.$(@HEAD@ -1 domain) ${TCPREMOTEIP} >&7 \
	2>&1
exec "$@"

File Added: pkgsrc/net/tinydyndns-run/files/tinydyndns-make-client.sh
#!@SH@

if [ -z "$1" ]; then
	echo "Usage: $0 hostname" >&2
	exit 1
fi

dyn_hostname="$1"
DOMAIN=$(@HEAD@ -1 @PKG_SYSCONFDIR@/domain)

cat <<EOF
#!@SH@

dyn_hostname=${dyn_hostname}
dyn_password=your-password-here

TCPCLIENT=@PREFIX@/bin/tcpclient
DOMAIN=${DOMAIN}
PORT=110

main() {
	\${TCPCLIENT} \${DOMAIN} \${PORT} @SH@ -c "exec 0<&6; exec 1>&7
		echo USER \${dyn_hostname}
		read input
		echo PASS \${dyn_password}
		read input
		echo QUIT
		read input"
}

main "\$@"
exit \$?
EOF

File Added: pkgsrc/net/tinydyndns-run/files/tinydyndns-passwd.sh
#!@SH@

TINYDYN_ETC="@PKG_SYSCONFDIR@"
TINYDYN_DOMAIN=$(@HEAD@ -1 ${TINYDYN_ETC}/domain)
TINYDYN_PASSWD="${TINYDYN_ETC}/passwd"
TINYDYN_PASSWDTMP="${TINYDYN_ETC}/passwd{new}"
TINYDYN_USER=@TINYDYN_USER@
TINYDYN_UID=$(@ID@ -u ${TINYDYN_USER})
TINYDYN_GID=$(@ID@ -g ${TINYDYN_USER})
TINYDYN_SHELL="@NOLOGIN@"

passwd_exists_for() {
	local _hostname
	_hostname=$1
	@GREP@ "^${_hostname}:" ${TINYDYN_PASSWD} >/dev/null 2>/dev/null
}

passwd_hash() {
	local _password
	_password=$1
	echo "$1" | @PREFIX@/bin/tinydyndns-pwhash
}

passwd_add() {
	local _hostname _password
	_hostname=$1
	_password=$2
	_hashed_password=$(passwd_hash "${_password}")
	@CAT@ ${TINYDYN_PASSWD} >${TINYDYN_PASSWDTMP} 2>/dev/null
	echo "${_hostname}:${_hashed_password}:${TINYDYN_UID}:${TINYDYN_GID}::${TINYDYN_ETC}:${TINYDYN_SHELL}" \
		>>${TINYDYN_PASSWDTMP}
}

passwd_update() {
	local _hostname _password
	_hostname=$1
	_password=$2
	_hashed_password=$(passwd_hash "${_password}")
	@SED@ -e \
		"s|^${_hostname}:.*$|${_hostname}:${_hashed_password}:${TINYDYN_UID}:${TINYDYN_GID}::${TINYDYN_ETC}:${TINYDYN_SHELL}|g" \
		${TINYDYN_PASSWD} >${TINYDYN_PASSWDTMP}
}

dyndns_add() {
	local _hostname
	_hostname=$1
	( cd ${TINYDYN_ETC}; @PREFIX@/bin/tinydyndns-data add ${_hostname}.${TINYDYN_DOMAIN} )
}

main() {
	if [ -z "$1" -o -z "$2" ]; then
		echo "Usage: $0 hostname password" >&2
		return 1
	fi

	dyn_hostname=$1
	dyn_password=$2

	if passwd_exists_for "${dyn_hostname}"; then
		passwd_update "${dyn_hostname}" "${dyn_password}"
	else
		passwd_add "${dyn_hostname}" "${dyn_password}"
	fi
	@MV@ -f ${TINYDYN_PASSWDTMP} ${TINYDYN_PASSWD}
	@CHMOD@ 600 ${TINYDYN_PASSWD}

	dyndns_add "${dyn_hostname}"
}

main "$@"
exit $?

File Added: pkgsrc/net/tinydyndns-run/files/tinydyndns-pop3d.sh
#!@SH@

main() {
	echo '+OK '
	read input
	if [ "$input" = 'LIST' ]; then
		echo '+OK'
		echo '.'
	elif [ "$input" = 'STAT' ]; then
		echo '+OK 0 0'
	fi
	read input
	echo '+OK'
	return 0
}

main "$@"
exit $?

File Added: pkgsrc/net/tinydyndns-run/files/tinydyndns-pwhash.py
#!/usr/bin/env python

import crypt, sys

print(crypt.crypt(sys.stdin.read().rstrip()))

File Added: pkgsrc/net/tinydyndns-run/files/tinydyndns.sh
#!@RCD_SCRIPTS_SHELL@

# PROVIDE: tinydyndns named
# REQUIRE: NETWORKING mountcritremote syslogd
# BEFORE:  DAEMON

name="tinydyndns"

# User-settable rc.conf variables and their default values:
: ${tinydyndns_postenv:=""}
: ${tinydyndns_ip:="0.0.0.0"}
: ${tinydyndns_datalimit:="300000"}
: ${tinydyndns_autodata:="YES"}
: ${tinydyndns_autocdb:="YES"}
: ${tinydyndns_log:="YES"}
: ${tinydyndns_logcmd:="logger -t nbtinydyn/dns -p daemon.info"}
: ${tinydyndns_nologcmd:="@PREFIX@/bin/multilog -*"}

tinydyn_data="@PKG_SYSCONFDIR@/data"
tinydyn_domain="@PKG_SYSCONFDIR@/domain"
tinydyn_passwd="@PKG_SYSCONFDIR@/passwd"

if [ -f /etc/rc.subr ]; then
	. /etc/rc.subr
fi

rcvar=${name}
required_files="${tinydyn_domain} ${tinydyn_passwd}"
command="@PREFIX@/bin/tinydns"
procname=nb${name}
start_precmd="tinydyndns_precmd"
extra_commands="rebuild"
rebuild_cmd="tinydyndns_rebuild"

tinydyndns_precmd() {
	if [ -f /etc/rc.subr ] && ! checkyesno tinydyndns_log; then
		tinydyndns_logcmd=${tinydyndns_nologcmd}
	fi
	if [ -f /etc/rc.subr ] && checkyesno tinydyndns_autodata; then
		tinydyndns_needdata && tinydyndns_initdata
	else
		required_files="${tinydyn_data} ${required_files}"
	fi
	if [ -f /etc/rc.subr ] && checkyesno tinydyndns_autocdb; then
		tinydyndns_needcdb && tinydyndns_rebuild
	else
		required_files="${tinydyn_data}.cdb ${required_files}"
	fi
	command="@PREFIX@/bin/pgrphack @SETENV@ - ${tinydyndns_postenv} \
ROOT=@PKG_SYSCONFDIR@ \
IP=${tinydyndns_ip} \
@PREFIX@/bin/envuidgid @TINYDYN_USER@ \
@PREFIX@/bin/softlimit -d ${tinydyndns_datalimit} \
@PREFIX@/bin/argv0 @PREFIX@/bin/tinydns ${procname} \
</dev/null 2>&1 | \
@PREFIX@/bin/pgrphack @PREFIX@/bin/setuidgid @DJBDNS_LOG_USER@ ${tinydyndns_logcmd}"
	command_args="&"
	rc_flags=""
}

tinydyndns_needdata() {
	[ ! -f "${tinydyn_data}" ]
}

tinydyndns_initdata() {
	@ECHO@ "Auto-creating ${tinydyn_data}."
	if [ ${tinydyndns_ip} = "0.0.0.0" ]; then
		@ECHO@ >&2 "ERROR: set tinydyndns_ip in rc.conf"
		exit 1
	fi
	_domain=$(@HEAD@ -1 ${tinydyn_domain})
	if [ -z "${_domain}" ]; then
		@ECHO@ >&2 "ERROR: write the domain to ${tinydyn_domain}"
		exit 2
	fi
	@CAT@ >${tinydyn_data}.tmp <<EOF
.${_domain}:${tinydyndns_ip}:a:259200
+${_domain}:${tinydyndns_ip}:86400
EOF
	@MV@ -f ${tinydyn_data}.tmp ${tinydyn_data}
	@CHOWN@ @TINYDYN_USER@ ${tinydyn_data}
	@CHMOD@ 644 ${tinydyn_data}
}

tinydyndns_needcdb() {
	_src=${tinydyn_data}
	_dst=${tinydyn_data}.cdb
	[ -f "${_src}" -a "${_src}" -nt "${_dst}" ] || [ ! -f "${_dst}" ]
}

tinydyndns_rebuild() {
	@ECHO@ "Rebuilding ${tinydyn_data}.cdb."
	cd @PKG_SYSCONFDIR@ && @PREFIX@/bin/tinydns-data
	_domain=$(@HEAD@ -1 ${tinydyn_domain})
	@CUT@ -d: -f1 < ${tinydyn_passwd} \
		| @SED@ -e "s|\$|.${_domain}|" \
		| @XARGS@ @PREFIX@/bin/tinydyndns-data add
	@CHOWN@ @TINYDYN_USER@ ${tinydyn_data}.cdb
	@CHMOD@ 644 ${tinydyn_data}.cdb
}

if [ -f /etc/rc.subr ]; then
	load_rc_config $name
	run_rc_command "$1"
else
	@ECHO_N@ " ${name}"
	tinydyndns_precmd
	eval ${command} ${tinydyndns_flags} ${command_args}
fi

File Added: pkgsrc/net/tinydyndns-run/files/tinydynpop3d.sh
#!@RCD_SCRIPTS_SHELL@

# PROVIDE: tinydynpop3d named

name="tinydynpop3d"

# User-settable rc.conf variables and their default values:
: ${tinydynpop3d_postenv:="CVM_PWFILE_PWCMP=crypt"}
: ${tinydynpop3d_datalimit:="4000000"}
: ${tinydynpop3d_pretcpserver:=""}
: ${tinydynpop3d_tcpserver:="@PREFIX@/bin/tcpserver"}
: ${tinydynpop3d_tcpflags:="-vRH"}
: ${tinydynpop3d_tcphost:="0.0.0.0"}
: ${tinydynpop3d_tcpport:="110"}
: ${tinydynpop3d_precheckpassword:="@PREFIX@/bin/qmail-popup $(@HEAD@ -1 @PKG_SYSCONFDIR@/domain)"}
: ${tinydynpop3d_checkpassword:="@PREFIX@/bin/cvm-checkpassword @PREFIX@/bin/cvm-pwfile"}
: ${tinydynpop3d_prepop3d:="@PREFIX@/bin/tinydyndns-call-update"}
: ${tinydynpop3d_pop3dcmd:="@PREFIX@/bin/tinydyndns-pop3d"}
: ${tinydynpop3d_postpop3d:=""}
: ${tinydynpop3d_log:="YES"}
: ${tinydynpop3d_logcmd:="logger -t nbtinydyn/pop3d -p mail.info"}
: ${tinydynpop3d_nologcmd:="@PREFIX@/bin/multilog -*"}

tinydyn_cdb="@PKG_SYSCONFDIR@/data.cdb"
tinydyn_domain="@PKG_SYSCONFDIR@/domain"
tinydyn_passwd="@PKG_SYSCONFDIR@/passwd"

if [ -f /etc/rc.subr ]; then
	. /etc/rc.subr
fi

rcvar=${name}
required_files="${tinydyn_cdb} ${tinydyn_domain}"
rcvar=${name}
command="${tinydynpop3d_tcpserver}"
procname=nb${name}
start_precmd="tinydynpop3d_precmd"

tinydynpop3d_precmd() {
	if [ -f /etc/rc.subr ] && ! checkyesno tinydynpop3d_log; then
		tinydynpop3d_logcmd=${tinydynpop3d_nologcmd}
	fi
	# tcpserver(1) is akin to inetd(8), but runs one service per process.
	# We want to signal only the tcpserver process responsible for this
	# service. Use argv0(1) to set procname to "nbtinydynpop3d".
	command="@PREFIX@/bin/pgrphack @SETENV@ - ${tinydynpop3d_postenv} \
CVM_PWFILE_PATH=${tinydyn_passwd} \
@PREFIX@/bin/softlimit -m ${tinydynpop3d_datalimit} ${tinydynpop3d_pretcpserver} \
@PREFIX@/bin/argv0 ${tinydynpop3d_tcpserver} ${procname} \
${tinydynpop3d_tcpflags} \
${tinydynpop3d_tcphost} ${tinydynpop3d_tcpport} \
${tinydynpop3d_precheckpassword} ${tinydynpop3d_checkpassword} \
${tinydynpop3d_prepop3d} ${tinydynpop3d_pop3dcmd} ${tinydynpop3d_postpop3d} \
2>&1 7>&1 | \
@PREFIX@/bin/pgrphack @PREFIX@/bin/setuidgid @DJBDNS_LOG_USER@ ${tinydynpop3d_logcmd}"
	command_args="&"
	rc_flags=""
}

if [ -f /etc/rc.subr ]; then
	load_rc_config $name
	run_rc_command "$1"
else
	@ECHO_N@ " ${name}"
	tinydynpop3d_precmd
	eval ${command} ${tinydynpop3d_flags} ${command_args}
fi