Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/glocktober/setmycfdns
Update cloudflare DNS record based on retrieved public ip
https://github.com/glocktober/setmycfdns
cloudflare dns python
Last synced: 17 days ago
JSON representation
Update cloudflare DNS record based on retrieved public ip
- Host: GitHub
- URL: https://github.com/glocktober/setmycfdns
- Owner: Glocktober
- License: mit
- Created: 2022-02-13T20:31:29.000Z (about 3 years ago)
- Default Branch: master
- Last Pushed: 2024-12-26T03:24:08.000Z (about 2 months ago)
- Last Synced: 2025-01-26T09:45:54.393Z (20 days ago)
- Topics: cloudflare, dns, python
- Language: Python
- Homepage:
- Size: 15.6 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE.txt
Awesome Lists containing this project
README
## setmycfdns - DNS updates for Cloudflare
The scenerio exists where a servers public (external) IP address can change over time. This is especially true with cloud computing.
As instances are stopped or hibernated and then restarted - their public IPs change, leaving public DNS records out of date.
This program can be used to update CloudFlare zone records when a server reboots or returns from hibernation. This gives CloudFlare users the same benifit as a cloud-native DNS solutions.
### Limitations
`setmycfdns` will update ***existing*** DNS records - the records must ***already exist*** in your CloudFlare zone.`setmycfdns` doesn't create or remove records (well... look at the undocumented options --create-record and --delete-record)
This is by design to prevent things from going wrong.
`setmycfdns` updates **A** and **AAAA** DNS records; other records are not supported.
## setmycfdns Command Usage and Options
After configuring `setmycfdns` is simple to use and in most instances does not require any special switchs.
```bash
% setmycfdns
```
This will **automatically** find your public IP address and update the dns zone record based on the *fully qualifed domain name* (fqdn) of your computer.In a more complex configuration you can use a different name or multiple ip address.
```bash
% setmycfdns --fqdn first.example.com
% setmycfdns --fqdn second.example.com -ip 100.100.22.23
```
A list of all availabe options:
```
% setmycfdns --help
usage: setmycfdns [-h] [-v] [-ip IP] [-fqdn FQDN] [-q] [-z ZONE] [-6]Update CloudFlare IP record
optional arguments:
-h, --help show this help message and exit
-v, --version show program's version number and exit
-ip IP, --ip IP set specific IP address to use
-fqdn FQDN, --fqdn FQDN
Fully Qualified Domain Name (rkmbp.sunyocc.edu)
-q, --query Query only - no updates are made
-z ZONE, --zone ZONE Cloudflare Zone to update (optional)
-6 Update AAAA record (default is A record)setmycfdns gunville 2024 v2
#### Automatic IP detection:
By default `setmyip` automatically detects the public IP address by sending an HTTP request to [ipv4.icanhazip.com](http://ipv4.icanhazip.com). This site returns the IPv4 address of the sender.
You can optionally use a different site to autodetect the public ip by setting the environment variable `IPAPIURL` to that URL:
```bash
% IPAPIURL='http://api.ipify.org'
% setmycfdns
````
You can do the same for IPv6 using `IPV6APIURL`.When ipv6 is selected with the `-6` switch automatic detection uses the ipv6 stack. [ipv6.icanhazip.com](http://ipv6.icanhazip.com).
If your host has multiple ip addresses or uses a proxy for web requests you will need to provide the ip address to use with the `--ip IP` command line switch.
```bash
% setmycfdns -ip 100.123.4.56
% setmycfdns -6 -ip 2600:1f16:a44:1701:1be3:f8b7:aa51:410b
```#### Automatic Hostname Determination:
The fqdn of the host is acquired with the Python `socket.gethostname()` function. (Several solutions were tried, none worked perfect, but this one seems to work best.)
There are some limitations to hostname determination:
* Some systems are not configured to provide the fqdn (*web01.example.com*) and provide only the short hostname (*web01*). There is no elegant and simple solution that works on all platforms and configurations.* In some environments the hostname on the private side (e.g. web01.local) is not the same one used on the public side (web01.example.com).
* Likewise, cloud VPCs by default provide hostnames in a similar fashion (e.g. *ip-172-31-84-22.ec2.internal*)
In these cases you will be required to provide the full fqdn with the `--fqdn FQDN` switch.
```bash
% setmycfdns --fqdn web01.example.com
```#### CloudFlare Zone selection:
The cloudflare zone is selected from the FQDN, but can also explicity provided with the `--zone ZONE` switch.
If the `--zone` switch is used the the zone does not match the hostname determined above, the fqdn is constructed by appending the zone.
```bash
% hostname
server1
% setmycfdns --fqdn server1.example.com # server1.example.com
% setmycfdns --fqdn server1 --zone example.com # server1.example.com
% setmycfdns --zone eample.com # server1.example.com
```The above are identical. Note that the `fqdn` does not have to be 'fully qualified' when the `--zone` switch is used.
#### IPv6 Support
Both ipv4 **A** and ipv6 **AAAA** DNS records are supported by `setmycfdns`. To update ipv6 records the `-6` switch is used - and required.
```bash
% setmycfdns -6
```# Installation and Configuration
`setmycfdns` is easily installed using `pip`
```bash
% pip install setmycfdns
```#### CloudFlare API Keys
CloudFlare credentials (API keys) are required. You will need to generate these in your CloudFlare account.
<<<<<<< HEAD
Generally a `.cloudflare.cf` file in the users home directory or the current working directory, but there are several options. The format is dictated by the `python-cloudflare` API library and [details can be found here.](https://github.com/cloudflare/python-cloudflare/blob/master/README.md)
=======
Generally a `.cloudflare.cf` file in the users home directory or the current working directory, but there are several options. The format is dictated by the `python-cloudflare` API library and [details can be found here.](https://github.com/cloudflare/python-cloudflare/blob/master/README.md) These are a TOML formated file with a CloudFlare tier and values for email and api_key.Alternative to the `.cloudflare.cf' file you can pass credentials using the environment variables CLOUDFLARE_EMAIL and CLOUDFLARE_KEY.
>>>>>>> 543cb5ef539fa33c11afecc9fdf19a7dcd1b901c***Remember to always protect these API keys.***
#### Configuring `setmycfdns` to Run On Reboots (optional)
The following `crontab` entry will run `setmycfdns` each time the server reboots.
```
@reboot /usr/local/bin/setmycfdns
```
The actual path depends on where you install `setmycfdns`#### Configuring `setmycfdns` To Run Post Hibernation (optional)
This may differ some depending on the operating system. This example here works with RedHat flavors.
* Create the following file in `/lib/systemd/system-sleep/`
* Add these contents of the file
* Set the file to be excutable```bash
% sudo touch /lib/systemd/system-sleep/20_cfdns
% sudo chomd +x /lib/systemd/system-sleep/20_cfdns
% cat > /lib/systemd/system-sleep/20_cfdns <>
```
The actual path depends on where you install `setmycfdns`