summaryrefslogtreecommitdiffstats
path: root/initramfs/initrd-stuff/bin/servconfig
blob: 2b7a4cf2ba3e578c7302fb107540eb5a910bd42e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
# Copyright (c) 2003 - 2006 - RZ Uni Freiburg
# Copyright (c) 2006, 2007 - OpenSLX GmbH
#
# This program is free software distributed under the GPL version 2.
# See http://openslx.org/COPYING
#
# If you have any feedback please consult http://openslx.org/feedback and
# send your feedback to feedback@openslx.org
#
# General information about OpenSLX can be found under http://openslx.org
#
# universal (distro independent) configuration script for OpenSLX linux
# diskless clients (executed in stage3 within initial ramfs). The file-
# system setup is completed when servconfig starts

#############################################################################
# check for configuration files to source

# functions common for all distros, messages contains all error and
# info output
. /etc/messages
. /etc/functions
# load distro specific configuration variables and functions. distro
# specific functions may overwrite functions defined in /etc/functions
. /etc/sysconfig/config
. /etc/distro-functions
. /etc/sysconfig/slxsystem.conf
# get location of logfile definition
. /mnt/etc/${D_SYSCONFDIR}/logfile

# script run timer
[ $DEBUGLEVEL -eq 8 ] && echo "** SW setup started at $(sysup)"

# heavy debugging output in level 3 and below 8 ...
[ $DEBUGLEVEL -gt 3 -a $DEBUGLEVEL -lt 8 -o $DEBUGLEVEL -eq 12 ] && \
  set -x

#############################################################################
# copy distro specific scripts, programs, libraries and configs
cp -a /etc/sysconfig/files/* /mnt 2>/dev/null &
# boot.local file (different for several distros)
[ -f "/etc/boot.local" -a -n "${D_BOOTLOCAL}" ] && {
  echo "# added by $0 (initramfs from $date)" >> /mnt/etc/${D_BOOTLOCAL}
  cat /etc/boot.local >> /mnt/etc/${D_BOOTLOCAL}
}

#############################################################################
# read and unify configuration options - default configuration file, from
# dhcp, ldap ...
# wait for the appearance of configuration from several sources
cfgcomplete
. /etc/machine-setup
[ $DEBUGLEVEL -eq 8 ] && echo "** Config info is complete at $(sysup)"

# copy additional configuration and var files and directories
# admins can place there files in /var/lib/openslx/config/...
# to be packed during stage2 into (/srv/dxs)/tftpboot/client-config...)
# ... in the near future ...
cp -a /rootfs/* /mnt 2>/dev/null

# set greeting and add information on booted system
len=$(expr length ${SLXVERSION}${SYSTEM_NAME})
if [ $len -le 28 ] ; then
  vdstr="Stateless Workstation (V${SLXVERSION}/${SYSTEM_NAME})"
  smax=28
else
  vdstr="V${SLXVERSION}/${SYSTEM_NAME}"
  smax=52
fi
while [ $len -le $smax ] ; do
  vdstr="$vdstr "
  len=$(($len + 1))
done
len=$(expr length $host_name)
while [ $len -le 30 ] ; do
  space="$space "
  len=$(($len + 1))
done
echo "
   WELCOME TO                 $space        \n (\l)
           _____  ______  ______ __    __    _______ __     __    __
          /  _   |   _   |   ___|  |  |  |  |   ____|  |   |  |  |  |
         |  | |  |  |_|  |  |_  |   |    |  |  |___ |  |        /  /
         |  | |  |   ___/|   _|      |   |   ____   |  |     |    |
         |  |_|  |  |    |  |___|  |  |  |   ____|  |  |___ /  /
           _____/|__|    |______|__|  |__|  |_______|______|__|  |__|

   $vdstr (c) <OpenSLX.ORG>
">/mnt/etc/issue

#############################################################################
# set localization and add entries to initialize keytable and consolefont to
# boot.slx
DEFKEYTABLE="de-latin1-nodeadkeys"
if [ -z "$country" ] ; then
  error "$scfg_country" nonfatal
  country="${D_DEFAULTCOUNTRY}"
fi
localization "${country}"
if [ -z "${KEYTABLE}" ] ; then
  error "$hcfg_keyb" nonfatal
  KEYTABLE=${DEFKEYTABLE}
fi
echo -e "\t# entries added by $0: $date" >> /mnt/etc/${D_INITDIR}/boot.slx
[ -n "${KEYTABLE}" ] && keytable
[ -n "${CONSOLE_FONT}" ] && consolefont

#############################################################################
# vmware stuff first part: two scenarios
# * VM images in /usr/share/vmware - then simply link
# * VM images via additional mount (mount source NFS, NBD, ...)
if [ "x$vmware" != "x" ] && [ "x$vmware" != "xno" ] ; then
  # map slxgrp to pool, so it's better to understand
  pool=${slxgrp}
  # if we dont have slxgrp defined
  [ -z "$pool" ] && pool="default"

  # get source of vmware image server (get type, server and path)
  if strinstr "/" "$vmware" ; then
    vmimgprot=$(uri_token $vmware prot)
    vmimgserv=$(uri_token $vmware server)
    vmimgpath="$(uri_token $vmware path)"
  fi
  if [ -n "${vmimgserv}" ] ; then
    testmkd /mnt/var/lib/vmware
    case "${vmimgprot}" in
      *nbd)
      ;;
      lbdev)
        # we expect the stuff on toplevel directory, filesystem type should be
        # autodetected here ... (vmimgserv is blockdev here)
        vmbdev=/dev/${vmimgserv}
        waitfor ${vmbdev} 20000
        echo -e "ext2\nreiserfs\nvfat\nxfs" >/etc/filesystems 
        mount -o ro ${vmbdev} /mnt/var/lib/vmware || error "$scfg_evmlm" nonfatal
      ;;
      *)
        # we expect nfs mounts here ...
        for proto in tcp udp fail; do
          [ $proto = "fail" ] && { error "$scfg_nfs" nonfatal;
            noimg=yes; break;}
          mount -n -t nfs -o ro,nolock,$proto ${vmimgserv}:${vmimgpath} \
            /mnt/var/lib/vmware && break
        done
      ;;
    esac
  fi
fi

#############################################################################
# setup passwd and shadow for local system users like root, bin, daemon and
# nobody if no user/admin provided passwd exists ...
# the root password provided by machine-setup is used only if no passwd file
# is provided (default case)
if [ ! -f /rootfs/etc/passwd ] ; then
  basepasswd
fi

#############################################################################
# dns and ip configuration
# hostname of the machine
echo "$host_name" >/proc/sys/kernel/hostname
echo -e "# /etc/hosts - file generated by\n#\t$0:\n#\t$date\
\n#\n# IP-Address  Full-Qualified-Hostname  Short-Hostname\n#\n\
127.0.0.1\tlocalhost\n::1\t\tlocalhost ipv6-localhost ipv6-loopback\n\
fe00::0\t\tipv6-localnet\nff00::0\t\tipv6-mcastprefix\nff02::1\
\t\tipv6-allnodes\nff02::2\t\tipv6-allrouters\nff02::3\t\t\
ipv6-allhosts\n" >/mnt/etc/hosts
if [ -n  "$domain_name" ]; then
  echo -en "$clientip\t" >>/mnt/etc/hosts
  for name in $domain_name; do
    echo -en "$host_name.$name " >>/mnt/etc/hosts
  done
  echo -e "$host_name" >>/mnt/etc/hosts
else
  echo -e "$clientip\t$host_name" >>/mnt/etc/hosts
fi
# set up domainname and resolving
rm -rf /mnt/etc/resolv.conf
test -n "$domain_name" && \
  echo -e "# /etc/resolv.conf - file generated by\n#\t$0:\n\
#\t$date\n#options timeout:1 attempts:1 rotate\n\
search "$domain_name >/mnt/etc/resolv.conf
test -n "$domain_name_servers" && {
  for name in $domain_name_servers; do
    echo nameserver $name >>/mnt/etc/resolv.conf;
  done; }

#############################################################################
# run distro specific configuration function
config_distro

#############################################################################
# boot.local (fixme: deprecated)
if [ -n "$bootlocal_script" ]; then
  echo -e "# Option is deprecated and will be removed soon. Please put the \
file to the ConfTGZ (rootfs/etc/${D_INITDIR}/boot.local)" >> \
  /mnt/etc/${D_INITDIR}/boot.local
fi

#############################################################################
# basic (non network) services

# at daemon - calling distro specific function config_atd
config_atd

# configuration of cron services - calling distro specific function
# config_cron (runlevel links, directories, ...)
config_cron
[ "x$crontab_entries" != "x" ] && \
    echo -e "$crontab_entries" >> /mnt/etc/crontab

# setup system log services - distro dependent function config_syslog
config_syslog

# acpi and powersave - distro dependent function config_acpi, these daemons
# might require dbus
config_acpi

# configure dbus - distro dependent function config_dreshal - handle
# all stuff regarding dependent services like dbus, resmgr, hal ...
# (check for runlevel scripts, passwd entries, directories ...)
config_dreshal

# configure automounter
if [ "x$automnt" != "xno" ] ; then
  # check if there is some user provided configuration (only auto.master is
  # important) and skip automatic setup
  if [ ! -f /rootfs/etc/auto.master ] ; then
    if [ -d /mnt/misc ] ; then
      echo -e "# /etc/auto.master - file generated by $0:\n\
/misc\t/etc/auto.misc" >/mnt/etc/auto.master
      echo -e "# /etc/auto.misc - file generated by $0:" >/mnt/etc/auto.misc
    else
      echo -e "# /etc/auto.master - file generated by $0:\n\
/misc\t#/etc/auto.misc" >/mnt/etc/auto.master
      echo -e "# /etc/auto.misc - file generated by $0:\nautomount for \
removable devices is mostly deprecated, so /misc is not\nactivated in \
auto.master." >/mnt/etc/auto.misc
    fi
    if [ -n "${automnt_src}" ] ; then
      # local directory and home directory server from machine-setup
      [ -z "${automnt_dir}" ] && automnt_dir="/home"
      # remove leading and trailing slash
      automnt_dir=${automnt_dir#/}
      automnt_dir=${automnt_dir%/}
      test -d /${automnt_dir} || error "$scfg_erradir" nonfatal
      strinstr "/" ${automnt_dir} && error "$scfg_erratpld" nonfatal
      amserv=$(uri_token $automnt_src server)
      ampath=$(uri_token $automnt_src path)
      echo -e "/${automnt_dir}\t/etc/auto.${automnt_dir}\n" \
        >> /mnt/etc/auto.master
      echo -e "# /etc/auto.${automnt_dir} created by $0:\n" \
        > /mnt/etc/auto.${automnt_dir}
      echo -e "*\t-rsize=32768,wsize=32768,rw\t${amserv}:${ampath}/&" \
        >> /mnt/etc/auto.${automnt_dir}
      # no tempfs needed if automounter operates on /home
      [ "${automnt_dir}" = "home" ] && umount -t tmpfs /mnt/home 2>/dev/null
      # portmapper is needed for remote NFS sources and local nfs directories
      testmkd /mnt/var/lib/nfs/state
      config_portmap
    fi
  fi
  config_automount
fi

# configure print services / start requested printer daemon
config_printer

# configure bluetooth services
config_bt

#############################################################################
# network(ed) services

# network time service (ntp) configuration file
if [ -n "$ntp_servers" -a ! -f /rootfs/etc/ntp.conf ]; then
  echo -e "# /etc/ntp.conf - file generated by $0: \
$date\n" >/mnt/etc/ntp.conf
  for name in $ntp_servers; do
    echo server $name >>/mnt/etc/ntp.conf
  done
fi
# copy timezone file defined with language settings
[ -z "$TZ" ] && TZ="$timezone"
ln -snf /usr/share/zoneinfo/${TZ} /mnt/etc/localtime || \
  error "$scfg_ntptz" nonfatal
config_ntp

# secure shell server - at the moment all clients share one "secret"
# key or the key has to be regenerated on every bootup or fetched on
# every bootup from somewhere
config_sshd

# simple network management protocol agent
config_snmp

# setup afs client stuff
config_afs

# setup nfsv4/krb stuff
config_nfsv4

# configure samba service
config_samba

#############################################################################
# NIS
# setup nis configuration if needed
if [ "x$nis_domain" != "x" ] && [ "x$nis_servers" != "x" ] ; then
  echo $nis_domain >/mnt/etc/defaultdomain
  echo -e "# /etc/yp.conf - file generated by $0:\n#\t\
$date\n\nypserver "$nis_servers >/mnt/etc/yp.conf
  config_nis
fi

#############################################################################
# name service caching daemon if networked user database
config_nscd

#############################################################################
# vmware stuff second part: setting up the environment

# create needed directories and files
if [ "x$vmware" != "x" ] && [ "x$vmware" != "xno" ] ; then
  for i in /etc/vmware/vmnet1/dhcpd /etc/vmware/vmnet8/nat \
           /etc/vmware/vmnet8/dhcpd /var/run/vmware /etc/vmware/loopimg \
           /etc/vmware/fd-loop /var/X11R6/bin /etc/X11/sessions; do
    testmkd /mnt/$i
  done
  # create needed devices (not created automatically via module load)
  for i in "/dev/vmnet0 c 119 0" "/dev/vmnet1 c 119 1" \
           "/dev/vmnet8 c 119 8" "/dev/vmmon c 10 165"; do
    mknod $i
  done
  # create the vmware startup configuration file /etc/vmware/locations
  # fixme --> ToDo
  # echo -e "answer VNET_8_NAT yes\nanswer VNET_8_HOSTONLY_HOSTADDR \n\
#192.168.100.1\nanswer VNET_8_HOSTONLY_NETMASK 255.255.255.0\n\
#file /etc/vmware/vmnet8/dhcpd/dhcpd.conf\n\
# remove_file /etc/vmware/not_configured" >/mnt/etc/vmware/locations

  chmod 0700 /dev/vmnet*
  chmod 1777 /mnt/etc/vmware/fd-loop
  # loop file for exchanging information between linux and vmware guest
  if modprobe ${MODPRV} loop; then
    mdev -s
  else
    : #|| error "" nonfatal
  fi
  # mount a clean tempfs (bug in UnionFS prevents loopmount to work)
  strinfile "unionfs" /proc/mounts && \
    mount -n -o size=1500k -t tmpfs vm-loopimg /mnt/etc/vmware/loopimg
  # create an empty floppy image of 1.4MByte size
  dd if=/dev/zero of=/mnt/etc/vmware/loopimg/fd.img \
    count=2880 bs=512 2>/dev/null
  chmod 0777 /mnt/etc/vmware/loopimg/fd.img
  # use dos formatter from rootfs (later stage4)
  LD_LIBRARY_PATH=/mnt/lib /mnt/sbin/mkfs.msdos \
    /mnt/etc/vmware/loopimg/fd.img >/dev/null 2>&1 #|| error
  mount -n -t msdos -o loop,umask=000 /mnt/etc/vmware/loopimg/fd.img \
    /mnt/etc/vmware/fd-loop
  echo -e "usbfs\t\t/proc/bus/usb\tusbfs\t\tauto\t\t 0 0" >> /mnt/etc/fstab
  # needed for VMware 5.5.3 and versions below
  echo -e "\tmount -t usbfs usbfs /proc/bus/usb 2>/dev/null" \
    >>/mnt/etc/${D_INITDIR}/boot.slx
  config_vmware
  chmod 1777 /mnt/var/run/vmware
  # define a variable where gdm/kdm should look for additional sessions
  # do we really need it?
  # export vmsessions=/var/lib/vmware/vmsessions

  # directory of templates and xdialog files
  vmdir=/mnt/var/lib/vmware
  
  if cp ${vmdir}/templates/xdialog.sh /mnt/var/X11R6/bin 2>/dev/null; then
    # create default.desktop for kdm
    echo -e "[Desktop Entry]\nEncoding=UTF8\nName=Default\nName[de]=Standard"\
      >/mnt/etc/X11/sessions/default.desktop

    #I dont like this part, but there is no simple workaround. We need to
    #create xdialog.sh on every box :(
    echo "Exec=/var/X11R6/bin/xdialog.sh" \
      >>/mnt/etc/X11/sessions/default.desktop
    echo "Type=Application" >>/mnt/etc/X11/sessions/default.desktop

    # /usr/share/xsessions/* files for the menu
    for i in /mnt/usr/share/xsessions/*.desktop; do
      # execute
      echo "\"$(grep '^Exec=' ${i}|sed 's/^Exec=//')\" \\" \
        >>/mnt/var/X11R6/bin/xdialog.sh
      # short description
      echo "\"$(grep '^Name=' ${i}|sed 's/^Name=//')\" \\" \
        >>/mnt/var/X11R6/bin/xdialog.sh
      # long description
      echo "\"$(grep '^Comment=' ${i}|sed 's/^Comment=//')\" \\" \
        >>/mnt/var/X11R6/bin/xdialog.sh
    done
    # all virtual machine clients
    cat ${vmdir}/xdialog-files/${pool}/*.xdialog \
      >>/mnt/var/X11R6/bin/xdialog.sh
    # closing bracket as last line ends with '\'
    echo ")" >>/mnt/var/X11R6/bin/xdialog.sh
    chmod 755 /mnt/var/X11R6/bin/xdialog.sh

    # copy xdm files, so we could choose them before we log in
    for i in ${vmdir}/xdmsessions/${pool}/*.desktop;do
      cp ${i} /mnt/etc/X11/sessions/
    done
  else
    error "$scfg_vmchs" nonfatal
  fi
  # we configured vmware, so we can delete the not_configured file
  rm /mnt/etc/vmware/not_configured 2>/dev/null

  # copy dhcpd.conf and nat for vmnet8 (nat)
  # fixme: It should be possible to start just one vmware dhcp which should
  # listen to both interfaces vmnet1 and vmnet8 ...
  cp /mnt/var/lib/vmware/templates/dhcpd.conf \
    /mnt/etc/vmware/vmnet8/dhcpd 2>/dev/null
  cp /mnt/var/lib/vmware/templates/nat.conf \
    /mnt/etc/vmware/vmnet8/nat 2>/dev/null
fi

#############################################################################
# preparation of /tmp directory (partition 44, nfs scratch, ramdisk). there
# might be the chance that we have a disk partition available, so wait for
# completion of detection, setup process
[ $DEBUGLEVEL -eq 8 ] && echo "** Waiting for /tmp completion at $(sysup)"
waitfor /tmp/tmpready 40000
[ $DEBUGLEVEL -eq 8 ] && echo "** Setup of /tmp completed at $(sysup)"
# create some directories and correct permissions
tmpisdisk=$(sed -n '/\/tmp/p' /tmp/fstab 2>/dev/null)
# if there is no local disk partition for /tmp then try to mount a rw
# scratch space (if defined in $scratch) and prepared on server
if [ -n "$scratch" -a -z "$tmpisdisk" ] ; then
  scrproto=$(uri_token $FILESRC prot)
  scrpath=$(uri_token $FILESRC path)
  testmkd /tmp/scratch
  # exports have to be per client!!
  case "$scrproto" in
    nbd)
      :
    ;;
    *)
      tmpserv=$(uri_token $scratch server)
      tmppath=$(uri_token $scratch path)
      # hanging mount processes might stop further setup - timeout
      # should be configured ... it is possible to mount "nolock" only
      mount -t nfs -o rw,tcp,nolock,intr,nodev,soft,timeo=2,nosuid \
        ${tmpserv}:${tmppath} /tmp/scratch >/dev/null 2>&1 && {
        testmkd /tmp/scratch/${clientip}
        umount /tmp/scratch
        # no need for tempfs there ...
        umount /mnt/tmp >/dev/null 2>&1
        mount -t nfs -o rw,tcp,nolock,intr,nodev,soft,timeo=2,nosuid \
          ${tmpserv}:${tmppath}/${clientip} /mnt/tmp >/dev/null 2>&1 
        # create an empty container file for vmware *.vmem, it does not
        # like to live on NFS exports
        if [ "x$vmware" != "x" -a "x$vmware" != "xno" ] ; then
          dd if=/dev/zero of=/mnt/tmp/vm-container count=1 seek=2048000
          diskfm /mnt/tmp/vm-container /mnt/tmp/vmware
          chmod a+rwxt /mnt/tmp/vmware
        fi; }
    ;;
  esac
fi

#############################################################################
# X11/GUI stuff
if [ "x$start_x" != "xno" ] ; then
  # creating directories commonly needed for X11 in all distros
  # rest should be done via config_x11 function (distro specific)
  for i in /var/lib/xkb/compiled \
           /etc/X11/xdm \
           /etc/X11/sessions \
           /var/X11R6/bin \
           /var/run/xdmctl \
           /tmp/.ICE-unix \
           /tmp/.X11-unix ; do testmkd /mnt/$i; done
  chmod 1777 /mnt/tmp/.ICE-unix /mnt/tmp/.X11-unix
  chown 0:0 /mnt/tmp/.ICE-unix /mnt/tmp/.X11-unix
  echo "# file emtied by $0 during initramfs" > /mnt/etc/X11/xdm/Xservers
  # define additional sessions offered to the user (via dhcp/ldap config)
  # descsession -> deprecated by new vmware integration concept
  # write available X display manager to /etc/X11/xdm/Xaccess
  [ -n "$x_display_manager" ] && \
  echo -e "# /etc/X11/xdm/Xaccess - file generated by $0: \
$date\n*\n%hostlist\t$x_display_manager\n*\t\tCHOOSER %hostlist"\
    >/mnt/etc/X11/xdm/Xaccess

  # define type of X session
  dsx="no"
  case "$start_x" in
    yes|YES|direct|DIRECT|query|QUERY)
      # direct connection onto the own displaymanager, which
      # should be enabled then
      [ "x$start_xdmcp" = "xno" ] && $start_xdmcp="yes"
      init=""
      dsx="yes"
      xdmcp="false"
      echo -e "# /etc/X11/Xservers - file generated by \
$0: $date\n:0 local X :0 vt07\n" >/mnt/etc/X11/xdm/Xservers
    ;;
    broadcast|BROADCAST)
      # the client will XDMCP broadcast and choose first available
      # X11 server
      [ "x$start_xdmcp" = "xgdm" ] || \
        init="7:5:respawn:${D_XORGBIN} vt7 -quiet -broadcast"
    ;;
    indirect|INDIRECT)
      # the client will try to XDMCP connect list of X11 servers
      if [ "x$start_xdmcp" = "xgdm" ] ; then
        init=""
      else
        init="7:5:respawn:${D_XORGBIN} vt7 -quiet -indirect $host_name"
      fi
      [ "x$start_xdmcp" = "xno" ] && start_xdmcp="yes"
      xdmcp="true"
    ;;
    *)
      # no display manager needed in kiosk mode
      # in this mode you have to provide the type of X session to start
      [ x$start_xdmcp != "x" ] || start_xdmcp="no";
      init="7:5:respawn:/var/X11R6/bin/kiosk /dev/tty7"
      # nobody can halt pc 
      echo 'nobody ALL=NOPASSWD:/sbin/halt, /sbin/shutdown' >>/mnt/etc/sudoers
      echo -e "#!/bin/sh\n# /var/X11R6/bin/kiosk - file generated by $0: $date
      while ps aux|grep -i kiosk|grep -v \"grep\" &>/dev/null; do
        test -f /var/run/kiosk || break; sleep 3;
      done
      touch /var/run/kiosk
      for((i=0;\$i<=120;i=\$((\$i+1)))); do
        [ -e /var/run/resmgr.pid ] && break
        [ \$i = 120 ] && exit 1
        sleep 1
      done
      resmgr login nobody tty8 \\
      && resmgr grant nobody desktop \\
      && chown -R nobody:nogroup /var/lib/nobody \\
      && (su -c '(sleep 10; amixer -q sset Master 28 unmute; \\
        amixer -q sset PCM 28 unmute) &
        xinit /var/X11R6/bin/startgui $start_x \\
        -- vt7 -quiet' -l nobody &>/dev/null)
      rm /var/run/kiosk
      resmgr revoke nobody
      resmgr logout tty7
      killall X" >/mnt/var/X11R6/bin/kiosk
      # early start of kiosk session
      echo -e "\t# kiosk start added by $0\n\t\
/var/X11R6/bin/kiosk &>/dev/null &" >>/mnt/etc/${D_INITDIR}/boot.slx
      cp /etc/startgui /mnt/var/X11R6/bin
      chmod a+x /mnt/var/X11R6/bin/kiosk /mnt/var/X11R6/bin/startgui
      rm /mnt/var/run/kiosk 2>/dev/null
    ;;
  esac
  echo -e "# entry made by $0 $date\n$init" >> /mnt/etc/inittab
  # most probably not needed any longer
  if [ -n ${D_XORGBIN} ] ; then
    testmkd /mnt/var/X11R6/bin
    ln -sf ${D_XORGBIN} /mnt/var/X11R6/bin/X
  fi
fi

# setup requested display manager
if [ "x$start_xdmcp" != "xno" ] ; then
  testmkd /mnt/var/lib/xdm/authdir/authfiles
  testmkd /mnt/var/run/xdmctl
  if [ "$start_xdmcp" = "yes" ] ; then
    start_xdmcp=kdm
  fi
  # just ensure lowercase
  start_xdmcp=$(echo $start_xdmcp|sed -e "y/'GKWXDM'/'gkwxdm'/")
  case "$start_xdmcp" in
    wdm)
      # anywhere in use!?
    ;;
    kdm)
      # config is most probably not common in all distros?
      # distro specific function config_kdm
      config_kdm
    ;;
    gdm)
      # config is most probably not common in all distros?
      # distro specific function config_gdm
      config_gdm
    ;;
    *)
      # setup xdm (should be the same over the several distros)
      echo -e "# /etc/X11/xdm/xdm-config - file generated by\n\
#\t$0: $date\n\nDisplayManager.errorLogFile:\t/var/log/xdm.errors\n\
DisplayManager.pidFile:\t\t/var/run/xdm.pid\n\
DisplayManager.authDir:\t\t/var/lib/xdm\n\
DisplayManager.keyFile:\t\t/etc/X11/xdm/xdm-keys\n\
DisplayManager.servers:\t\t/etc/X11/xdm/Xservers\n\
DisplayManager.accessFile:\t/etc/X11/xdm/Xaccess\n\
DisplayManager.willing:\t\tsu nobody -c /etc/X11/xdm/Xwilling\n\
DisplayManager.*.authName:\tMIT-MAGIC-COOKIE-1\n\
DisplayManager.*.authComplain:\tfalse\n\
DisplayManager.*.setup:\t\t/etc/X11/xdm/Xsetup\n\
DisplayManager.*.chooser:\t/etc/X11/xdm/RunChooser\n\
DisplayManager.*.startup:\t/etc/X11/xdm/Xstartup\n\
DisplayManager.*.session:\t/etc/X11/xdm/Xsession\n\
DisplayManager.*.reset:\t\t/etc/X11/xdm/Xreset" \
         >/mnt/etc/X11/xdm/xdm-config
      [ "$xdmcp" = "false" ] && echo -e \
      "DisplayManager.requestPort:\t0\n" >>/mnt/etc/X11/xdm/xdm-config
      # distro specific function config_xdm (at least for runlevel links)
      config_xdm
    ;;
  esac
fi

# script run timer
[ $DEBUGLEVEL -eq 8 ] && echo "** SW setup finished at $(sysup)"

# servconfig finished successfully
echo "servconfig finished at $(sysup)" > /tmp/svcfg