diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 97ce921..587b8b3 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,7 +1,6 @@ { "recommendations": [ "mads-hartmann.bash-ide-vscode", - "rogalmic.bash-debug", - "mkhl.shfmt", + "rogalmic.bash-debug" ], } \ No newline at end of file diff --git a/tools/fqdn b/tools/fqdn new file mode 100755 index 0000000..c183504 --- /dev/null +++ b/tools/fqdn @@ -0,0 +1,90 @@ +#!/usr/bin/env bash + +# CONSTANTS + +BASEDIR=$(dirname "$0") +COMMAND=show + +# FUNCTIONS +function usage { + echo "usage: $(basename "$0") [--set NEW_FQDN]" + echo " either returns the fully qualified name when pass with no argument" + echo " or define the new fully qualified name when pass --set {NEW_FQDN}" +} + +function parse_options { + while [[ $# -gt 0 ]]; do + case "$1" in + '--set') + COMMAND=define + shift 1 + [[ -z ${1:-} || $1 =~ ^- ]] && usage && exit 1 + NEW_FQDN=$1 + ;; + --help | -h) + usage && exit 0 + ;; + *) + echo >&2 "Unknown option: $1" && usage && exit 2 + ;; + esac + + shift 1 # Move to the next argument + done +} + +function show { + hostname -f +} + +function define { + if [[ $NEW_FQDN == *.* ]]; then + name=$(echo $NEW_FQDN | cut -d. -f1) + domain=${NEW_FQDN#${name}.} + if [[ -n $domain ]]; then + define_fqdn $name $domain + else + define_single $name + fi + else + define_single $NEW_FQDN + fi +} + +function define_single { + local single=$1 + local previous=$(hostname -f) + for i in $(grep $previous /etc/hosts | cut -f1); do + append_or_replace ^$i.* "$i\t$single" /etc/hosts >/dev/null + done + hostnamectl hostname $single +} + +function define_fqdn { + local name=$1 + local domain=$2 + local previous=$(hostname -f) + + for i in $(grep $previous /etc/hosts | cut -f1); do + append_or_replace ^$i.* "$i\t$name.$domain $name" /etc/hosts >/dev/null + done + hostnamectl hostname $name +} + +function perform_command { + case $COMMAND in + show) + show + ;; + define) + [[ $(id -u) != 0 ]] && echo 'require root privilege, please prepend the command with `sudo`' && exit 10 + define + ;; + esac +} + +# MAIN + +set -Eue +parse_options $* +perform_command