source: src-sh/pc-thinclient/pc-thinclient @ 8106dcf

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

Update pc-thinclient

Forgot an extra needed ".

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