Do option handling better. Update README.md.

This commit is contained in:
Darren 'Tadgy' Austin 2023-11-05 18:37:39 +00:00
commit ece8ebe054
2 changed files with 47 additions and 52 deletions

View file

@ -13,7 +13,7 @@ Usage
Configuration options for `pushover-client` can be provided in a (user specifiable or default) configuration file, given on the command line, or a mixture Configuration options for `pushover-client` can be provided in a (user specifiable or default) configuration file, given on the command line, or a mixture
of both. of both.
The basic usage of the pushover client is: `pushover-client [options] [config file]`. The basic usage of the pushover client is: `pushover-client [config file] [options]`.
There are three **required** options that must be given in either the default or user specified custom config file, or on the command line: There are three **required** options that must be given in either the default or user specified custom config file, or on the command line:
1. The user key(s) (config file: `USER_KEYS`, command line:` -u|--user`). 1. The user key(s) (config file: `USER_KEYS`, command line:` -u|--user`).
@ -27,7 +27,7 @@ to specify the "dynamic" options (such as the message/alert to be sent).
Config files Config files
------------ ------------
Config files can be used to define "usages" or alert types for individual circumstances. Specifying the majority of "fixed" configuration options in the Config files can be used to define "usages" or alerts or individual circumstances. Specifying the majority of "fixed" configuration options in the
config file makes the command line of `pushover-client` cleaner and easier to use. config file makes the command line of `pushover-client` cleaner and easier to use.
A properly configured config file specified on the command line can be the only item required to send an alert. A properly configured config file specified on the command line can be the only item required to send an alert.

View file

@ -23,9 +23,15 @@ show_help() {
#........1.........2.........3.........4.........5.........6.........7.........8 #........1.........2.........3.........4.........5.........6.........7.........8
cat <<-EOF cat <<-EOF
Usage: $SCRIPT [options] [config file] Usage: $SCRIPT [config file] [options]
Push notifications to your https://pushover.net registered devices. Push notifications to your https://pushover.net registered devices.
If [config_file] is specified it is used to read the default configuration.
If [config_file] is not specified, a custom user or system 'default' file will be
read to obtain the defaults. If no 'default' custom user or system config file
can be read, command line options are required for operation.
Command line [options] override any config file.
Options: Options:
-a, --attachment <filename> The picture to send with the alert. No default. -a, --attachment <filename> The picture to send with the alert. No default.
-A, --api-url <url> The API URL to use for this submission. Default -A, --api-url <url> The API URL to use for this submission. Default
@ -126,13 +132,7 @@ show_help() {
--url-title <text> The title of the URL given with -U. Ignored --url-title <text> The title of the URL given with -U. Ignored
if -U is not used also. if -U is not used also.
Quote <text> if it contains spaces. Quote <text> if it contains spaces.
Option processing ceases with the first non-option argument, or "--". Option processing ceases with "--".
If 'config_file' is specified it is used to read the default configuration. If
'config_file' is not specified, a user specific or system default file will be
read to obtain the defaults. Command line options override any config file.
If no default user specific or system config file can be read, command line
options are required for operation.
For example usage, use: $SCRIPT --examples For example usage, use: $SCRIPT --examples
EOF EOF
@ -143,12 +143,12 @@ show_examples() {
#........1.........2.........3.........4.........5.........6.........7.........8 #........1.........2.........3.........4.........5.........6.........7.........8
cat <<-EOF cat <<-EOF
Basic usage is: $SCRIPT [options] [config file] Basic usage is: $SCRIPT [config file] [options]
[options] can be seen by running: $SCRIPT --help
[config file] configuration options are overridden by command line [options]. [config file] configuration options are overridden by command line [options].
All or part settings may be specified in the [config file], with the addition of All or part settings may be specified in the [config file], with the addition of
command line [options] to augment the [config file] settings. command line [options] to augment the [config file] settings.
[options] can be seen by running: $SCRIPT --help
Command line examples: Command line examples:
Send a plain text message to all devices, showing all required [options]. Send a plain text message to all devices, showing all required [options].
@ -191,47 +191,45 @@ show_examples() {
EOF EOF
} }
# Get the last and second to last arguments of the command line. # Pick out possible config file and '--' arguments of the command line.
ARGS=( "$@" ) ARGS=( "$@" )
(( ${#ARGS[@]} != 0 )) && LAST_ARG="${ARGS[-1]}" (( ${#ARGS[@]} >= 1 )) && FIRST_ARG="${ARGS[0]}"
(( ${#ARGS[@]} >= 2 )) && PREV_ARG="${ARGS[-2]}" (( ${#ARGS[@]} >= 2 )) && SECOND_ARG="${ARGS[1]}"
# If a config file was given on the command line, read it; otherwise read the default. # Get the config filename if it was given on the command line, or use the default.
if [[ -z "$LAST_ARG" ]] || { [[ "$LAST_ARG" == -* ]] && [[ "$PREV_ARG" != "--" ]]; }; then [[ -z "$FIRST_ARG" ]] || [[ "$FIRST_ARG" =~ -[^-] ]] && FILENAME="$DEFAULT_CONFIG_FILE" && SKIP_CUSTOM=1
# Read the default configs as a basis for options. [[ ! -v FILENAME ]] && [[ "$FIRST_ARG" != -* ]] && FILENAME="$FIRST_ARG" && unset "ARGS[0]"
if [[ -r "$DEFAULT_USER_DIR/$DEFAULT_CONFIG_FILE" ]]; then [[ ! -v FILENAME ]] && [[ "$FIRST_ARG" == "--" ]] && [[ -n "$SECOND_ARG" ]] && FILENAME="$SECOND_ARG" && unset "ARGS[1]"
eval "$(awk '!/^(#|$|[[:blank:]]*$)/ { print "CONFIG_"$0 }' "$DEFAULT_USER_DIR/$DEFAULT_CONFIG_FILE")" 2>/dev/null || {
printf "%s: %s '%s'\\n" "${0##*/}" "error in config file" "$DEFAULT_USER_DIR/$DEFAULT_CONFIG_FILE" >&2 # Find and validate the correct config filename.
if (( ${SKIP_CUSTOM:-0} == 1 )) && [[ -e "$DEFAULT_USER_DIR/$FILENAME" ]] && [[ ! -d "$DEFAULT_USER_DIR/$FILENAME" ]] && \
[[ -r "$DEFAULT_USER_DIR/$FILENAME" ]]; then
FILENAME="$DEFAULT_USER_DIR/$FILENAME"
elif (( ${SKIP_CUSTOM:-0} == 1 )) && [[ -e "$DEFAULT_SYSTEM_DIR/$FILENAME" ]] && [[ ! -d "$DEFAULT_SYSTEM_DIR/$FILENAME" ]] && \
[[ -r "$DEFAULT_SYSTEM_DIR/$FILENAME" ]]; then
FILENAME="$DEFAULT_SYSTEM_DIR/$FILENAME"
elif [[ "${FILENAME:0:1}" != "/" ]] && [[ -e "$FILENAME" ]] && [[ ! -d "$FILENAME" ]] && [[ -r "$FILENAME" ]]; then
:
elif [[ "${FILENAME:0:1}" != "/" ]] && [[ -e "$DEFAULT_USER_DIR/$FILENAME" ]] && [[ ! -d "$DEFAULT_USER_DIR/$FILENAME" ]] && \
[[ -r "$DEFAULT_USER_DIR/$FILENAME" ]]; then
FILENAME="$DEFAULT_USER_DIR/$FILENAME"
elif [[ "${FILENAME:0:1}" != "/" ]] && [[ -e "$DEFAULT_SYSTEM_DIR/$FILENAME" ]] && [[ ! -d "$DEFAULT_SYSTEM_DIR/$FILENAME" ]] && \
[[ -r "$DEFAULT_SYSTEM_DIR/$FILENAME" ]]; then
FILENAME="$DEFAULT_SYSTEM_DIR/$FILENAME"
elif [[ "${FILENAME:0:1}" == "/" ]] && [[ -e "$FILENAME" ]] && [[ ! -d "$FILENAME" ]] && [[ -r "$FILENAME" ]]; then
:
elif [[ -n "$FILENAME" ]]; then
printf "%s: '%s' %s\\n" "${0##*/}" "$FILENAME" "invalid config file name" >&2
exit 1 exit 1
}
elif [[ -r "$DEFAULT_SYSTEM_DIR/$DEFAULT_CONFIG_FILE" ]]; then
eval "$(awk '!/^(#|$|[[:blank:]]*$)/ { print "CONFIG_"$0 }' "$DEFAULT_SYSTEM_DIR/$DEFAULT_CONFIG_FILE")" 2>/dev/null || {
printf "%s: %s '%s'\\n" "${0##*/}" "error in config file" "$DEFAULT_SYSTEM_DIR/$DEFAULT_CONFIG_FILE" >&2
exit 1
}
fi fi
elif [[ "$LAST_ARG" != -* ]] || { [[ "$LAST_ARG" == -* ]] && [[ "$PREV_ARG" == "--" ]]; }; then
# Read the config file given on the command line. # Read the config file.
if [[ "${LAST_ARG:0:1}" == "/" ]]; then [[ -n "$FILENAME" ]] && {
[[ -e "$LAST_ARG" ]] && [[ ! -d "$LAST_ARG" ]] && [[ -r "$LAST_ARG" ]] && FILENAME="$LAST_ARG"
else
[[ -e "$LAST_ARG" ]] && [[ ! -d "$LAST_ARG" ]] && [[ -r "$LAST_ARG" ]] && FILENAME="$LAST_ARG"
[[ -z "$FILENAME" ]] && [[ -e "$DEFAULT_USER_DIR/$LAST_ARG" ]] && [[ ! -d "$DEFAULT_USER_DIR/$LAST_ARG" ]] && [[ -r "$DEFAULT_USER_DIR/$LAST_ARG" ]] && \
FILENAME="$DEFAULT_USER_DIR/$LAST_ARG"
[[ -z "$FILENAME" ]] && [[ -e "$DEFAULT_SYSTEM_DIR/$LAST_ARG" ]] && [[ ! -d "$DEFAULT_SYSTEM_DIR/$LAST_ARG" ]] && [[ -r "$DEFAULT_SYSTEM_DIR/$LAST_ARG" ]] && \
FILENAME="$DEFAULT_SYSTEM_DIR/$LAST_ARG"
fi
[[ -z "$FILENAME" ]] && {
printf "%s: '%s' %s\\n" "${0##*/}" "$LAST_ARG" "invalid config file name" >&2
exit 1
}
eval "$(awk '!/^(#|$|[[:blank:]]*$)/ { print "CONFIG_"$0 }' "$FILENAME")" 2>/dev/null || { eval "$(awk '!/^(#|$|[[:blank:]]*$)/ { print "CONFIG_"$0 }' "$FILENAME")" 2>/dev/null || {
printf "%s: %s '%s'\\n" "${0##*/}" "error in config file" "$FILENAME" >&2 printf "%s: %s '%s'\\n" "${0##*/}" "error in config file" "$FILENAME" >&2
exit 1 exit 1
} }
unset "ARGS[-1]" }
(( ${#ARGS[@]} > 0 )) && [[ "${ARGS[-1]}" == "--" ]] && unset "ARGS[-1]"
fi
# Parse command line options. # Parse command line options.
set -- "${ARGS[@]}" set -- "${ARGS[@]}"
@ -395,21 +393,18 @@ while [[ -n "$1" ]]; do
shift shift
break break
;; ;;
-*) *)
printf "%s: %s: %s\\n" "${0##*/}" "invalid option" "$1" >&2 printf "%s: %s: %s\\n" "${0##*/}" "invalid option" "$1" >&2
printf "%s: %s %s\\n" "Try" "${0##*/}" "--help" >&2 printf "%s: %s %s\\n" "Try" "${0##*/}" "--help" >&2
exit 1 exit 1
;; ;;
*)
break
;;
esac esac
shift shift
done done
# The options list should be empty if the correct syntax was used. # The options list should be empty if the correct syntax was used.
[[ -n "$1" ]] && { [[ -n "$1" ]] && {
printf "%s: %s\\n" "${0##*/}" "too many non-option arguments provided" >&2 printf "%s: %s\\n" "${0##*/}" "options cannot come after --" >&2
exit 1 exit 1
} }