ddns dag
parent
f7963a4e05
commit
70a0a592c2
|
@ -0,0 +1,64 @@
|
|||
DOMAIN_NAME ?= monotremata.xyz
|
||||
RECORD_NAME ?= wg
|
||||
|
||||
API_URL = https://api.linode.com/v4
|
||||
GET_IP_URL = ifconfig.me/ip
|
||||
WORK_DIR = $(RECORD_NAME).$(DOMAIN_NAME)
|
||||
|
||||
HOST_IP = $(WORK_DIR)/host_ip.txt
|
||||
DOMAIN_ID = $(WORK_DIR)/domain_id.txt
|
||||
RECORD_ID = $(WORK_DIR)/record_id.txt
|
||||
UPDATE_RECORD = $(WORK_DIR)/updated_record.txt
|
||||
|
||||
TOKEN = $(shell pass linode.com/token)
|
||||
|
||||
CURL = curl --silent
|
||||
AUTH_CURL = $(CURL) -H "Authorization: Bearer $(TOKEN)"
|
||||
|
||||
define get_id
|
||||
jq '.["data"][] | select(.["$(1)"] == "$(2)")["id"]'
|
||||
endef
|
||||
|
||||
.PHONY: force clean
|
||||
|
||||
# because the ip state is only updated when the IP changes, we should only need
|
||||
# to update the record when that happens
|
||||
$(UPDATE_RECORD): $(HOST_IP) $(DOMAIN_ID) $(RECORD_ID)
|
||||
@echo "updating record"
|
||||
@$(AUTH_CURL) \
|
||||
-H "Content-Type: application/json" \
|
||||
-X PUT -d '{ "target": "'"$$(cat $<)"'" }' \
|
||||
"$(API_URL)/domains/$$(cat $(DOMAIN_ID))/records/$$(cat $(RECORD_ID))"
|
||||
@touch $@
|
||||
|
||||
# the domain id should not change and this should only ever need to run once
|
||||
$(DOMAIN_ID):
|
||||
@echo "fetching domain id"
|
||||
@mkdir -p $(@D)
|
||||
@$(AUTH_CURL) $(API_URL)/domains | \
|
||||
$(call get_id,domain,$(DOMAIN_NAME)) | \
|
||||
tee $@
|
||||
|
||||
# the register id should not change and this should only ever need to run once
|
||||
$(RECORD_ID): $(DOMAIN_ID)
|
||||
@echo "fetching record id"
|
||||
@mkdir -p $(@D)
|
||||
@$(AUTH_CURL) $(API_URL)/domains/$$(cat $<)/records | \
|
||||
$(call get_id,name,$(RECORD_NAME)) | \
|
||||
tee $@
|
||||
|
||||
# this target depends on a PHONY so that it is attempted every time, but the
|
||||
# target file should only be updated is the current host ip is different to the
|
||||
# saved one
|
||||
$(HOST_IP): force
|
||||
@echo "fetching host IP"
|
||||
@mkdir -p $(@D)
|
||||
@current_ip=$$($(CURL) $(GET_IP_URL)); \
|
||||
echo "$$current_ip"; \
|
||||
if [ ! -f $@ ] || [ "$$current_ip" != "$$(cat $@)" ]; then \
|
||||
echo "updating stored IP"; \
|
||||
echo "$$current_ip" | tee $@; \
|
||||
fi
|
||||
|
||||
clean:
|
||||
rm -r $(WORK_DIR)
|
|
@ -0,0 +1,5 @@
|
|||
# DDNS
|
||||
|
||||
This DAG updates a dynamic IP on Linode's DNS.
|
||||
|
||||
It only attempts the update after the current IP has changed.
|
Loading…
Reference in New Issue