From 7d39e5352c718723ea6d6a1e3b651afc4ba2d6d6 Mon Sep 17 00:00:00 2001 From: Dict Xiong Date: Wed, 1 Mar 2023 01:28:53 +0800 Subject: [PATCH] logger.sh: support ddns --- .update.sh | 6 ++++ tools/logger.sh | 77 ++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 75 insertions(+), 8 deletions(-) diff --git a/.update.sh b/.update.sh index 4342d28..a3a42e9 100644 --- a/.update.sh +++ b/.update.sh @@ -10,6 +10,12 @@ DFS_UPDATE_CHANNEL=${DFS_UPDATE_CHANNEL:-"main"} # send beacon online apost_beacon "sys.online" +# update dns +if [[ "$DFS_DDNS_ENABLE" == "$1" ]]; then + fmt_info "updating dns ..." + "$THIS_DIR/tools/logger.sh" ddns || (fmt_error "failed to update dns" && apost_beacon "dfs.ddns.failed") +fi + # fetch origin cd $DOTFILES git fetch --all --prune diff --git a/tools/logger.sh b/tools/logger.sh index 1d47b53..c71c9c6 100755 --- a/tools/logger.sh +++ b/tools/logger.sh @@ -8,7 +8,9 @@ if [[ "$DFS_ORPHAN" == "1" ]]; then exit 0 fi -if [[ -x $(command -v hostname) ]]; then +if [[ -n "$DFS_HOSTNAME" ]]; then + hostname=$DFS_HOSTNAME +elif [[ -x $(command -v hostname) ]]; then hostname=$(hostname) elif [[ -x $(command -v uname) ]]; then hostname=$(uname -n) @@ -82,21 +84,76 @@ post_log() fi } +update_dns() +{ + if [[ -z "$DFS_DDNS_IP4$DFS_DDNS_IP6" ]]; then + fmt_fatal "neither DFS_DDNS_IP4 nor DFS_DDNS_IP6 is configured" + fi + init_uuid + local ip4 + local ip6 + local api_url="https://api.beardic.cn" + if [[ -z "$DFS_DDNS_IP4" ]]; then + ip4="" + elif [[ "$DFS_DDNS_IP4" == "auto" ]]; then + ip4="auto" + elif [[ "$DFS_DDNS_IP4" == "api" ]]; then + ip4=$(curl -sSL "https://api.ipify.org") + elif [[ "$DFS_DDNS_IP4" == "http"* ]]; then + ip4=$(curl -sSL "$DFS_DDNS_IP4") + if [[ -z "$ip4" ]]; then + fmt_fatal "unable to get ip4 address from $DFS_DDNS_IP4" + fi + else + ip4=$(ip a show $DFS_DDNS_IP4 | grep inet | grep global | awk '/inet / {print $2}' | awk -F'[/]' '{print $1}') + if [[ -z "$ip4" ]]; then + fmt_fatal "unable to get ip4 address from $DFS_DDNS_IP4" + fi + fi + if [[ -z "$DFS_DDNS_IP6" ]]; then + ip6="" + elif [[ "$DFS_DDNS_IP6" == "auto" ]]; then + ip6="auto" + api_url="https://api6.beardic.cn" + elif [[ "$DFS_DDNS_IP6" == "api" ]]; then + ip6=$(curl -sSL "https://api6.ipify.org") + elif [[ "$DFS_DDNS_IP6" == "http"* ]]; then + ip6=$(curl -sSL "$DFS_DDNS_IP6") + if [[ -z "$ip6" ]]; then + fmt_fatal "unable to get ip6 address from $DFS_DDNS_IP6" + fi + else + ip6=$(ip a show $DFS_DDNS_IP6 | grep inet6 | grep global | awk '/inet6 / {print $2}' | awk -F'[/]' '{print $1}') + if [[ -z "$ip6" ]]; then + fmt_fatal "unable to get ip6 address from $DFS_DDNS_IP6" + fi + fi + fmt_note "updating dns record for $hostname with ip4=$ip4 ip6=$ip6" + resp=$(curl -sSL "$api_url/update-dns?hostname=$hostname&uuid=$uuid&ip4=$ip4&ip6=$ip6") + if grep -q "200" <<< "$resp"; then + echo $resp + elif grep -q "403" <<< "$resp"; then + echo $resp >&2 + fmt_error "error updating dns record: authentification failed" + fmt_info "try to register you hostname and uuid" + fmt_info "hostname: $hostname" + fmt_info "uuid: $uuid" + else + echo $resp >&2 + fmt_fatal "error updating dns record" + fi +} + print_help() { - fmt_info "usage: $0 " + fmt_info "usage: $0 " } router() { - if [[ $# < 2 ]]; then - print_help >&2 - exit 1 - fi - case "$1" in -h|--help) - fmt_info "usage: $0 " + print_help ;; beacon) post_beacon "$2" "$3" @@ -104,7 +161,11 @@ router() log) post_log "$2" ;; + ddns) + update_dns + ;; *) + print_help fmt_fatal "invalid argument" ;; esac