summaryrefslogtreecommitdiff
path: root/bin/cryptonomic-dyndns-command
blob: 8e97de7ef83dab309647a7f46b90f923b2a121af (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#!/bin/bash

die() { printf '%s\n' "$*" >&2; exit 1; }

sql_string()
{
	printf '%s' "'${1//\'/\'\'}'"
}

powerdns_sqlite_add_replace_record()
{
	local fqdn="$1"
	local record_type="$(sql_string "$2")"
	local sql_ip_address="$(sql_string "$3")"

	fqdn=${fqdn: -64 : 64}
	local sql_new_domain="$(sql_string "$fqdn")"
	local sql_domain="$(sql_string "${fqdn#*.}")"

	DBDIR=/etc/powerdns
	DBNAME=powerdns.sqlite3
	DB=$DBDIR/$DBNAME

	test -r $DB    && test -w $DB    || die "Wrong permissions on $DB"
	test -r $DBDIR && test -w $DBDIR || die "Wrong permissions on $DBDIR"

	sqlite3 $DB <<END
${SQL_ECHO:+.echo on}
BEGIN;
	DELETE FROM records WHERE type=$record_type AND name=$sql_new_domain;

	INSERT INTO records

		(domain_id,
		name,
		type,
		content,
		ttl,
		prio)

		SELECT
			id,
			$sql_new_domain,
			$record_type,
			$sql_ip_address,
			3600,
			0
		FROM domains
		WHERE name=$sql_domain;
COMMIT;
END
	r=$?
	[ $r = 0 ] || return $r

	printf '%s %s\n' "$fqdn" "$3"
}

add()
{
	local record_type ip="$2"
	case "$ip" in
		*.*.*.*) record_type=A ;;
		*:*) record_type=AAAA ;;
		*) exit 1 ;;
	esac

	powerdns_sqlite_add_replace_record "$domain" "$record_type" "$ip"
}

main()
{
	add "$domain" "$ip_address"

	set -- $SSH_ORIGINAL_COMMAND
	while [ $# -ge 1 ]; do
		d=$1
		shift

		case "$d" in
			*.*) continue;;
		esac

		add "$d.$domain" "$ip_address"
	done
}

PEM_DEST=$HOME/public_rsync

eval "$(samizdat-ssh-uid --copy-pem "$PEM_DEST")"

domain=${SSH_CLIENT_DOMAIN}
ip_address=${SSH_CLIENT%% *}

main "$@"