diff --git a/src/Utils.vala b/src/Utils.vala index 25105f146..8c7afcc34 100644 --- a/src/Utils.vala +++ b/src/Utils.vala @@ -1,7 +1,7 @@ // -*- Mode: vala; indent-tabs-mode: nil; tab-width: 4 -*- /*- - * Copyright (c) 2016–2018 elementary LLC. (https://elementary.io) - * + * Copyright 2016–2021 elementary, Inc. (https://elementary.io) + * Copyright 2006-2021 ubiquity Developers (https://launchpad.net/ubiquity) * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -16,6 +16,7 @@ * along with this program. If not, see . * * Authored by: Corentin Noël + * Marius Meisenzahl */ namespace Utils { @@ -128,4 +129,141 @@ namespace Utils { return session_instance; } + + [DBus (name = "org.freedesktop.hostname1")] + interface HostnameInterface : Object { + public abstract string chassis { owned get; } + } + + private static HostnameInterface? hostname_interface_instance; + private static void get_hostname_interface_instance () { + if (hostname_interface_instance == null) { + try { + hostname_interface_instance = Bus.get_proxy_sync ( + BusType.SYSTEM, + "org.freedesktop.hostname1", + "/org/freedesktop/hostname1" + ); + } catch (GLib.Error e) { + warning ("%s", e.message); + } + } + } + + private string get_chassis () { + get_hostname_interface_instance (); + + return hostname_interface_instance.chassis; + } + + private string? get_machine_id () { + string machine_id; + try { + FileUtils.get_contents ("/etc/machine-id", out machine_id); + } catch (FileError e) { + warning ("%s", e.message); + return null; + } + + return machine_id.strip (); + } + + private static string? get_sys_vendor () { + string vendor; + try { + FileUtils.get_contents ("/sys/devices/virtual/dmi/id/sys_vendor", out vendor); + } catch (FileError e) { + warning ("%s", e.message); + return null; + } + + return vendor.strip (); + } + + private static string? get_product_name () { + string model; + try { + FileUtils.get_contents ("/sys/devices/virtual/dmi/id/product_name", out model); + } catch (FileError e) { + warning ("%s", e.message); + return null; + } + + return model.strip (); + } + + private static string? get_product_version () { + string model; + try { + FileUtils.get_contents ("/sys/devices/virtual/dmi/id/product_version", out model); + } catch (FileError e) { + warning ("%s", e.message); + return null; + } + + return model.strip (); + } + + // Based on https://git.launchpad.net/ubiquity/tree/ubiquity/misc.py?id=ae6415d224c2e76afa2274cc9f85997f38870419#n648 + private static string? get_ubiquity_compatible_hostname () { + string model = get_product_name (); + string manufacturer = get_sys_vendor (); + + if (manufacturer.length == 0) { + return null; + } + manufacturer = manufacturer.down (); + + if (manufacturer.contains ("to be filled")) { + // Don't bother with products in development. + return null; + } + + if (manufacturer.contains ("bochs") || manufacturer.contains ("vmware")) { + model = "virtual machine"; + // VirtualBox sets an appropriate system-product-name. + } else { + if (manufacturer.contains ("lenovo") || manufacturer.contains ("ibm")) { + model = get_product_version (); + } + } + + try { + if (manufacturer.contains ("apple")) { + // MacBook4,1 - strip the 4,1 + var re = new Regex ("[^a-zA-Z\\s]"); + model = re.replace (model, model.length, 0, ""); + } + + // Replace each gap of non-alphanumeric characters with a dash. + // Ensure the resulting string does not begin or end with a dash. + var re = new Regex ("[^a-zA-Z0-9]+"); + model = re.replace (model, model.length, 0, "-"); + while (model[0] == '-') { + model = model.substring (1); + } + while (model[model.length - 1] == '-') { + model = model.substring (0, model.length - 1); + } + + if (model.down () == "not-available") { + return null; + } + if (model.down () == "To be filled by O.E.M.".down ()) { + return null; + } + } catch (RegexError e) { + warning ("Error cleaning up hostname strings: %s", e.message); + return null; + } + + return model; + } + + public static string get_hostname () { + string hostname = get_ubiquity_compatible_hostname () ?? ("elementary-os" + "-" + get_chassis ()); + hostname += "-" + get_machine_id ().substring (0, 8); + + return hostname; + } } diff --git a/src/Views/ProgressView.vala b/src/Views/ProgressView.vala index b78ed4c7c..af1f7cdf1 100644 --- a/src/Views/ProgressView.vala +++ b/src/Views/ProgressView.vala @@ -99,7 +99,7 @@ public class ProgressView : AbstractInstallerView { var config = InstallerDaemon.InstallConfig (); config.flags = Distinst.MODIFY_BOOT_ORDER; - config.hostname = "elementary-os"; + config.hostname = Utils.get_hostname (); config.lang = "en_US.UTF-8"; unowned Configuration current_config = Configuration.get_default ();