3133c69c8cf194014767e6c0ad0b8cc604f1153e
[shellsnippets/shellsnippets.git] / mksh / sysadmin / mkhosts
1 #!/bin/mksh
2 # DEB $Id: mkhosts 1671 2011-02-11 13:16:02Z tglase $
3 # RPM $Id: mkhosts 1687 2011-02-14 13:37:38Z tglase $
4 #-
5 # Copyright © 2010, 2011
6 #       Thorsten Glaser <t.glaser@tarent.de>
7 # Licenced under the AGPLv3
8
9 rpm=0
10
11 [[ $1 = really && $USER_ID = 0 ]] || exec sudo mksh "$0" really "$@"
12 shift
13
14 myipsx=
15 while getopts "i:" ch; do
16         case $ch {
17         (i) myipsx=$OPTARG ;;
18         }
19 done
20 shift $((OPTIND - 1))
21
22 nl='
23 '
24 saveIFS=$IFS
25 IFS=,
26 set -A ips -- $myipsx
27 IFS=$saveIFS
28 set -A myips
29 for ip in "${ips[@]}"; do
30         skip=0
31         if [[ $ip = +([0-9]).+([0-9]).+([0-9]).+([0-9]) ]]; then
32                 IFS=.
33                 set -A ipsub -- $ip
34                 IFS=$saveIFS
35                 for x in ${ipsub[*]}; do
36                         (( x < 0 || x > 255 )) && skip=1
37                 done
38                 ip=$((ipsub[0])).$((ipsub[1])).$((ipsub[2])).$((ipsub[3]))
39         elif [[ $ip = +([0-9a-fA-F:]) ]]; then
40                 : #XXX check validity
41         else
42                 skip=1
43         fi
44         if (( skip )); then
45                 print -u2 "WARNING: skipping invalid IP '$ip'"
46         else
47                 myips[${#myips[*]}]=$ip
48         fi
49 done
50 (( ${#myips[*]} )); noips=$?
51
52 printf '%s\n' "Old Hostname: $(hostname -f) ($(hostname))"
53 while :; do
54         printf "New Hostname: "
55         read hn
56         [[ $hn = [a-zA-Z0-9]?(*([a-zA-Z0-9-])[a-zA-Z0-9])+(.[a-zA-Z0-9]?(*([a-zA-Z0-9-])[a-zA-Z0-9])) ]] && break
57 done
58
59 if (( noips )); then
60         if (( rpm )); then
61                 is="127.0.0.1   $hn ${hn%%.*} localhost localhost.localdomain"
62         else
63                 is="127.0.0.1   $hn ${hn%%.*} localhost"
64         fi
65 else
66         if (( rpm )); then
67                 is="127.0.0.1   localhost localhost.localdomain"
68         else
69                 is="127.0.0.1   localhost"
70         fi
71         for ip in "${myips[@]}"; do
72                 is="$is${nl}$ip $hn ${hn%%.*}"
73         done
74 fi
75
76 if (( rpm )); then
77         grep -vi '^HOSTNAME=' /etc/sysconfig/network >/etc/sysconfig/network~
78         echo "HOSTNAME=$hn" >>/etc/sysconfig/network~
79         cat /etc/sysconfig/network~ >/etc/sysconfig/network
80         rm -f /etc/sysconfig/network~
81         cat >/etc/hosts <<-EOF
82                 $is
83
84                 ::1             localhost6 localhost6.localdomain6
85 EOF
86 else
87         echo $hn >/etc/hostname
88         cat >/etc/hosts <<-EOF
89                 $is
90
91                 ::1     ip6-localhost ip6-loopback
92                 fe00::0 ip6-localnet
93                 ff00::0 ip6-mcastprefix
94                 ff02::1 ip6-allnodes
95                 ff02::2 ip6-allrouters
96                 ff02::3 ip6-allhosts
97 EOF
98 fi
99 echo $hn >/proc/sys/kernel/hostname
100 hostname $hn
101 test x"$(hostname -f)" = x"$hn" && exit 0
102 echo "Hostname $(hostname -f) ($(hostname)) doesn’t match $hn!"
103 exit 1