source: src-sh/pc-thinclient/pc-thinclient @ 23421e3

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

Update pc-thinclient

Correction. Add user input for network id and network mask to /etc/exports with necessary options. Fixed file output path also.

  • Property mode set to 100644
File size: 15.0 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       
189                # Ask for the network mask of the local subnet
190        while
191        z=1
192        do
193                echo "What is the network mask for your local subnet? (I.E. 255.255.255.0)"
194                echo -e "netmaskid) \c"
195                read netmaskid
196        break
197        done
198
199
200portmap_enable=\"YES\"
201nfs_server_enable=\"YES\"
202inetd_enable=\"YES\"
203
204        # Add firewall exception
205        if [ -e "/etc/pf.conf" ] ; then
206          cat /etc/pf.conf | grep "pass in on ${NIC} all" >/dev/null 2>/dev/null
207          if [ "$?" != "0" ] ; then
208                # Setup the firewall exclusion for this NIC
209                echo "pass in on ${NIC} all" >> /etc/pf.conf
210          fi
211        fi
212
213        # Add some entries for /etc/exports based on manual user input
214        echo "-maproot=nobody -ro -network $netid -mask $netmaskid" >> /etc/exports
215
216        # Setup tftp
217        cat /etc/inetd.conf | grep "$PXEWORLD" >/dev/null 2>/dev/null
218        if [ "$?" != "0" ] ; then
219                echo "tftp   dgram   udp     wait    root    /usr/libexec/tftpd      tftpd -l -s ${PXEWORLD}" >> /etc/inetd.conf
220        fi
221       
222        # Setup rcpbind entries
223        cat /etc/hosts.allow 2>/dev/null | grep "192.168.2.0" >/dev/null 2>/dev/null
224        if [ "$?" != "0" ] ; then
225                sed  -i '' 's|rpcbind : ALL : deny|rpcbind : 192.168.2.0/255.255.255.0 : allow\
226portmap : 192.168.2.0/255.255.255.0 : allow\
227rpcbind : ALL : deny|' /etc/hosts.allow
228        fi
229
230        # Add a bulk of IPs to /etc/hosts this fixes bugs with RPC timeouts
231        # when mounting NFS
232        grep -q 'thinclient100' /etc/hosts
233        if [ $? -ne 0 ] ; then
234                i="100"
235                while
236                z="1"
237                do
238                        if [ "${i}" = "200" ]; then break; fi
239                        echo "192.168.2.${i}  thinclient${i}" >>/etc/hosts
240                        i="`expr ${i} + 1`"
241                done
242        fi
243
244        # Start the services
245        cmds="/etc/rc.d/nfsd /etc/rc.d/inetd"
246        for _sC in $cmds
247        do
248                echo -e "Starting ${_sC}...\c"
249                ${_sC} restart >/dev/null 2>/dev/null
250                if [ "$?" != "0" ] ; then
251                        echo -e "FAILED! Please run try running it manually."
252                else
253                        echo -e "OK"
254                fi
255        done
256}
257
258
259# Check if we need to install custom config
260check_installconfig() {
261        if [ -e "${PXEWORLD}/etc/scripts/tcslogin.sh" ] ; then return ; fi
262
263        # Lets copy over the /etc/scripts directory
264        rm -rf ${PXEWORLD}/etc/scripts >/dev/null 2>/dev/null
265        cp -r ${PROGDIR}/resources/scripts ${PXEWORLD}/etc/scripts
266
267        # Remove a few rc.d things we dont need on clients
268        rm ${PXEWORLD}/etc/rc.d/cron
269        rm ${PXEWORLD}/etc/rc.d/sendmail
270
271        # Lets copy over all the /etc/ files we need
272        cp ${PROGDIR}/resources/etc/fstab ${PXEWORLD}/etc/
273        cp ${PROGDIR}/resources/etc/gettytab ${PXEWORLD}/etc/
274        cp ${PROGDIR}/resources/etc/hosts ${PXEWORLD}/etc/
275        cp ${PROGDIR}/resources/etc/motd ${PXEWORLD}/etc/
276        cp ${PROGDIR}/resources/etc/rc.conf ${PXEWORLD}/etc/
277        cp ${PROGDIR}/resources/etc/ttys ${PXEWORLD}/etc/
278
279        # Copy over rc.d / boot / root files
280        cp ${PROGDIR}/resources/boot/beastie.4th ${PXEWORLD}/boot/
281        cp ${PROGDIR}/resources/root/dot.login ${PXEWORLD}/root/.login
282
283        # Create a few directories used on client
284        mkdir -p ${PXEWORLD}/mnt/xorg-config
285
286        # Create the diskless configuration
287        mkdir -p ${PXEWORLD}/conf/base
288        mkdir -p ${PXEWORLD}/conf/base/etc
289        mkdir -p ${PXEWORLD}/conf/base/var
290        mkdir -p ${PXEWORLD}/conf/base/root
291        echo "10m" > ${PXEWORLD}/conf/base/etc/md_size
292        echo "20m" > ${PXEWORLD}/conf/base/var/md_size
293        echo "30m" > ${PXEWORLD}/conf/base/root/md_size
294        chroot ${PXEWORLD} tar cvf conf/base/etc.cpio.gz --format cpio --gzip etc 2>/dev/null
295        chroot ${PXEWORLD} tar cvf conf/base/var.cpio.gz --exclude var/db/pkg --format cpio --gzip var 2>/dev/null
296        chroot ${PXEWORLD} tar cvf conf/base/root.cpio.gz --format cpio --gzip root 2>/dev/null
297       
298}
299
300# Check if we need to build the world environment
301check_worldports() {
302        if [ -e "${PXEWORLD}/usr/local/bin/xv" ] ; then return ; fi
303
304        if [ ! -d "${PXEWORLD}/usr/ports/x11/xorg" -a ! -d "/usr/ports/x11/xorg" ] ; then
305                exit_err "Missing /usr/ports/x11/xorg, please checkout ports tree to continue"
306        fi
307
308        if [ ! -d "${PXEWORLD}/usr/ports/x11/xorg" ] ; then
309                rm -rf "${PXEWORLD}/usr/ports"
310                echo "Copying /usr/ports -> ${PXEWORLD}/usr/ports"
311                cp -r /usr/ports ${PXEWORLD}/usr/ports
312        fi
313
314        # Building ports inside world
315        mount -t devfs devfs ${PXEWORLD}/dev
316        cp /etc/resolv.conf ${PXEWORLD}/etc/resolv.conf
317        echo "BATCH=yes" >> ${PXEWORLD}/etc/make.conf
318        echo '#!/bin/sh
319
320/etc/rc.d/ldconfig start
321chmod 777 /tmp
322MACHINE=i386 ; export MACHINE
323UNAME_p=i386 ; export UNAME_p
324UNAME_m=i386 ; export UNAME_m
325
326for p in $WORLDPORTS
327do
328        cd /usr/ports/$p
329        make install
330        if [ "$?" != "0" ] ; then
331                exit 1
332        fi
333done
334' > ${PXEWORLD}/.mkports.sh
335
336        chmod 755 ${PXEWORLD}/.mkports.sh
337        chroot ${PXEWORLD} /.mkports.sh
338        if [ "$?" != "0" ] ; then
339                exit_err "Failed building thinclient world ports!"
340        fi
341        rm ${PXEWORLD}/.mkports.sh
342        umount ${PXEWORLD}/dev
343
344}
345
346# Check if we need to build the world environment
347check_world() {
348  if [ -e "${PXEWORLD}/COPYRIGHT" ] ; then return ; fi
349       
350  mkdir -p "${PXEWORLD}"
351  cd "${PXEWORLD}"
352
353  # Default pcbsd.conf file
354  PCBSD_ETCCONF="/usr/local/etc/pcbsd.conf"
355
356  # Set the mirror URL
357  get_mirror
358  MIRRORURL="$VAL"
359
360  # Set the system arch type
361  if [ "$SYSTYPE" = "desktop" ] ; then
362    # If building remote X server, we don't need to run amd64
363    ARCH="i386"
364  else
365    ARCH="`uname -m`"
366  fi
367
368  local dFiles="base.txz doc.txz kernel.txz games.txz"
369  if [ "$ARCH" = "amd64" ] ; then
370     dFiles="$dFiles lib32.txz"
371  fi
372
373  # To fetch the jail environment
374  echo "Fetching FreeBSD environment. This may take a while..."
375  for i in $dFiles
376  do
377    echo "Downloading ${MIRRORURL}/${SYSVER}/${ARCH}/dist/${i} ..."
378   
379    get_file_from_mirrors "/${SYSVER}/${ARCH}/dist/${i}" "$i"
380    [ $? -ne 0 ] && exit_err "Error while downloading the freebsd world."
381  done
382
383  # Save the archive as our example world environment
384  mkdir -p ${PXEWORLD}/installarchive/
385
386  echo "Extracting FreeBSD environment... This may take a while..."
387  # Extract dist files
388  for i in $dFiles
389  do
390    tar xvpf ${i} 2>/dev/null
391    if [ $? -ne 0 ] ; then exit_err "Failed extracting FreeBSD environment"; fi
392
393    # Save the archive file
394    mv ${i} ${PXEWORLD}/installarchive/
395  done
396
397}
398
399# Function to check if dhcpd is installed
400check_dhcpd() {
401        which dhcpd >/dev/null 2>/dev/null
402        if [ "$?" = "0" ] ; then return; fi
403
404        echo "Installing $DHCPPORT"
405        pkg install -y ${DHCPPORT}
406        if [ "$?" != "0" ] ; then exit_err "Failed installing ${DHCPPORT}"; fi
407}
408
409# Function to display what information to add to external DHCP server
410ignore_dhcpd() {
411        echo "Add the following information to your external DHCP Server"
412        echo "Will display here when this works"
413}
414
415# Function which checks and sets up the thinclient as an install server
416check_installdirs() {
417        if [ -e "${PXEWORLD}/installscripts/pc-sysinstall.example" ]; then
418           return
419        fi
420        touch ${PXEWORLD}/etc/installserver
421        mkdir ${PXEWORLD}/installscripts
422        cp ${PROGDIR}/resources/scripts/pc-sysinstall.example ${PXEWORLD}/installscripts/pc-sysinstall.example
423        echo "zfs_load=\"YES\"" > ${PXEWORLD}/boot/loader.conf
424        echo "geom_mirror_load=\"YES\"" >> ${PXEWORLD}/boot/loader.conf
425        echo "geom_eli_load=\"YES\"" >> ${PXEWORLD}/boot/loader.conf
426}
427
428do_removal() {
429        if [ -d "${PXEWORLD}" ] ; then
430                echo "Removing ${PXEWORLD}"
431                rm -rf ${PXEWORLD} 2>/dev/null
432                chflags -R noschg ${PXEWORLD} 2>/dev/null
433                rm -rf ${PXEWORLD} 2>/dev/null
434        fi
435}
436
437# Make sure we are root
438if [ `id -u` != "0" ] ; then exit_err "Must be run as root!"; fi
439
440# Check if we are removing the existing thinclient
441if [ "$1" = "-remove" -o "$1" = "remove" ] ;  then
442  do_removal
443  exit 0
444fi
445
446echo "$0 will install the components to convert this system into a thin-client server."
447echo -e "Continue? (Y/N) \c"
448read tmp
449if [ "$tmp" != "Y" -a "$tmp" != "y" ] ; then
450        exit 0
451fi
452
453echo "Do you wish to install the dhcpd server port or use an external server?"
454echo "If you wish to use an external server please make sure it supports adding" 
455echo "next server and bootfile name options."
456echo -e "(d/e) \c"
457read tmp
458if [ "$tmp" = "D" -o "$tmp" = "d" ] ; then
459   DHCPTYPE="internal"
460else
461   DHCPTYPE="external"
462fi
463
464echo "Do you wish to make this a remote X desktop server or install server?"
465echo -e "(r/i) \c"
466read tmp
467if [ "$tmp" = "I" -o "$tmp" = "i" ] ; then
468   SYSTYPE="install"
469else
470   SYSTYPE="desktop"
471fi
472
473
474if [ "$DHCPTYPE" = "internal" ] ; then
475  # Start by installing dhcpd
476  check_dhcpd
477else
478  # Install without dhcpd
479  ignore_dhcpd
480
481# Start by setting up a new buildworld
482check_world
483
484if [ "$SYSTYPE" = "desktop" ] ; then
485  # Build the ports inside the world environment
486  check_worldports
487else
488  # Setup the installation directories
489  check_installdirs
490fi
491
492# Install the thinclient configuration files
493check_installconfig
494
495if [ "$DHCPTYPE" = "internal" ] ; then
496  # Tweak the base system to enable the thinclient
497  check_configsystem
498else
499  # Tweak the base system to enable the thinclient without dhcpd
500  check_configsystem_ignore_dhcp
501fi
502
503if [ "$SYSTYPE" = "desktop" ] ; then
504  echo ""
505  echo "You will now need to enable remote desktop."
506  echo "This can be done via the PC-BSD Control Panel -> GDM Configuration"
507  echo "or by manually editing /usr/local/etc/gdm/custom.conf"
508else
509  echo ""
510  echo "To perform system installations, place your custom pc-sysinstall scripts in:"
511  echo "/usr/home/thinclient/installscripts"
512  echo ""
513  echo "An example script is provided in the above directory"
514  echo ""
515  echo "For unattended installations, save your pc-sysinstall script as:"
516  echo "/usr/home/thinclient/installscripts/unattended.cfg"
517fi
518
519if [ "$DHCPTYPE" = "internal" ] ; then
520  echo " "
521  echo "Your system is now setup to do PXE booting!"
522  exit 0
523else
524  echo "You will need to modify your dhcp server before you can begin using PXE boot"
525  exit 0
526fi
527fi
Note: See TracBrowser for help on using the repository browser.