diff options
author | lenemter <lenemter@gmail.com> | 2024-07-12 11:46:34 +0900 |
---|---|---|
committer | lenemter <lenemter@gmail.com> | 2024-07-12 11:46:34 +0900 |
commit | c453e2b9d0a55f880248daaab6a2e58ba20fd51f (patch) | |
tree | 340ab77e3b57848313d67448b06cd1b075eb079f | |
parent | 3215c511677369bb07314ae54bef808ae2cf8833 (diff) |
Rewrite for OS 8
-rw-r--r-- | data/io.elementary.settings-daemon.system-upgrade.helper | 10 | ||||
-rw-r--r-- | src/Backends/SystemUpgrade.vala | 267 | ||||
-rw-r--r-- | src/Utils/SystemUpgradeHelper.vala | 24 |
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 (); |