aboutsummaryrefslogtreecommitdiff
path: root/content/blog/2022-02-10-njalla-dns-api.md
diff options
context:
space:
mode:
authorChristian Cleberg <hello@cleberg.net>2024-07-28 19:46:20 -0500
committerChristian Cleberg <hello@cleberg.net>2024-07-28 19:46:20 -0500
commit2be43cc479dfd4cfb621f14381330c708291e324 (patch)
tree7ac50f99425c5524c0820360754045b80d1bafcc /content/blog/2022-02-10-njalla-dns-api.md
parentafe76ac7d7498b862abaa623790b91410e34574d (diff)
downloadcleberg.net-2be43cc479dfd4cfb621f14381330c708291e324.tar.gz
cleberg.net-2be43cc479dfd4cfb621f14381330c708291e324.tar.bz2
cleberg.net-2be43cc479dfd4cfb621f14381330c708291e324.zip
conversion from Zola to Weblorg
Diffstat (limited to 'content/blog/2022-02-10-njalla-dns-api.md')
-rw-r--r--content/blog/2022-02-10-njalla-dns-api.md205
1 files changed, 0 insertions, 205 deletions
diff --git a/content/blog/2022-02-10-njalla-dns-api.md b/content/blog/2022-02-10-njalla-dns-api.md
deleted file mode 100644
index 7f5f9d3..0000000
--- a/content/blog/2022-02-10-njalla-dns-api.md
+++ /dev/null
@@ -1,205 +0,0 @@
-+++
-date = 2022-02-10
-title = "Dynamic DNS with Njalla API"
-description = ""
-draft = false
-+++
-
-# Njalla's API
-
-As noted in my recent post about [switching to Njalla from
-Cloudflare](file:///blog/ditching-cloudflare/), I was searching for a way to
-replace my very easy-to-use bash script to [update Cloudflare's DNS via their
-API](file:///blog/cloudflare-dns-api/).
-
-To reiterate what I said in those posts, this is a common necessity for those of
-us who have non-static IP addresses that can change at any moment due to ISP
-policy.
-
-In order to keep a home server running smoothly, the server admin needs to have
-a process to constantly monitor their public IP address and update their
-domain's DNS records if it changes.
-
-This post explains how to use Python to update Njalla's DNS records whenever a
-machine's public IP address changes.
-
-## Creating a Token
-
-To use Njalla's API, you will first need to create a token that will be used to
-authenticate you every time you call the API. Luckily, this is very easy to do
-if you have an account with Njalla.
-
-Simply go the [API Settings](https://njal.la/settings/api/) page and click the
-`Add Token` button. Next, enter a name for the token and click `Add`.
-
-Finally, click the `Manage` button next to your newly created token and copy the
-`API Token` field.
-
-## Finding the Correct API Request
-
-Once you have a token, you're ready to call the Njalla API for any number of
-requests. For a full listing of available requests, see the [Njalla API
-Documentation](https://njal.la/api/).
-
-For this demo, we are using the `list-records` and `edit-record` requests.
-
-The `list-records` request requires the following payload to be sent when
-calling the API:
-
-```txt
-params: {
- domain: string
-}
-```
-
-The `edit-record` request requires the following payload to be sent when calling
-the API:
-
-```txt
-params: {
- domain: string
- id: int
- content: string
-}
-```
-
-# Server Set-Up
-
-To create this script, we will be using Python. By default, I use Python 3 on my
-servers, so please note that I did not test this in Python 2, and I do not know
-if Python 2 will work for this.
-
-## Creating the Script
-
-First, find a suitable place to create your script. Personally, I just create a
-directory called `ddns` in my home directory:
-
-```sh
-mkdir ~/ddns
-```
-
-Next, create a Python script file:
-
-```sh
-nano ~/ddns/ddns.py
-```
-
-The following code snippet is quite long, so I won't go into depth on each part.
-However, I suggest you read through the entire script before running it; it is
-quite simple and contains comments to help explain each code block.
-
-:warning: **Note**: You will need to update the following variables for this to
-work:
-
-- `token`: This is the Njalla API token you created earlier.
-- `user_domain`: This is the top-level domain you want to modify.
-- `include_subdomains`: Set this to `True` if you also want to modify
- subdomains found under the TLD.
-- `subdomains`: If `include_subdomains` = `True`, you can include your list of
- subdomains to be modified here.
-
-```python
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-# Import Python modules
-
-from requests import get
-import requests
-import json
-
-# Set global variables
-
-url = 'https://njal.la/api/1/'
-token = '<your-api-token>'
-user_domain = 'example.com'
-include_subdomains = True
-subdomains = ['one', 'two']
-
-
-# Main API call function
-
-def njalla(method, **params):
- headers = {'Authorization': 'Njalla ' + token}
- response = requests.post(url, json={'method': method,
- 'params': params}, headers=headers).json()
- if 'result' not in response:
- raise Exception('API Error', response)
- return response['result']
-
-
-# Gather all DNS records for a domain
-
-def get_records(domain):
- return njalla('list-records', domain=user_domain)
-
-
-# Update a DNS record for a domain
-
-def update_record(domain, record_id, record_content):
- return njalla('edit-record', domain=domain, id=record_id,
- content=record_content)
-
-
-# Get public IP addresses
-
-ipv4 = get('https://api.ipify.org').text
-print('IPv4: {}'.format(ipv4))
-ipv6 = get('https://api64.ipify.org').text
-print('IPv6: {}'.format(ipv6))
-
-# Call API to get all DNS records
-
-data = get_records(user_domain)
-
-# Loop through records and check if each one is IPv4 (A) or IPv6 (AAAA)
-# Update only if DNS is different from server IP
-
-for record in data['records']:
- if record['name'] == '@' or (include_subdomains and record['name'] \
- in subdomains):
- if record['type'] == 'A':
- if record['content'] == ipv4:
- print(record['type'], 'record for', record['name'],
- 'already matches public IPv4 address. Skipping...'
- )
- else:
- print('IPv4 of', ipv4,
- 'does not match Njalla's value of',
- record['content'], '. Updating...')
- update_record(user_domain, record['id'], ipv4)
- elif record['type'] == 'AAAA':
- if record['content'] == ipv6:
- print(record['type'], 'record for', record['name'],
- 'already matches public IPv6 address. Skipping...'
- )
- else:
- print('IPv6 of', ipv6,
- 'does not match Njalla's value of',
- record['content'], '. Updating...')
- update_record(user_domain, record['id'], ipv6)
-```
-
-## Running the Script
-
-Once you've created the script and are ready to test it, run the following
-command:
-
-```sh
-python3 ~/ddns/ddns.py
-```
-
-## Setting the Script to Run Automatically
-
-To make sure the scripts run automatically, add it to the `cron` file so that it
-will run on a schedule. To do this, open the `cron` file:
-
-```sh
-crontab -e
-```
-
-In the cron file, paste the following at the bottom of the editor in order to
-check the IP every five minutes:
-
-```sh
-*/5 ** ** ** ** python3 /home/<your_username>/ddns/ddns.py
-```