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

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

Update pc-thinclient

Forgot to change path to hosts.allow that I was using during testing of script code.

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