endSessionDialog: Check for PackageKit before considering updates/upgrades
GNOME Shell is spitting out some errors in the journal due to its attempts to speak to PackageKit, which is not present on Endless OS, so let's add some runtime checks to make sure that PackageKit is actually available before assuming so and using its proxy to decide which kind of UI to show to the user when ending the session. https://gitlab.gnome.org/GNOME/gnome-shell/issues/369
This commit is contained in:
parent
53be76c9e2
commit
bb6d9734e4
@ -231,14 +231,13 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
|
|||||||
this._loginManager = LoginManager.getLoginManager();
|
this._loginManager = LoginManager.getLoginManager();
|
||||||
this._userManager = AccountsService.UserManager.get_default();
|
this._userManager = AccountsService.UserManager.get_default();
|
||||||
this._user = this._userManager.get_user(GLib.get_user_name());
|
this._user = this._userManager.get_user(GLib.get_user_name());
|
||||||
|
this._updatesPermission = null;
|
||||||
|
|
||||||
this._pkOfflineProxy = new PkOfflineProxy(Gio.DBus.system,
|
this._pkOfflineProxy = new PkOfflineProxy(Gio.DBus.system,
|
||||||
'org.freedesktop.PackageKit',
|
'org.freedesktop.PackageKit',
|
||||||
'/org/freedesktop/PackageKit',
|
'/org/freedesktop/PackageKit',
|
||||||
(proxy, error) => {
|
this._onPkOfflineProxyCreated.bind(this));
|
||||||
if (error)
|
|
||||||
log(error.message);
|
|
||||||
});
|
|
||||||
this._powerProxy = new UPowerProxy(Gio.DBus.system,
|
this._powerProxy = new UPowerProxy(Gio.DBus.system,
|
||||||
'org.freedesktop.UPower',
|
'org.freedesktop.UPower',
|
||||||
'/org/freedesktop/UPower',
|
'/org/freedesktop/UPower',
|
||||||
@ -333,16 +332,33 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
|
|||||||
this._inhibitorSection.add_actor(this._sessionHeader);
|
this._inhibitorSection.add_actor(this._sessionHeader);
|
||||||
this._inhibitorSection.add_actor(this._sessionList);
|
this._inhibitorSection.add_actor(this._sessionList);
|
||||||
|
|
||||||
try {
|
|
||||||
this._updatesPermission = Polkit.Permission.new_sync("org.freedesktop.packagekit.trigger-offline-update", null, null);
|
|
||||||
} catch (e) {
|
|
||||||
log('No permission to trigger offline updates: %s'.format(e.toString()));
|
|
||||||
}
|
|
||||||
|
|
||||||
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(EndSessionDialogIface, this);
|
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(EndSessionDialogIface, this);
|
||||||
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/SessionManager/EndSessionDialog');
|
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/SessionManager/EndSessionDialog');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_onPkOfflineProxyCreated(proxy, error) {
|
||||||
|
if (error) {
|
||||||
|
log(error.message);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Creating a D-Bus proxy won't propagate SERVICE_UNKNOWN or NAME_HAS_NO_OWNER
|
||||||
|
// errors if PackageKit is not available, but the GIO implementation will make
|
||||||
|
// sure in that case that the proxy's g-name-owner is set to null, so check that.
|
||||||
|
if (this._pkOfflineProxy.g_name_owner === null) {
|
||||||
|
this._pkOfflineProxy = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// It only makes sense to check for this permission if PackageKit is available.
|
||||||
|
try {
|
||||||
|
this._updatesPermission = Polkit.Permission.new_sync(
|
||||||
|
"org.freedesktop.packagekit.trigger-offline-update", null, null);
|
||||||
|
} catch(e) {
|
||||||
|
log('No permission to trigger offline updates: %s'.format(e.toString()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_onDestroy() {
|
_onDestroy() {
|
||||||
this._user.disconnect(this._userLoadedId);
|
this._user.disconnect(this._userLoadedId);
|
||||||
this._user.disconnect(this._userChangedId);
|
this._user.disconnect(this._userChangedId);
|
||||||
@ -387,7 +403,8 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Use a different description when we are installing a system upgrade
|
// Use a different description when we are installing a system upgrade
|
||||||
if (dialogContent.upgradeDescription) {
|
// if the PackageKit proxy is available (i.e. PackageKit is available).
|
||||||
|
if (this._pkOfflineProxy && dialogContent.upgradeDescription) {
|
||||||
let name = this._pkOfflineProxy.PreparedUpgrade['name'].deep_unpack();
|
let name = this._pkOfflineProxy.PreparedUpgrade['name'].deep_unpack();
|
||||||
let version = this._pkOfflineProxy.PreparedUpgrade['version'].deep_unpack();
|
let version = this._pkOfflineProxy.PreparedUpgrade['version'].deep_unpack();
|
||||||
|
|
||||||
@ -496,6 +513,12 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_triggerOfflineUpdateReboot(callback) {
|
_triggerOfflineUpdateReboot(callback) {
|
||||||
|
// Handle this gracefully if PackageKit is not available.
|
||||||
|
if (!this._pkOfflineProxy) {
|
||||||
|
callback();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
this._pkOfflineProxy.TriggerRemote('reboot', (result, error) => {
|
this._pkOfflineProxy.TriggerRemote('reboot', (result, error) => {
|
||||||
if (error)
|
if (error)
|
||||||
log(error.message);
|
log(error.message);
|
||||||
@ -505,6 +528,12 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_triggerOfflineUpdateShutdown(callback) {
|
_triggerOfflineUpdateShutdown(callback) {
|
||||||
|
// Handle this gracefully if PackageKit is not available.
|
||||||
|
if (!this._pkOfflineProxy) {
|
||||||
|
callback();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
this._pkOfflineProxy.TriggerRemote('power-off', (result, error) => {
|
this._pkOfflineProxy.TriggerRemote('power-off', (result, error) => {
|
||||||
if (error)
|
if (error)
|
||||||
log(error.message);
|
log(error.message);
|
||||||
@ -514,6 +543,12 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_triggerOfflineUpdateCancel(callback) {
|
_triggerOfflineUpdateCancel(callback) {
|
||||||
|
// Handle this gracefully if PackageKit is not available.
|
||||||
|
if (!this._pkOfflineProxy) {
|
||||||
|
callback();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
this._pkOfflineProxy.CancelRemote((result, error) => {
|
this._pkOfflineProxy.CancelRemote((result, error) => {
|
||||||
if (error)
|
if (error)
|
||||||
log(error.message);
|
log(error.message);
|
||||||
@ -676,7 +711,8 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
|
|||||||
this._totalSecondsToStayOpen = totalSecondsToStayOpen;
|
this._totalSecondsToStayOpen = totalSecondsToStayOpen;
|
||||||
this._type = type;
|
this._type = type;
|
||||||
|
|
||||||
if (this._type == DialogType.RESTART) {
|
// Only consider updates and upgrades if PackageKit is available.
|
||||||
|
if (this._pkOfflineProxy && this._type == DialogType.RESTART) {
|
||||||
if (this._pkOfflineProxy.UpdateTriggered)
|
if (this._pkOfflineProxy.UpdateTriggered)
|
||||||
this._type = DialogType.UPDATE_RESTART;
|
this._type = DialogType.UPDATE_RESTART;
|
||||||
else if (this._pkOfflineProxy.UpgradeTriggered)
|
else if (this._pkOfflineProxy.UpgradeTriggered)
|
||||||
@ -708,8 +744,9 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
|
|||||||
if (dialogContent.showOtherSessions)
|
if (dialogContent.showOtherSessions)
|
||||||
this._loadSessions();
|
this._loadSessions();
|
||||||
|
|
||||||
let updateTriggered = this._pkOfflineProxy.UpdateTriggered;
|
// Only consider updates and upgrades if PackageKit is available.
|
||||||
let updatePrepared = this._pkOfflineProxy.UpdatePrepared;
|
let updateTriggered = this._pkOfflineProxy ? this._pkOfflineProxy.UpdateTriggered : false;
|
||||||
|
let updatePrepared = this._pkOfflineProxy ? this._pkOfflineProxy.UpdatePrepared : false;
|
||||||
let updatesAllowed = this._updatesPermission && this._updatesPermission.allowed;
|
let updatesAllowed = this._updatesPermission && this._updatesPermission.allowed;
|
||||||
|
|
||||||
_setCheckBoxLabel(this._checkBox, dialogContent.checkBoxText || '');
|
_setCheckBoxLabel(this._checkBox, dialogContent.checkBoxText || '');
|
||||||
|
Loading…
Reference in New Issue
Block a user