grml-terminalserver-config: do not rebuild initrd but use the existing one
[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
121   echo "Installing initrd $PATH_/minirt26.gz:"
122   if isExistent "$PATH_/minirt26.gz" ; then
123      echo
124      echo "$PATH_/minirt26.gz exists already, nothing to do"
125      return 0
126   fi
127
128   # until we have a stable file location API let's use
129   # an according heuristic
130   for file in "$(find /live/image/boot -name initrd.gz)"; do
131     dir="$(dirname $file)"
132     if file "$dir"/linux26 | grep -q "$(uname -r)" ; then
133       cp "$dir"/initrd.gz "$PATH_"/minirt26.gz
134       echo '... done'
135       return 0
136     fi
137   done
138 }
139
140 # }}}
141
142 # INTERACTIVE CONFIGURATION  {{{
143
144 function actionInteractive
145 {
146   local i=""
147
148   dprint "running in interactive mode"
149
150   local card_title_="Choose network device connected to client network"
151   local card_message_="Available network devices:"
152   local iprange_title_="IP Address range for clients"
153 local iprange_message_="
154 Please enter the desired IP-Range of addresses that should be allocated by clients, separated by a single space.
155
156 Example:
157           192.168.0.101 192.168.0.200
158
159 for addresses from 192.168.0.101 to (and including) 192.168.0.200.
160
161 "
162   local runconfig_title_="Networkcard config"
163   local runconfig_message_="Would you like to configure your interfaces now?"
164
165   # on witch interfaces should we listen
166   local netdevices_="$(grep -ve 'lo:' -ve 'Inter-|' -ve 'face |bytes' /proc/net/dev | awk -F: '{print $1}')"
167   local device_list_=""
168   for INTERFACE_ in $netdevices_; do device_list_="$device_list_ ${INTERFACE_} Networkcard_${INTERFACE_##eth}"; done
169     echo -n "" >"$TMP_"
170     $DIALOG_ --backtitle "$BACK_TITLE_" --title "$card_title_" --menu "$card_message_" \
171       0 0 18 $device_list_ 2>"$TMP_" || warn "could not get network-interface"
172   INTERFACE_="$(<$TMP_)" ; echo -n "" >"$TMP_"
173
174   while true; do
175     IP_=`netGetIp "$INTERFACE_" warn`
176     NETMASK_=`netGetNetmask "$INTERFACE_" warn`
177     netValidIp "$IP_" warn && break
178     $DIALOG_ --backtitle "$BACK_TITLE_" --title "$runconfig_title_" --yesno "$runconfig_message_" 18 45 && \
179       netcardconfig || die "Could not get interface" $?
180   done
181
182   IPRANGE_FROM_=`execute "ipcalc -nb $IP_/$NETMASK_" warn |awk '/HostMin/{print $2}'`
183   IPRANGE_TO_=`execute "ipcalc -nb $IP_/$NETMASK_" warn |awk '/HostMax/{print $2}'`
184   NETWORK_=`execute "ipcalc -nb $IP_/$NETMASK_" warn |awk '/Network:/{print $2}'`
185   NETWORK_=${NETWORK_%/*}
186   local iprange_=""
187   while [ -z "$IPRANGE_FROM_" -o -z "$IPRANGE_TO_" -o -z "$iprange_" ]; do
188     iprange_="$IPRANGE_FROM_ $IPRANGE_TO_"
189     echo -n "" >"$TMP_"
190     $DIALOG_ --clear --backtitle "$BACK_TITLE_" --title "$iprange_title_ ($INTERFACE_=$IP_/$NETMASK_)" \
191       --inputbox "$iprange_message_" 18 75 "$iprange_" 2>"$TMP_" || die "problems getting network range" $?
192
193     iprange_="$(<$TMP_)"
194     IPRANGE_FROM_="${iprange_%% *}"
195     IPRANGE_TO_="${iprange_##* }"
196
197     for i in "$IPRANGE_FROM_" "$IPRANGE_TO_"; do
198       netValidIp "$i" warn || iprange_=""
199     done
200   done
201
202   NAMESERVERS_=`netGetNameservers warn`
203   GW_=`netGetDefaultGateway warn`
204   GW_DEV_=`/sbin/ip route get "$GW_" | awk '{ print $3; exit; }'`
205   if [ "$GW_DEV_" != "$INTERFACE_" ] && [ "$GW_DEV_" != "" ]; then
206     # GW_DEV_ of server is not the same device as the one serviced by dhcpd
207     # so it doesn't make sense to provide the GW_ address to the clients
208     local do_nat_="YES"
209     local do_nat_title_="Network Address Translation"
210     local do_nat_message_="
211 Do you want to set up NAT so that clients booting from this
212 grml-terminalserver can use this machine also as gateway to
213 the internet?"
214
215     $DIALOG_ --clear --backtitle "$BACK_TITLE_" --title "$do_nat_title_" --yesno "$do_nat_message_" 15 75 || \
216       do_nat_="NO"
217     if [ "$do_nat_" = "YES" ]; then
218       # user wants NAT, we give the clients the server address as
219       # gateway as well
220       GW_="$IP_"
221       NAT_INTERFACE_="$GW_DEV_"
222     else
223       # no NAT, no sensible gateway
224       GW_=""
225       NAT_INTERFACE_=""
226     fi
227   fi
228
229   # get options
230   #local OPT_IPTABLES_="yes"
231   #local OPT_SSH_="yes"
232   #local OPT_DISTCC_="yes"
233   #local OPT_SQUID_=""
234
235   local OPTIONS_TITLE_="Options"
236   local OPTIONS_MESSAGE_="Please give the appropriate options you want the clients to use:
237
238 grml2hd   - Make a non-interactive remote installation
239
240
241
242 "
243 #  local OPTIONS_MESSAGE_="Please give the appropriate options you want the clients to use:
244 #
245 #iptables  - Only the server should be able to access the clients
246 #ssh       - A ssh-key will be created on the server and distributed to the clients
247 #distcc    - You want to use the clients as compile-farm (ssh options recommned)
248 #
249 #"
250
251   local OPT_IPTABLES_DESC_="Start iptables on the clients"
252   local OPT_SSH_DESC_="Start ssh on the clients"
253   local OPT_DISTCC_DESC_="Start distcc on the clients"
254   local OPT_GRML2HD_DESC_="Remote install grml on the network clients"
255   # dialog options (enable if implemented)
256   #iptables "$OPT_IPTABLES_DESC_" off \
257   #ssh "$OPT_SSH_DESC_" off \
258   #distcc "$OPT_DISTCC_DESC_" off \
259   echo -n "" >"$TMP_"
260   $DIALOG_ --clear --separate-output --backtitle "$BACK_TITLE_" --title "$OPTIONS_TITLE_" --checklist "$OPTIONS_MESSAGE_" 25 80 10 \
261   grml2hd "$OPT_GRML2HD_DESC_" off \
262     2>$TMP_ || die "could not get terminalserver options" $?
263   while read tmp_option_; do
264     OPTIONS_="$OPTIONS_ $tmp_option_"
265   done <$TMP_
266
267   # parse options
268   for i in $OPTIONS_; do
269     case "$i" in
270       grml2hd)  optGrml2Hd || return 1 ;;
271     esac
272   done
273
274   echo -n "" >"$TMP_"
275   local OPTIONS_BOOTARG_MESSAGE_="Here you can add additional boot arguments for the clients seperated by spaces:
276
277 Quite usefull examples:
278
279 ssh=<pw>              - Start ssh server and set password of user grml to pw
280 services=<1,2,3>      - Execute /etc/init.d/{1,2,3} start
281 console=ttyS0,9600n8  - Initialise serial console
282 startx                - Boot into X
283
284
285 "
286   $DIALOG_ --clear --no-collapse --backtitle "$BACK_TITLE_" --title "$OPTIONS_TITLE_" --inputbox "$OPTIONS_BOOTARG_MESSAGE_" 0 0\
287     2>$TMP_ || die "problems getting additional boot arguments"
288   BOOT_ARGS_="$BOOT_ARGS_ $(<$TMP_)"
289
290   writeConfig
291   actionMkInitrd
292   notice "GRML terminalserver successfully configured"
293 }
294 # }}}
295
296 # OPTIONS GETTING DIALOG {{{
297 function optGrml2Hd
298 {
299   local GRML2HD_TITLE_='Grml2hd options dialog'
300   local tmp_=''
301   local options_='BOOT_IMAGE=grml2hd'
302
303   # get partition to install grml2hd on
304   OPTIONS_PARTITION_MSG_='Please specify the target partition where to install grml'
305   PARTITION_TITLE_='Partition selection'
306   echo -n "" >"$TMP_"
307   $DIALOG_ --clear --backtitle "$BACK_TITLE_" --title "$PARTITION_TITLE_" --inputbox \
308     "$OPTIONS_PARTITION_MSG_" 0 75 '/dev/hda1' 2>$TMP_ || die "problems getting partition"
309   tmp_="partition=$(<$TMP_)"
310   options_="$options_ $tmp_"
311
312   # get filesystem type
313   OPTION_FS_TYPE_='Please specify the filesystem type'
314   FS_TITLE_='Filesystem selection'
315   echo -n "" >"$TMP_"
316   $DIALOG_ --clear --backtitle "$BACK_TITLE_" --title "$FS_TITLE_" --inputbox \
317   "$OPTION_FS_TYPE_" 0 75 'ext3' 2>$TMP_ || die "problems getting filesystem type"
318   tmp_="filesystem=$(<$TMP_)"
319   options_="$options_ $tmp_"
320
321   # get where to save mbr
322   OPTION_MBR_='Please specify the location where to save the mbr'
323   MBR_TITLE_='Select location of mbr'
324   echo -n "" >"$TMP_"
325   $DIALOG_ --clear --backtitle "$BACK_TITLE_" --title "$MBR_TITLE_" --inputbox \
326     "$OPTION_MBR_" 0 75 '/dev/hda' 2>$TMP_ || die "problems getting location where to write mbr"
327   tmp_="mbr=$(<$TMP_)"
328   options_="$options_ $tmp_"
329
330   # get first user
331   OPTION_USER_='Who should be the first user on the system'
332   USER_TITLE_='User selection'
333   echo -n "" >"$TMP_"
334   $DIALOG_ --clear --backtitle "$BACK_TITLE_" --title "$USER_TITLE_" --inputbox \
335     "$OPTION_USER_" 0 75 'grml' 2>$TMP_ || die "problems getting first user of system"
336   tmp_="user=$(<$TMP_)"
337   options_="$options_ $tmp_"
338
339   BOOT_ARGS_="$options_"
340 }
341 #}}}
342
343
344 function removeTmpFiles
345 {
346   execute "rm -f $TMP_" warn
347 }
348
349 function actionClean
350 {
351   for i in dhcpd.conf minirt26.gz; do
352     execute "rm -f $PATH_/$i*"
353   done
354
355   for i in $CARDS_DETECTED_BY_DISCOVER $CONF_FILE_; do
356     execute "rm -f $i"
357   done
358
359 }
360
361
362 ###
363 ### __MAIN
364 ###
365
366 while getopts "i:hv" opt; do
367   case "$opt" in
368     i) interface_=$OPTARG ;;
369     h) printUsage; exit ;;
370     v) let verbose_=$verbose_+1 ;;
371     ?) printUsage; exit 64 ;;
372   esac
373 done
374 shift $(($OPTIND - 1))  # set ARGV to the first not parsed commandline parameter
375 setVerbose $verbose_
376
377 case "$1" in
378   help)   printUsage; exit 0 ;;
379 esac
380
381 checkRoot die 'You have to be root to use this program'
382 disableSyslog
383
384 execute "mkdir -p $PATH_" die
385
386 TMP_=`mktemp -t grml-terminalserver-config.XXXXXX` || die "Could not create tmpfile" $?
387 setExitFunction 'removeTmpFiles'
388
389
390 . $DEFAULT_CONFIG_
391 . $CONFIG_
392 # used config vars:
393 # MODULES_PATH_
394 # MODULES_PATH_ROOT_DIFF_
395 # KERNEL_VERSION_
396 # ORIGINAL_INITRD_
397 if [[ $MODULES_PATH_ == "" || $KERNEL_VERSION_ == "" || $ORIGINAL_INITRD_ == "" ]]; then
398   warn "MODULES_PATH_=\"$MODULES_PATH_\" \
399 KERNEL_VERSION_=\"$KERNEL_VERSION_\" \
400 ORIGINAL_INITRD_=\"$ORIGINAL_INITRD_\""
401   die "False configuration, please update $CONFIG_"
402 fi
403
404
405 case "$1" in
406   interactive)  actionInteractive ;;
407   initrd) actionMkInitrd ;;
408   clean)  actionClean ;;
409   *)    actionInteractive ;;
410 esac
411
412 removeTmpFiles
413 # END OF FILE
414 ################################################################################
415 # vim:foldmethod=marker tabstop=2 expandtab shiftwidth=2