Fix grub grepping code for RS Public Cloud
[releng/builder.git] / packer / provision / baseline.sh
1 #!/bin/bash
2
3 # vim: ts=4 sw=4 sts=4 et tw=72 :
4
5 # force any errors to cause the script and job to end in failure
6 set -xeu -o pipefail
7
8 ensure_kernel_install() {
9     # Workaround for mkinitrd failing on occassion.
10     # On CentOS 7 it seems like the kernel install can fail it's mkinitrd
11     # run quietly, so we may not notice the failure. This script retries for a
12     # few times before giving up.
13     initramfs_ver=$(rpm -q kernel | tail -1 | sed "s/kernel-/initramfs-/")
14     grub_conf="/boot/grub/grub.conf"
15     # Public cloud does not use /boot/grub/grub.conf and uses grub2 instead.
16     if [ ! -e "$grub_conf" ]; then
17         echo "$grub_conf not found. Using Grub 2 conf instead."
18         grub_conf="/boot/grub2/grub.cfg"
19     fi
20
21     for i in $(seq 3); do
22         if grep "$initramfs_ver" "$grub_conf"; then
23             break
24         fi
25         echo "Kernel initrd missing. Retrying to install kernel..."
26         yum reinstall -y kernel
27     done
28     if ! grep "$initramfs_ver" "$grub_conf"; then
29         cat /boot/grub/grub.conf
30         echo "ERROR: Failed to install kernel."
31         exit 1
32     fi
33 }
34
35 rh_systems() {
36     # Handle the occurance where SELINUX is actually disabled
37     SELINUX=$(grep -E '^SELINUX=(disabled|permissive|enforcing)$' /etc/selinux/config)
38     MODE=$(echo "$SELINUX" | cut -f 2 -d '=')
39     case "$MODE" in
40         permissive)
41             echo "************************************"
42             echo "** SYSTEM ENTERING ENFORCING MODE **"
43             echo "************************************"
44             # make sure that the filesystem is properly labelled.
45             # it could be not fully labeled correctly if it was just switched
46             # from disabled, the autorelabel misses some things
47             # skip relabelling on /dev as it will generally throw errors
48             restorecon -R -e /dev /
49
50             # enable enforcing mode from the very start
51             setenforce enforcing
52
53             # configure system for enforcing mode on next boot
54             sed -i 's/SELINUX=permissive/SELINUX=enforcing/' /etc/selinux/config
55         ;;
56         disabled)
57             sed -i 's/SELINUX=disabled/SELINUX=permissive/' /etc/selinux/config
58             touch /.autorelabel
59
60             echo "*******************************************"
61             echo "** SYSTEM REQUIRES A RESTART FOR SELINUX **"
62             echo "*******************************************"
63         ;;
64         enforcing)
65             echo "*********************************"
66             echo "** SYSTEM IS IN ENFORCING MODE **"
67             echo "*********************************"
68         ;;
69     esac
70
71     # Allow jenkins access to alternatives command to switch java version
72     cat <<EOF >/etc/sudoers.d/89-jenkins-user-defaults
73 Defaults:jenkins !requiretty
74 jenkins ALL = NOPASSWD: /usr/sbin/alternatives
75 EOF
76
77     echo "---> Updating operating system"
78     yum clean all
79     yum install -y deltarpm
80     yum update -y
81
82     ensure_kernel_install
83
84     # add in components we need or want on systems
85     echo "---> Installing base packages"
86     yum install -y @base https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
87     # separate group installs from package installs since a non-existing
88     # group with dnf based systems (F21+) will fail the install if such
89     # a group does not exist
90     yum install -y unzip xz puppet git git-review perl-XML-XPath ShellCheck
91
92     # All of our systems require Java (because of Jenkins)
93     # Install all versions of the OpenJDK devel but force 1.7.0 to be the
94     # default
95
96     echo "---> Configuring OpenJDK"
97     yum install -y 'java-*-openjdk-devel'
98
99     FACTER_OS=$(/usr/bin/facter operatingsystem)
100     FACTER_OSVER=$(/usr/bin/facter operatingsystemrelease)
101     case "$FACTER_OS" in
102         Fedora)
103             if [ "$FACTER_OSVER" -ge "21" ]
104             then
105                 echo "---> not modifying java alternatives as OpenJDK 1.7.0 does not exist"
106             else
107                 alternatives --set java /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java
108                 alternatives --set java_sdk_openjdk /usr/lib/jvm/java-1.7.0-openjdk.x86_64
109             fi
110         ;;
111         RedHat|CentOS)
112             if [ "$(echo "$FACTER_OSVER" | cut -d'.' -f1)" -ge "7" ]
113             then
114                 echo "---> not modifying java alternatives as OpenJDK 1.7.0 does not exist"
115             else
116                 alternatives --set java /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java
117                 alternatives --set java_sdk_openjdk /usr/lib/jvm/java-1.7.0-openjdk.x86_64
118             fi
119         ;;
120         *)
121             alternatives --set java /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java
122             alternatives --set java_sdk_openjdk /usr/lib/jvm/java-1.7.0-openjdk.x86_64
123         ;;
124     esac
125
126     # Needed to parse OpenStack commands used by opendaylight-infra stack commands
127     # to initialize Heat template based systems.
128     yum install -y jq
129
130     # install haveged to avoid low entropy rejecting ssh connections
131     yum install -y haveged
132     systemctl enable haveged.service
133
134 }
135
136 ubuntu_systems() {
137     # Ignore SELinux since slamming that onto Ubuntu leads to
138     # frustration
139
140     # Allow jenkins access to update-alternatives command to switch java version
141     cat <<EOF >/etc/sudoers.d/89-jenkins-user-defaults
142 Defaults:jenkins !requiretty
143 jenkins ALL = NOPASSWD: /usr/bin/update-alternatives
144 EOF
145
146     export DEBIAN_FRONTEND=noninteractive
147     cat <<EOF >> /etc/apt/apt.conf
148 APT {
149   Get {
150     Assume-Yes "true";
151     allow-change-held-packages "true";
152     allow-downgrades "true";
153     allow-remove-essential "true";
154   };
155 };
156
157 Dpkg::Options {
158   "--force-confdef";
159   "--force-confold";
160 };
161
162 EOF
163
164     # Add hostname to /etc/hosts to fix 'unable to resolve host' issue with sudo
165     sed -i "/127.0.0.1/s/$/ $(hostname)/" /etc/hosts
166
167     echo "---> Updating operating system"
168
169     # add additional repositories
170     sudo add-apt-repository "deb http://us.archive.ubuntu.com/ubuntu $(lsb_release -sc) main universe restricted multiverse"
171
172     echo "---> Installing base packages"
173     # Use retry loop to install packages for failing mirrors
174     for i in {0..5}
175     do
176         echo "Attempt $i of installing base packages..."
177         apt-get clean
178         apt-get update -m
179         apt-get upgrade -m
180         apt-get dist-upgrade -m
181
182         for pkg in unzip xz-utils puppet git git-review libxml-xpath-perl
183         do
184             # shellcheck disable=SC2046
185             if [ $(dpkg-query -W -f='${Status}' $pkg 2>/dev/null | grep -c "ok installed") -eq 0 ]; then
186                 apt-get install $pkg
187             fi
188         done
189     done
190
191     # install Java 7
192     echo "---> Configuring OpenJDK"
193     FACTER_OSVER=$(/usr/bin/facter operatingsystemrelease)
194     case "$FACTER_OSVER" in
195         14.04)
196             apt-get install openjdk-7-jdk
197             # make jdk8 available
198             add-apt-repository -y ppa:openjdk-r/ppa
199             apt-get update
200             # We need to force openjdk-8-jdk to install
201             apt-get install openjdk-8-jdk
202             # make sure that we still default to openjdk 7
203             update-alternatives --set java /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java
204             update-alternatives --set javac /usr/lib/jvm/java-7-openjdk-amd64/bin/javac
205         ;;
206         16.04)
207             apt-get install openjdk-8-jdk
208         ;;
209         *)
210             echo "---> Unknown Ubuntu version $FACTER_OSVER"
211             exit 1
212         ;;
213     esac
214
215     # Needed to parse OpenStack commands used by opendaylight-infra stack commands
216     # to initialize Heat template based systems.
217     apt-get install jq
218
219     # install haveged to avoid low entropy rejecting ssh connections
220     apt-get install haveged
221     update-rc.d haveged defaults
222
223     # disable unattended upgrades & daily updates
224     echo '---> Disabling automatic daily upgrades'
225     sed -ine 's/"1"/"0"/g' /etc/apt/apt.conf.d/10periodic
226     echo 'APT::Periodic::Unattended-Upgrade "0";' >> /etc/apt/apt.conf.d/10periodic
227 }
228
229 all_systems() {
230     # To handle the prompt style that is expected all over the environment
231     # with how use use robotframework we need to make sure that it is
232     # consistent for any of the users that are created during dynamic spin
233     # ups
234     echo 'PS1="[\u@\h \W]> "' >> /etc/skel/.bashrc
235
236     # Do any Distro specific installations here
237     echo "Checking distribution"
238     FACTER_OS=$(/usr/bin/facter operatingsystem)
239     case "$FACTER_OS" in
240         RedHat|CentOS)
241             if [ "$(/usr/bin/facter operatingsystemrelease | /bin/cut -d '.' -f1)" = "7" ]; then
242                 echo
243                 echo "---> CentOS 7"
244                 echo "No extra steps currently for CentOS 7"
245                 echo
246             else
247                 echo "---> CentOS 6"
248                 echo "Installing ODL YUM repo"
249                 yum install -y https://nexus.opendaylight.org/content/repositories/opendaylight-yum-epel-6-x86_64/rpm/opendaylight-release/0.1.0-1.el6.noarch/opendaylight-release-0.1.0-1.el6.noarch.rpm
250             fi
251         ;;
252         *)
253             echo "---> $FACTER_OS found"
254             echo "No extra steps for $FACTER_OS"
255         ;;
256     esac
257 }
258
259 echo "---> Attempting to detect OS"
260 # upstream cloud images use the distro name as the initial user
261 ORIGIN=$(if [ -e /etc/redhat-release ]
262     then
263         echo redhat
264     else
265         echo ubuntu
266     fi)
267 #ORIGIN=$(logname)
268
269 case "${ORIGIN}" in
270     fedora|centos|redhat)
271         echo "---> RH type system detected"
272         rh_systems
273     ;;
274     ubuntu)
275         echo "---> Ubuntu system detected"
276         ubuntu_systems
277     ;;
278     *)
279         echo "---> Unknown operating system"
280     ;;
281 esac
282
283 # execute steps for all systems
284 all_systems