#!/bin/sh PROGRAM=setup-hostname PREFIX=@PREFIX@ . $PREFIX/lib/libalpine.sh usage() { cat <<-__EOF__ usage: setup-hostname [-h] [-n HOSTNAME] Sets the system hostname. options: -h Show this help -n Hostname to set non-interactively Sets hostname to HOSTNAME or prompt if unspecified. __EOF__ exit 1 } # http://en.wikipedia.org/wiki/Hostname#Restrictions_on_valid_host_names valid_hostname() { # check length if [ $(echo "$1" | wc -c) -gt 255 ]; then echo "Hostname '$1' is too long." return 1 fi # check that it only contains valid chars if ! [ -z "$(echo $1 | sed 's/[0-9a-z.-]//g')" ]; then echo "Hostname must only contain letters (a-z), digits (0-9), '.' or '-'" return 1 fi # must not start with - or . case "$1" in -*) echo "Hostname must not start with a '-'"; return 1;; .*) echo "Hostname must not start with a '.'"; return 1;; esac return 0 } while getopts "hn:" opt; do case $opt in h) usage;; n) name="$OPTARG";; esac done shift $(( $OPTIND - 1 )) if [ -z "$name" ] && [ $# -eq 1 ]; then name="$1" fi # if name is set, then we run non-interactively if [ -n "$name" ] && ! valid_hostname "$name"; then exit 1 fi HOST="$name" while [ -z "$name" ]; do HOST=$(hostname) ask "Enter system hostname (fully qualified form, e.g. 'foo.example.org')" "$HOST" if valid_hostname "$resp"; then HOST="$resp" break fi done mkdir -p "$ROOT/etc" echo "$HOST" > "$ROOT/etc/hostname"