#!/usr/bin/env bash # # This script is called from prepare-iaas-$os after logging in over ssh as # the root user # set -x os=$(lsb_release -si | tr '[:upper:]' '[:lower:]') if [ "$os" != "ubuntu" ] && [ "$os" != "debian" ]; then echo "unsupported os: '$os'" exit 1 fi # Get rid of ugly perl messages when running from macOS: # === # apt-listchanges: Reading changelogs... # perl: warning: Setting locale failed. # perl: warning: Please check that your locale settings: # LANGUAGE = (unset), # LC_ALL = (unset), # LC_CTYPE = "UTF-8", # LC_TERMINAL = "iTerm2", # LANG = "C.UTF-8" # are supported and installed on your system. # perl: warning: Falling back to a fallback locale ("C.UTF-8"). # === export LC_CTYPE=C.UTF-8 # Remove default user if present if id "$os"; then # Make sure there is no systemd process running as the initial cloud image user # after the "enable root" step in prepare-iaas-$os. If there are any # proceses still running as the specified user the "userdel" command # below will fail. # # Depending on how long we have waited between running the "enable root" # script and this one it is possible the process has timed out on its own, # so run this command before doing "set -e" in case there is no process # to match. pkill -u "$os" -xf "/lib/systemd/systemd --user" # Make sure the process has gone away before continuing sleep_seconds=1 attempt=1 max_attempts=10 while pgrep -u "$os" -xf "/lib/systemd/systemd --user"; do if [ $attempt -gt $max_attempts ]; then echo "failed waiting for systemd process to exit, please investigate" exit 1 fi echo "systemd process still running as '$os' user, this is attempt $attempt out of $max_attempts, sleeping for $sleep_seconds seconds..." sleep $sleep_seconds attempt=$((attempt + 1)) done # While the man page for "userdel" recommends using "deluser" we can not # run "deluser" with "--remove-home" without installing more than the # already included `perl-base` package on debian, so stick with the low # level utility. if ! userdel --remove "$os"; then exit 1 fi fi # From this point we expect all commands to succeed set -e rm /etc/sudoers.d/* # Make sure en_US.UTF-8 is present in the system, expected by at least # bootstrap-cosmos.sh locale_gen_file=/etc/locale.gen if grep -q '^# en_US.UTF-8 UTF-8$' $locale_gen_file; then sed -i 's/^# \(en_US.UTF-8 UTF-8\)$/\1/' $locale_gen_file locale-gen fi if [ "$(lsb_release -is)" == "Debian" ] && [ "$(lsb_release -cs)" == "bullseye" ]; then interfaces_file='/etc/network/interfaces.d/50-cloud-init' if [ -f "${interfaces_file}" ]; then interface_string='iface ens3 inet6 dhcp' accept_ra_string=' accept_ra 2' if ! grep -qPz "${interface_string}\n${accept_ra_string}" ${interfaces_file} ; then # By default net.ipv6.conf.ens3.accept_ra is set to 1 which # makes the kernel throw a way the IPv6 route when # net.ipv6.conf.all.forwarding is set to 1 by our service for # Docker. echo "Configuring interfaces to always accept Router Advertisements even with IP Forwarding enabled" sed -i -r "s/(${interface_string})/\1\n${accept_ra_string}/" ${interfaces_file} else echo "WARN: Configuration already applied or no match for \"${interface_string}\" in ${interfaces_file}" fi else echo "WARN: ${interfaces_file} not found. File renamed in this image?" fi fi DEBIAN_FRONTEND="noninteractive" apt-get -y update DEBIAN_FRONTEND="noninteractive" apt-get -o Dpkg::Options::="--force-confnew" --fix-broken --assume-yes dist-upgrade reboot