DistUpgrade: do not make UI dialog calls while EUID != 0
The screen lock prevention code has to temporarily set the EUID to the
non-root user UID so that it can make a DBus call on the user's session
bus. While the EUID is temporarily non-zero, a UI dialog may be
displayed to report the success of inhibiting the screen lock. For most
cases this is OK, but it causes an exception for the DistUpgradeViewKDE
frontend. This is because the view.information() call needs to read
dialog_error.ui from the tmpdir, but the non-root user does not have
permission to read this file.
To fix this, in _inhibitIdle(), move the information dialog call to
after the finally block which re-sets the EUID.
do-release-upgrade: preserve env vars needed for screen lock prevention
The screen lock prevention code relies on environment variables such as
DBUS_SESSION_BUS_ADDRESS being preserved, since the
org.freedesktop.ScreenSaver DBus interface is needed. This works in
cases where the dist-upgrade script is invoked with 'sudo -E' (e.g.
DistUpgradeViewText frontend). However, when pkexec is used (e.g.
DistUpgradeViewGtk3 frontend) the environment variables cannot be
preserved as per pkexec's design.
Add an --env flag to do-release-upgrade that accepts a comma-separated
list of environment variables (e.g. VAR1=VALUE1,VAR2=VALUE2) which should be set when
executing the dist-upgrade script. This approach is similar to the
existing workaround for RELEASE_UPGRADER_ALLOW_THIRD_PARTY, but is
generalized to allow any environment variables to be set.
Finally, when the DistUpgradeViewGtk3 or DistUpgradeViewKDE frontends
are used, and the do-release-upgrade script is re-exec'd with pkexec,
set the DBUS_SESSION_BUS_ADDRESS and XDG_SESSION_TYPE variables with
--env so that the screen lock prevention code works with these
frontends.
Modify the ubuntu-release-upgrader apport package hook to also gather recent messages in journalctl and a list of crashes in /var/crash as one of those may have negatively affected the upgrade process.