Going Backwards

Yesterday I wrote about how I made a mistake by updating my primary Ubuntu computer to include the proposed pocket. I shouldn’t have done this. So today I quickly hacked together a script to take any packages which came from proposed and “downgrade” them back to the release pocket. It’s not pretty, but it worked, for me.

#!/bin/bash

TMPDIR=$(mktemp -d)
PACKAGES=$TMPDIR/packages
DOWNGRADE=$TMPDIR/downgrade

# Get list of all installed packages
dpkg -l | grep ^ii | awk -F ' ' '{ print $2}' > $PACKAGES

# Start the downgrade script
echo  "sudo apt install \\" > $DOWNGRADE

# For each package in the list of installed packages
while read p; do
  # Get the summary of where the package came from
  apt-cache policy $p > $TMPDIR/$p
  # Get the line after (grep -A 1 and tail -n 1) the highlighted one with 3 stars
  SOURCE=$(grep -A 1 "^\ *\*\*" $TMPDIR/$p | tail -n 1 | awk -F ' ' '{ print $3}' )
  # If that line suggests we got the package from proposed, add it to the script
  if [[ "$SOURCE" == *"hirsute-proposed"* ]]; then
    echo "$p/hirsute \\" >> $DOWNGRADE
  fi
done <$PACKAGES
# Tell the user what to run to actually do the downgrade
echo "Run sh $DOWNGRADE"

Don’t use this. As they say on YouTube, this script is for educational purposes only. There’s probably a thousand ways to make this more elegantly. Indeed I tried a suggestion on AskUbuntu which didn’t work at all.

All this does is check every package to see where it originated, and if it came from proposed, add it to a list of packages to be downgraded. That list is a shell script. Run that, and it downgrades the packages.

There were a couple of tweaks I had to do to the resulting script. Specifically remove any mentions of kernel 5.10, and any other packages which were new in proposed and thus didn’t have a version to downgrade to.

Running the script looks a bit like this. I have skipped a bunch of it, because it’s very verbose, given there’s nearly five hundred packages to download.

Reading package lists...
Building dependency tree...
Reading state information...
The following packages were automatically installed and are no longer required:
  kate5-data kde-cli-tools kde-cli-tools-data kpeople-vcard ktexteditor-data
  kuserfeedback-doc libasync-mergepoint-perl libbasicusageenvironment1
  libboost-iostreams1.71.0 libboost-thread1.71.0 libcroco3 libdeflate0
  libdeflate0:i386 libeditorconfig0 libfakekey0 libfuture-perl libgroupsock8
  libio-async-loop-epoll-perl libio-async-perl libjs-sizzle libkf5people-data
  libkf5peoplebackend5 libkf5pulseaudioqt2 libkf5threadweaver5
  libkuserfeedbackcore1 libkuserfeedbackwidgets1 libkworkspace5-5
  liblinux-epoll-perl liblivemedia77 libmetrics-any-perl libnvpair1linux
  libqca-qt5-2 libqca-qt5-2-plugins libqt5multimediaquick5
  libqt5quickparticles5 libsereal-perl libsnmp35:i386 libstruct-dumb-perl
  libtest-metrics-any-perl libtest-refcount-perl libusageenvironment3
  libuutil1linux libxml-writer-perl libzfs2linux libzpool2linux node-jquery
  python3-sip python3-typing-extensions qml-module-org-kde-userfeedback
  qml-module-qt-labs-platform qml-module-qtmultimedia
  qml-module-qtquick-particles2 sshfs
Use 'sudo apt autoremove' to remove them.

We then move on to what was asked for:

The following additional packages will be installed:
  android-libselinux android-libsepol linux-headers-5.8.0-36-generic
  linux-image-5.8.0-36-generic linux-modules-5.8.0-36-generic
  linux-modules-extra-5.8.0-36-generic
Recommended packages:
  e2fsprogs-l10n libkf5filemetadata-bin libkf5globalaccel-bin
  libkf5iconthemes-bin qml-module-org-kde-newstuff libkf5parts-plugins
  qml-module-org-kde-purpose libkf5service-bin libkf5su-bin libkf5xmlgui-bin
  pipewire hplip crash kexec-tools kdeconnect tex-gyre
The following packages will be REMOVED
  kate kdeconnect ktexteditor-katepart libc-devtools libkf5people5
  libkf5peoplewidgets5 libkf5texteditor-bin libkf5texteditor5 libmd0:i386
  qml-module-org-kde-people ruby-rubygems
The following NEW packages will be installed
  android-libselinux android-libsepol linux-headers-5.8.0-36-generic
  linux-image-5.8.0-36-generic linux-modules-5.8.0-36-generic
  linux-modules-extra-5.8.0-36-generic
The following packages will be DOWNGRADED:
  acl acpica-tools adb anacron android-libadb android-libbacktrace
  android-libbase android-libcrypto-utils android-libcutils
  android-libext4-utils android-liblog android-libsparse android-libutils
  android-libziparchive android-sdk-platform-tools
  android-sdk-platform-tools-common appstream apt apt-config-icons
  apt-config-icons-hidpi apt-transport-https apt-utils base-passwd binutils

---8<---

  systemd-sysv systemd-timesyncd tar tcpdump tex-common texlive-base
  texlive-extra-utils texlive-fonts-recommended texlive-formats-extra
  texlive-latex-base texlive-latex-extra texlive-latex-recommended
  texlive-luatex texlive-pictures texlive-plain-generic texlive-xetex thermald
  thin-provisioning-tools thunderbird thunderbird-gnome-support ubuntu-session
  udev update-notifier update-notifier-common wpasupplicant xdg-desktop-portal
  xterm xz-utils zfs-zed zfsutils-linux
0 to upgrade, 6 to newly install, 493 to downgrade, 11 to remove and 0 not to upgrade.
Need to get 660 MB/666 MB of archives.
After this operation, 293 MB of additional disk space will be used.

I let it run and got a bunch of this kind of “downgrading” message, which suggests it’s working.

dpkg: warning: downgrading libaudit1:amd64 from 1:3.0-2ubuntu1 to 1:2.8.5-3ubuntu3      
Preparing to unpack .../10-libaudit1_1%3a2.8.5-3ubuntu3_amd64.deb ...                     
Unpacking libaudit1:amd64 (1:2.8.5-3ubuntu3) over (1:3.0-2ubuntu1) ...                    
Setting up libaudit1:amd64 (1:2.8.5-3ubuntu3) ...  

It ended with:

done.

Looks good, time to reboot and find out if it worked!