Latest version: v2021-08-21 (CHANGES.md)
Make sure to add new config options when updating script
This shell script makes sure your Freenom domains don't expire by auto renewing them.It's original functionality of updating an A record with the clients ip address is also retained.
You'll need to have already registered an account at Freenom.com with at least one (free) domain added before you can run the script.
FREENOM.COM DOMAIN RENEWAL AND DYNDNS
=====================================
USAGE:
freenom.sh -l [-d]
freenom.sh -r <domain OR -a> [-s <subdomain>]
freenom.sh -u <domain> [-s <subdomain>] [-m <ip>] [-f]
freenom.sh -z <domain>
OPTIONS:
-l List all domains with id's in account
add [-d] to show renewal Details
-r Renew <domain> or use '-r -a' to update All
use [-s] with -r to update subdomains
-u Update <domain> A record with current ip
add [-s] to update <Subdomain> record
add [-m <ip>] to Manually update static <ip>
add [-f] to Force update on unchanged ip
-z Zone listing dns records for <domain>
-4 Use ipv4 and modify A record on "-u" (default)
-6 Use ipv6 and modify AAAA record on "-u"
-c Config <file> to be used instead freenom.conf
-i Ip commands list used to get current ip
-o Output renewals result html file(s)
EXAMPLES:
./freenom.sh -r example.com
./freenom.sh -c /etc/mycustom.conf -r -a
./freenom.sh -u example.com -s mail
NOTES:
Using "-u" or "-r" and specifying <domain> as argument
will override any settings in script or config file
Note that this shell script requires recent versions of "Bash" and "cURL"
Run make install
from git clone directory to automatically install the script, conf file and to configure scheduler.
Suggested installation path: "/usr/local/bin" and "/usr/local/etc" for the config file
Settings can be changed in the script itself or set in a seperate config file (default). Every setting has comments with possible options and examples.
First edit config and set your email and password which you use to sign-in to freenom.com
freenom.sh -c /path/to/file.conf
freenom.sh
(before "Main")Test the script by running freenom.sh -l
and make sure your domains are listed. To update A record or Renew domains, see Usage or freenom.sh -h
Optionally you can schedule the script to run automatically. The installer creates "/etc/cron.d/freenom" or systemd timers in 'system mode' so the script runs at certain intervals. It will output a message with instructions on how to set your domain(s) to renew/update or renew all:
systemctl enable --now freenom-renew@example.tk.timer
systemctl enable --now freenom-renew-all.timer
systemctl enable --now freenom-update@example.tk.timer
If systemd is not available on your system the installer will use cron instead.
To manually configure cron:
Example:
0 9 * * 0 root bash -c 'sleep $((RANDOM \% 60))m; /usr/local/bin/freenom.sh -r -a'
0 * * * * root bash -c 'sleep $((RANDOM \% 15))m; /usr/local/bin/freenom.sh -u example.tk'
This first line in this example will run the script with "renew all domains" options every week on Sunday between 9.00 and 10.00
The second line updates the A record of example.tk
with the current client ip address, at hourly intervals
To manually setup systemd add one or more "timer(s)"
Thanks to @sdcloudt you can use the template units from the systemd dir.
Copy the files to:
Create symlinks (or use systemctl enable
) to create a service instance for your domain(s)
Reload systemd
Example:
# Create symlinks:
mkdir /path/to/systemd/timers.target.wants
ln -s /path/to/systemd/freenom-renew@.service /etc/systemd/user/timers.target.wants/freenom-renew@example.tk.service
ln -s /path/to/systemd/freenom-renew-all.service /etc/systemd/user/timers.target.wants/freenom-renew-all.service
ln -s /path/to/systemd/freenom-update@.service /etc/systemd/user/timers.target.wants/freenom-update@example.tk.service:
# then reload systemd:
systemctl daemon-reload
In case of any errors make sure you're using the correct paths and "freenom.conf" is setup. Check systemctl status <unit>
and logs.
freenomctl --user
To enable email alerts make sure MTA
is set, the default is 'sendmail'. Emails will be send on renew or update errors. If you do not have/want an MTA installed you could use bashmail instead.
If you want to receive the alerts on a different email address than freenom_email
set RCPTTO
. You can also set an optional "From" address: MAILFROM="Freenom Script <freenom-script@example.tk>"
Leaving MTA
empty or commented disables alerts.
The following options can be changed in config, they are however OK to leave as-is.
freenom_http_retry="3" # number of curl retries
freenom_update_force="0" # [0/1] force ip update, even if unchanged
freenom_update_ttl="3600" # ttl in sec (changed from 14440 to 3600)
freenom_update_ip_retry="3" # number of retries to get ip
freenom_update_ip_log="1" # [0/1] log 'skipped same ip' msg
freenom_renew_log="1" # [0/1] log renew warnings details
freenom_list_bind="0" # [0/1] output isc bind zone format
freenom_http_sleep="3 3" # wait n to n+n secs between http requests
freenom_oldcurl_force="0" # [0/1] force older curl version support
freenom_update_ip="0" # [0/1] arg "-u"
freenom_update_manual="0" # [0/1] arg "-m"
freenom_update_all="0" # [0/1] arg "-a" (future update, not working yet)
freenom_list="0" # [0/1] arg "-l"
freenom_list_renewals="0" # [0/1] args "-l -d"
freenom_list_records="0" # [0/1] arg "-z"
freenom_renew_domain="0" # [0/1] arg "-r"
freenom_renew_all="0" # [0/1] args "-r -a"
To update A or AAAA records the nameservers for the domain must be set to the default Freenom Name Servers.
To get your current ip address from a number of public services the script uses 3 methods:
curl https://checkip.amazonaws.com
dig TXT +short o-o.myaddr.l.google.com @ns1.google.com
There are a few more services defined for redundancy, the script will choose one at random. By default it will retry 3 times to get ip.
Once your ip is found it's written to "freenom.ip4.domain.lock" (or 'ip6') to prevent unnecessary updates in case the ip is unchanged.To force an update you can remove this file which is located in the default output path: "/var/log".
To manually update: set freenom_static_ip=<your ip>
and freenom_update_manual="1"
, or use the -m
option.
Make sure 'curl' and/or 'dig' is installed (e.g. debian: dnsutils or redhat: bind-utils)
In case of issues try running curl and dig command manually.
freenom.sh -i
(or grep getIp freenom.conf
)freenom_update_ipv="4"
freenom_update_dig="0"
Makefile
freenom.sh
and freenom.conf
"/var/log/freenom/"
(default)freenom.log
, freenom_<domain>.ip{4,6}
, freenom_renewalResult-<id>.html
freenom.sh -o
to view Result html filesAlso see comment "Output files" and freenom_out_dir
variable in conf.
Usually you can just replace "freenom.sh" with the new version, if you're using a seperate config file.
An exeption is when config options were added/changed which you may need to compare and merge. Such config changes are listed in CHANGES.md.
Run make uninstall
.
You can also manually reverse the steps under Installation above (e.g. remove .sh, .conf and scheduler files).
See CHANGES.md