*.deb extraction utility (also *.dsc by wrapping “dpkg-source -x”)
[shellsnippets/shellsnippets.git] / mksh / sysadmin / mkhosts
1 #!/bin/mksh
2 # $Id: mkhosts 2083 2011-06-09 20:48:55Z tglase $
3 #-
4 # Copyright © 2010, 2011
5 #       Thorsten Glaser <t.glaser@tarent.de>
6 # Licenced under the AGPLv3
7
8 [[ $1 = really && $USER_ID = 0 ]] || exec sudo mksh "$0" really "$@"
9 shift
10
11 myipsx=
12 target=
13 while getopts "h:i:" ch; do
14         case $ch {
15         (h) target=$OPTARG ;;
16         (i) myipsx=$OPTARG ;;
17         (*) print -u2 "Usage: $0 [-h new.fqdn] [-i ip]"; exit 1 ;;
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         if [[ -n $target ]]; then
56                 hn=$target
57                 print -r -- "$hn"
58         else
59                 read hn
60         fi
61         [[ $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
62         if [[ -n $target ]]; then
63                 print -u2 Invalid hostname.
64                 exit 1
65         fi
66 done
67
68 if (( noips )); then
69         is="127.0.0.1   $hn ${hn%%.*} localhost localhost.localdomain"
70 else
71         is="127.0.0.1   localhost localhost.localdomain"
72         for ip in "${myips[@]}"; do
73                 is="$is${nl}$ip $hn ${hn%%.*}"
74         done
75 fi
76
77 [[ -d /etc/sysconfig/. ]] && \
78     if [[ -e /etc/sysconfig/network || ! -e /etc/hostname ]]; then
79         grep -vi '^HOSTNAME=' /etc/sysconfig/network >/etc/sysconfig/network~
80         echo "HOSTNAME=$hn" >>/etc/sysconfig/network~
81         cat /etc/sysconfig/network~ >/etc/sysconfig/network
82         rm -f /etc/sysconfig/network~
83 fi
84 [[ -e /etc/hostname || ! -d /etc/sysconfig/. ]] && \
85     echo $hn >/etc/hostname
86 cat >/etc/hosts <<-EOF
87         $is
88
89         ::1     ip6-localhost ip6-loopback localhost6 localhost6.localdomain6
90         fe00::0 ip6-localnet
91         ff00::0 ip6-mcastprefix
92         ff02::1 ip6-allnodes
93         ff02::2 ip6-allrouters
94         ff02::3 ip6-allhosts
95 EOF
96 echo $hn >/proc/sys/kernel/hostname
97 hostname $hn
98 test x"$(hostname -f)" = x"$hn" && exit 0
99 echo "Hostname $(hostname -f) ($(hostname)) doesn’t match $hn!"
100 exit 1