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

feat: 🔃 replace getopt with argbash

This commit is contained in:
2021-04-03 13:57:19 +02:00
parent 6a14d00256
commit 6d9bf8a2ae
3 changed files with 269 additions and 80 deletions

View File

@@ -5,6 +5,8 @@
### New ### New
* :sparkles: replace getopt with argbash. [Eduard Veit]
* :sparkles: add interpretaton of status codes and act accordingly. [Eduard Veit] * :sparkles: add interpretaton of status codes and act accordingly. [Eduard Veit]
* :sparkles: make network interface configurable. [Eduard Veit] * :sparkles: make network interface configurable. [Eduard Veit]
@@ -13,7 +15,7 @@
* :sparkles: add .gitchangelog.rc. [Eduard Veit] * :sparkles: add .gitchangelog.rc. [Eduard Veit]
* :sparkles: add dynb. [Eduard Veit] * :sparkles: add dynb.sh. [Eduard Veit]
### Fix ### Fix
@@ -25,12 +27,16 @@
* :memo: add CHANGELOG.md. [Eduard Veit] * :memo: add CHANGELOG.md. [Eduard Veit]
* :memo: add .env.example. [Eduard Veit] * :memo: add example.env. [Eduard Veit]
* :memo: write README.md. [Eduard Veit] * :memo: write README.md. [Eduard Veit]
### Other ### Other
* :recycle: refactor, fix and debug error handling. [Eduard Veit]
* :recycle: refactor main code. [Eduard Veit]
* Initial commit. [EV21] * Initial commit. [EV21]

View File

@@ -31,14 +31,10 @@ The following update methods are currently implemented:
* `curl` - The minimum requirement for running DynDNS2 operations * `curl` - The minimum requirement for running DynDNS2 operations
essential for APIs: also essential if you are using other 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 ## 🚀 Installation
Download the latest release Download the latest release
@@ -57,7 +53,7 @@ This convenience function only works if `util-linux` is installed on your system
## ⚙ Configuration ## ⚙ Configuration
You can use a config in form of an `.env` file. You can use a config in form of an `.env` file.
Or if your system meets the relevant requirements you can use CLI parameters. Or you can just use CLI parameters.
Create `.env` in the app root directory or at `~/.local/share/dynb/.env`. Create `.env` in the app root directory or at `~/.local/share/dynb/.env`.
``` ```

327
dynb.sh
View File

@@ -55,7 +55,6 @@ _new_IPv4=
_new_IPv6= _new_IPv6=
_dns_records= _dns_records=
_main_domain= _main_domain=
_has_getopt=
_is_IPv4_enabled=false _is_IPv4_enabled=false
_is_IPv6_enabled=false _is_IPv6_enabled=false
_interface_str= _interface_str=
@@ -72,6 +71,222 @@ _configFile=$HOME/.local/share/dynb/.env
_statusFile=/tmp/dynb.status _statusFile=/tmp/dynb.status
_debug=1 _debug=1
# 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_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
die()
{
local _ret="${2:-1}"
test "${_PRINT_HELP:-no}" = yes && print_help >&2
echo "$1" >&2
exit "${_ret}"
}
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=
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>] [-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' "-h, --help: Prints help"
}
parse_commandline()
{
while test $# -gt 0
do
_key="$1"
case "$_key" in
-v|--no-version|--version)
_arg_version="on"
test "${1:0:5}" = "--no-" && _arg_version="off"
;;
-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
;;
-l|--no-link|--link)
_arg_link="on"
test "${1:0:5}" = "--no-" && _arg_link="off"
;;
-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
;;
-r|--no-reset|--reset)
_arg_reset="on"
test "${1:0:5}" = "--no-" && _arg_reset="off"
;;
-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
;;
--no-debug|--debug)
_arg_debug="on"
test "${1:0:5}" = "--no-" && _arg_debug="off"
;;
-m|--update-method)
test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1
_arg_update_method="$2"
shift
;;
--update-method=*)
_arg_update_method="${_key##--update-method=}"
;;
-m*)
_arg_update_method="${_key##-m}"
;;
-i|--ip-mode)
test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1
_arg_ip_mode="$2"
shift
;;
--ip-mode=*)
_arg_ip_mode="${_key##--ip-mode=}"
;;
-i*)
_arg_ip_mode="${_key##-i}"
;;
-d|--domain)
test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1
_arg_domain="$2"
shift
;;
--domain=*)
_arg_domain="${_key##--domain=}"
;;
-d*)
_arg_domain="${_key##-d}"
;;
-s|--service-provider)
test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1
_arg_service_provider="$2"
shift
;;
--service-provider=*)
_arg_service_provider="${_key##--service-provider=}"
;;
-s*)
_arg_service_provider="${_key##-s}"
;;
-u|--username)
test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1
_arg_username="$2"
shift
;;
--username=*)
_arg_username="${_key##--username=}"
;;
-u*)
_arg_username="${_key##-u}"
;;
-p|--password)
test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1
_arg_password="$2"
shift
;;
--password=*)
_arg_password="${_key##--password=}"
;;
-p*)
_arg_password="${_key##-p}"
;;
-t|--token)
test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1
_arg_token="$2"
shift
;;
--token=*)
_arg_token="${_key##--token=}"
;;
-t*)
_arg_token="${_key##-t}"
;;
-h|--help)
print_help
exit 0
;;
-h*)
print_help
exit 0
;;
*)
_PRINT_HELP=yes die "FATAL ERROR: Got an unexpected argument '$1'" 1
;;
esac
shift
done
}
parse_commandline "$@"
# OTHER STUFF GENERATED BY Argbash
### END OF CODE GENERATED BY Argbash (sortof) ### ])
# [ <-- needed because of Argbash
_help_message="$(cat << 'EOF' _help_message="$(cat << 'EOF'
dynb - dynamic DNS update script for bash dynb - dynamic DNS update script for bash
@@ -422,69 +637,45 @@ function ipHasChanged() {
fi fi
} }
############### ################
## arguments ## ## parameters ##
############### ################
ARGS= function handleParameters() {
if [[ $_has_getopt == "" ]] && [[ $(uname) == Linux ]]; then if [[ $_arg_version == "on" ]]; then
ARGS=$(getopt --options "hvi:,d:,m:,s:,u:,p:,t:" --longoptions "help,version,link,ip-mode:,domain:,update-method:,service-provider:,username:,password:,token:,reset" -- "$@"); echo $_version
fi exit 0
eval set -- "$ARGS"; fi
unset ARGS if [[ $_arg_link == "on" ]]; then
ln --verbose --symbolic "$(realpath "$0")" "$HOME/.local/bin/dynb"
function processParameters() { exit 0
while true; do fi
case $1 in if [[ $_arg_reset == "on" ]]; then
-h | --help ) rm --verbose "$_statusFile"
echo "$_help_message" exit 0
exit 0 fi
;; if [[ $_arg_update_method != "" ]]; then
-v | --version ) _update_method=$_arg_update_method
echo "$_version" fi
exit 0 if [[ $_arg_ip_mode != "" ]]; then
;; _ip_mode=$_arg_ip_mode
--link ) fi
ln --verbose --symbolic "$(realpath "$0")" "$HOME/.local/bin/dynb" if [[ $_arg_domain != "" ]]; then
exit 0 _dyn_domain=$_arg_domain
;; fi
-i | --ip-mode ) if [[ $_arg_service_provider != "" ]]; then
_ip_mode=$2 _serviceProvider=$_arg_service_provider
shift 2 fi
;; if [[ $_arg_username != "" ]]; then
-d | --domain ) _username=$_arg_username
_dyn_domain=$2 fi
shift 2 if [[ $_arg_password != "" ]]; then
;; _password=$_arg_password
-m | --update-method ) fi
_update_method=$2 if [[ $_arg_token != "" ]]; then
shift 2 _token=$_arg_token
;; fi
-s | --service-provider ) return 0
_serviceProvider=$2
shift 2
;;
-u | --username )
_username=$2
shift 2
;;
-p | --password )
_password=$2
shift 2
;;
-t | --token )
_token=$2
shift 2
;;
--reset )
rm --verbose "$_statusFile"
exit 0
;;
--)
shift
break
esac
done
} }
################## ##################
@@ -505,10 +696,6 @@ function checkDependencies() {
exit 1 exit 1
fi fi
} }
# maybe replace this with matejak/argbash
[[ -x $(command -v getopt 2> /dev/null) ]] || {
_has_getopt=false
}
} }
function doUnsets() { function doUnsets() {
@@ -557,9 +744,7 @@ function dynb() {
source "$_statusFile" source "$_statusFile"
fi fi
if [[ $_has_getopt == "" ]] && [[ $(uname) == Linux ]]; then handleParameters
processParameters "$@"
fi
if [[ $_network_interface != "" ]]; then if [[ $_network_interface != "" ]]; then
_interface_str="--interface $_network_interface" _interface_str="--interface $_network_interface"
@@ -628,3 +813,5 @@ function dynb() {
dynb "${@}" dynb "${@}"
exit $? exit $?
# ] <-- needed because of Argbash