2
0
mirror of https://github.com/dnscrypt/dnscrypt-server-docker synced 2024-11-19 09:25:47 +00:00
dnscrypt-server-docker/entrypoint.sh

150 lines
3.9 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"
KEYS_DIR="/opt/encrypted-dns/etc/keys"
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
2018-01-22 19:23:54 +00:00
# -N provider-name -E external-ip-address:port
2015-07-05 23:39:54 +00:00
init() {
if [ "$(is_initialized)" = yes ]; then
2015-07-05 23:39:54 +00:00
start
exit $?
fi
2018-01-22 19:23:54 +00:00
while getopts "h?N:E:" opt; do
2015-07-05 23:39:54 +00:00
case "$opt" in
h | \?) usage ;;
N) provider_name=$(echo "$OPTARG" | sed -e 's/^[ \t]*//' | tr A-Z a-z) ;;
E) ext_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
.*) 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
2018-01-22 19:23:54 +00:00
[ -z "$ext_address" ] && usage
case "$ext_address" in
.*) 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
2018-01-22 19:23:54 +00:00
2018-01-22 17:21:50 +00:00
echo "Provider name: [$provider_name]"
echo "$provider_name" >"${KEYS_DIR}/provider_name"
2015-07-05 23:39:54 +00:00
chmod 644 "${KEYS_DIR}/provider_name"
sed \
-e "s/@PROVIDER_NAME@/${provider_name}/" \
-e "s/@EXTERNAL_IPV4@/${ext_address}/" \
"$CONFIG_FILE_TEMPLATE" >"$CONFIG_FILE"
/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-23 18:55:51 +00:00
dnscrypt_wrapper_compat() {
if [ ! -d "$LEGACY_KEYS_DIR" ]; then
return
fi
echo "Legacy [$LEGACY_KEYS_DIR] directory found."
if [ -d "$KEYS_DIR" ]; then
echo "Both [${LEGACY_KEYS_DIR}] and [${KEYS_DIR}] are present - This is not expected" >&2
exit 1
else
echo "We'll just symlink it to [${KEYS_DIR}] internally"
ln -s "${LEGACY_KEYS_DIR}" "$KEYS_DIR"
fi
if [ ! -f "${LEGACY_KEYS_DIR}/secret.key" ]; then
echo "No secret key in [${LEGACY_KEYS_DIR}/secret.key], this is not expected." >&2
fi
echo "...and this is fine! You can keep using it, no need to change anything to your Docker volumes."
}
2015-07-05 23:39:54 +00:00
is_initialized() {
2019-09-23 18:55:51 +00:00
dnscrypt_wrapper_compat
if [ ! -f "${KEYS_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 no
else
echo yes
fi
}
ensure_initialized() {
if [ "$(is_initialized)" = no ]; then
2018-01-22 19:23:54 +00:00
echo "Please provide an initial configuration (init -N <provider_name> -E <external IP>)" >&2
2015-07-05 23:39:54 +00:00
exit 1
fi
}
start() {
ensure_initialized
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"
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
}
usage() {
cat <<EOT
2015-07-05 23:39:54 +00:00
Commands
========
2018-01-22 19:23:54 +00:00
* init -N <provider_name> -E <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.
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-22 15:31:17 +00:00
* shell: run a shell
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
start) start ;;
init)
shift
2019-09-23 17:40:44 +00:00
init "$@"
;;
provider-info) provider_info ;;
2019-09-22 15:31:17 +00:00
shell) shell ;;
*) usage ;;
2015-07-05 23:39:54 +00:00
esac