blob: 9e13a0d7027f1ef81125ccfebddb45245c9515bd [file] [log] [blame]
#!/bin/sh
# Copyright 2019 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# Upgrades a Crostini container to the versions in the arguments in order,
# expects to be run as root.
#
# Upgrade from stretch to buster:
# ./upgrade_container DEBIAN_BUSTER
#
# Upgrade from buster to bullseye:
# ./upgrade_container DEBIAN_BULLSEYE
#
# Upgrade from stretch to bullseye through buster:
# ./upgrade_container DEBIAN_BUSTER DEBIAN_BULLSEYE
# Note that debian does not support skip-version upgrades.
#
# Complete a previously unfinished upgrade:
# ./upgrade_container
set -ex
to_buster() {
[ $1 = 'DEBIAN_BUSTER' ]
}
to_bullseye() {
[ $1 = 'DEBIAN_BULLSEYE' ]
}
# Use defaults for everything, we don't support answering prompts.
export DEBIAN_FRONTEND=noninteractive
# Make sure apt-keys are up to date. We don't use keyring.debian.org because it
# only serves debian-specific keys and that's not enough when we want the
# Google package signing key. however most people don't need this so ignore
# failures.
APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=1 apt-key adv --batch \
--refresh-keys --keyserver keyserver.ubuntu.com \
EB4C1BFD4F042F6DDDCCEC917721F63BD38B4796 || true
do_upgrade() {
# When conflicting configuration files exist between the local system and the
# upstream package, prefer the default option. If there is no default option,
# default to keeping the local version. This is required along with setting
# DEBIAN_FRONTEND above for a truly noninteractive upgrade experience.
APT_OPTIONS="-o Dpkg::Options::=--force-confdef
-o Dpkg::Options::=--force-confold"
# If a previous run of this script was killed, it might have left packages in
# a half-configured state. Complete the configurations.
dpkg --configure -a || true
# Upgrade everything.
apt-get ${APT_OPTIONS} update -y
apt-get ${APT_OPTIONS} upgrade -y
apt-get ${APT_OPTIONS} dist-upgrade -y
}
# Debian doesn't support skip-version upgrades, so we need to make sure we're
# already up to date on our current version before continuing. This also handles
# the case where we restart an upgrade after /etc/os-release has been updated.
do_upgrade
for version in $@; do
if to_buster "${version}"; then
# No longer need to backport GPU support packages.
rm -f /etc/apt/sources.list.d/cros-gpu.list \
/etc/apt/preferences.d/cros-gpu.pref
# The actual flip to buster.
sed -i 's/stretch/buster/g' /etc/apt/sources.list \
/etc/apt/sources.list.d/cros.list
elif to_bullseye "${version}"; then
# The actual flip to bullseye.
sed -i 's/buster/bullseye/g' /etc/apt/sources.list \
/etc/apt/sources.list.d/cros.list
# The bullseye security repo is called "bullseye-security", while buster
# uses "buster/updates"
sed -i 's/debian-security bullseye\/updates/debian-security bullseye-security/g' \
/etc/apt/sources.list
fi
# Upgrade again, now to the new version.
do_upgrade
done