2
0
mirror of https://github.com/dnscrypt/dnscrypt-server-docker synced 2024-11-17 15:25:33 +00:00
dnscrypt-server-docker/entrypoint.sh

261 lines
8.6 KiB
Bash
Raw Normal View History

#! /usr/bin/env bash
2015-07-05 23:39:54 +00:00
set -e
action="$1"
LEGACY_KEYS_DIR="/opt/dnscrypt-wrapper/etc/keys"
2019-09-25 14:10:09 +00:00
LEGACY_LISTS_DIR="/opt/dnscrypt-wrapper/etc/lists"
2019-09-26 08:47:55 +00:00
LEGACY_STATE_DIR="${LEGACY_KEYS_DIR}/state"
KEYS_DIR="/opt/encrypted-dns/etc/keys"
2019-09-25 20:50:53 +00:00
STATE_DIR="${KEYS_DIR}/state"
2019-09-25 14:10:09 +00:00
LISTS_DIR="/opt/encrypted-dns/etc/lists"
CONF_DIR="/opt/encrypted-dns/etc"
CONFIG_FILE="${CONF_DIR}/encrypted-dns.toml"
CONFIG_FILE_TEMPLATE="${CONF_DIR}/encrypted-dns.toml.in"
2015-07-05 23:39:54 +00:00
init() {
2019-09-25 20:50:53 +00:00
if [ "$(is_initialized)" = yes ]; then
2015-07-05 23:39:54 +00:00
start
exit $?
fi
2019-09-24 16:17:48 +00:00
2019-10-14 10:50:49 +00:00
anondns_enabled="false"
anondns_blacklisted_ips=""
metrics_address="127.0.0.1:9100"
while getopts "h?N:E:T:AM:" opt; do
2015-07-05 23:39:54 +00:00
case "$opt" in
2019-10-14 10:50:49 +00:00
h | \?) usage ;;
N) provider_name=$(echo "$OPTARG" | sed -e 's/^[ \t]*//' | tr A-Z a-z) ;;
E) ext_addresses=$(echo "$OPTARG" | sed -e 's/^[ \t]*//' | tr A-Z a-z) ;;
2019-10-14 10:50:49 +00:00
T) tls_proxy_upstream_address=$(echo "$OPTARG" | sed -e 's/^[ \t]*//' | tr A-Z a-z) ;;
A) anondns_enabled="true" ;;
M) metrics_address=$(echo "$OPTARG" | sed -e 's/^[ \t]*//' | tr A-Z a-z) ;;
2015-07-05 23:39:54 +00:00
esac
done
[ -z "$provider_name" ] && usage
case "$provider_name" in
2019-10-14 10:50:49 +00:00
.*) usage ;;
2.dnscrypt-cert.*) ;;
*) provider_name="2.dnscrypt-cert.${provider_name}" ;;
2015-07-05 23:39:54 +00:00
esac
2018-01-22 17:21:50 +00:00
[ -z "$ext_addresses" ] && usage
case "$ext_addresses" in
2019-10-14 10:50:49 +00:00
.*) usage ;;
0.*)
echo "Do not use 0.0.0.0, use an actual external IP address" >&2
exit 1
;;
2018-01-22 17:21:50 +00:00
esac
listen_addresses=$(get_listen_addresses "$ext_addresses")
2018-01-22 19:23:54 +00:00
2019-09-24 16:17:48 +00:00
tls_proxy_configuration=""
if [ -n "$tls_proxy_upstream_address" ]; then
tls_proxy_configuration="upstream_addr = \"${tls_proxy_upstream_address}\""
fi
2019-09-25 14:10:09 +00:00
domain_blacklist_file="${LISTS_DIR}/blacklist.txt"
domain_blacklist_configuration=""
if [ -s "$domain_blacklist_file" ]; then
2019-12-24 11:37:51 +00:00
chown _encrypted-dns:_encrypted-dns "$domain_blacklist_file"
2019-09-25 14:10:09 +00:00
domain_blacklist_configuration="domain_blacklist = \"${domain_blacklist_file}\""
fi
2018-01-22 17:21:50 +00:00
echo "Provider name: [$provider_name]"
2019-10-14 10:50:49 +00:00
echo "$provider_name" >"${KEYS_DIR}/provider_name"
2015-07-05 23:39:54 +00:00
chmod 644 "${KEYS_DIR}/provider_name"
sed \
2019-09-25 15:13:49 +00:00
-e "s#@PROVIDER_NAME@#${provider_name}#" \
-e "s#@LISTEN_ADDRESSES@#${listen_addresses}#" \
2019-09-25 15:13:49 +00:00
-e "s#@TLS_PROXY_CONFIGURATION@#${tls_proxy_configuration}#" \
-e "s#@DOMAIN_BLACKLIST_CONFIGURATION@#${domain_blacklist_configuration}#" \
2019-10-14 13:52:00 +00:00
-e "s#@ANONDNS_ENABLED@#${anondns_enabled}#" \
2019-10-14 10:50:49 +00:00
-e "s#@ANONDNS_BLACKLISTED_IPS@#${anondns_blacklisted_ips}#" \
-e "s#@METRICS_ADDRESS@#${metrics_address}#" \
2019-10-14 10:50:49 +00:00
"$CONFIG_FILE_TEMPLATE" >"$CONFIG_FILE"
2019-09-25 20:50:53 +00:00
mkdir -p -m 700 "${STATE_DIR}"
chown _encrypted-dns:_encrypted-dns "${STATE_DIR}"
if [ -f "${KEYS_DIR}/secret.key" ]; then
echo "Importing the previous secret key [${KEYS_DIR}/secret.key]"
/opt/encrypted-dns/sbin/encrypted-dns \
--config "$CONFIG_FILE" \
--import-from-dnscrypt-wrapper "${KEYS_DIR}/secret.key" \
2019-10-14 10:50:49 +00:00
--dry-run >/dev/null || exit 1
mv -f "${KEYS_DIR}/secret.key" "${KEYS_DIR}/secret.key.migrated"
2019-09-25 20:50:53 +00:00
fi
/opt/encrypted-dns/sbin/encrypted-dns \
--config "$CONFIG_FILE" --dry-run |
tee "${KEYS_DIR}/provider-info.txt"
2015-07-05 23:39:54 +00:00
echo
echo -----------------------------------------------------------------------
echo
echo "Congratulations! The container has been properly initialized."
echo "Take a look up above at the way dnscrypt-proxy has to be configured in order"
echo "to connect to your resolver. Then, start the container with the default command."
}
provider_info() {
ensure_initialized
echo
cat "${KEYS_DIR}/provider-info.txt"
2015-07-05 23:39:54 +00:00
echo
}
2019-09-26 08:47:55 +00:00
legacy_compat() {
if [ -f "${KEYS_DIR}/provider-info.txt" ] && [ -f "${KEYS_DIR}/provider_name" ]; then
return 0
fi
if [ -f "${LEGACY_KEYS_DIR}/provider-info.txt" ] && [ -f "${LEGACY_KEYS_DIR}/provider_name" ]; then
echo "Using [${LEGACY_KEYS_DIR}] for keys" >&2
2019-12-24 12:48:56 +00:00
mkdir -p -m 755 "${KEYS_DIR}"
2019-10-14 10:50:49 +00:00
mv -f "${KEYS_DIR}/provider-info.txt" "${KEYS_DIR}/provider-info.txt.migrated" 2>/dev/null || :
ln -s "${LEGACY_KEYS_DIR}/provider-info.txt" "${KEYS_DIR}/provider-info.txt" 2>/dev/null || :
mv -f "${KEYS_DIR}/provider_name" "${KEYS_DIR}/provider_name.migrated" 2>/dev/null || :
ln -s "${LEGACY_KEYS_DIR}/provider_name" "${KEYS_DIR}/provider_name" 2>/dev/null || :
mv -f "${KEYS_DIR}/secret.key" "${KEYS_DIR}/secret.key.migrated" 2>/dev/null || :
ln -s "${LEGACY_KEYS_DIR}/secret.key" "${KEYS_DIR}/secret.key" 2>/dev/null || :
2019-09-26 08:47:55 +00:00
mkdir -p -m 700 "${LEGACY_STATE_DIR}"
2019-12-24 12:48:56 +00:00
chown _encrypted-dns:_encrypted-dns "${KEYS_DIR}" "${STATE_DIR}" "${LEGACY_STATE_DIR}"
2019-10-14 10:50:49 +00:00
mv -f "$STATE_DIR" "${STATE_DIR}.migrated" 2>/dev/null || :
ln -s "$LEGACY_STATE_DIR" "${STATE_DIR}" 2>/dev/null || :
2019-09-26 08:47:55 +00:00
fi
if [ -f "${LEGACY_LISTS_DIR}/blacklist.txt" ]; then
echo "Using [${LEGACY_LISTS_DIR}] for lists" >&2
2019-12-24 12:48:56 +00:00
mkdir -p -m 755 "${LISTS_DIR}"
2019-10-14 10:50:49 +00:00
mv -f "${LISTS_DIR}/blacklist.txt" "${LISTS_DIR}/blacklist.txt.migrated" 2>/dev/null || :
ln -s "${LEGACY_LISTS_DIR}/blacklist.txt" "${LISTS_DIR}/blacklist.txt" 2>/dev/null || :
2019-12-24 12:48:56 +00:00
chown _encrypted-dns:_encrypted-dns "${LISTS_DIR}" "${LEGACY_LISTS_DIR}/blacklist.txt"
2019-09-26 08:47:55 +00:00
fi
}
2015-07-05 23:39:54 +00:00
is_initialized() {
2019-09-26 08:47:55 +00:00
if [ -f "$CONFIG_FILE" ] && [ -f "${STATE_DIR}/encrypted-dns.state" ] && [ -f "${KEYS_DIR}/provider-info.txt" ] && [ -f "${KEYS_DIR}/provider_name" ]; then
2015-07-05 23:39:54 +00:00
echo yes
2019-09-26 08:47:55 +00:00
else
legacy_compat
if [ -f "$CONFIG_FILE" ] && [ -f "${STATE_DIR}/encrypted-dns.state" ] && [ -f "${KEYS_DIR}/provider-info.txt" ] && [ -f "${KEYS_DIR}/provider_name" ]; then
echo yes
else
echo no
fi
2015-07-05 23:39:54 +00:00
fi
}
ensure_initialized() {
if [ "$(is_initialized)" = no ]; then
2019-09-23 21:34:51 +00:00
if [ -d "$LEGACY_KEYS_DIR" ]; then
echo "Please provide an initial configuration (init -N <provider_name> -E <external IP>)" >&2
fi
2015-07-05 23:39:54 +00:00
exit 1
fi
}
start() {
ensure_initialized
if [ -f "${KEYS_DIR}/secret.key" ]; then
echo "Importing the previous secret key [${KEYS_DIR}/secret.key]"
/opt/encrypted-dns/sbin/encrypted-dns \
--config "$CONFIG_FILE" \
--import-from-dnscrypt-wrapper "${KEYS_DIR}/secret.key" \
2019-10-14 10:50:49 +00:00
--dry-run >/dev/null || exit 1
mv -f "${KEYS_DIR}/secret.key" "${KEYS_DIR}/secret.key.migrated"
fi
2019-09-23 17:40:44 +00:00
/opt/encrypted-dns/sbin/encrypted-dns \
--config "$CONFIG_FILE" --dry-run |
tee "${KEYS_DIR}/provider-info.txt"
2019-10-14 10:50:49 +00:00
exec /etc/runit/2 </dev/null >/dev/null 2>/dev/null
2019-09-22 15:31:17 +00:00
}
shell() {
exec /bin/bash
2015-07-05 23:39:54 +00:00
}
is_ipv6() {
case "$1" in
\[[a-fA-F0-9:.]*\]:[0-9]*)
echo yes
;;
[0-9.]*:[0-9]*)
echo no
;;
*)
echo "IP and port should be specified as 'ipv4_addr:port' or '[ipv6_addr]:port'" >&2
exit 1
;;
esac
}
get_listen_addresses() {
listen_addresses=""
ext_addresses="$1"
OIFS="$IFS"
IFS=","
for ext_address in $ext_addresses; do
2019-11-05 14:56:21 +00:00
localport=$(echo "$ext_address" | sed -E 's/.*:([0-9]*)$/\1/')
if [ -z "$localport" ]; then
localport="443"
fi
entry="{ local = "
v6=$(is_ipv6 "$ext_address")
if [ "$v6" = "yes" ]; then
entry="${entry}\"[::]:${localport}\""
else
entry="${entry}\"0.0.0.0:${localport}\""
fi
entry="${entry}, external = \"${ext_address}\" }"
if [ -n "$listen_addresses" ]; then
listen_addresses="${listen_addresses}, "
fi
listen_addresses="${listen_addresses}${entry}"
done
IFS="$OIFS"
echo "${listen_addresses}"
}
2015-07-05 23:39:54 +00:00
usage() {
2019-10-14 10:50:49 +00:00
cat <<EOT
2015-07-05 23:39:54 +00:00
Commands
========
* init -N <provider_name> -E <external ip>:<port>[,<external ip>:<port>...]
2018-01-22 17:21:50 +00:00
initialize the container for a server accessible at ip <external ip> on port
<port>, for a provider named <provider_name>. This is required only once.
2019-10-14 10:50:49 +00:00
2019-09-24 16:17:48 +00:00
If TLS connections to the same port have to be redirected to a HTTPS server
(e.g. for DoH), add -T <https server ip>:<port>
2015-07-05 23:39:54 +00:00
2019-10-14 10:50:49 +00:00
To enable Anonymized DNS relaying, add -A.
2015-07-05 23:39:54 +00:00
* start (default command): start the resolver and the dnscrypt server proxy.
Ports 443/udp and 443/tcp have to be publicly exposed.
2018-01-22 23:31:12 +00:00
* provider-info: prints the provider name and provider public key.
2015-07-05 23:39:54 +00:00
2019-09-24 15:41:49 +00:00
* shell: run a shell.
2019-09-22 15:31:17 +00:00
2015-07-05 23:39:54 +00:00
This container has a single volume that you might want to securely keep a
backup of: /opt/encrypted-dns/etc/keys
2015-07-05 23:39:54 +00:00
EOT
exit 1
}
case "$action" in
2019-10-14 10:50:49 +00:00
start) start ;;
init)
shift
init "$@"
;;
provider-info) provider_info ;;
shell) shell ;;
*) usage ;;
2015-07-05 23:39:54 +00:00
esac