#!/bin/sh
# Filename:      grml-hostname
# Purpose:       simple frontend to set hostname
# Authors:       (c) Michael Prokop <mika@grml.org>
# Bug-Reports:   see http://grml.org/bugs/
# License:       This file is licensed under the GPL v2.
################################################################################

. /etc/grml/script-functions

check4root || exit 1

[ -n "$SUDO_USER" ] && RUNASUSER=$SUDO_USER || RUNASUSER=grml

PN='grml-hostname'
OLDHOSTNAME="$(hostname)"

case "$1" in -h|--help) echo "Usage: $0 [hostname]">&2; exit 1 ;; esac

if [ -n "$1" ] ; then
   NEW_HOSTNAME="$1"
   NONINTERACTIVE=1
else
   if [ -x /usr/bin/random-hostname ] ; then
      NEW_HOSTNAME="$(/usr/bin/random-hostname)"
   else
      NEW_HOSTNAME="$(hostname)"
   fi
fi

if [ -z "$NONINTERACTIVE" ] ; then
   NEW_HOSTNAME="$(dialog --stdout --title "${PN}" --extra-button --extra-label "Propose hostname" \
   --inputbox "Set hostname (/etc/hostname, /etc/hosts and /etc/postfix/main.cf will be adjusted)\
\n\nTip: press 'Propose hostname' for another proposal" 14 70 $NEW_HOSTNAME)"
  retval=$?
else
  retval=0
fi

# stupid + simplified checking for valid hostname (according to RFC 952)
VALIDATE=$(echo "$NEW_HOSTNAME" | tr --delete '[:alnum:]-')
if [ -n "$VALIDATE" ] ; then
  if [ -z "$NONINTERACTIVE" ] ; then
    dialog --title "${PN}" \
      --msgbox "Error: invalid characters specified in hostname: '$VALIDATE' can not be used inside hostnames." \
      0 0
    exec "$0"
  else
    echo "Error: invalid characters specified in hostname: '$VALIDATE' can not be used inside hostnames." >&2
    exit 1
  fi
fi

case $retval in
  0)
     echo "$NEW_HOSTNAME" > /etc/hostname
     echo "$NEW_HOSTNAME" > /etc/mailname
     sed -ir "s/^\(127.0.0.1\s*\).*localhost.*/\1$NEW_HOSTNAME localhost/" /etc/hosts
     sed -ir "s/^\(::1\s*\).*ip6-localhost.*/\1ip6-localhost ip6-loopback $NEW_HOSTNAME/" /etc/hosts

     POSTFIX=''
     if [ -r /etc/postfix/main.cf ] ; then
       sed -i "s/^mydestination = .*/mydestination = $NEW_HOSTNAME, localhost, localhost.localdomain/" /etc/postfix/main.cf && \
       sed -i "s/^myhostname = .*/myhostname = $NEW_HOSTNAME/" /etc/postfix/main.cf && POSTFIX='
Configuration of myhostname in /etc/postfix/main.cf has been adjusted as well. Do not forget to restart postfix if necessary.'
     fi

     if [ -n "$DISPLAY" ] ; then
       if sudo -u $RUNASUSER xauth add $(xauth -n list | grep "${OLDHOSTNAME}/unix:0" | sed "s|${OLDHOSTNAME}/unix:0|${NEW_HOSTNAME}/unix:0|") ; then
	  sudo -u $RUNASUSER xauth remove "${OLDHOSTNAME}/unix:0"
       fi
     fi

     if [ -x /etc/init.d/avahi-daemon ] && pgrep avahi-daemon >/dev/null ; then
       /etc/init.d/avahi-daemon restart
     fi

     /etc/init.d/hostname.sh

     if [ -z "$NONINTERACTIVE" ] ; then
        dialog --stdout --title "${PN}" --msgbox "Setting hostname to $NEW_HOSTNAME was successful.$POSTFIX" 0 0
     else
        echo "Setting hostname to $NEW_HOSTNAME: done"
     fi
     exit 0
     ;;
  1)
     echo "Cancel pressed."
     ;;
  3)
     $0 ;;
  255)
     echo "ESC pressed."
     ;;
esac

## END OF FILE #################################################################
