summaryrefslogtreecommitdiff
diff options
authorlenemter <lenemter@gmail.com>2024-07-12 11:46:34 +0900
committerlenemter <lenemter@gmail.com>2024-07-12 11:46:34 +0900
commitc453e2b9d0a55f880248daaab6a2e58ba20fd51f (patch)
tree340ab77e3b57848313d67448b06cd1b075eb079f
parent3215c511677369bb07314ae54bef808ae2cf8833 (diff)
Rewrite for OS 8
-rw-r--r--data/io.elementary.settings-daemon.system-upgrade.helper10
-rw-r--r--src/Backends/SystemUpgrade.vala267
-rw-r--r--src/Utils/SystemUpgradeHelper.vala24
3 files changed, 212 insertions, 89 deletions
diff --git a/data/io.elementary.settings-daemon.system-upgrade.helper b/data/io.elementary.settings-daemon.system-upgrade.helper
index 660dd08..0f18716 100644
--- a/data/io.elementary.settings-daemon.system-upgrade.helper
+++ b/data/io.elementary.settings-daemon.system-upgrade.helper
@@ -27,11 +27,15 @@ def update_third_party_repository(current, next, repository_file):
f.write("\n".join(content))
+def install_network_manager_config():
+ with open("/etc/NetworkManager/conf.d/10-globally-managed-devices.conf", "w+") as f:
+ pass
+
def main():
- parser = argparse.ArgumentParser(
- description="Helper to upgrade elementary OS")
+ parser = argparse.ArgumentParser(description="Helper to upgrade elementary OS")
parser.add_argument("--update-third-party-repository", action="store_true")
+ parser.add_argument("--install-network-manager-config", action="store_true")
parser.add_argument("--current", nargs="?", default=None)
parser.add_argument("--next", nargs="?", default=None)
@@ -41,6 +45,8 @@ def main():
if args.update_third_party_repository and args.current and args.next and args.repository_file:
return update_third_party_repository(args.current, args.next, args.repository_file)
+ elif args.install_network_manager_config:
+ return install_network_manager_config()
if __name__ == "__main__":
diff --git a/src/Backends/SystemUpgrade.vala b/src/Backends/SystemUpgrade.vala
index 90a53c3..c6b936f 100644
--- a/src/Backends/SystemUpgrade.vala
+++ b/src/Backends/SystemUpgrade.vala
@@ -59,157 +59,252 @@ public class SettingsDaemon.Backends.SystemUpgrade : GLib.Object {
Inhibitor.get_instance ().inhibit ();
- Pk.Results? results = null;
-
+
try {
- debug ("Refresh cache");
+ info ("Refresh cache");
+ Pk.Results? results = null;
results = yield task.refresh_cache_async (true, cancellable, (t, p) => { });
+ info ("Successfully refreshed cache");
if (cancellable.is_cancelled ()) {
Inhibitor.get_instance ().uninhibit ();
return;
}
- debug ("Get repositories");
- results = yield task.get_repo_list_async (Pk.Bitfield.from_enums (Pk.Filter.NONE), cancellable, (p, t) => { });
+ // yield update_repositories ();
if (cancellable.is_cancelled ()) {
Inhibitor.get_instance ().uninhibit ();
return;
}
- var repo_files = new Array<string> ();
- var repos = results.get_repo_detail_array ();
- for (int i = 0; i < repos.length; i++) {
- var repo = repos[i];
-
- // TODO: check for ppas
-
- var parts = repo.repo_id.split (":", 2);
- var f = parts[0];
+ yield remove_old_settings ();
- if (!FileUtils.test (f, FileTest.EXISTS)) {
- continue;
- }
+ if (cancellable.is_cancelled ()) {
+ Inhibitor.get_instance ().uninhibit ();
+ return;
+ }
- bool found = false;
- for (int j = 0; j < repo_files.length; j++) {
- if (repo_files.index (j) == f) {
- found = true;
- break;
- }
- }
+ yield install_systemd_resolved ();
- if (!found) {
- repo_files.append_val (f);
- }
+ if (cancellable.is_cancelled ()) {
+ Inhibitor.get_instance ().uninhibit ();
+ return;
}
- var helper = new Utils.SystemUpgradeHelper ();
-
- debug ("Update repositories");
- for (int i = 0; i < repo_files.length; i++) {
- var repository_file = repo_files.index (i);
- debug (" %s", repository_file);
+ yield do_upgrade ();
- if (!helper.update_third_party_repository ("jammy", "noble", repository_file)) {
- throw new Error (0, 0, "Could not update repository: %s\n", repository_file);
- }
+ if (cancellable.is_cancelled ()) {
+ Inhibitor.get_instance ().uninhibit ();
+ return;
}
- debug ("Refresh cache");
- results = yield task.refresh_cache_async (true, cancellable, (p, t) => { });
+ yield install_new_settings ();
if (cancellable.is_cancelled ()) {
Inhibitor.get_instance ().uninhibit ();
return;
}
- if (results == null) {
- throw new Error (0, 0, "Could not refresh cache");
- }
+ install_network_manager_config ();
- debug ("Get updates");
- results = yield task.get_updates_async (Pk.Bitfield.from_enums (Pk.Filter.NEWEST), cancellable, (t, p) => { });
+ info ("Set PackageKit reboot action");
+ Pk.offline_trigger (Pk.OfflineAction.REBOOT, cancellable);
if (cancellable.is_cancelled ()) {
Inhibitor.get_instance ().uninhibit ();
return;
}
- if (results == null) {
- throw new Error (0, 0, "Could not get updates");
- }
+ info ("Ready to reboot");
+
+ system_upgrade_finished ();
+ } catch (Error e) {
+ warning ("Upgrade failed: %s", e.message);
- var sack = results.get_package_sack ();
- sack.remove_by_filter (update_system_filter_helper);
- var package_ids = sack.get_ids ();
+ system_upgrade_failed (e.message);
+ }
- task.only_download = true;
+ is_system_upgrade_running = false;
- debug ("Download packages");
- var status = Pk.Status.UNKNOWN;
- int percentage = -1;
- results = yield task.update_packages_async (package_ids, cancellable, ((p, t) => {
- if (t == Pk.ProgressType.STATUS) {
- status = p.get_status ();
- }
+ Inhibitor.get_instance ().uninhibit ();
+ }
- int new_percentage = percentage;
- if (t == Pk.ProgressType.PERCENTAGE && status == Pk.Status.DOWNLOAD) {
- new_percentage = p.percentage;
- }
+ private async void update_repositories () throws GLib.Error{
+ info ("Get repositories");
+ var results = yield task.get_repo_list_async (Pk.Bitfield.from_enums (Pk.Filter.NONE), cancellable, (p, t) => {});
- if (status == Pk.Status.FINISHED) {
- new_percentage = 100;
- }
+ if (cancellable.is_cancelled ()) {
+ Inhibitor.get_instance ().uninhibit ();
+ return;
+ }
- if (new_percentage != percentage) {
- percentage = new_percentage;
- system_upgrade_progress (percentage);
+ var repo_files = new Array<string> ();
+ var repos = results.get_repo_detail_array ();
+ for (int i = 0; i < repos.length; i++) {
+ var repo = repos[i];
+
+ // TODO: check for ppas
+
+ var parts = repo.repo_id.split (":", 2);
+ var f = parts[0];
+
+ if (!FileUtils.test (f, FileTest.EXISTS)) {
+ continue;
+ }
+
+ bool found = false;
+ for (int j = 0; j < repo_files.length; j++) {
+ if (repo_files.index (j) == f) {
+ found = true;
+ break;
}
- }));
+ }
- if (cancellable.is_cancelled ()) {
- Inhibitor.get_instance ().uninhibit ();
- return;
+ if (!found) {
+ repo_files.append_val (f);
+ }
+ }
+
+ info ("Update repositories");
+ for (int i = 0; i < repo_files.length; i++) {
+ var repository_file = repo_files.index (i);
+ info (" %s", repository_file);
+
+ if (!helper.update_third_party_repository ("jammy", "noble", repository_file)) {
+ throw new Error (0, 0, "Could not update repository: %s\n", repository_file);
}
+ }
+
+ info ("Refresh cache");
+ results = yield task.refresh_cache_async (true, cancellable, (p, t) => { });
+ if (results == null) {
+ throw new Error (0, 0, "Could not refresh cache");
+ }
+ }
+
+ private async void remove_old_settings () throws GLib.Error {
+ info ("Removing old (Gtk3) Settings");
+ var results = task.search_names_sync (Pk.Bitfield.from_enums (Pk.Filter.INSTALLED), {"switchboard"}, cancellable, () => {});
- if (results == null) {
- throw new Error (0, 0, "Could not download packages");
+ var sack = results.get_package_sack ();
+ sack.remove_by_filter (update_system_filter_helper);
+ var package_ids = sack.get_ids ();
+
+ string[] packages_to_remove = {};
+ foreach (unowned var id in package_ids) {
+ var split = id.split (";");
+ if (split.length >= 1 && (split[0] == "switchboard" || split[0].contains ("switchboard-plug"))) {
+ packages_to_remove += id;
+ break;
}
+ }
- debug ("Set PackageKit reboot action");
- Pk.offline_trigger (Pk.OfflineAction.REBOOT, cancellable);
- if (cancellable.is_cancelled ()) {
- Inhibitor.get_instance ().uninhibit ();
- return;
+ if (packages_to_remove.length > 0) {
+ info (string.joinv (" ", packages_to_remove));
+ yield task.remove_packages_async (packages_to_remove, true, true, cancellable, () => {});
+ }
+
+ info ("Successfully removed old settings");
+ }
+
+ private async void install_systemd_resolved () throws GLib.Error {
+ var results = task.search_names_sync (Pk.Bitfield.from_enums (Pk.Filter.NONE), {"systemd-resolved"}, cancellable, () => {});
+
+ var package_ids = results.get_package_sack ().get_ids ();
+
+ string? systemd_resolved_package = null;
+ foreach (unowned var id in package_ids) {
+ var split = id.split (";");
+ if (split.length >= 1 && split[0] == "systemd-resolved") {
+ systemd_resolved_package = id;
+ break;
}
+ }
- debug ("Ready to reboot");
+ yield task.install_packages_async ({systemd_resolved_package}, cancellable, () => {});
+ }
- system_upgrade_finished ();
- } catch (Error e) {
- warning ("Upgrade failed: %s", e.message);
+ private async void do_upgrade () throws GLib.Error {
+ info ("Get updates");
+ var results = yield task.get_updates_async (Pk.Bitfield.from_enums (Pk.Filter.NEWEST), cancellable, (t, p) => { });
- system_upgrade_failed (e.message);
+ if (cancellable.is_cancelled ()) {
+ Inhibitor.get_instance ().uninhibit ();
+ return;
}
- is_system_upgrade_running = false;
+ if (results == null) {
+ throw new Error (0, 0, "Could not get updates");
+ }
- Inhibitor.get_instance ().uninhibit ();
+ var sack = results.get_package_sack ();
+ sack.remove_by_filter (update_system_filter_helper);
+ var package_ids = sack.get_ids ();
+
+ info ("Download packages");
+ var status = Pk.Status.UNKNOWN;
+ int percentage = -1;
+ results = yield task.update_packages_async (package_ids, cancellable, (p, t) => {
+ if (t == Pk.ProgressType.STATUS) {
+ status = p.get_status ();
+ }
+
+ int new_percentage = percentage;
+ if (t == Pk.ProgressType.PERCENTAGE && status == Pk.Status.DOWNLOAD) {
+ new_percentage = p.percentage;
+ }
+
+ if (status == Pk.Status.FINISHED) {
+ new_percentage = 100;
+ }
+
+ if (new_percentage != percentage) {
+ percentage = new_percentage;
+ system_upgrade_progress (percentage);
+ }
+ });
+
+ if (results == null) {
+ throw new Error (0, 0, "Could not download packages");
+ }
+
+ info ("Successfully downloaded packages");
+ }
+
+ private async void install_new_settings () throws GLib.Error {
+ info ("Installing new (Gtk4) Settings");
+
+ var results = task.search_names_sync (Pk.Bitfield.from_enums (Pk.Filter.INSTALLED), {"io.elementary.settings"}, cancellable, () => {});
+
+ yield task.install_packages_async (results.get_package_sack ().get_ids (), cancellable, () => {});
+
+ info ("Successfully installed new Settings");
+ }
+
+ private void install_network_manager_config () throws GLib.Error {
+ info ("Installing NetworkManager config");
+ if (!helper.install_network_manager_config ()) {
+ throw new Error (0, 0, "Could not install NetworkManager config");
+ }
+ info ("Successfully installed NetworkManager config");
}
construct {
- task = new Pk.Task ();
+ task = new Pk.Task () {
+ only_download = true,
+ simulate = true
+ };
cancellable = new Cancellable ();
+ helper = new Utils.SystemUpgradeHelper ();
cancellable.cancelled.connect (() => { system_upgrade_cancelled (); });
}
private static Pk.Task task;
private static Cancellable cancellable;
+ private static Utils.SystemUpgradeHelper helper;
private bool is_system_upgrade_running = false;
diff --git a/src/Utils/SystemUpgradeHelper.vala b/src/Utils/SystemUpgradeHelper.vala
index 796e5fd..7192702 100644
--- a/src/Utils/SystemUpgradeHelper.vala
+++ b/src/Utils/SystemUpgradeHelper.vala
@@ -1,5 +1,5 @@
/*
- * Copyright 2022 elementary, Inc. (https://elementary.io)
+ * Copyright 2022-2024 elementary, Inc. (https://elementary.io)
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
@@ -15,6 +15,7 @@
* License along with this program; if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA
+ *
* Authored by: Marius Meisenzahl <mariusmeisenzahl@gmail.com>
*/
@@ -40,6 +41,27 @@ public class SettingsDaemon.Utils.SystemUpgradeHelper : GLib.Object {
return true;
}
+ public bool install_network_manager_config () {
+ if (!authenticate ()) {
+ var message = "Unable to authenticate";
+ warning (message);
+ on_standard_error (message);
+ return false;
+ }
+
+ var cmd = "install-network-manager-config";
+
+ var command = "pkexec %s/io.elementary.settings-daemon.system-upgrade.helper --%s".printf (
+ "/usr/share/io.elementary.settings-daemon", cmd);
+
+ if (!run (command)) {
+ on_error ();
+ return false;
+ }
+
+ return true;
+ }
+
public signal void on_standard_output (string line);
public signal void on_standard_error (string line);
public signal void on_error ();