1
0
mirror of https://github.com/EV21/dynb.git synced 2025-12-26 16:39:32 +01:00

12 Commits

Author SHA1 Message Date
2f5e193f88 add DynDNS2 support for noip.com 2021-01-27 18:50:24 +01:00
5210c35400 ♻️ refactor, fix and debug error handling 2021-01-27 17:52:15 +01:00
522a0f99bb ♻️ refactor main code 2021-01-26 22:23:03 +01:00
3bf6b69ae8 add interpretaton of status codes and act accordingly 2021-01-26 21:43:07 +01:00
d139022295 make network interface configurable 2021-01-26 21:43:07 +01:00
8997835903 🐛 fix sourcing of config file
♻️ do some shellcheck fixes
2021-01-26 21:43:07 +01:00
d6dc223794 add DynDNS2 support for dynv6.com 2021-01-26 21:43:07 +01:00
dc12f71d00 📝 add CHANGELOG.md 2021-01-26 21:43:07 +01:00
5ba730cff1 add .gitchangelog.rc 2021-01-26 21:43:07 +01:00
1104cf8505 📝 add example.env 2021-01-26 21:43:07 +01:00
99a446f4c7 📝 write README.md 2021-01-26 21:42:21 +01:00
f056e96e25 add dynb.sh 2021-01-26 21:24:33 +01:00
16 changed files with 473 additions and 1504 deletions

View File

@@ -1,9 +0,0 @@
**/.env
**/.dockerignore
**/.docker-compose.debug.yml
**/.docker-compose.yml
**/.git
**/.gitignore
**/.gitchangelog.rc
man/man.rst
man/man-defs.rst

View File

@@ -82,34 +82,24 @@ ignore_regexps = [
## whenever you are tweaking this variable.
##
section_regexps = [
('Features', [
r'^[fF]eat\s*:\s*((dev|use?r|pkg|test|doc)\s*:\s*)?([^\n]*)$',
('New', [
r'^:sparkles\s*:\s*((dev|use?r|pkg|test|doc)\s*:\s*)?([^\n]*)$',
]),
('Added', [
r'^[aA]dd\s*:\s*((dev|use?r|pkg|test|doc)\s*:\s*)?([^\n]*)$',
]),
('Changed', [
r'^[cC]hange\s*:\s*((dev|use?r|pkg|test|doc)\s*:\s*)?([^\n]*)$',
]),
('Deprecated', [
r'^[dD]epricated\s*:\s*((dev|use?r|pkg|test|doc)\s*:\s*)?([^\n]*)$',
]),
('Removed', [
r'^[rR]emove\s*:\s*((dev|use?r|pkg|test|doc)\s*:\s*)?([^\n]*)$',
('Changes', [
r'^:wrench\s*:\s*((dev|use?r|pkg|test|doc)\s*:\s*)?([^\n]*)$',
]),
('Fix', [
r'^[fF]ix\s*:\s*((dev|use?r|pkg|test|doc)\s*:\s*)?([^\n]*)$',
]),
('Security', [
r'^[sS]ec\s*:\s*((dev|use?r|pkg|test|doc)\s*:\s*)?([^\n]*)$',
r'^:bug\s*:\s*((dev|use?r|pkg|test|doc)\s*:\s*)?([^\n]*)$',
]),
('Documentation', [
r'^[dD]oc\s*:\s*((dev|use?r|pkg|test|doc)\s*:\s*)?([^\n]*)$',
r'^:memo\s*:\s*((dev|use?r|pkg|test|doc)\s*:\s*)?([^\n]*)$',
]),
('Remove', [
r'^:fire\s*:\s*((dev|use?r|pkg|test|doc)\s*:\s*)?([^\n]*)$',
]),
#('Other', None ## Match all lines
# ),
('Other', None ## Match all lines
),
]
@@ -158,7 +148,7 @@ body_process = ReSub(r'((^|\n)[A-Z]\w+(-\w+)*: .*(\n\s+.*)*)+$', r'') | strip
##
## Available constructs are those listed in ``body_process`` doc.
subject_process = (strip |
ReSub(r'^([cC]hg|[fF]ix|[nN]ew|[dD]oc|[fF]eat|[aA]dd|[cC]hange)\s*:\s*((dev|use?r|pkg|test|doc)\s*:\s*)?([^\n@]*)(@[a-z]+\s+)*$', r'\4') |
ReSub(r'^([cC]hg|[fF]ix|[nN]ew)\s*:\s*((dev|use?r|pkg|test|doc)\s*:\s*)?([^\n@]*)(@[a-z]+\s+)*$', r'\4') |
SetIfEmpty("No commit message.") | ucfirst | final_dot)

View File

@@ -1,16 +0,0 @@
name: Run shellcheck with reviewdog
on: [pull_request]
jobs:
shellcheck:
name: runner / shellcheck
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: shellcheck
uses: reviewdog/action-shellcheck@v1.9.0
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
reporter: github-pr-review
path: "."
pattern: "*.sh"
exclude: "./.git/*"

1
.gitignore vendored
View File

@@ -1,2 +1 @@
.env*
docker-compose*

View File

@@ -1,17 +0,0 @@
repos:
- repo: https://github.com/syntaqx/git-hooks
rev: v0.0.17
hooks:
- id: shellcheck
- id: shfmt
args:
- "-l" # list files whose formatting differs from shfmt's
- "-i 2" # indent: 0 for tabs (default), >0 for number of spaces
- "-ci" # switch cases will be indented
- "-w" # write result to file instead of stdout
- repo: https://github.com/executablebooks/mdformat
rev: 0.7.9
hooks:
- id: mdformat
additional_dependencies:
- mdformat-gfm # GitHub Flavored Markdown support

View File

@@ -1,114 +1,36 @@
# Changelog
## 0.3.0 (2022-05-26)
## (unreleased)
### Features
### New
* ✨ validate ip address respons from ip check web service. [Eduard Veit]
* :sparkles: add interpretaton of status codes and act accordingly. [Eduard Veit]
* ✨ check internet connection for selected ip versions. [Eduard Veit]
* :sparkles: make network interface configurable. [Eduard Veit]
* 🎨 colorful info, debug and error messages. [Eduard Veit]
* :sparkles: add DynDNS2 support for dynv6.com. [Eduard Veit]
* :sparkles: add .gitchangelog.rc. [Eduard Veit]
* :sparkles: add dynb. [Eduard Veit]
### Fix
* Abort on all dig errors. [Eduard Veit]
* :bug: fix sourcing of config file. [Eduard Veit]
:recycle: do some shellcheck fixes
### Documentation
* 📝 add labels to Dockerfile. [Eduard Veit]
## 0.2.0 (2021-09-24)
### Features
* ✨ enable parameter extensions for `docker run --interactive` [Eduard Veit]
### Changed
* Handle dns server selection. [Eduard Veit]
### Documentation
* 📝 update CHANGELOG.md. [Eduard Veit]
* 📝 document docker parameters. [Eduard Veit]
* 📝 change default dns server setting. [Eduard Veit]
* 📝 update CHANGELOG. [Eduard Veit]
* 📝 update README.md. [Eduard Veit]
## 0.1.2 (2021-04-23)
### Documentation
* 📝 document environment variables. [Eduard Veit]
## 0.1.1 (2021-04-23)
### Fix
* 🐛 fix loop and error handling in case of connection issues. [Eduard Veit]
## 0.1.0 (2021-04-22)
### Features
* ✨ add Dockerfile. [Eduard Veit]
* ✨ add loop mode. [Eduard Veit]
* ✨ add support for Duck DNS as DynDNS2 provider. [Eduard Veit]
* ✨ add support for deSEC as DynDNS2 provider. [Eduard Veit]
* ✨ add completion. [Eduard Veit]
✨ add man page
* 🔃 replace getopt with argbash. [Eduard Veit]
* ✨ add interpretaton of status codes and act accordingly. [Eduard Veit]
* ✨ make network interface configurable. [Eduard Veit]
* ✨ add DynDNS2 support for dynv6.com. [Eduard Veit]
### Added
* 📝 README.md. [Eduard Veit]
* ✨ dynb.sh. [Eduard Veit]
### Changed
* 🔃 rename environment variables. [Eduard Veit]
### Fix
* 🐛 fix error handling. [Eduard Veit]
* 🐛 fix sourcing of config file. [Eduard Veit]
♻️ do some shellcheck fixes
### Documentation
* 📝 document example of an docker-compose.yml file. [Eduard Veit]
* 📝 document `loop mode` and mention `dig` as requirement. [Eduard Veit]
* 📝 update example of .env in README.md. [Eduard Veit]
* 📝 CHANGELOG.md. [Eduard Veit]
* 📝 add example.env. [Eduard Veit]
* :memo: add CHANGELOG.md. [Eduard Veit]
* :memo: add .env.example. [Eduard Veit]
* :memo: write README.md. [Eduard Veit]
### Other
* Initial commit. [EV21]

View File

@@ -1,21 +0,0 @@
FROM alpine:latest
RUN \
apk update \
&& \
apk add \
bash \
curl \
jq \
bind-tools \
tzdata
WORKDIR /usr/src/app
COPY . .
ENTRYPOINT ["/bin/bash", "/usr/src/app/dynb.sh"]
LABEL org.opencontainers.image.source="https://github.com/EV21/dynb"
LABEL org.opencontainers.image.description="DynB - dynamic DNS update client."
LABEL org.opencontainers.image.licenses="MIT"

134
README.md
View File

@@ -1,11 +1,8 @@
# 🔃 DynB
DynB - dynamic DNS update script, written in bash
IPv4 (A) and IPv6 (AAAA) record updates are supported.
<!-- TOC -->
- [✨ Update Methods](#-update-methods)
- [APIs](#apis)
- [DynDNS2](#dyndns2)
@@ -14,171 +11,100 @@ IPv4 (A) and IPv6 (AAAA) record updates are supported.
- [⚙ Configuration](#-configuration)
- [🏃 Run](#-run)
- [⏰ Cron](#-cron)
- [loop mode](#loop-mode)
- [crontab](#crontab)
- [🐟 docker](#-docker)
- [environment variables](#environment-variables)
<!-- /TOC -->
## ✨ Update Methods
The following update methods are currently implemented:
### APIs
- INWX.com Domrobot JSON-RPC-API\
* INWX.com JSON-RPC-API
Limitations:
- minimum TTL is 300 (5 minutes)
### DynDNS2
- INWX.com
- deSEC.io (dedyn.io)
- DuckDNS.org
- dynv6.com
* INWX.com
* dynv6.com
## 📦 Requirements
- `curl` - The minimum requirement for all API requests.
- `dig` - You can get it by installing `dnsutils` (debian/ubuntu/ArchLinux), `bind-utils` (CentOS/RHEL), `bind-tools` (Alpine)
* `curl` - The minimum requirement for running DynDNS2 operations
also essential if you are using other APIs:
essential for APIs:
- `jq` - Command-line JSON processor
* `jq` - Command-line JSON processor
optional requirement:
* `getopt` for CLI parameter handling from [util-linux](https://pkgs.org/download/util-linux)
## 🚀 Installation
Download the latest release
or simply clone this repo
```shell
```
git clone https://github.com/EV21/dynb.git
```
If you want to add the script to you PATH, run :point_down:
```shell
```
bash dynb.sh --link
```
This convenience function only works if `util-linux` is installed on your system.
## ⚙ Configuration
You can use a config in form of an `.env` file.
Or you can just use CLI parameters.
Or if your system meets the relevant requirements you can use CLI parameters.
Create `.env` in the app root directory or at `~/.local/share/dynb/.env`.
```
_dyn_domain=dyndns.example.com
```bash
DYNB_DYN_DOMAIN=dyndns.example.com
## service provider could be deSEC, duckdns, dynv6, inwx
DYNB_SERVICE_PROVIDER=inwx
## service provider could be inwx
_serviceProvider=inwx
## update method options: domrobot, dyndns
DYNB_UPDATE_METHOD=domrobot
_update_method=domrobot
## ip mode could be either: 4, 6 or dual for dualstack
DYNB_IP_MODE=64
_ip_mode=dual
## If you are using the DomRobot RPC-API enter your credentials for the web interface login here
## If you are using the DynDNS2 protocol enter your credentials here
DYNB_USERNAME=User42
DYNB_PASSWORD=SuperSecretPassword
## or use a token
DYNB_TOKEN=
_username=
_password=
```
## 🏃 Run
If you have a config file just run :point_down:
```bash
```
dynb
```
Alternatively you can use parameters if your system meets the relevant requirements. This example shows the long form parameter, there are also short ones.\
Alternatively you can use parameters if your system meets the relevant requirements. This example shows the long form parameter, there are also short ones.
Call the help function :point_down:
```bash
```
dynb --help
```
```bash
```
dynb --ip-mode dualstack --update-method domrobot --domain dyndns.example.com --username user42 --password SuperSecretPassword
```
```bash
```
dynb --ip-mode dualstack --update-method dyndns --provider inwx --domain dyndns.example.com --username user42 --password SuperSecretPassword
```
## ⏰ Cron
To automatically call the script you can use either crontab or the script can also run in a loop mode.
### loop mode
Just use the parameter `--interval 60` or the environment variable `DYNB_INTERVAL=60` so the script will check every 60 seconds if it needs to do an update.
### crontab
To automatically call the script you can use cron.
execute :point_down:
```bash
```
crontab -e
```
then enter :point_down: to run dynb every five minutes.
```bash
```
*/5 * * * * $HOME/.local/bin/dynb >> $HOME/.local/share/dynb/dynb-cron.log
```
alternative with docker and parameters::
```bash
*/5 * * * * docker run --interactive --tty --rm --network host ev21/dynb:latest --ip-mode 64 --update-method domrobot --domain dyndns.example.com --username user42 --password SuperSecretPassword
```
Note, cron typically does not use the users PATH variable.
## 🐟 docker
This is an example of a `docker-compose.yml` file. If you are using IPv6 make sure the routing works properly with your docker container. Note: [IPv6 networking](https://docs.docker.com/config/daemon/ipv6/) is only supported on Docker daemons running on Linux hosts.
```yaml
version: '3.4'
services:
dynb:
image: ev21/dynb
container_name: dynb
network_mode: host
environment:
- DYNB_DYN_DOMAIN=dyndns.example.com
- DYNB_SERVICE_PROVIDER=desec
- DYNB_UPDATE_METHOD=dyndns
- DYNB_IP_MODE=64
- DYNB_USERNAME=User42
- DYNB_PASSWORD=SuperSecretPassword
- DYNB_INTERVAL=60
- TZ=Europe/Berlin
```
## environment variables
| variable | default value | description |
| --------------------- | --------------- | -------------------------------------------------------------------------------------------------------------- |
| DYNB_DYN_DOMAIN | undefined | required; `dyndns.example.com` |
| DYNB_SERVICE_PROVIDER | undefined | required; `deSEC`, `duckdns`, `dynv6`, `inwx` |
| DYNB_UPDATE_METHOD | undefined | required; `dyndns` or `domrobot` (with inwx) |
| DYNB_IP_MODE | undefined | required; `4`, `6` or `64` for both |
| DYNB_USERNAME | undefined | the requirement depends on your provider and the update method |
| DYNB_PASSWORD | undefined | the requirement depends on your provider and the update method |
| DYNB_TOKEN | undefined | the requirement depends on your provider and the update method |
| DYNB_INTERVAL | undefined | without this setting the script/docker container will run one time and exits |
| DYNB_DEBUG | undefined | more console outputs |
| DYNB_IPv4_CHECK_SITE | api64.ipify.org | You need a website or Web-API that outputs your remote IP |
| DYNB_IPv6_CHECK_SITE | api64.ipify.org | You need a website or Web-API that outputs your remote IP |
| DYNB_DNS_CHECK_SERVER | undefined | If you are using a local DNS Resolver/Server make sure it answers with the public answer or set another server |

View File

@@ -1,41 +0,0 @@
#!/bin/bash
# Put this file to /etc/bash_completion.d/dynb.sh
# needed because of Argbash --> m4_ignore([
### START OF CODE GENERATED BY Argbash v2.10.0 one line above ###
# Argbash is a bash code generator used to get arguments parsing right.
# Argbash is FREE SOFTWARE, see https://argbash.io for more info
_dynb_sh ()
{
local cur prev opts base
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
all_long_opts="--version --link --reset --debug --update-method --ip-mode --domain --service-provider --username --password --token --interval --help "
all_short_opts="-v -l -r -m -i -d -s -u -p -t -h "
case "$prev" in
--update-method|-m|--ip-mode|-i|--domain|-d|--service-provider|-s|--username|-u|--password|-p|--token|-t|--interval)
COMPREPLY=( $(compgen -o bashdefault -o default -- "${cur}") )
return 0
;;
*)
case "$cur" in
--*)
COMPREPLY=( $(compgen -W "${all_long_opts}" -- "${cur}") )
return 0
;;
-*)
COMPREPLY=( $(compgen -W "${all_short_opts}" -- "${cur}") )
return 0
;;
*)
COMPREPLY=( $(compgen -o bashdefault -o default -- "${cur}") )
return 0
;;
esac
esac
}
complete -F _dynb_sh dynb.sh
### END OF CODE GENERATED BY Argbash (sortof) ### ])

View File

@@ -1,24 +0,0 @@
#!/bin/bash
# m4_ignore(
echo "This is just a script template for argbash, not the script." >&2
exit 11 #)Created by argbash-init v2.10.0
# Rearrange the order of options below according to what you would like to see in the help message.
# ARG_OPTIONAL_BOOLEAN([version],[v],[outputs the client version],[off])
# ARG_OPTIONAL_BOOLEAN([link],[l],[links to your script at ~/.local/bin/dynb],[off])
# ARG_OPTIONAL_BOOLEAN([reset],[r],[deletes the client blocking status file],[off])
# ARG_OPTIONAL_BOOLEAN([debug],[],[enables debug mode],[off])
# ARG_OPTIONAL_SINGLE([update-method],[m],[choose if you want to use DynDNS2 or the DomRobot RPC-API],[])
# ARG_OPTIONAL_SINGLE([ip-mode],[i],[updates type A (IPv4) and AAAA (IPv6) records],[])
# ARG_OPTIONAL_SINGLE([domain],[d],[set the domain you want to update],[])
# ARG_OPTIONAL_SINGLE([service-provider],[s],[set your provider in case you are using DynDNS2],[])
# ARG_OPTIONAL_SINGLE([username],[u],[depends on your selected update method and your provider],[])
# ARG_OPTIONAL_SINGLE([password],[p],[depends on your selected update method and your provider],[])
# ARG_OPTIONAL_SINGLE([token],[t],[depends on your selected update method and your provider],[])
# ARG_OPTIONAL_SINGLE([interval],[],[choose the seconds interval to run the script in a loop, minimum is 60],[])
# ARG_HELP([DynB - dynamic DNS update script for bash])
# ARGBASH_GO
# [ <-- needed because of Argbash
# ] <-- needed because of Argbash

View File

@@ -1,297 +0,0 @@
#!/bin/bash
# Created by argbash-init v2.10.0
# Rearrange the order of options below according to what you would like to see in the help message.
# ARG_OPTIONAL_BOOLEAN([version],[v],[outputs the client version],[off])
# ARG_OPTIONAL_BOOLEAN([link],[l],[links to your script at ~/.local/bin/dynb],[off])
# ARG_OPTIONAL_BOOLEAN([reset],[r],[deletes the client blocking status file],[off])
# ARG_OPTIONAL_BOOLEAN([debug],[],[enables debug mode],[off])
# ARG_OPTIONAL_SINGLE([update-method],[m],[choose if you want to use DynDNS2 or the DomRobot RPC-API],[])
# ARG_OPTIONAL_SINGLE([ip-mode],[i],[updates type A (IPv4) and AAAA (IPv6) records],[])
# ARG_OPTIONAL_SINGLE([domain],[d],[set the domain you want to update],[])
# ARG_OPTIONAL_SINGLE([service-provider],[s],[set your provider in case you are using DynDNS2],[])
# ARG_OPTIONAL_SINGLE([username],[u],[depends on your selected update method and your provider],[])
# ARG_OPTIONAL_SINGLE([password],[p],[depends on your selected update method and your provider],[])
# ARG_OPTIONAL_SINGLE([token],[t],[depends on your selected update method and your provider],[])
# ARG_OPTIONAL_SINGLE([interval],[],[choose the seconds interval to run the script in a loop, minimum is 60],[])
# ARG_HELP([DynB - dynamic DNS update script for bash])
# ARGBASH_GO()
# needed because of Argbash --> m4_ignore([
### START OF CODE GENERATED BY Argbash v2.10.0 one line above ###
# Argbash is a bash code generator used to get arguments parsing right.
# Argbash is FREE SOFTWARE, see https://argbash.io for more info
# # When called, the process ends.
# Args:
# $1: The exit message (print to stderr)
# $2: The exit code (default is 1)
# if env var _PRINT_HELP is set to 'yes', the usage is print to stderr (prior to $1)
# Example:
# test -f "$_arg_infile" || _PRINT_HELP=yes die "Can't continue, have to supply file as an argument, got '$_arg_infile'" 4
die()
{
local _ret="${2:-1}"
test "${_PRINT_HELP:-no}" = yes && print_help >&2
echo "$1" >&2
exit "${_ret}"
}
# Function that evaluates whether a value passed to it begins by a character
# that is a short option of an argument the script knows about.
# This is required in order to support getopts-like short options grouping.
begins_with_short_option()
{
local first_option all_short_options='vlrmidsupth'
first_option="${1:0:1}"
test "$all_short_options" = "${all_short_options/$first_option/}" && return 1 || return 0
}
# THE DEFAULTS INITIALIZATION - OPTIONALS
_arg_version="off"
_arg_link="off"
_arg_reset="off"
_arg_debug="off"
_arg_update_method=
_arg_ip_mode=
_arg_domain=
_arg_service_provider=
_arg_username=
_arg_password=
_arg_token=
_arg_interval=
# Function that prints general usage of the script.
# This is useful if users asks for it, or if there is an argument parsing error (unexpected / spurious arguments)
# and it makes sense to remind the user how the script is supposed to be called.
print_help()
{
printf '%s\n' "DynB - dynamic DNS update script for bash"
printf 'Usage: %s [-v|--(no-)version] [-l|--(no-)link] [-r|--(no-)reset] [--(no-)debug] [-m|--update-method <arg>] [-i|--ip-mode <arg>] [-d|--domain <arg>] [-s|--service-provider <arg>] [-u|--username <arg>] [-p|--password <arg>] [-t|--token <arg>] [--interval <arg>] [-h|--help]\n' "$0"
printf '\t%s\n' "-v, --version, --no-version: outputs the client version (off by default)"
printf '\t%s\n' "-l, --link, --no-link: links to your script at ~/.local/bin/dynb (off by default)"
printf '\t%s\n' "-r, --reset, --no-reset: deletes the client blocking status file (off by default)"
printf '\t%s\n' "--debug, --no-debug: enables debug mode (off by default)"
printf '\t%s\n' "-m, --update-method: choose if you want to use DynDNS2 or the DomRobot RPC-API (no default)"
printf '\t%s\n' "-i, --ip-mode: updates type A (IPv4) and AAAA (IPv6) records (no default)"
printf '\t%s\n' "-d, --domain: set the domain you want to update (no default)"
printf '\t%s\n' "-s, --service-provider: set your provider in case you are using DynDNS2 (no default)"
printf '\t%s\n' "-u, --username: depends on your selected update method and your provider (no default)"
printf '\t%s\n' "-p, --password: depends on your selected update method and your provider (no default)"
printf '\t%s\n' "-t, --token: depends on your selected update method and your provider (no default)"
printf '\t%s\n' "--interval: choose the seconds interval to run the script in a loop, minimum is 60 (no default)"
printf '\t%s\n' "-h, --help: Prints help"
}
# The parsing of the command-line
parse_commandline()
{
while test $# -gt 0
do
_key="$1"
case "$_key" in
# The version argurment doesn't accept a value,
# we expect the --version or -v, so we watch for them.
-v|--no-version|--version)
_arg_version="on"
test "${1:0:5}" = "--no-" && _arg_version="off"
;;
# We support getopts-style short arguments clustering,
# so as -v doesn't accept value, other short options may be appended to it, so we watch for -v*.
# After stripping the leading -v from the argument, we have to make sure
# that the first character that follows coresponds to a short option.
-v*)
_arg_version="on"
_next="${_key##-v}"
if test -n "$_next" -a "$_next" != "$_key"
then
{ begins_with_short_option "$_next" && shift && set -- "-v" "-${_next}" "$@"; } || die "The short option '$_key' can't be decomposed to ${_key:0:2} and -${_key:2}, because ${_key:0:2} doesn't accept value and '-${_key:2:1}' doesn't correspond to a short option."
fi
;;
# See the comment of option '--version' to see what's going on here - principle is the same.
-l|--no-link|--link)
_arg_link="on"
test "${1:0:5}" = "--no-" && _arg_link="off"
;;
# See the comment of option '-v' to see what's going on here - principle is the same.
-l*)
_arg_link="on"
_next="${_key##-l}"
if test -n "$_next" -a "$_next" != "$_key"
then
{ begins_with_short_option "$_next" && shift && set -- "-l" "-${_next}" "$@"; } || die "The short option '$_key' can't be decomposed to ${_key:0:2} and -${_key:2}, because ${_key:0:2} doesn't accept value and '-${_key:2:1}' doesn't correspond to a short option."
fi
;;
# See the comment of option '--version' to see what's going on here - principle is the same.
-r|--no-reset|--reset)
_arg_reset="on"
test "${1:0:5}" = "--no-" && _arg_reset="off"
;;
# See the comment of option '-v' to see what's going on here - principle is the same.
-r*)
_arg_reset="on"
_next="${_key##-r}"
if test -n "$_next" -a "$_next" != "$_key"
then
{ begins_with_short_option "$_next" && shift && set -- "-r" "-${_next}" "$@"; } || die "The short option '$_key' can't be decomposed to ${_key:0:2} and -${_key:2}, because ${_key:0:2} doesn't accept value and '-${_key:2:1}' doesn't correspond to a short option."
fi
;;
# See the comment of option '--version' to see what's going on here - principle is the same.
--no-debug|--debug)
_arg_debug="on"
test "${1:0:5}" = "--no-" && _arg_debug="off"
;;
# We support whitespace as a delimiter between option argument and its value.
# Therefore, we expect the --update-method or -m value.
# so we watch for --update-method and -m.
# Since we know that we got the long or short option,
# we just reach out for the next argument to get the value.
-m|--update-method)
test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1
_arg_update_method="$2"
shift
;;
# We support the = as a delimiter between option argument and its value.
# Therefore, we expect --update-method=value, so we watch for --update-method=*
# For whatever we get, we strip '--update-method=' using the ${var##--update-method=} notation
# to get the argument value
--update-method=*)
_arg_update_method="${_key##--update-method=}"
;;
# We support getopts-style short arguments grouping,
# so as -m accepts value, we allow it to be appended to it, so we watch for -m*
# and we strip the leading -m from the argument string using the ${var##-m} notation.
-m*)
_arg_update_method="${_key##-m}"
;;
# See the comment of option '--update-method' to see what's going on here - principle is the same.
-i|--ip-mode)
test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1
_arg_ip_mode="$2"
shift
;;
# See the comment of option '--update-method=' to see what's going on here - principle is the same.
--ip-mode=*)
_arg_ip_mode="${_key##--ip-mode=}"
;;
# See the comment of option '-m' to see what's going on here - principle is the same.
-i*)
_arg_ip_mode="${_key##-i}"
;;
# See the comment of option '--update-method' to see what's going on here - principle is the same.
-d|--domain)
test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1
_arg_domain="$2"
shift
;;
# See the comment of option '--update-method=' to see what's going on here - principle is the same.
--domain=*)
_arg_domain="${_key##--domain=}"
;;
# See the comment of option '-m' to see what's going on here - principle is the same.
-d*)
_arg_domain="${_key##-d}"
;;
# See the comment of option '--update-method' to see what's going on here - principle is the same.
-s|--service-provider)
test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1
_arg_service_provider="$2"
shift
;;
# See the comment of option '--update-method=' to see what's going on here - principle is the same.
--service-provider=*)
_arg_service_provider="${_key##--service-provider=}"
;;
# See the comment of option '-m' to see what's going on here - principle is the same.
-s*)
_arg_service_provider="${_key##-s}"
;;
# See the comment of option '--update-method' to see what's going on here - principle is the same.
-u|--username)
test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1
_arg_username="$2"
shift
;;
# See the comment of option '--update-method=' to see what's going on here - principle is the same.
--username=*)
_arg_username="${_key##--username=}"
;;
# See the comment of option '-m' to see what's going on here - principle is the same.
-u*)
_arg_username="${_key##-u}"
;;
# See the comment of option '--update-method' to see what's going on here - principle is the same.
-p|--password)
test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1
_arg_password="$2"
shift
;;
# See the comment of option '--update-method=' to see what's going on here - principle is the same.
--password=*)
_arg_password="${_key##--password=}"
;;
# See the comment of option '-m' to see what's going on here - principle is the same.
-p*)
_arg_password="${_key##-p}"
;;
# See the comment of option '--update-method' to see what's going on here - principle is the same.
-t|--token)
test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1
_arg_token="$2"
shift
;;
# See the comment of option '--update-method=' to see what's going on here - principle is the same.
--token=*)
_arg_token="${_key##--token=}"
;;
# See the comment of option '-m' to see what's going on here - principle is the same.
-t*)
_arg_token="${_key##-t}"
;;
# See the comment of option '--update-method' to see what's going on here - principle is the same.
--interval)
test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1
_arg_interval="$2"
shift
;;
# See the comment of option '--update-method=' to see what's going on here - principle is the same.
--interval=*)
_arg_interval="${_key##--interval=}"
;;
# See the comment of option '--version' to see what's going on here - principle is the same.
-h|--help)
print_help
exit 0
;;
# See the comment of option '-v' to see what's going on here - principle is the same.
-h*)
print_help
exit 0
;;
*)
_PRINT_HELP=yes die "FATAL ERROR: Got an unexpected argument '$1'" 1
;;
esac
shift
done
}
# Now call all the functions defined above that are needed to get the job done
parse_commandline "$@"
# OTHER STUFF GENERATED BY Argbash
### END OF CODE GENERATED BY Argbash (sortof) ### ])
# [ <-- needed because of Argbash
# vvv PLACE YOUR CODE HERE vvv
# PUT YOUR CODE HERE
# ^^^ TERMINATE YOUR CODE BEFORE THE BOTTOM ARGBASH MARKER ^^^
# ] <-- needed because of Argbash

838
dynb.sh

File diff suppressed because it is too large Load Diff

View File

@@ -1,21 +1,7 @@
###################
## Configuration ##
###################
DYNB_DYN_DOMAIN=dyndns.example.com
## service provider could be deSEC, duckdns, dynv6, inwx
DYNB_SERVICE_PROVIDER=inwx
## update method options: domrobot, dyndns
DYNB_UPDATE_METHOD=domrobot
## ip mode could be either: 4, 6 or dual for dualstack
DYNB_IP_MODE=64
## If you are using the DomRobot RPC-API enter your credentials for the web interface login here
## If you are using the DynDNS2 protocol enter your credentials here
DYNB_USERNAME=User42
DYNB_PASSWORD=SuperSecretPassword
## or use a token
DYNB_TOKEN=
_dyn_domain=dyndns.example.com
_serviceProvider=inwx
_update_method=domrobot
_ip_mode=dual
_username=User42
_password=SuperSecretPassword
_token=

View File

@@ -1,114 +0,0 @@
.\" Man page generated from reStructuredText.
.
.TH MAN 1 "2021-04-21" "" ""
.SH NAME
man \- DynB - dynamic DNS update script for bash
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
\fBman [\-\-version] [\-\-link] [\-\-reset] [\-\-debug] [\-\-update\-method UPDATE\-METHOD] [\-\-ip\-mode IP\-MODE] [\-\-domain DOMAIN] [\-\-service\-provider SERVICE\-PROVIDER] [\-\-username USERNAME] [\-\-password PASSWORD] [\-\-token TOKEN] [\-\-interval INTERVAL] [\-\-help]\fP
.SH DESCRIPTION
.sp
IPv4 (A) and IPv6 (AAAA) record updates are supported.
.SH ARGUMENTS
.INDENT 0.0
.TP
.B \-v\fP,\fB \-\-version
outputs the client version.
[Default: off]
.sp
.TP
.B \-l\fP,\fB \-\-link
links to your script at ~/.local/bin/dynb.
[Default: off]
.sp
.TP
.B \-r\fP,\fB \-\-reset
deletes the client blocking status file.
[Default: off]
.sp
.TP
.B \-\-debug
enables debug mode.
[Default: off]
.sp
.TP
.BI \-m \ UPDATE\-METHOD\fR,\fB \ \-\-update\-method \ UPDATE\-METHOD
choose if you want to use DynDNS2 or the DomRobot RPC\-API.
.sp
dyndns | domrobot
.TP
.BI \-i \ IP\-MODE\fR,\fB \ \-\-ip\-mode \ IP\-MODE
updates type A (IPv4) and AAAA (IPv6) records.
.sp
4 | 6 | dual
.TP
.BI \-d \ DOMAIN\fR,\fB \ \-\-domain \ DOMAIN
set the domain you want to update.
.sp
dyndns.example.com
.TP
.BI \-s \ SERVICE\-PROVIDER\fR,\fB \ \-\-service\-provider \ SERVICE\-PROVIDER
set your provider in case you are using DynDNS2.
.sp
deSEC | duckdns | dynv6 | inwx
.TP
.BI \-u \ USERNAME\fR,\fB \ \-\-username \ USERNAME
depends on your selected update method and your provider.
.sp
e.g. user42
.TP
.BI \-p \ PASSWORD\fR,\fB \ \-\-password \ PASSWORD
depends on your selected update method and your provider.
.sp
e.g. SuperSecretPassword
.TP
.BI \-t \ TOKEN\fR,\fB \ \-\-token \ TOKEN
depends on your selected update method and your provider.
.sp
YourProviderGivenToken
.TP
.BI \-\-interval \ INTERVAL
choose the seconds interval to run the script in a loop, minimum is 60.
.sp
.TP
.B \-h\fP,\fB \-\-help
Prints help.
.sp
.UNINDENT
.SH AUTHOR
Eduard Veit
.\" Generated by docutils manpage writer.
.

View File

@@ -1,35 +0,0 @@
.. |AUTHOR| replace:: Eduard Veit
.. |VERSION| replace:: \
.. |MAN_SECTION| replace:: 1
.. |DESCRIPTION| replace::
IPv4 (A) and IPv6 (AAAA) record updates are supported.
.. |OPTION_VERSION| replace:: \
.. |OPTION_LINK| replace:: \
.. |OPTION_RESET| replace:: \
.. |OPTION_DEBUG| replace:: \
.. |OPTION_UPDATE_METHOD| replace:: dyndns | domrobot
.. |OPTION_IP_MODE| replace:: 4 | 6 | dual
.. |OPTION_DOMAIN| replace:: dyndns.example.com
.. |OPTION_SERVICE_PROVIDER| replace:: deSEC | duckdns | dynv6 | inwx
.. |OPTION_USERNAME| replace:: e.g. user42
.. |OPTION_PASSWORD| replace:: e.g. SuperSecretPassword
.. |OPTION_TOKEN| replace:: YourProviderGivenToken
.. |OPTION_INTERVAL| replace:: \
.. |OPTION_HELP| replace:: \

View File

@@ -1,88 +0,0 @@
.. include:: man-defs.rst
===
man
===
-----------------------------------------
DynB - dynamic DNS update script for bash
-----------------------------------------
:Author: |AUTHOR|
:Date: 2021-04-21
:Version: |VERSION|
:Manual section: |MAN_SECTION|
SYNOPSIS
========
``man [--version] [--link] [--reset] [--debug] [--update-method UPDATE-METHOD] [--ip-mode IP-MODE] [--domain DOMAIN] [--service-provider SERVICE-PROVIDER] [--username USERNAME] [--password PASSWORD] [--token TOKEN] [--interval INTERVAL] [--help]``
DESCRIPTION
===========
|DESCRIPTION|
ARGUMENTS
=========
-v, --version outputs the client version.
[Default: off]
|OPTION_VERSION|
-l, --link links to your script at ~/.local/bin/dynb.
[Default: off]
|OPTION_LINK|
-r, --reset deletes the client blocking status file.
[Default: off]
|OPTION_RESET|
--debug enables debug mode.
[Default: off]
|OPTION_DEBUG|
-m UPDATE-METHOD, --update-method UPDATE-METHOD choose if you want to use DynDNS2 or the DomRobot RPC-API.
|OPTION_UPDATE_METHOD|
-i IP-MODE, --ip-mode IP-MODE updates type A (IPv4) and AAAA (IPv6) records.
|OPTION_IP_MODE|
-d DOMAIN, --domain DOMAIN set the domain you want to update.
|OPTION_DOMAIN|
-s SERVICE-PROVIDER, --service-provider SERVICE-PROVIDER set your provider in case you are using DynDNS2.
|OPTION_SERVICE_PROVIDER|
-u USERNAME, --username USERNAME depends on your selected update method and your provider.
|OPTION_USERNAME|
-p PASSWORD, --password PASSWORD depends on your selected update method and your provider.
|OPTION_PASSWORD|
-t TOKEN, --token TOKEN depends on your selected update method and your provider.
|OPTION_TOKEN|
--interval INTERVAL choose the seconds interval to run the script in a loop, minimum is 60.
|OPTION_INTERVAL|
-h, --help Prints help.
|OPTION_HELP|