Fix usage of rpcinfo being available inside /usr/sbin nowadays [Closes: issue1274]
[grml-terminalserver.git] / grml-terminalserver-config
1 #!/bin/bash
2 # Filename:      terminalserver-config
3 # Purpose:       configuration program for grml-terminalserver
4 # Authors:       grml-team (grml.org), (c) Michael Gebetsroither <gebi@grml.org>
5 # Bug-Reports:   see http://grml.org/bugs/
6 # License:       This file is licensed under the GPL v2.
7 ################################################################################
8
9
10 ###
11 ### __INCLUDES
12 ###
13 . /etc/grml/sh-lib
14 #. /etc/grml/sysexits-sh
15
16
17
18 ###
19 ### __VARIABLES
20 ###
21
22 verbose_=0
23
24 # this file holds all variable definitions
25 SHARED_PROG_VARS_="/usr/share/grml-terminalserver/shared_prog_vars"
26 isExistent $SHARED_PROG_VARS_ die
27 . $SHARED_PROG_VARS_
28
29 # variables used in the config file for grml-terminalserver
30 INTERFACE_=""
31 IP_=""
32 NETMASK_=""
33 GW_=""
34 NAMESERVERS_=""
35 IPRANGE_FROM_=""
36 IPRANGE_TO_=""
37 NETWORK_=""
38 OPTIONS_=""
39 BOOT_ARGS_=""
40 NAT_INTERFACE_=""
41
42
43 ###
44 ### __FUNCTIONS
45 ###
46
47 function printUsage
48 {
49   cat <<EOT
50 Usage: "$PROG_NAME__" [OPTIONS] <command>
51
52 $PROG_NAME__ is the config program for the terminalserver coming with grml.
53
54 COMMANDS:
55
56    help             This help text
57    interactive      Interactive Configuration of the grml-terminalserver
58    initrd           Only create the initrd
59    clean            Remove all configfiles created during user configuration
60    <default>        interactive mode
61
62 OPTIONS:
63    -v               verbose (show what is going on, v++)
64    -h               this help text
65
66 EOT
67 }
68
69
70 function writeConfig
71 {
72   local date_=""
73
74   if [ -f $CONF_FILE_ ]; then
75     mv -fb $CONF_FILE_ ${CONF_FILE_}-old
76   fi
77
78   date_=`date`
79   cat <<EOT > $CONF_FILE_
80 # GRML TERMINAL-SERVER CONFIG
81 # created on "$date_"
82 INTERFACE_="$INTERFACE_"
83 IP_="$IP_"
84 NETWORK_="$NETWORK_"
85 NETMASK_="$NETMASK_"
86 GW_="$GW_"
87 NAMESERVERS_="$NAMESERVERS_"
88 IPRANGE_FROM_="$IPRANGE_FROM_"
89 IPRANGE_TO_="$IPRANGE_TO_"
90 OPTIONS_="$OPTIONS_"
91 BOOT_ARGS_="$BOOT_ARGS_"
92 NAT_INTERFACE_="$NAT_INTERFACE_"
93
94 EOT
95   notice "config successfully safed to \"$CONF_FILE_\""
96 }
97
98
99 # AUTOMATIC CONFIGURATION  {{{
100 function checkParamArg
101 {
102   local param_name="$1"
103   local arg="$2"
104
105   #eval "echo $`echo $test`"
106   echo $arg |grep "^[-|+]" &>/dev/null || return
107
108   die "Argument from $param_name looks like another parameter \"$arg\"" 1
109 }
110
111 function actionAutoconf
112 {
113   checkParamArg "-i" "$interface_"
114 }
115 # }}}
116
117 # INITRD {{{
118 function actionMkInitrd
119 {
120   echo "Installing initrd $PATH_/initrd.img:"
121   # until we have a stable file location API let's use
122   # an according heuristic
123   initrd_=initrd.img-"$(uname -r)"
124   cp /boot/"$initrd_" "$PATH_"/initrd.img || die "Could not copy /boot/$initrd_"
125 }
126
127 # }}}
128
129 # INTERACTIVE CONFIGURATION  {{{
130
131 function actionInteractive
132 {
133   local i=""
134
135   dprint "running in interactive mode"
136
137   local card_title_="Choose network device connected to client network"
138   local card_message_="Available network devices:"
139   local iprange_title_="IP Address range for clients"
140   local iprange_message_="
141 Please enter the desired IP-Range of addresses that should be allocated by clients, separated by a single space.
142
143 Example:
144           192.168.0.101 192.168.0.200
145
146 for addresses from 192.168.0.101 to (and including) 192.168.0.200.
147
148 "
149   local runconfig_title_="Networkcard config"
150   local runconfig_message_="Would you like to configure your interfaces now?"
151
152   # on which interfaces should we listen
153   local netdevices_="$(grep -ve 'lo:' -ve 'Inter-|' -ve 'face |bytes' /proc/net/dev | awk -F: '{print $1}')"
154   local device_list_=""
155   for INTERFACE_ in $netdevices_; do device_list_="$device_list_ ${INTERFACE_} Networkcard_${INTERFACE_##eth}"; done
156     echo -n "" >"$TMP_"
157     $DIALOG_ --backtitle "$BACK_TITLE_" --title "$card_title_" --menu "$card_message_" \
158       0 0 18 $device_list_ 2>"$TMP_" || warn "could not get network-interface"
159   INTERFACE_="$(<$TMP_)" ; echo -n "" >"$TMP_"
160
161   while true; do
162     IP_=`netGetIp "$INTERFACE_" warn`
163     NETMASK_=`netGetNetmask "$INTERFACE_" warn`
164     netValidIp "$IP_" warn && break
165     $DIALOG_ --backtitle "$BACK_TITLE_" --title "$runconfig_title_" --yesno "$runconfig_message_" 18 45 && \
166       netcardconfig || die "Could not get interface" $?
167   done
168
169   IPRANGE_FROM_=`execute "ipcalc -nb $IP_/$NETMASK_" warn |awk '/HostMin/{print $2}'`
170   # if we have x.x.x.1 as starting range address provide
171   # x.x.x.10 instead so we avoid possible conflicts with
172   # default gateway
173   if echo $IPFROM | grep -c '\.1$' ; then
174     IPFROM="${IPFROM%%\.1}.10"
175   fi
176   IPRANGE_TO_=`execute "ipcalc -nb $IP_/$NETMASK_" warn |awk '/HostMax/{print $2}'`
177   NETWORK_=`execute "ipcalc -nb $IP_/$NETMASK_" warn |awk '/Network:/{print $2}'`
178   NETWORK_=${NETWORK_%/*}
179   local iprange_=""
180   while [ -z "$IPRANGE_FROM_" -o -z "$IPRANGE_TO_" -o -z "$iprange_" ]; do
181     iprange_="$IPRANGE_FROM_ $IPRANGE_TO_"
182     echo -n "" >"$TMP_"
183     $DIALOG_ --clear --backtitle "$BACK_TITLE_" --title "$iprange_title_ ($INTERFACE_=$IP_/$NETMASK_)" \
184       --inputbox "$iprange_message_" 18 75 "$iprange_" 2>"$TMP_" || die "problems getting network range" $?
185
186     iprange_="$(<$TMP_)"
187     IPRANGE_FROM_="${iprange_%% *}"
188     IPRANGE_TO_="${iprange_##* }"
189
190     for i in "$IPRANGE_FROM_" "$IPRANGE_TO_"; do
191       netValidIp "$i" warn || iprange_=""
192     done
193   done
194
195   NAMESERVERS_=`netGetNameservers warn`
196   GW_=`netGetDefaultGateway warn`
197   GW_DEV_=`/sbin/ip route get "$GW_" | sed 's/^local //' | awk '{ print $3; exit; }'`
198   if [ "$GW_DEV_" != "$INTERFACE_" ] && [ "$GW_DEV_" != "" ] && [ "$GW_DEV_" != "lo" ]; then
199     # GW_DEV_ of server is not the same device as the one serviced by dhcpd
200     # so it doesn't make sense to provide the GW_ address to the clients
201     local do_nat_="YES"
202     local do_nat_title_="Network Address Translation"
203     local do_nat_message_="
204 Do you want to set up NAT so that clients booting from this
205 grml-terminalserver can use this machine also as gateway to
206 the internet?"
207
208     $DIALOG_ --clear --backtitle "$BACK_TITLE_" --title "$do_nat_title_" --yesno "$do_nat_message_" 15 75 || \
209       do_nat_="NO"
210     if [ "$do_nat_" = "YES" ]; then
211       # user wants NAT, we give the clients the server address as
212       # gateway as well
213       GW_="$IP_"
214       NAT_INTERFACE_="$GW_DEV_"
215     else
216       # no NAT, no sensible gateway
217       GW_=""
218       NAT_INTERFACE_=""
219     fi
220   fi
221
222   echo -n "" >"$TMP_"
223   local OPTIONS_BOOTARG_MESSAGE_="Here you can add additional boot arguments for the clients seperated by spaces:
224
225 Quite usefull examples:
226
227 ssh=<pw>              - Start ssh server and set password of user grml to pw
228 services=<1,2,3>      - Execute /etc/init.d/{1,2,3} start
229 console=ttyS0,9600n8  - Initialise serial console
230 startx                - Boot into X
231
232
233 "
234   $DIALOG_ --clear --no-collapse --backtitle "$BACK_TITLE_" --title "$OPTIONS_TITLE_" --inputbox "$OPTIONS_BOOTARG_MESSAGE_" 0 0\
235     2>$TMP_ || die "problems getting additional boot arguments"
236   BOOT_ARGS_="$BOOT_ARGS_ $(<$TMP_)"
237
238   writeConfig
239   actionMkInitrd
240   notice "GRML terminalserver successfully configured"
241 }
242 # }}}
243
244 function removeTmpFiles
245 {
246   execute "rm -f $TMP_" warn
247 }
248
249 function actionClean
250 {
251   for i in dhcpd.conf initrd.img; do
252     execute "rm -f $PATH_/$i*"
253   done
254
255   for i in $CARDS_DETECTED_BY_DISCOVER $CONF_FILE_; do
256     execute "rm -f $i"
257   done
258
259 }
260
261
262 ###
263 ### __MAIN
264 ###
265
266 while getopts "i:hv" opt; do
267   case "$opt" in
268     i) interface_=$OPTARG ;;
269     h) printUsage; exit ;;
270     v) let verbose_=$verbose_+1 ;;
271     ?) printUsage; exit 64 ;;
272   esac
273 done
274 shift $(($OPTIND - 1))  # set ARGV to the first not parsed commandline parameter
275 setVerbose $verbose_
276
277 case "$1" in
278   help)   printUsage; exit 0 ;;
279 esac
280
281 checkRoot die 'You have to be root to use this program'
282 disableSyslog
283
284 execute "mkdir -p $PATH_" die
285
286 TMP_=`mktemp -t grml-terminalserver-config.XXXXXX` || die "Could not create tmpfile" $?
287 setExitFunction 'removeTmpFiles'
288
289
290 . $DEFAULT_CONFIG_
291 . $CONFIG_
292 # used config vars:
293 # MODULES_PATH_
294 # MODULES_PATH_ROOT_DIFF_
295 # KERNEL_VERSION_
296 # ORIGINAL_INITRD_
297 if [[ $MODULES_PATH_ == "" || $KERNEL_VERSION_ == "" || $ORIGINAL_INITRD_ == "" ]]; then
298   warn "MODULES_PATH_=\"$MODULES_PATH_\" \
299 KERNEL_VERSION_=\"$KERNEL_VERSION_\" \
300 ORIGINAL_INITRD_=\"$ORIGINAL_INITRD_\""
301   die "False configuration, please update $CONFIG_"
302 fi
303
304
305 case "$1" in
306   interactive)  actionInteractive ;;
307   initrd) actionMkInitrd ;;
308   clean)  actionClean ;;
309   *)    actionInteractive ;;
310 esac
311
312 removeTmpFiles
313 # END OF FILE
314 ################################################################################
315 # vim:foldmethod=marker tabstop=2 expandtab shiftwidth=2