diff options
Diffstat (limited to 'debian/cloud-init.postinst')
-rw-r--r-- | debian/cloud-init.postinst | 331 |
1 files changed, 0 insertions, 331 deletions
diff --git a/debian/cloud-init.postinst b/debian/cloud-init.postinst deleted file mode 100644 index 420420b5..00000000 --- a/debian/cloud-init.postinst +++ /dev/null @@ -1,331 +0,0 @@ -#!/bin/sh -e - -. /usr/share/debconf/confmodule - -set -f # disable pathname expansion -db_capb escape # to support carriage return / multi-line values - -debug() { - [ "${_CI_UPGRADE_DEBUG:-0}" = "0" ] && return 0 - echo "$@" 1>&2 || : -} - -update_cfg() { - # takes filename, header, new object (in yaml), optionally 'remover' - # and merges new into existing object in filename, and then updates file - # remover a string that means "delete existing entry" - python3 -c ' -import sys, yaml - -def update(src, cand): - if not (isinstance(src, dict) and isinstance(cand, dict)): - return cand - for k, v in cand.items(): - # if the candidate has _ as value, delete source - if v == REMOVER: - if k in src: - del src[k] - continue - if k not in src: - src[k] = v - else: - src[k] = update(src[k], v) - return src - -(fname, header, newyaml) = sys.argv[1:4] -REMOVER = object -if len(sys.argv) == 5: - REMOVER = sys.argv[4] -newcfg = yaml.load(newyaml) - -with open(fname, "r") as fp: - cfg = yaml.load(fp) -if not cfg: cfg = {} - -cfg = update(cfg, newcfg) - -with open(fname, "w") as fp: - fp.write(header + "\n") - fp.write(yaml.dump(cfg))' "$@" -} - -handle_preseed_maas() { - local cfg_file="/etc/cloud/cloud.cfg.d/90_dpkg_maas.cfg" - local md_url="" creds_all="" c_key="" t_key="" t_sec="" c_sec=""; - - db_get "cloud-init/maas-metadata-url" && md_url="$RET" || : - db_get "cloud-init/maas-metadata-credentials" && creds_all="$RET" || : - - # nothing to do - [ -n "$md_url" -o -n "$creds_all" ] || return 0 - - # change a url query string format into : delimited - if [ -n "$creds_all" -a "${creds_all#*&}" != "${creds_all}" ]; then - # the command here ends up looking like: - # python3 -c '...' 'oauth_consumer_key=v1&oauth_token_key=v2...' \ - # oauth_consumer_key oauth_token_key oauth_token_secret - creds_all=$(python3 -c 'from six.moves.urllib.parse import parse_qs; -import sys; -keys = parse_qs(sys.argv[1]) -for k in sys.argv[2:]: - sys.stdout.write("%s:" % keys.get(k,[""])[0])' "$creds_all" \ - oauth_consumer_key oauth_token_key oauth_token_secret -) - fi - - # now, if non-empty creds_all is: consumer_key:token_key:token_secret - if [ -n "$creds_all" ]; then - OIFS="$IFS"; IFS=:; set -- $creds_all; IFS="$OIFS" - c_key=$1; t_key=$2; t_sec=$3 - fi - - if [ "$md_url" = "_" -a "${c_key}:${t_key}:${t_sec}" = "_:_:_" ]; then - # if all these values were '_', the delete value, just delete the file. - rm -f "$cfg_file" - else - local header="# written by cloud-init debian package per preseed entries -# cloud-init/{maas-metadata-url,/maas-metadata-credentials}" - - local pair="" k="" v="" pload="" orig_umask="" - for pair in "metadata_url:$md_url" "consumer_key:${c_key}" \ - "token_key:${t_key}" "token_secret:$t_sec"; do - k=${pair%%:*} - v=${pair#${k}:} - [ -n "$v" ] && pload="${pload} $k: \"$v\"," - done - - # '_' would indicate "delete", otherwise, existing entries are left - orig_umask=$(umask) - umask 066 - : >> "$cfg_file" && chmod 600 "$cfg_file" - update_cfg "$cfg_file" "$header" "datasource: { MAAS: { ${pload%,} } }" _ - umask ${orig_umask} - fi - - # now clear the database of the values, as they've been consumed - db_unregister "cloud-init/maas-metadata-url" || : - db_unregister "cloud-init/maas-metadata-credentials" || : -} - -handle_preseed_local_cloud_config() { - local ccfg="" debconf_name="cloud-init/local-cloud-config" - local cfg_file="/etc/cloud/cloud.cfg.d/90_dpkg_local_cloud_config.cfg" - local header="# written by cloud-init debian package per preseed entry -# $debconf_name" - - db_get "${debconf_name}" && ccfg="$RET" || : - - if [ "$ccfg" = "_" ]; then - rm -f "$cfg_file" - elif [ -n "$ccfg" ]; then - { echo "$header"; echo "$ccfg"; } > "$cfg_file" - fi - db_unregister "${debconf_name}" || : -} - -fix_1336855() { - ### Begin fix for LP: 1336855 - # fix issue where cloud-init misidentifies the location of grub and - # where grub misidentifies the location of the device - - # if cloud-init's grub module did not run, then it did not break anything. - [ -f /var/lib/cloud/instance/sem/config_grub_dpkg ] || return 0 - - # This bug only happened on /dev/xvda devices - [ -b /dev/xvda ] || return 0 - - # we can't fix the system without /proc/cmdline - [ -r /proc/cmdline ] || return 0 - - # Don't do anything unless we have grub - [ -x /usr/sbin/grub-install ] || return 0 - - # First, identify the kernel device for the parent. - for parm in $(cat /proc/cmdline); do - dev=$(echo $parm | awk -F\= '{print$NF}') - case $parm in - root=UUID*) [ -d /dev/disk/by-uuid ] && - root_dev=$(readlink -f /dev/disk/by-uuid/$dev);; - root=LABEL*) [ -d /dev/disk/by-label ] && - root_dev=$(readlink -f /dev/disk/by-label/$dev);; - root=/dev*) [ -d /dev ] && - root_dev=$(readlink -f $dev);; - esac - [ -n "$root_dev" ] && break - done - - # Don't continue if we don't have a root directive - [ -z "$root_dev" ] && return 0 - - # Only deal with simple, cloud-based devices - case $root_dev in - /dev/vda*|/dev/xvda*|/dev/sda*) ;; - *) return 0;; - esac - - # Make sure that we are not chrooted. - [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ] && return 0 - - # Check if we are in a container, i.e. LXC - if systemd-detect-virt --quiet --container || lxc-is-container 2>/dev/null; then - return 0 - fi - - # Find out where grub thinks the root device is. Only continue if - # grub postinst would install/reinstall grub - db_get grub-pc/install_devices && grub_cfg_dev=${RET} || return 0 - db_get grub-pc/install_devices_empty && grub_dev_empty=${RET} || return 0 - - # Find out the parent device for the root device. - # example output: sda/sda1 - block_path=$(udevadm info -q path -n $root_dev | awk '-Fblock/' '{print$NF}') - - # Extract the parent device name. This works where the device is a block device - # example output: /dev/sda - parent_dev=$(echo $block_path | awk '-F/' '$1 { if ( $1 ) {print"/dev/"$1}}') - [ -b "${parent_dev}" ] || return 0 - - # Do nothing if the device that the grub postinst would install is already used - [ "$grub_cfg_dev" = "$parent_dev" -o "$grub_cfg_dev" = "$root_dev" ] && return 0 - - # If we get here, do the installation - echo "Reconfiguring grub install device due to mismatch (LP: #1336855)" - echo " Grub should use $parent_dev but is configured for $grub_cfg_dev" - db_set grub-pc/install_devices "$parent_dev" - grub-install $parent_dev && - echo "Reinstalled grub" || - echo "WARNING! Unable to fix grub device mismatch. You may be broken." - -} - -cleanup_lp1552999() { - local oldver="$1" last_bad_ver="0.7.7~bzr1178" - dpkg --compare-versions "$oldver" le "$last_bad_ver" || return 0 - local edir="/etc/systemd/system/multi-user.target.wants" - rm -f "$edir/cloud-config.service" "$edir/cloud-final.service" \ - "$edir/cloud-init-local.service" "$edir/cloud-init.service" -} - -disable_network_config_on_upgrade() { - local oldver="$1" last_without_net="0.7.7~bzr1182-0ubuntu1" - if [ ! -f /var/lib/cloud/instance/obj.pkl ]; then - # this is a fresh system not one that has been booted. - return 0 - fi - if dpkg --compare-versions "$oldver" le "$last_without_net"; then - echo "dpkg upgrade from $oldver" > /var/lib/cloud/data/upgraded-network - fi -} - -fix_azure_upgrade_1611074() { - # adjust /etc/fstab on azure so boot after resize does not mount - # /mnt as ntfs and stop re-formatting. - local fixed_ver="0.7.8-49-1" dspath="/var/lib/cloud/instance/datasource" - local oldver="$1" tmpf="" r="" wmsg="" me="cloud-init postinst" - - # if not on azure, or not booted with instance/ skip out. - if [ ! -e "$dspath" ]; then - debug "no $dspath" - return 0 - fi - if ! grep -qi azure "$dspath"; then - debug "not on azure per $dspath" - return 0 - fi - - # if there is no /etc/fstab, then nothing to fix. - if [ ! -e /etc/fstab ]; then - debug "no /etc/fstab" - return 0 - fi - - if dpkg --compare-versions "$oldver" ge "$fixed_ver"; then - debug "previous version was fixed" - return 0 - fi - - wmsg="WARN: $me failed." - wmsg="$wmsg Subsequent resize may not update ephemeral correctly." - tmpf=$(mktemp "${TMPDIR:-/tmp}/cloud-init-upgrade.XXXXXX") || { - echo "$wmsg (mktemp failed with $?)" 1>&2 - return 0; - } - - awk '{ - if ($4 !~ /x-systemd.requires/ && $4 ~ /comment=cloudconfig/) { - sub(/comment=cloudconfig/, "x-systemd.requires=cloud-init.service,comment=cloudconfig") - } - printf("%s\n", $0)}' /etc/fstab > "$tmpf" || { - echo "$wmsg (awk reading of /etc/fstab failed with $?)" 1>&2 - rm -f "$tmpf" - return 0; - } - if cmp /etc/fstab "$tmpf" >/dev/null 2>&1; then - debug "no changes needed." - else - cat "$tmpf" > /etc/fstab || { - r=$? - echo "$wmsg (cp $tmpf /etc/fstab failed with $r)" - echo ==== expected to write the following to /etc/fstab ===== - cat "$tmpf" - echo ======================================================== - return $r - } 1>&2 - echo "$me fixed /etc/fstab for x-systemd.requires" 1>&2 - fi - rm "$tmpf" || : -} - - -if [ "$1" = "configure" ]; then - # disable ureadahead (LP: #499520) - dpkg-divert --package cloud-init --rename --divert \ - /etc/init/ureadahead.conf.disabled --add /etc/init/ureadahead.conf - if db_get cloud-init/datasources; then - values="$RET" - if [ "${values#*MaaS}" != "${values}" ]; then - # if db had old MAAS spelling, fix it. - values=$(echo "$values" | sed 's,MaaS,MAAS,g') - db_set cloud-init/datasources "$values" - fi - cat > /etc/cloud/cloud.cfg.d/90_dpkg.cfg <<EOF -# to update this file, run dpkg-reconfigure cloud-init -datasource_list: [ $values ] -EOF - fi - - # we want to affect apt_pipelining on install, not wait for - # cloud-init to run it on next boot. - pipeline_f="/etc/apt/apt.conf.d/90cloud-init-pipelining" - if [ -f /var/lib/cloud/instance/obj.pkl ]; then - cloud-init single --name apt-pipelining --frequency once >/dev/null 2>&1 || - echo "Warning: failed to setup apt-pipelining" 1>&2 - elif [ ! -f "$pipeline_f" ]; then - # there was no cloud available, so populate it ourselves. - cat > "$pipeline_f" <<EOF -//Written by cloud-init per 'apt_pipelining' -Acquire::http::Pipeline-Depth "0"; -EOF - fi - - # if there are maas settings pre-seeded apply them - handle_preseed_maas - - # if there is generic cloud-config preseed, apply them - handle_preseed_local_cloud_config - - # fix issue where cloud-init misidentifies the location of grub - fix_1336855 - - # make upgrades disable network changes by cloud-init - disable_network_config_on_upgrade "$2" - - fix_azure_upgrade_1611074 "$2" -fi - -#DEBHELPER# - -if [ "$1" = "configure" ]; then - oldver="$2" - cleanup_lp1552999 "$oldver" -fi |