source: src-sh/pc-thinclient/pc-thinclient @ df9276a

9.2-releasereleng/10.0releng/10.0.1
Last change on this file since df9276a was df9276a, checked in by pkgdemon <pkgdemonteam@…>, 11 months ago

Update pc-thinclient

Add code to ask for network id

  • Property mode set to 100644
File size: 14.8 KB
Line 
1#!/bin/sh
2#
3# Copyright 2012 Kris Moore / iXsystems
4# All rights reserved
5#
6# Redistribution and use in source and binary forms, with or without
7# modification, are permitted providing that the following conditions
8# are met:
9# 1. Redistributions of source code must retain the above copyright
10#    notice, this list of conditions and the following disclaimer.
11# 2. Redistributions in binary form must reproduce the above copyright
12#    notice, this list of conditions and the following disclaimer in the
13#    documentation and/or other materials provided with the distribution.
14#
15# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
19# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
23# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
24# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25# POSSIBILITY OF SUCH DAMAGE.
26#
27#        Name: pc-thinclient
28# Description: Helper script to build / install the necessary bits to turn
29#              a PC-BSD system into a thin-client server
30#
31# Modified for external dhcp server support by Joe Maloney
32
33# Source our functions
34. /usr/local/share/pcbsd/scripts/functions.sh
35
36# Set some universal variables
37PROGDIR="/usr/local/share/pcbsd/pc-thinclient"
38DHCPPORT="isc-dhcp41-server"
39PXEWORLD="/usr/home/thinclient"
40WORLDPORTS="x11/xorg graphics/xv"
41export WORLDPORTS
42SYSVER="`uname -r | cut -d '-' -f 1-2`"
43
44# Start by sourcing /etc/profile
45# This grabs any HTTP_ / FTP_ PROXY variables
46. /etc/profile
47
48# Start configuring the base system
49check_configsystem() {
50        echo "Setting up system for PXE booting..."
51
52        # Setup the new pxeboot user with a default password
53        cat /etc/passwd | grep pxeboot >/dev/null 2>/dev/null
54        if [ "$?" != "0" ] ; then
55                echo "thinclient" | pw useradd -n "pxeboot" -h 0 -s /bin/tcsh -d ${PXEWORLD}/mnt/xorg-config -c "pxeboot"
56                chown -R pxeboot:pxeboot ${PXEWORLD}/mnt/xorg-config
57        fi
58
59        # Copy over the default dhcpd.conf file
60        cp ${PROGDIR}/resources/dhcpd/dhcpd.conf /usr/local/etc/dhcpd.conf
61
62        # Ask for the NIC we want to run on
63        while
64        z=1
65        do
66                echo "What NIC do you wish DHCPD to listen on? (I.E. re0)"
67                echo -e "nic) \c"
68                read NIC
69               
70                ifconfig $NIC >/dev/null 2>/dev/null
71                if [ $? -ne 0 -o -z "$NIC" ] ; then
72                        echo "Invalid nic entered, please try again!"
73                        sleep 1
74                else
75                        break
76                fi
77        done
78
79        # Save the rc.conf glue
80        cat /etc/rc.conf | grep "# pc-thinclient" >/dev/null 2>/dev/null
81        if [ "$?" != "0" ] ; then
82                echo "# pc-thinclient configuration
83dhcpd_enable=\"YES\"
84dhcpd_ifaces=\"${NIC}\"
85portmap_enable=\"YES\"
86nfs_server_enable=\"YES\"
87inetd_enable=\"YES\"
88ifconfig_${NIC}=\"192.168.2.2\"" >> /etc/rc.conf
89        fi
90
91        # Add firewall exception
92        if [ -e "/etc/pf.conf" ] ; then
93          cat /etc/pf.conf | grep "pass in on ${NIC} all" >/dev/null 2>/dev/null
94          if [ "$?" != "0" ] ; then
95                # Setup the firewall exclusion for this NIC
96                echo "pass in on ${NIC} all" >> /etc/pf.conf
97          fi
98        fi
99
100        # Add some entries for /etc/exports
101        cat /etc/exports 2>/dev/null | grep "$PXEWORLD" >/dev/null 2>/dev/null
102        if [ "$?" != "0" ] ; then
103                echo "$PXEWORLD -maproot=nobody -ro -network 192.168.2 -mask 255.255.255" >>/etc/exports
104        fi
105
106        # Setup tftp
107        cat /etc/inetd.conf | grep "$PXEWORLD" >/dev/null 2>/dev/null
108        if [ "$?" != "0" ] ; then
109                echo "tftp   dgram   udp     wait    root    /usr/libexec/tftpd      tftpd -l -s ${PXEWORLD}" >> /etc/inetd.conf
110        fi
111
112        # Setup rcpbind entries
113        cat /etc/hosts.allow 2>/dev/null | grep "192.168.2.0" >/dev/null 2>/dev/null
114        if [ "$?" != "0" ] ; then
115                sed  -i '' 's|rpcbind : ALL : deny|rpcbind : 192.168.2.0/255.255.255.0 : allow\
116portmap : 192.168.2.0/255.255.255.0 : allow\
117rpcbind : ALL : deny|' /etc/hosts.allow
118        fi
119
120        # Add a bulk of IPs to /etc/hosts this fixes bugs with RPC timeouts
121        # when mounting NFS
122        grep -q 'thinclient100' /etc/hosts
123        if [ $? -ne 0 ] ; then
124                i="100"
125                while
126                z="1"
127                do
128                        if [ "${i}" = "200" ]; then break; fi
129                        echo "192.168.2.${i}  thinclient${i}" >>/etc/hosts
130                        i="`expr ${i} + 1`"
131                done
132        fi
133
134        # Make sure the NIC is set to the right IP before bringing up dhcpd
135        ifconfig $NIC 192.168.2.2
136
137        # Start the services
138        cmds="/etc/rc.d/nfsd /etc/rc.d/inetd /usr/local/etc/rc.d/isc-dhcpd"
139        for _sC in $cmds
140        do
141                echo -e "Starting ${_sC}...\c"
142                ${_sC} restart >/dev/null 2>/dev/null
143                if [ "$?" != "0" ] ; then
144                        echo -e "FAILED! Please run try running it manually."
145                else
146                        echo -e "OK"
147                fi
148        done
149}
150
151# Start configuring the base system without DHCP
152check_configsystem_ignore_dhcp() {
153        echo "Setting up system for PXE booting..."
154
155        # Setup the new pxeboot user with a default password
156        cat /etc/passwd | grep pxeboot >/dev/null 2>/dev/null
157        if [ "$?" != "0" ] ; then
158                echo "thinclient" | pw useradd -n "pxeboot" -h 0 -s /bin/tcsh -d ${PXEWORLD}/mnt/xorg-config -c "pxeboot"
159                chown -R pxeboot:pxeboot ${PXEWORLD}/mnt/xorg-config
160        fi
161
162        # Ask for the NIC we want to run on
163        while
164        z=1
165        do
166                echo "What NIC do you wish to listen on? (I.E. re0)"
167                echo -e "nic) \c"
168                read NIC
169
170                ifconfig $NIC >/dev/null 2>/dev/null
171                if [ $? -ne 0 -o -z "$NIC" ] ; then
172                        echo "Invalid nic entered, please try again!"
173                        sleep 1
174                else
175                        break
176                fi
177        done
178       
179                # Ask for the network id of the local subnet
180        while
181        z=1
182        do
183                echo "What is the network id for your local subnet? (I.E. 192.168.2.0)"
184                echo -e "netid) \c"
185                read netid
186
187        done
188
189portmap_enable=\"YES\"
190nfs_server_enable=\"YES\"
191inetd_enable=\"YES\"
192
193        # Add firewall exception
194        if [ -e "/etc/pf.conf" ] ; then
195          cat /etc/pf.conf | grep "pass in on ${NIC} all" >/dev/null 2>/dev/null
196          if [ "$?" != "0" ] ; then
197                # Setup the firewall exclusion for this NIC
198                echo "pass in on ${NIC} all" >> /etc/pf.conf
199          fi
200        fi
201
202        # Add some entries for /etc/exports
203        cat /etc/exports 2>/dev/null | grep "$PXEWORLD" >/dev/null 2>/dev/null
204        if [ "$?" != "0" ] ; then
205                echo "$PXEWORLD -maproot=nobody -ro -network 192.168.2 -mask 255.255.255" >>/etc/exports
206        fi
207
208        # Setup tftp
209        cat /etc/inetd.conf | grep "$PXEWORLD" >/dev/null 2>/dev/null
210        if [ "$?" != "0" ] ; then
211                echo "tftp   dgram   udp     wait    root    /usr/libexec/tftpd      tftpd -l -s ${PXEWORLD}" >> /etc/inetd.conf
212        fi
213       
214        # Setup rcpbind entries
215        cat /etc/hosts.allow 2>/dev/null | grep "192.168.2.0" >/dev/null 2>/dev/null
216        if [ "$?" != "0" ] ; then
217                sed  -i '' 's|rpcbind : ALL : deny|rpcbind : 192.168.2.0/255.255.255.0 : allow\
218portmap : 192.168.2.0/255.255.255.0 : allow\
219rpcbind : ALL : deny|' /etc/hosts.allow
220        fi
221
222        # Add a bulk of IPs to /etc/hosts this fixes bugs with RPC timeouts
223        # when mounting NFS
224        grep -q 'thinclient100' /etc/hosts
225        if [ $? -ne 0 ] ; then
226                i="100"
227                while
228                z="1"
229                do
230                        if [ "${i}" = "200" ]; then break; fi
231                        echo "192.168.2.${i}  thinclient${i}" >>/etc/hosts
232                        i="`expr ${i} + 1`"
233                done
234        fi
235
236        # Start the services
237        cmds="/etc/rc.d/nfsd /etc/rc.d/inetd"
238        for _sC in $cmds
239        do
240                echo -e "Starting ${_sC}...\c"
241                ${_sC} restart >/dev/null 2>/dev/null
242                if [ "$?" != "0" ] ; then
243                        echo -e "FAILED! Please run try running it manually."
244                else
245                        echo -e "OK"
246                fi
247        done
248}
249
250
251# Check if we need to install custom config
252check_installconfig() {
253        if [ -e "${PXEWORLD}/etc/scripts/tcslogin.sh" ] ; then return ; fi
254
255        # Lets copy over the /etc/scripts directory
256        rm -rf ${PXEWORLD}/etc/scripts >/dev/null 2>/dev/null
257        cp -r ${PROGDIR}/resources/scripts ${PXEWORLD}/etc/scripts
258
259        # Remove a few rc.d things we dont need on clients
260        rm ${PXEWORLD}/etc/rc.d/cron
261        rm ${PXEWORLD}/etc/rc.d/sendmail
262
263        # Lets copy over all the /etc/ files we need
264        cp ${PROGDIR}/resources/etc/fstab ${PXEWORLD}/etc/
265        cp ${PROGDIR}/resources/etc/gettytab ${PXEWORLD}/etc/
266        cp ${PROGDIR}/resources/etc/hosts ${PXEWORLD}/etc/
267        cp ${PROGDIR}/resources/etc/motd ${PXEWORLD}/etc/
268        cp ${PROGDIR}/resources/etc/rc.conf ${PXEWORLD}/etc/
269        cp ${PROGDIR}/resources/etc/ttys ${PXEWORLD}/etc/
270
271        # Copy over rc.d / boot / root files
272        cp ${PROGDIR}/resources/boot/beastie.4th ${PXEWORLD}/boot/
273        cp ${PROGDIR}/resources/root/dot.login ${PXEWORLD}/root/.login
274
275        # Create a few directories used on client
276        mkdir -p ${PXEWORLD}/mnt/xorg-config
277
278        # Create the diskless configuration
279        mkdir -p ${PXEWORLD}/conf/base
280        mkdir -p ${PXEWORLD}/conf/base/etc
281        mkdir -p ${PXEWORLD}/conf/base/var
282        mkdir -p ${PXEWORLD}/conf/base/root
283        echo "10m" > ${PXEWORLD}/conf/base/etc/md_size
284        echo "20m" > ${PXEWORLD}/conf/base/var/md_size
285        echo "30m" > ${PXEWORLD}/conf/base/root/md_size
286        chroot ${PXEWORLD} tar cvf conf/base/etc.cpio.gz --format cpio --gzip etc 2>/dev/null
287        chroot ${PXEWORLD} tar cvf conf/base/var.cpio.gz --exclude var/db/pkg --format cpio --gzip var 2>/dev/null
288        chroot ${PXEWORLD} tar cvf conf/base/root.cpio.gz --format cpio --gzip root 2>/dev/null
289       
290}
291
292# Check if we need to build the world environment
293check_worldports() {
294        if [ -e "${PXEWORLD}/usr/local/bin/xv" ] ; then return ; fi
295
296        if [ ! -d "${PXEWORLD}/usr/ports/x11/xorg" -a ! -d "/usr/ports/x11/xorg" ] ; then
297                exit_err "Missing /usr/ports/x11/xorg, please checkout ports tree to continue"
298        fi
299
300        if [ ! -d "${PXEWORLD}/usr/ports/x11/xorg" ] ; then
301                rm -rf "${PXEWORLD}/usr/ports"
302                echo "Copying /usr/ports -> ${PXEWORLD}/usr/ports"
303                cp -r /usr/ports ${PXEWORLD}/usr/ports
304        fi
305
306        # Building ports inside world
307        mount -t devfs devfs ${PXEWORLD}/dev
308        cp /etc/resolv.conf ${PXEWORLD}/etc/resolv.conf
309        echo "BATCH=yes" >> ${PXEWORLD}/etc/make.conf
310        echo '#!/bin/sh
311
312/etc/rc.d/ldconfig start
313chmod 777 /tmp
314MACHINE=i386 ; export MACHINE
315UNAME_p=i386 ; export UNAME_p
316UNAME_m=i386 ; export UNAME_m
317
318for p in $WORLDPORTS
319do
320        cd /usr/ports/$p
321        make install
322        if [ "$?" != "0" ] ; then
323                exit 1
324        fi
325done
326' > ${PXEWORLD}/.mkports.sh
327
328        chmod 755 ${PXEWORLD}/.mkports.sh
329        chroot ${PXEWORLD} /.mkports.sh
330        if [ "$?" != "0" ] ; then
331                exit_err "Failed building thinclient world ports!"
332        fi
333        rm ${PXEWORLD}/.mkports.sh
334        umount ${PXEWORLD}/dev
335
336}
337
338# Check if we need to build the world environment
339check_world() {
340  if [ -e "${PXEWORLD}/COPYRIGHT" ] ; then return ; fi
341       
342  mkdir -p "${PXEWORLD}"
343  cd "${PXEWORLD}"
344
345  # Default pcbsd.conf file
346  PCBSD_ETCCONF="/usr/local/etc/pcbsd.conf"
347
348  # Set the mirror URL
349  get_mirror
350  MIRRORURL="$VAL"
351
352  # Set the system arch type
353  if [ "$SYSTYPE" = "desktop" ] ; then
354    # If building remote X server, we don't need to run amd64
355    ARCH="i386"
356  else
357    ARCH="`uname -m`"
358  fi
359
360  local dFiles="base.txz doc.txz kernel.txz games.txz"
361  if [ "$ARCH" = "amd64" ] ; then
362     dFiles="$dFiles lib32.txz"
363  fi
364
365  # To fetch the jail environment
366  echo "Fetching FreeBSD environment. This may take a while..."
367  for i in $dFiles
368  do
369    echo "Downloading ${MIRRORURL}/${SYSVER}/${ARCH}/dist/${i} ..."
370   
371    get_file_from_mirrors "/${SYSVER}/${ARCH}/dist/${i}" "$i"
372    [ $? -ne 0 ] && exit_err "Error while downloading the freebsd world."
373  done
374
375  # Save the archive as our example world environment
376  mkdir -p ${PXEWORLD}/installarchive/
377
378  echo "Extracting FreeBSD environment... This may take a while..."
379  # Extract dist files
380  for i in $dFiles
381  do
382    tar xvpf ${i} 2>/dev/null
383    if [ $? -ne 0 ] ; then exit_err "Failed extracting FreeBSD environment"; fi
384
385    # Save the archive file
386    mv ${i} ${PXEWORLD}/installarchive/
387  done
388
389}
390
391# Function to check if dhcpd is installed
392check_dhcpd() {
393        which dhcpd >/dev/null 2>/dev/null
394        if [ "$?" = "0" ] ; then return; fi
395
396        echo "Installing $DHCPPORT"
397        pkg install -y ${DHCPPORT}
398        if [ "$?" != "0" ] ; then exit_err "Failed installing ${DHCPPORT}"; fi
399}
400
401# Function to display what information to add to external DHCP server
402ignore_dhcpd() {
403        echo "Add the following information to your external DHCP Server"
404        echo "Will display here when this works"
405}
406
407# Function which checks and sets up the thinclient as an install server
408check_installdirs() {
409        if [ -e "${PXEWORLD}/installscripts/pc-sysinstall.example" ]; then
410           return
411        fi
412        touch ${PXEWORLD}/etc/installserver
413        mkdir ${PXEWORLD}/installscripts
414        cp ${PROGDIR}/resources/scripts/pc-sysinstall.example ${PXEWORLD}/installscripts/pc-sysinstall.example
415        echo "zfs_load=\"YES\"" > ${PXEWORLD}/boot/loader.conf
416        echo "geom_mirror_load=\"YES\"" >> ${PXEWORLD}/boot/loader.conf
417        echo "geom_eli_load=\"YES\"" >> ${PXEWORLD}/boot/loader.conf
418}
419
420do_removal() {
421        if [ -d "${PXEWORLD}" ] ; then
422                echo "Removing ${PXEWORLD}"
423                rm -rf ${PXEWORLD} 2>/dev/null
424                chflags -R noschg ${PXEWORLD} 2>/dev/null
425                rm -rf ${PXEWORLD} 2>/dev/null
426        fi
427}
428
429# Make sure we are root
430if [ `id -u` != "0" ] ; then exit_err "Must be run as root!"; fi
431
432# Check if we are removing the existing thinclient
433if [ "$1" = "-remove" -o "$1" = "remove" ] ;  then
434  do_removal
435  exit 0
436fi
437
438echo "$0 will install the components to convert this system into a thin-client server."
439echo -e "Continue? (Y/N) \c"
440read tmp
441if [ "$tmp" != "Y" -a "$tmp" != "y" ] ; then
442        exit 0
443fi
444
445echo "Do you wish to install the dhcpd server port or use an external server?"
446echo "If you wish to use an external server please make sure it supports adding" 
447echo "next server and bootfile name options."
448echo -e "(d/e) \c"
449read tmp
450if [ "$tmp" = "D" -o "$tmp" = "d" ] ; then
451   DHCPTYPE="internal"
452else
453   DHCPTYPE="external"
454fi
455
456echo "Do you wish to make this a remote X desktop server or install server?"
457echo -e "(r/i) \c"
458read tmp
459if [ "$tmp" = "I" -o "$tmp" = "i" ] ; then
460   SYSTYPE="install"
461else
462   SYSTYPE="desktop"
463fi
464
465
466if [ "$DHCPTYPE" = "internal" ] ; then
467  # Start by installing dhcpd
468  check_dhcpd
469else
470  # Install without dhcpd
471  ignore_dhcpd
472
473# Start by setting up a new buildworld
474check_world
475
476if [ "$SYSTYPE" = "desktop" ] ; then
477  # Build the ports inside the world environment
478  check_worldports
479else
480  # Setup the installation directories
481  check_installdirs
482fi
483
484# Install the thinclient configuration files
485check_installconfig
486
487if [ "$DHCPTYPE" = "internal" ] ; then
488  # Tweak the base system to enable the thinclient
489  check_configsystem
490else
491  # Tweak the base system to enable the thinclient without dhcpd
492  check_configsystem_ignore_dhcp
493fi
494
495if [ "$SYSTYPE" = "desktop" ] ; then
496  echo ""
497  echo "You will now need to enable remote desktop."
498  echo "This can be done via the PC-BSD Control Panel -> GDM Configuration"
499  echo "or by manually editing /usr/local/etc/gdm/custom.conf"
500else
501  echo ""
502  echo "To perform system installations, place your custom pc-sysinstall scripts in:"
503  echo "/usr/home/thinclient/installscripts"
504  echo ""
505  echo "An example script is provided in the above directory"
506  echo ""
507  echo "For unattended installations, save your pc-sysinstall script as:"
508  echo "/usr/home/thinclient/installscripts/unattended.cfg"
509fi
510
511if [ "$DHCPTYPE" = "internal" ] ; then
512  echo " "
513  echo "Your system is now setup to do PXE booting!"
514  exit 0
515else
516  echo "You will need to modify your dhcp server before you can begin using PXE boot"
517  exit 0
518fi
519fi
Note: See TracBrowser for help on using the repository browser.