parent
197dda456a
commit
12d5109526
@ -0,0 +1,184 @@
|
|||||||
|
From 7dbcddd5bd5939493db74843593316f7101f8fde Mon Sep 17 00:00:00 2001
|
||||||
|
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||||
|
Date: Thu, 1 Dec 2022 10:00:46 +0000
|
||||||
|
Subject: [PATCH] New API: inspect_get_build_id
|
||||||
|
|
||||||
|
Add an API to return the build ID of the guest. This to allow a
|
||||||
|
future change to be able to distinguish between Windows 10 and Windows 11
|
||||||
|
which can only be done using the build ID.
|
||||||
|
|
||||||
|
For Windows we can read the CurrentBuildNumber key from the registry.
|
||||||
|
For Linux there happens to be a BUILD_ID field in /etc/os-release.
|
||||||
|
I've never seen a Linux distro that actually uses this.
|
||||||
|
|
||||||
|
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
|
||||||
|
(cherry picked from commit f3dd67affe3c657af64ee9f6d70a16e965309556)
|
||||||
|
---
|
||||||
|
daemon/inspect.ml | 6 ++++++
|
||||||
|
daemon/inspect_fs_unix.ml | 2 ++
|
||||||
|
daemon/inspect_fs_windows.ml | 14 ++++++++++++++
|
||||||
|
daemon/inspect_types.ml | 5 +++++
|
||||||
|
daemon/inspect_types.mli | 1 +
|
||||||
|
generator/actions_inspection.ml | 19 +++++++++++++++++++
|
||||||
|
generator/proc_nr.ml | 3 ++-
|
||||||
|
lib/MAX_PROC_NR | 2 +-
|
||||||
|
8 files changed, 50 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/daemon/inspect.ml b/daemon/inspect.ml
|
||||||
|
index fb75b4a6c..20217c025 100644
|
||||||
|
--- a/daemon/inspect.ml
|
||||||
|
+++ b/daemon/inspect.ml
|
||||||
|
@@ -335,6 +335,12 @@ and inspect_get_hostname root =
|
||||||
|
| Some v -> v
|
||||||
|
| None -> "unknown"
|
||||||
|
|
||||||
|
+and inspect_get_build_id root =
|
||||||
|
+ let root = search_for_root root in
|
||||||
|
+ match root.inspection_data.build_id with
|
||||||
|
+ | Some v -> v
|
||||||
|
+ | None -> "unknown"
|
||||||
|
+
|
||||||
|
and inspect_get_windows_systemroot root =
|
||||||
|
let root = search_for_root root in
|
||||||
|
match root.inspection_data.windows_systemroot with
|
||||||
|
diff --git a/daemon/inspect_fs_unix.ml b/daemon/inspect_fs_unix.ml
|
||||||
|
index 63cb279d0..009195f80 100644
|
||||||
|
--- a/daemon/inspect_fs_unix.ml
|
||||||
|
+++ b/daemon/inspect_fs_unix.ml
|
||||||
|
@@ -96,6 +96,8 @@ let rec parse_os_release release_file data =
|
||||||
|
data.product_name <- Some value
|
||||||
|
else if key = "VERSION_ID" then
|
||||||
|
parse_os_release_version_id value data
|
||||||
|
+ else if key = "BUILD_ID" then
|
||||||
|
+ data.build_id <- Some value
|
||||||
|
) values;
|
||||||
|
|
||||||
|
(* If we haven't got all the fields, exit right away. *)
|
||||||
|
diff --git a/daemon/inspect_fs_windows.ml b/daemon/inspect_fs_windows.ml
|
||||||
|
index c4a05bc38..7bc5de7f7 100644
|
||||||
|
--- a/daemon/inspect_fs_windows.ml
|
||||||
|
+++ b/daemon/inspect_fs_windows.ml
|
||||||
|
@@ -263,6 +263,20 @@ and check_windows_software_registry software_hive data =
|
||||||
|
with
|
||||||
|
Not_found -> ()
|
||||||
|
);
|
||||||
|
+
|
||||||
|
+ (* CurrentBuildNumber (build_id).
|
||||||
|
+ *
|
||||||
|
+ * In modern Windows, the "CurrentBuild" and "CurrentBuildNumber"
|
||||||
|
+ * keys are the same. But in Windows XP, "CurrentBuild"
|
||||||
|
+ * contained something quite different. So always use
|
||||||
|
+ * "CurrentBuildNumber".
|
||||||
|
+ *)
|
||||||
|
+ (try
|
||||||
|
+ let v = List.assoc "CurrentBuildNumber" values in
|
||||||
|
+ data.build_id <- Some (Hivex.value_string h v)
|
||||||
|
+ with
|
||||||
|
+ Not_found -> ()
|
||||||
|
+ );
|
||||||
|
with
|
||||||
|
| Not_found ->
|
||||||
|
if verbose () then
|
||||||
|
diff --git a/daemon/inspect_types.ml b/daemon/inspect_types.ml
|
||||||
|
index 9395c51f9..328a2146b 100644
|
||||||
|
--- a/daemon/inspect_types.ml
|
||||||
|
+++ b/daemon/inspect_types.ml
|
||||||
|
@@ -48,6 +48,7 @@ and inspection_data = {
|
||||||
|
mutable version : version option;
|
||||||
|
mutable arch : string option;
|
||||||
|
mutable hostname : string option;
|
||||||
|
+ mutable build_id : string option;
|
||||||
|
mutable fstab : fstab_entry list;
|
||||||
|
mutable windows_systemroot : string option;
|
||||||
|
mutable windows_software_hive : string option;
|
||||||
|
@@ -167,6 +168,8 @@ and string_of_inspection_data data =
|
||||||
|
data.arch;
|
||||||
|
Option.may (fun v -> bpf " hostname: %s\n" v)
|
||||||
|
data.hostname;
|
||||||
|
+ Option.may (fun v -> bpf " build ID: %s\n" v)
|
||||||
|
+ data.build_id;
|
||||||
|
if data.fstab <> [] then (
|
||||||
|
let v = List.map (
|
||||||
|
fun (a, b) -> sprintf "(%s, %s)" (Mountable.to_string a) b
|
||||||
|
@@ -272,6 +275,7 @@ let null_inspection_data = {
|
||||||
|
version = None;
|
||||||
|
arch = None;
|
||||||
|
hostname = None;
|
||||||
|
+ build_id = None;
|
||||||
|
fstab = [];
|
||||||
|
windows_systemroot = None;
|
||||||
|
windows_software_hive = None;
|
||||||
|
@@ -294,6 +298,7 @@ let merge_inspection_data child parent =
|
||||||
|
parent.version <- merge child.version parent.version;
|
||||||
|
parent.arch <- merge child.arch parent.arch;
|
||||||
|
parent.hostname <- merge child.hostname parent.hostname;
|
||||||
|
+ parent.build_id <- merge child.build_id parent.build_id;
|
||||||
|
parent.fstab <- child.fstab @ parent.fstab;
|
||||||
|
parent.windows_systemroot <-
|
||||||
|
merge child.windows_systemroot parent.windows_systemroot;
|
||||||
|
diff --git a/daemon/inspect_types.mli b/daemon/inspect_types.mli
|
||||||
|
index 29c76e8ab..05a3ffd4e 100644
|
||||||
|
--- a/daemon/inspect_types.mli
|
||||||
|
+++ b/daemon/inspect_types.mli
|
||||||
|
@@ -51,6 +51,7 @@ and inspection_data = {
|
||||||
|
mutable version : version option;
|
||||||
|
mutable arch : string option;
|
||||||
|
mutable hostname : string option;
|
||||||
|
+ mutable build_id : string option;
|
||||||
|
mutable fstab : fstab_entry list;
|
||||||
|
mutable windows_systemroot : string option;
|
||||||
|
mutable windows_software_hive : string option;
|
||||||
|
diff --git a/generator/actions_inspection.ml b/generator/actions_inspection.ml
|
||||||
|
index f8b744993..70de22ec0 100644
|
||||||
|
--- a/generator/actions_inspection.ml
|
||||||
|
+++ b/generator/actions_inspection.ml
|
||||||
|
@@ -529,6 +529,25 @@ hive is a valid Windows Registry hive.
|
||||||
|
|
||||||
|
You can use C<guestfs_hivex_open> to read or write to the hive.
|
||||||
|
|
||||||
|
+Please read L<guestfs(3)/INSPECTION> for more details." };
|
||||||
|
+
|
||||||
|
+ { defaults with
|
||||||
|
+ name = "inspect_get_build_id"; added = (1, 49, 8);
|
||||||
|
+ style = RString (RPlainString, "buildid"), [String (Mountable, "root")], [];
|
||||||
|
+ impl = OCaml "Inspect.inspect_get_build_id";
|
||||||
|
+ shortdesc = "get the system build ID";
|
||||||
|
+ longdesc = "\
|
||||||
|
+This returns the build ID of the system, or the string
|
||||||
|
+C<\"unknown\"> if the system does not have a build ID.
|
||||||
|
+
|
||||||
|
+For Windows, this gets the build number. Although it is
|
||||||
|
+returned as a string, it is (so far) always a number. See
|
||||||
|
+L<https://en.wikipedia.org/wiki/List_of_Microsoft_Windows_versions>
|
||||||
|
+for some possible values.
|
||||||
|
+
|
||||||
|
+For Linux, this returns the C<BUILD_ID> string from
|
||||||
|
+F</etc/os-release>, although this is not often used.
|
||||||
|
+
|
||||||
|
Please read L<guestfs(3)/INSPECTION> for more details." };
|
||||||
|
|
||||||
|
{ defaults with
|
||||||
|
diff --git a/generator/proc_nr.ml b/generator/proc_nr.ml
|
||||||
|
index edd9bd99d..0f17b1c06 100644
|
||||||
|
--- a/generator/proc_nr.ml
|
||||||
|
+++ b/generator/proc_nr.ml
|
||||||
|
@@ -514,7 +514,8 @@ let proc_nr = [
|
||||||
|
509, "cryptsetup_close";
|
||||||
|
510, "internal_list_rpm_applications";
|
||||||
|
511, "internal_readdir";
|
||||||
|
-512, "clevis_luks_unlock"
|
||||||
|
+512, "clevis_luks_unlock";
|
||||||
|
+513, "inspect_get_build_id";
|
||||||
|
]
|
||||||
|
|
||||||
|
(* End of list. If adding a new entry, add it at the end of the list
|
||||||
|
diff --git a/lib/MAX_PROC_NR b/lib/MAX_PROC_NR
|
||||||
|
index 4d0e90cbc..31cf34b8d 100644
|
||||||
|
--- a/lib/MAX_PROC_NR
|
||||||
|
+++ b/lib/MAX_PROC_NR
|
||||||
|
@@ -1 +1 @@
|
||||||
|
-512
|
||||||
|
+513
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
@ -0,0 +1,82 @@
|
|||||||
|
From 363bbb7e9bd39fc1683fb600c76266f67ad2063c Mon Sep 17 00:00:00 2001
|
||||||
|
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||||
|
Date: Thu, 1 Dec 2022 10:14:43 +0000
|
||||||
|
Subject: [PATCH] lib: Return correct osinfo field for Windows 11
|
||||||
|
|
||||||
|
For Windows Client, we can only distinguish between Windows 10 and
|
||||||
|
Windows 11 using the build ID. The product name in both cases is
|
||||||
|
"Windows 10 <something>", apparently intentionally.
|
||||||
|
|
||||||
|
References:
|
||||||
|
https://learn.microsoft.com/en-us/answers/questions/586619/windows-11-build-ver-is-still-10022000194.html
|
||||||
|
https://github.com/cygwin/cygwin/blob/a263fe0b268580273c1adc4b1bad256147990222/winsup/cygwin/wincap.cc#L429
|
||||||
|
https://en.wikipedia.org/wiki/List_of_Microsoft_Windows_versions
|
||||||
|
|
||||||
|
After this fix, the output of virt-inspector changes to this, which is
|
||||||
|
a bit odd, but correct:
|
||||||
|
|
||||||
|
<name>windows</name>
|
||||||
|
<arch>x86_64</arch>
|
||||||
|
<distro>windows</distro>
|
||||||
|
<product_name>Windows 10 Pro</product_name>
|
||||||
|
<product_variant>Client</product_variant>
|
||||||
|
<major_version>10</major_version>
|
||||||
|
<minor_version>0</minor_version>
|
||||||
|
<windows_systemroot>/Windows</windows_systemroot>
|
||||||
|
<windows_current_control_set>ControlSet001</windows_current_control_set>
|
||||||
|
<osinfo>win11</osinfo>
|
||||||
|
|
||||||
|
Thanks: Yaakov Selkowitz
|
||||||
|
Reported-by: Yongkui Guo
|
||||||
|
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=2012658
|
||||||
|
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
|
||||||
|
(cherry picked from commit 824c7457489366494f0f10fd3369dc30f3a3c360)
|
||||||
|
---
|
||||||
|
lib/inspect-osinfo.c | 24 ++++++++++++++++++++++--
|
||||||
|
1 file changed, 22 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/lib/inspect-osinfo.c b/lib/inspect-osinfo.c
|
||||||
|
index 90e57e6df..1c10ff469 100644
|
||||||
|
--- a/lib/inspect-osinfo.c
|
||||||
|
+++ b/lib/inspect-osinfo.c
|
||||||
|
@@ -86,6 +86,8 @@ guestfs_impl_inspect_get_osinfo (guestfs_h *g, const char *root)
|
||||||
|
else if (STREQ (type, "windows")) {
|
||||||
|
CLEANUP_FREE char *product_name = NULL;
|
||||||
|
CLEANUP_FREE char *product_variant = NULL;
|
||||||
|
+ CLEANUP_FREE char *build_id_str = NULL;
|
||||||
|
+ int build_id;
|
||||||
|
|
||||||
|
product_name = guestfs_inspect_get_product_name (g, root);
|
||||||
|
if (!product_name)
|
||||||
|
@@ -142,8 +144,26 @@ guestfs_impl_inspect_get_osinfo (guestfs_h *g, const char *root)
|
||||||
|
return safe_strdup (g, "win2k19");
|
||||||
|
else
|
||||||
|
return safe_strdup (g, "win2k16");
|
||||||
|
- } else
|
||||||
|
- return safe_strdup (g, "win10");
|
||||||
|
+ }
|
||||||
|
+ else {
|
||||||
|
+ /* For Windows >= 10 Client we can only distinguish between
|
||||||
|
+ * versions by looking at the build ID. See:
|
||||||
|
+ * https://learn.microsoft.com/en-us/answers/questions/586619/windows-11-build-ver-is-still-10022000194.html
|
||||||
|
+ * https://github.com/cygwin/cygwin/blob/a263fe0b268580273c1adc4b1bad256147990222/winsup/cygwin/wincap.cc#L429
|
||||||
|
+ */
|
||||||
|
+ build_id_str = guestfs_inspect_get_build_id (g, root);
|
||||||
|
+ if (!build_id_str)
|
||||||
|
+ return NULL;
|
||||||
|
+
|
||||||
|
+ build_id = guestfs_int_parse_unsigned_int (g, build_id_str);
|
||||||
|
+ if (build_id == -1)
|
||||||
|
+ return NULL;
|
||||||
|
+
|
||||||
|
+ if (build_id >= 22000)
|
||||||
|
+ return safe_strdup (g, "win11");
|
||||||
|
+ else
|
||||||
|
+ return safe_strdup (g, "win10");
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
Loading…
Reference in new issue