#!/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