stx-metal: add kickstart fixes for poky-stx
[pti/rtp.git] / meta-stx / conf / distro / files / ks / net_controller_ks.cfg
1 #
2 # Copyright (c) 2019 Wind River Systems, Inc.
3 # SPDX-License-Identifier: Apache-2.0
4 #
5
6 %pre
7 # This file defines functions that can be used in %pre and %post kickstart sections, by including:
8 # . /tmp/ks-functions.sh
9 #
10
11 cat <<END_FUNCTIONS >/tmp/ks-functions.sh
12 #
13 # Copyright (c) 2019 Wind River Systems, Inc.
14 #
15 # SPDX-License-Identifier: Apache-2.0
16 #
17
18 function get_by_path()
19 {
20     local disk=\$(cd /dev ; readlink -f \$1)
21     for p in /dev/disk/by-path/*; do
22         if [ "\$disk" = "\$(readlink -f \$p)" ]; then
23             echo \$p
24             return
25         fi
26     done
27 }
28
29 function get_disk()
30 {
31     echo \$(cd /dev ; readlink -f \$1)
32 }
33
34 function report_pre_failure_with_msg()
35 {
36     local msg=\$1
37     echo -e '\n\nInstallation failed.\n'
38     echo "\$msg"
39
40     exit 1
41 }
42
43 function report_post_failure_with_msg()
44 {
45     local msg=\$1
46     cat <<EOF >> /etc/motd
47
48 Installation failed.
49 \$msg
50
51 EOF
52     echo "\$msg" >/etc/platform/installation_failed
53
54     echo -e '\n\nInstallation failed.\n'
55     echo "\$msg"
56
57     exit 1
58 }
59
60 function report_post_failure_with_logfile()
61 {
62     local logfile=\$1
63     cat <<EOF >> /etc/motd
64
65 Installation failed.
66 Please see \$logfile for details of failure
67
68 EOF
69     echo \$logfile >/etc/platform/installation_failed
70
71     echo -e '\n\nInstallation failed.\n'
72     cat \$logfile
73
74     exit 1
75 }
76
77 function get_http_port()
78 {
79     echo \$(cat /proc/cmdline |xargs -n1 echo |grep '^inst.repo=' | sed -r 's#^[^/]*://[^/]*:([0-9]*)/.*#\1#')
80 }
81
82 END_FUNCTIONS
83
84 %end
85
86 %post
87 # This file defines functions that can be used in %pre and %post kickstart sections, by including:
88 # . /tmp/ks-functions.sh
89 #
90
91 cat <<END_FUNCTIONS >/tmp/ks-functions.sh
92 #
93 # Copyright (c) 2019 Wind River Systems, Inc.
94 #
95 # SPDX-License-Identifier: Apache-2.0
96 #
97
98 function get_by_path()
99 {
100     local disk=\$(cd /dev ; readlink -f \$1)
101     for p in /dev/disk/by-path/*; do
102         if [ "\$disk" = "\$(readlink -f \$p)" ]; then
103             echo \$p
104             return
105         fi
106     done
107 }
108
109 function get_disk()
110 {
111     echo \$(cd /dev ; readlink -f \$1)
112 }
113
114 function report_pre_failure_with_msg()
115 {
116     local msg=\$1
117     echo -e '\n\nInstallation failed.\n'
118     echo "\$msg"
119
120     exit 1
121 }
122
123 function report_post_failure_with_msg()
124 {
125     local msg=\$1
126     cat <<EOF >> /etc/motd
127
128 Installation failed.
129 \$msg
130
131 EOF
132     echo "\$msg" >/etc/platform/installation_failed
133
134     echo -e '\n\nInstallation failed.\n'
135     echo "\$msg"
136
137     exit 1
138 }
139
140 function report_post_failure_with_logfile()
141 {
142     local logfile=\$1
143     cat <<EOF >> /etc/motd
144
145 Installation failed.
146 Please see \$logfile for details of failure
147
148 EOF
149     echo \$logfile >/etc/platform/installation_failed
150
151     echo -e '\n\nInstallation failed.\n'
152     cat \$logfile
153
154     exit 1
155 }
156
157 function get_http_port()
158 {
159     echo \$(cat /proc/cmdline |xargs -n1 echo |grep '^inst.repo=' | sed -r 's#^[^/]*://[^/]*:([0-9]*)/.*#\1#')
160 }
161
162 END_FUNCTIONS
163
164 %end
165
166
167 # Template from: pre_common_head.cfg
168 %pre --erroronfail
169
170 # Source common functions
171 . /tmp/ks-functions.sh
172
173 # First, parse /proc/cmdline to find the boot args
174 set -- `cat /proc/cmdline`
175 for I in $*; do case "$I" in *=*) eval $I 2>/dev/null;; esac; done
176
177 append=
178 if [ -n "$console" ] ; then
179     append="console=$console"
180 fi
181
182 if [ -n "$security_profile" ]; then
183     append="$append security_profile=$security_profile"
184 fi
185
186 #### SECURITY PROFILE HANDLING (Pre Installation) ####
187 if [ -n "$security_profile" ] && [ "$security_profile" == "extended" ]; then
188     # IMA specific boot options:
189     # Enable Kernel auditing
190     append="$append audit=1"
191 else
192     # we need to blacklist the IMA and Integrity Modules
193     # on standard security profile
194     append="$append module_blacklist=integrity,ima"
195     
196     # Disable Kernel auditing in Standard Security Profile mode
197     append="$append audit=0"
198 fi
199
200 if [ -n "$tboot" ]; then
201     append="$append tboot=$tboot"
202 else
203     append="$append tboot=false"
204 fi
205
206 boot_device_arg=
207 if [ -n "$boot_device" ] ; then
208     boot_device_arg="--boot-drive=$(get_by_path $boot_device)"
209 fi
210
211 echo "bootloader --location=mbr $boot_device_arg --timeout=5 --append=\"$append\"" > /tmp/bootloader-include
212
213 echo "timezone --nontp --utc UTC" >/tmp/timezone-include
214 %end
215
216 #version=DEVEL
217 install
218 lang en_US.UTF-8
219 keyboard us
220 %include /tmp/timezone-include
221 # set to 'x' so we can use shadow password
222 rootpw  --iscrypted x
223 selinux --disabled
224 authconfig --enableshadow --passalgo=sha512
225 firewall --service=ssh
226
227 # The following is the partition information you requested
228 # Note that any partitions you deleted are not expressed
229 # here so unless you clear all partitions first, this is
230 # not guaranteed to work
231 zerombr
232
233 # Disk layout from %pre
234 %include /tmp/part-include
235 # Bootloader parms from %pre
236 %include /tmp/bootloader-include
237
238 reboot --eject
239
240
241 # Template from: pre_net_common.cfg
242 %pre
243
244 # Setup ntp.conf and sync time
245 cat <<EOF >/etc/ntp_kickstart.conf
246 server pxecontroller
247 EOF
248
249 /usr/sbin/ntpd -g -q -n -c /etc/ntp_kickstart.conf
250 if [ $? -eq 0 ]; then
251     /sbin/hwclock --systohc --utc
252 fi
253
254 %end
255
256
257 # Template from: pre_pkglist.cfg
258 %packages
259 @core
260 @base
261 -kernel-module-igb-uio-rt
262 -kernel-module-wrs-avp-rt
263 -kernel-rt
264 -kernel-rt-kvm
265 -kernel-rt-tools
266 -kernel-rt-tools-libs
267 -kmod-drbd-rt
268 -kmod-e1000e-rt
269 -kmod-i40e-rt
270 -kmod-ixgbe-rt
271 -kmod-tpm-rt
272 -mlnx-ofa_kernel
273 -mlnx-ofa_kernel-rt
274 -mlnx-ofa_kernel-rt-modules
275 -qat16-rt
276 @platform-controller
277 @updates-controller
278 %end
279
280
281 # Template from: pre_disk_setup_common.cfg
282 %pre --erroronfail
283
284 # Source common functions
285 . /tmp/ks-functions.sh
286
287 # This is a really fancy way of finding the first usable disk for the
288 # install and not stomping on the USB device if it comes up first
289
290 # First, parse /proc/cmdline to find the boot args
291 set -- `cat /proc/cmdline`
292 for I in $*; do case "$I" in *=*) eval $I 2>/dev/null;; esac; done
293
294 # Find either the ISO or USB device first chopping off partition
295 ISO_DEV=`readlink /dev/disk/by-label/oe_iso_boot`
296 sdev=`echo $ISO_DEV | sed -e 's/.$//'`
297 if [ -e /dev/disk/by-label/$sdev ] ; then
298     ISO_DEV=$sdev
299 fi
300 USB_DEV=`readlink /dev/disk/by-label/wr_usb_boot`
301 sdev=`echo $USB_DEV | sed -e 's/.$//'`
302 if [ -e /dev/disk/by-label/$sdev ] ; then
303     USB_DEV=$sdev
304 fi
305
306 # Temporary, until lab pxelinux.cfg files are updated to specify install devices
307 if [ -z "$rootfs_device" -o -z "$boot_device" ]
308 then
309     INST_HDD=""
310     # Prefer a vd* device if this is kvm/qemu
311     for e in vda vdb sda sdb nvme0n1; do
312         if [ -e /dev/$e -a "$ISO_DEV" != "../../$e" -a "$USB_DEV" != "../../$e" ] ; then
313             INST_HDD=$e
314             break
315         fi
316     done
317
318     # Set variables to $INST_HDD if not set
319     rootfs_device=${rootfs_device:-$INST_HDD}
320     boot_device=${boot_device:-$INST_HDD}
321 fi
322
323 # Convert to by-path
324 orig_rootfs_device=$rootfs_device
325 rootfs_device=$(get_by_path $rootfs_device)
326
327 orig_boot_device=$boot_device
328 boot_device=$(get_by_path $boot_device)
329
330 if [ ! -e "$rootfs_device" -o ! -e "$boot_device" ] ; then
331     # Touch this file to prevent Anaconda from dying an ungraceful death
332     touch /tmp/part-include
333
334     report_pre_failure_with_msg "ERROR: Specified installation ($orig_rootfs_device) or boot ($orig_boot_device) device is invalid."
335 fi
336
337 # Ensure specified device is not a USB drive
338 udevadm info --query=property --name=$rootfs_device |grep -q '^ID_BUS=usb' || \
339     udevadm info --query=property --name=$boot_device |grep -q '^ID_BUS=usb'
340 if [ $? -eq 0 ]; then
341     # Touch this file to prevent Anaconda from dying an ungraceful death
342     touch /tmp/part-include
343
344     report_pre_failure_with_msg "ERROR: Specified installation ($orig_rootfs_device) or boot ($orig_boot_device) device is a USB drive."
345 fi
346
347 # Deactivate existing volume groups to avoid Anaconda issues with pre-existing groups
348 vgs --noheadings -o vg_name | xargs --no-run-if-empty -n 1 vgchange -an
349
350 # Remove volumes and group for cgts-vg, if any
351 lvremove --force cgts-vg
352 pvs --select 'vg_name=cgts-vg' --noheadings -o pv_name | xargs --no-run-if-empty pvremove --force --force --yes
353 vgs --select 'vg_name=cgts-vg' --noheadings -o vg_name | xargs --no-run-if-empty vgremove --force
354
355 ONLYUSE_HDD=""
356 if [ "$(curl -sf http://pxecontroller:6385/v1/upgrade/$(hostname)/in_upgrade 2>/dev/null)" = "true" ]; then
357     # In an upgrade, only wipe the disk with the rootfs and boot partition
358     echo "In upgrade, wiping only $rootfs_device"
359     WIPE_HDD="$(get_disk $rootfs_device)"
360     ONLYUSE_HDD="$(basename $(get_disk $rootfs_device))"
361     if [ "$(get_disk $rootfs_device)" != "$(get_disk $boot_device)" ]; then
362         WIPE_HDD="$WIPE_HDD,$(get_disk $boot_device)"
363         ONLYUSE_HDD="$ONLYUSE_HDD,$(basename $(get_disk $boot_device))"
364     fi
365 else
366     # Make a list of all the hard drives that are to be wiped
367     WIPE_HDD=""
368     # Partition type OSD has a unique globally identifier
369     part_type_guid_str="Partition GUID code"
370     CEPH_OSD_GUID="4FBD7E29-9D25-41B8-AFD0-062C0CEFF05D"
371
372     # Check if we wipe OSDs
373     if [ "$(curl -sf http://pxecontroller:6385/v1/ihosts/wipe_osds 2>/dev/null)" = "true" ]; then
374         echo "Wipe OSD data."
375         WIPE_CEPH_OSDS="true"
376     else
377         echo "Skip Ceph OSD data wipe."
378         WIPE_CEPH_OSDS="false"
379     fi
380
381     for f in /dev/disk/by-path/*
382     do
383         dev=$(readlink -f $f)
384         lsblk --nodeps --pairs $dev | grep -q 'TYPE="disk"'
385         if [ $? -ne 0 ]
386         then
387             continue
388         fi
389
390         # Avoid wiping USB drives
391         udevadm info --query=property --name=$dev |grep -q '^ID_BUS=usb' && continue
392
393         # Avoid wiping ceph osds if sysinv tells us so
394         if [ ${WIPE_CEPH_OSDS} == "false" ]; then
395             wipe_dev="true"
396             part_numbers=( `parted -s $dev print | awk '$1 == "Number" {i=1; next}; i {print $1}'` )
397             # Scanning the partitions looking for CEPH OSDs and
398             # skipping any disk found with such partitions
399             for part_number in "${part_numbers[@]}"; do
400                 sgdisk_part_info=$(flock $dev sgdisk -i $part_number $dev)
401                 part_type_guid=$(echo "$sgdisk_part_info" | grep "$part_type_guid_str" | awk '{print $4;}')
402                 if [ "$part_type_guid" == $CEPH_OSD_GUID ]; then
403                     echo "OSD found on $dev, skipping wipe"
404                     wipe_dev="false"
405                     break
406                 fi
407             done
408             if [ "$wipe_dev" == "false" ]; then
409                 continue
410             fi
411         fi
412
413         # Add device to the wipe list
414         devname=$(basename $dev)
415         if [ -e $dev -a "$ISO_DEV" != "../../$devname" -a "$USB_DEV" != "../../$devname" ]; then
416             if [ -n "$WIPE_HDD" ]; then
417                 WIPE_HDD=$WIPE_HDD,$dev
418             else
419                 WIPE_HDD=$dev
420             fi
421         fi
422     done
423     echo "Not in upgrade, wiping disks: $WIPE_HDD"
424 fi
425
426 for dev in ${WIPE_HDD//,/ }
427 do
428     # Clearing previous GPT tables or LVM data
429     # Delete the first few bytes at the start and end of the partition. This is required with
430     # GPT partitions, they save partition info at the start and the end of the block.
431     # Do this for each partition on the disk, as well.
432     partitions=$(lsblk -rip $dev -o TYPE,NAME |awk '$1 == "part" {print $2}')
433     for p in $partitions $dev
434     do
435         echo "Pre-wiping $p from kickstart"
436         dd if=/dev/zero of=$p bs=512 count=34
437         dd if=/dev/zero of=$p bs=512 count=34 seek=$((`blockdev --getsz $p` - 34))
438     done
439 done
440
441 # Check for remaining cgts-vg PVs, which could potentially happen
442 # in an upgrade where we're not wiping all disks.
443 # If we ever create other volume groups from kickstart in the future,
444 # include them in this search as well.
445 partitions=$(pvs --select 'vg_name=cgts-vg' -o pv_name --noheading | grep -v '\[unknown\]')
446 for p in $partitions
447 do
448     echo "Pre-wiping $p from kickstart (cgts-vg present)"
449     dd if=/dev/zero of=$p bs=512 count=34
450     dd if=/dev/zero of=$p bs=512 count=34 seek=$((`blockdev --getsz $p` - 34))
451 done
452
453 let -i gb=1024*1024*1024
454
455 cat<<EOF>/tmp/part-include
456 clearpart --all --drives=$WIPE_HDD --initlabel
457 EOF
458
459 if [ -n "$ONLYUSE_HDD" ]; then
460     cat<<EOF>>/tmp/part-include
461 ignoredisk --only-use=$ONLYUSE_HDD
462 EOF
463 fi
464
465 if [ -d /sys/firmware/efi ] ; then
466     cat<<EOF>>/tmp/part-include
467 part /boot/efi --fstype=efi --size=300 --ondrive=$(get_disk $boot_device)
468 EOF
469 else
470     cat<<EOF>>/tmp/part-include
471 part biosboot --asprimary --fstype=biosboot --size=1 --ondrive=$(get_disk $boot_device)
472 EOF
473 fi
474
475
476 # Template from: pre_disk_controller.cfg
477
478 ## NOTE: updates to partition sizes need to be also reflected in
479 ## _controller_filesystem_limits() in sysinv/api/controllers/v1/istorconfig.py
480
481 ROOTFS_SIZE=20000
482 LOG_VOL_SIZE=8000
483 SCRATCH_VOL_SIZE=8000
484
485 ROOTFS_OPTIONS="defaults"
486 profile_mode=`cat /proc/cmdline |xargs -n1 echo |grep security_profile= | grep extended`
487 if [ -n "$profile_mode" ]; then
488    # Enable iversion labelling for rootfs when IMA is enabled
489    ROOTFS_OPTIONS="${ROOTFS_OPTIONS},iversion"
490 fi
491
492 cat<<EOF>>/tmp/part-include
493 part /boot --fstype=ext4 --asprimary --size=500 --ondrive=$(get_disk $rootfs_device) --fsoptions="$ROOTFS_OPTIONS"
494 part pv.253004 --grow --asprimary --size=500 --ondrive=$(get_disk $rootfs_device)
495 volgroup cgts-vg --pesize=32768 pv.253004
496 logvol /var/log --fstype=ext4 --vgname=cgts-vg --size=$LOG_VOL_SIZE --name=log-lv
497 logvol /scratch --fstype=ext4 --vgname=cgts-vg --size=$SCRATCH_VOL_SIZE --name=scratch-lv
498 part / --fstype=ext4 --asprimary --size=$ROOTFS_SIZE --ondrive=$(get_disk $rootfs_device) --fsoptions="$ROOTFS_OPTIONS"
499
500 EOF
501
502 %end
503
504
505 # Template from: post_platform_conf_controller.cfg
506 %post --erroronfail
507
508 # Source common functions
509 . /tmp/ks-functions.sh
510
511 # Set the security profile mode
512 secprofile="standard"
513 profile_mode=`cat /proc/cmdline |xargs -n1 echo |grep security_profile= | grep extended`
514 if [ -n "$profile_mode" ]; then
515    secprofile="extended"
516 fi
517
518 mkdir -p -m 0775 /etc/platform
519 cat <<EOF > /etc/platform/platform.conf
520 nodetype=controller
521 subfunction=controller
522 system_type=Standard
523 security_profile=$secprofile
524 EOF
525
526 %end
527
528
529 # Template from: post_common.cfg
530 %post --erroronfail
531
532 # Source common functions
533 . /tmp/ks-functions.sh
534
535 # Turn off locale support for i18n if is not installed
536 if [ ! -d /usr/share/i18n ] ; then
537    rm -f /etc/sysconfig/i18n
538 fi
539 # Unset the hostname
540 rm /etc/hostname
541
542 # If using a serial install make sure to add a getty on the tty1
543 conarg=`cat /proc/cmdline |xargs -n1 echo |grep console= |grep ttyS`
544 if [ -n "$conarg" ] ; then
545    echo "1:2345:respawn:/sbin/mingetty tty1" >> /etc/inittab
546 fi
547
548 #### SECURITY PROFILE HANDLING (Post Installation) ####
549 # Check if the Security profile mode is enabled
550 # and load the appropriate kernel modules
551 secprofile=`cat /proc/cmdline |xargs -n1 echo |grep security_profile= | grep extended`
552 if [ -n "$secprofile" ]; then
553    echo "In Extended Security profile mode. Loading IMA kernel module"
554    systemctl enable auditd.service
555    # Add the securityfs mount for the IMA Runtime measurement list
556    echo "securityfs     /sys/kernel/security    securityfs    defaults,nodev 0 0" >> /etc/fstab
557 else
558    # Disable audit daemon in the Standard Security Profile
559    systemctl disable auditd
560 fi
561
562 . /etc/platform/platform.conf
563 # Configure smart package manager channels
564 rm -rf /var/lib/smart
565 mkdir /var/lib/smart
566 /usr/bin/smart channel -y \
567     --add rpmdb type=rpm-sys name="RPM Database"
568 /usr/bin/smart channel -y \
569     --add base type=rpm-md name="Base" baseurl=http://controller:${http_port:-8080}/feed/rel-19.12
570 /usr/bin/smart channel -y \
571     --add updates type=rpm-md name="Patches" baseurl=http://controller:${http_port:-8080}/updates/rel-19.12
572
573 # Configure smart to use rpm --nolinktos option
574 /usr/bin/smart config --set rpm-nolinktos=true
575
576 # Configure smart to use rpm --nosignature option
577 /usr/bin/smart config --set rpm-check-signatures=false
578
579 # Delete the CentOS yum repo files
580 rm -f /etc/yum.repos.d/CentOS-*
581
582 # Persist the boot device naming as UDEV rules so that if the network device
583 # order changes post-install that we will still be able to DHCP from the
584 # correct interface to reach the active controller.  For most nodes only the
585 # management/boot interface needs to be persisted but because we require both
586 # controllers to be identically configured and controller-0 and controller-1
587 # are installed differently (e.g., controller-0 from USB and controller-1 from
588 # network) it is not possible to know which interface to persist for
589 # controller-0.  The simplest solution is to persist all interfaces.
590 #
591 mkdir -p /etc/udev/rules.d
592 echo "# Persisted network interfaces from anaconda installer" > /etc/udev/rules.d/70-persistent-net.rules
593 for dir in /sys/class/net/*; do
594     if [ -e ${dir}/device ]; then
595        dev=$(basename ${dir})
596        mac_address=$(cat /sys/class/net/${dev}/address)
597        echo "ACTION==\"add\", SUBSYSTEM==\"net\", DRIVERS==\"?*\", ATTR{address}==\"${mac_address}\", NAME=\"${dev}\"" >> /etc/udev/rules.d/70-persistent-net.rules
598     fi
599 done
600
601 # Mark the sysadmin password as expired immediately
602 chage -d 0 sysadmin
603
604 # Lock the root password
605 passwd -l root
606
607 # Enable tmpfs mount for /tmp
608 # delete /var/tmp so that it can similinked in
609 rm -rf /var/tmp
610 systemctl enable tmp.mount
611
612 # Disable automount of /dev/hugepages
613 systemctl mask dev-hugepages.mount
614
615 # Disable firewall
616 systemctl disable firewalld
617
618 # Disable libvirtd
619 systemctl disable libvirtd.service
620
621 # Enable rsyncd
622 systemctl enable rsyncd.service
623
624 # Allow root to run sudo from a non-tty (for scripts running as root that run sudo cmds)
625 echo 'Defaults:root !requiretty' > /etc/sudoers.d/root
626
627 # Make fstab just root read/writable
628 chmod 600 /etc/fstab
629
630 # Create first_boot flag
631 touch /etc/platform/.first_boot
632
633 %end
634
635 # Template from: post_kernel_controller.cfg
636 %post --erroronfail
637
638 # Source common functions
639 . /tmp/ks-functions.sh
640
641 ## Custom kernel options
642 KERN_OPTS=" intel_iommu=off usbcore.autosuspend=-1"
643
644 ## Setup the loop module to support up to 15 partitions so that we can enable the
645 ## customer to manually resize images if needed.
646 ##
647 KERN_OPTS="${KERN_OPTS} loop.max_part=15"
648
649 ## Add kernel options to ensure an selinux is disabled
650 KERN_OPTS="${KERN_OPTS} selinux=0 enforcing=0"
651
652 # Add kernel options to ensure NMI watchdog is enabled, if supported
653 KERN_OPTS="${KERN_OPTS} nmi_watchdog=panic,1 softlockup_panic=1"
654
655 # Add kernel option to disable biosdevname if enabled
656 # As this may already be in GRUB_CMDLINE_LINUX, only add if it is not already present
657 grep -q '^GRUB_CMDLINE_LINUX=.*biosdevname=0' /etc/default/grub
658 if [ $? -ne 0 ]; then
659     KERN_OPTS="${KERN_OPTS} biosdevname=0"
660 fi
661
662 # k8s updates
663 #KERN_OPTS="${KERN_OPTS} cgroup_disable=memory"
664 KERN_OPTS="${KERN_OPTS} user_namespace.enable=1"
665
666 # If the installer asked us to use security related kernel params, use
667 # them in the grub line as well (until they can be configured via puppet)
668 grep -q 'nopti' /proc/cmdline
669 if [ $? -eq 0 ]; then
670     KERN_OPTS="${KERN_OPTS} nopti"
671 fi
672 grep -q 'nospectre_v2' /proc/cmdline
673 if [ $? -eq 0 ]; then
674     KERN_OPTS="${KERN_OPTS} nospectre_v2"
675 fi
676
677 perl -pi -e 's/(GRUB_CMDLINE_LINUX=.*)\"/\1'"$KERN_OPTS"'\"/g' /etc/default/grub
678
679 if [ -d /sys/firmware/efi ] ; then
680   grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
681 else
682   grub2-mkconfig -o /boot/grub2/grub.cfg
683 fi
684
685 %end
686
687
688 # Template from: post_lvm_pv_on_rootfs.cfg
689 %post --erroronfail
690
691 # Source common functions
692 . /tmp/ks-functions.sh
693
694 # uncomment the global_filter line in lvm.conf
695 perl -0777 -i.bak -pe 's:(# This configuration option has an automatic default value\.\n)\t# global_filter:$1        global_filter:m' /etc/lvm/lvm.conf
696
697 # Determine which disk we created our PV on (i.e. the root disk)
698 ROOTDISK=$(get_by_path $(pvdisplay --select 'vg_name=cgts-vg' -C -o pv_name --noheadings))
699 if [ -z "$ROOTDISK" ]; then
700     report_post_failure_with_msg "ERROR: failed to identify rootdisk via pvdisplay"
701 fi
702 # Edit the LVM config so LVM only looks for LVs on the root disk
703 sed -i "s#^\( *\)global_filter = \[.*#\1global_filter = [ \"a|${ROOTDISK}|\", \"r|.*|\" ]#" /etc/lvm/lvm.conf
704 %end
705
706
707 # Template from: post_net_controller.cfg
708 %post --erroronfail
709
710 # Source common functions
711 . /tmp/ks-functions.sh
712
713 http_port=$(get_http_port)
714 # Retrieve the installation uuid from the controller we booted from
715 INSTALL_UUID=`curl -sf http://pxecontroller:${http_port:-8080}/feed/rel-19.12/install_uuid`
716 if [ $? -ne 0 ]
717 then
718   INSTALL_UUID=unknown
719 fi
720
721 grep -q INSTALL_UUID /etc/platform/platform.conf
722 if [ $? -ne 0 ]; then
723     echo "INSTALL_UUID=$INSTALL_UUID" >> /etc/platform/platform.conf
724 fi
725
726 cd /www/pages
727 # Sync software repository
728 feed_url=http://pxecontroller:${http_port:-8080}/feed/
729 anaconda_logdir=/var/log/anaconda
730 mkdir -p $anaconda_logdir
731
732 echo "Mirroring software repository (may take several minutes)..." >/dev/console
733 wget --recursive --no-parent --no-host-directories --no-clobber --reject 'index.html*' --reject '*.log' $feed_url/ -o $anaconda_logdir/wget-feed-mirror.log \
734     || report_post_failure_with_logfile $anaconda_logdir/wget-feed-mirror.log
735
736 # Sync patching repository
737 updates_url=http://pxecontroller:${http_port:-8080}/updates/
738 wget --mirror --no-parent --no-host-directories --reject 'index.html*' --reject '*.log' $updates_url/ -o $anaconda_logdir/wget-updates-mirror.log \
739     || report_post_failure_with_logfile $anaconda_logdir/wget-updates-mirror.log
740 echo "Done" >/dev/console
741
742 shopt -s nullglob
743
744 # Check whether a second release is installed
745 . /etc/build.info
746 CURRENT_REL_DIR=rel-${SW_VERSION}
747 OTHER_REL_DIR=
748 for REL_DIR in /www/pages/feed/*; do
749     if [[ ! $REL_DIR =~ "${SW_VERSION}" ]]; then
750         OTHER_REL_DIR=`basename $REL_DIR`
751         OTHER_REL_VERSION=${OTHER_REL_DIR:4}
752         break
753     fi
754 done
755
756 # If second release is installed, find the latest version of the installer
757 # RPM and install the pxeboot files we require to boot hosts with that release.
758 if [ ! -z "$OTHER_REL_DIR" ]; then
759     PATCH_RPM=`find /www/pages/updates/${OTHER_REL_DIR}/Packages -name 'pxe-network-installer*' | sort -V | tail -1`
760     BASE_RPM=`find /www/pages/feed/${OTHER_REL_DIR}/Packages -name 'pxe-network-installer*' | sort -V | tail -1`
761
762     if [ ! -z "$PATCH_RPM" ]; then
763         INSTALL_RPM=$PATCH_RPM
764     elif [ ! -z "$BASE_RPM" ]; then
765         INSTALL_RPM=$BASE_RPM
766     else
767         report_post_failure_with_msg "ERROR: Unable to find pxe-network-installer RPM for $OTHER_REL_DIR. Aborting installation."
768     fi
769
770     echo "Installing pxeboot files for release $OTHER_REL_DIR from $INSTALL_RPM" >/dev/console
771     TMP_RPM=/tmp/pxe-network-installer
772     mkdir $TMP_RPM
773     pushd $TMP_RPM
774     /usr/bin/rpm2cpio $INSTALL_RPM | cpio -idm \
775         || report_post_failure_with_msg "Failed to extract pxe-network-installer"
776
777     cp -r $TMP_RPM/usr / \
778         || report_post_failure_with_msg "Failed to copy pxe-network-installer /usr"
779     cp -r $TMP_RPM/pxeboot/$OTHER_REL_DIR /pxeboot/ \
780         || report_post_failure_with_msg "Failed to copy pxe-network-installer /pxeboot/$OTHER_REL_DIR"
781     cp $TMP_RPM/pxeboot/pxelinux.cfg.files/*-$OTHER_REL_VERSION /pxeboot/pxelinux.cfg.files/ \
782         || report_post_failure_with_msg "Failed to copy pxe-network-installer pxelinux.cfg files"
783
784     rm -rf $TMP_RPM
785 fi
786
787 %end
788
789 # Template from: post_net_common.cfg
790 %pre --erroronfail
791
792 # Source common functions
793 . /tmp/ks-functions.sh
794
795 http_port=$(get_http_port)
796 echo "repo --name=base --baseurl=http://pxecontroller:${http_port:-8080}/feed/rel-19.12/" > /tmp/repo-include
797 echo "repo --name=updates --baseurl=http://pxecontroller:${http_port:-8080}/updates/rel-19.12/" > /tmp/repo-include
798
799 %end
800
801 # Repository arguments from %pre
802 %include /tmp/repo-include
803
804
805 %post --erroronfail
806
807 # Source common functions
808 . /tmp/ks-functions.sh
809
810 # Persist the http port to the platform configuration
811 echo http_port=$(get_http_port) >> /etc/platform/platform.conf
812
813 # Obtain the boot interface from the PXE boot
814 BOOTIF=`cat /proc/cmdline |xargs -n1 echo |grep BOOTIF=`
815 if [ -d /sys/firmware/efi ] ; then
816     BOOTIF=${BOOTIF#BOOTIF=}
817 else
818     BOOTIF=${BOOTIF#BOOTIF=01-}
819     BOOTIF=${BOOTIF//-/:}
820 fi
821
822 mgmt_dev=none
823 mgmt_vlan=0
824 if [ -n "$BOOTIF" ] ; then
825     ndev=`ip link show |grep -B 1 $BOOTIF |head -1 |awk '{print $2}' |sed -e 's/://'`
826     if [ -n "$ndev" ] ; then
827         mgmt_dev=$ndev
828         # Retrieve the management VLAN from sysinv if it exists
829         mgmt_vlan=`curl -sf http://pxecontroller:6385/v1/isystems/mgmtvlan`
830         if [ $? -ne 0 ]
831         then
832           report_post_failure_with_msg "ERROR: Unable to communicate with System Inventory REST API. Aborting installation."
833         fi
834     else
835         report_post_failure_with_msg "ERROR: Unable to determine mgmt interface from BOOTIF=$BOOTIF."
836     fi
837 else
838     report_post_failure_with_msg "ERROR: BOOTIF is not set. Unable to determine mgmt interface."
839 fi
840
841 if [ $mgmt_vlan -eq 0 ] ; then
842
843     # Persist the boot device to the platform configuration. This will get
844     # overwritten later if the management_interface is on a bonded interface.
845     echo management_interface=$mgmt_dev >> /etc/platform/platform.conf
846
847     # Build networking scripts
848     cat << EOF > /etc/sysconfig/network-scripts/ifcfg-lo
849 DEVICE=lo
850 IPADDR=127.0.0.1
851 NETMASK=255.0.0.0
852 NETWORK=127.0.0.0
853 BROADCAST=127.255.255.255
854 ONBOOT=yes
855 IPV6_AUTOCONF=no
856 NAME=loopback
857 EOF
858
859     cat << EOF > /etc/sysconfig/network-scripts/ifcfg-$mgmt_dev
860 DEVICE=$mgmt_dev
861 BOOTPROTO=dhcp
862 ONBOOT=yes
863 IPV6_AUTOCONF=no
864 LINKDELAY=20
865 EOF
866
867 else
868
869     # Check whether to use inet or inet6
870     ipv6_addr=$(dig +short AAAA controller)
871     if [[ -n "$ipv6_addr" ]]
872     then
873         mgmt_address_family=inet6
874         ipv6init=yes
875         dhcpv6c=yes
876         dhclientargs=-1
877     else
878         mgmt_address_family=inet
879         ipv6init=no
880         dhcpv6c=no
881         dhclientargs=
882     fi
883
884     # Persist the boot device to the platform configuration. This will get
885     # overwritten later if the management_interface is on a bonded interface.
886     echo management_interface=vlan$mgmt_vlan >> /etc/platform/platform.conf
887
888     # Build networking scripts
889     cat << EOF > /etc/sysconfig/network-scripts/ifcfg-lo
890 DEVICE=lo
891 IPADDR=127.0.0.1
892 NETMASK=255.0.0.0
893 NETWORK=127.0.0.0
894 BROADCAST=127.255.255.255
895 ONBOOT=yes
896 IPV6_AUTOCONF=no
897 NAME=loopback
898 EOF
899
900     cat << EOF > /etc/sysconfig/network-scripts/ifcfg-$mgmt_dev
901 DEVICE=$mgmt_dev
902 BOOTPROTO=none
903 ONBOOT=yes
904 IPV6_AUTOCONF=no
905 LINKDELAY=20
906 EOF
907
908     cat << EOF > /etc/sysconfig/network-scripts/ifcfg-vlan$mgmt_vlan
909 DEVICE=vlan$mgmt_vlan
910 BOOTPROTO=dhcp
911 DHCLIENTARGS=$dhclientargs
912 IPV6INIT=$ipv6init
913 DHCPV6C=$dhcpv6c
914 ONBOOT=yes
915 IPV6_AUTOCONF=no
916 PHYSDEV=$mgmt_dev
917 VLAN=yes
918 LINKDELAY=20
919 EOF
920
921     # Reject DHCPOFFER from DHCP server that doesn't send
922     # wrs-install-uuid option
923     echo "require wrs-install-uuid;" >>/etc/dhcp/dhclient.conf
924     echo "require dhcp6.wrs-install-uuid;" >>/etc/dhcp/dhclient.conf
925
926     # Bring up the mgmt vlan so that a dhcp lease is acquired and an address is
927     # setup prior to the post-install reboot.  This is so that the timing of the IP
928     # address allocation is similar to how normal/non-pxe installation works.
929     mgmt_iface=vlan$mgmt_vlan
930     dhclient_family=$([[ $mgmt_address_family == "inet" ]] && echo -4 || echo -6)
931     ip link add link $mgmt_dev name $mgmt_iface type vlan id $mgmt_vlan
932     ip link set up dev $mgmt_iface
933     dhclient $dhclient_family $mgmt_iface || true
934
935 fi
936
937 %end