m/p/efivarfs: refactor
This accomplishes three things:
First, split out the variable access layer from the rest of the code.
This cleans up the attribute handling, which is now done centrally as
well as making the high-level functions very short and clean. They now
also return better errors.
Second this introduces proper types for LoadOption, which can now also
be unmarshaled which was a requirement for A/B updates. This required
implementation of EFI's DevicePath structure.
While refactoring the higher-level functions for this, this also
fixes a bug where the variable index (the 4 hex nibbles at the end) were
improperly generated as lowercase hex.
Third, this adds new high-level functions for interacting with more
boot-related variables needed for the A/B effort.
Change-Id: I53490fa4898a5e7a5498ecc05a9078bd2d66c26e
Reviewed-on: https://review.monogon.dev/c/monogon/+/1855
Tested-by: Jenkins CI
Reviewed-by: Serge Bazanski <serge@monogon.tech>
diff --git a/metropolis/pkg/efivarfs/BUILD.bazel b/metropolis/pkg/efivarfs/BUILD.bazel
index 33b0685..3e5339c 100644
--- a/metropolis/pkg/efivarfs/BUILD.bazel
+++ b/metropolis/pkg/efivarfs/BUILD.bazel
@@ -1,17 +1,32 @@
-load("@io_bazel_rules_go//go:def.bzl", "go_library")
+load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
go_library(
name = "efivarfs",
srcs = [
"boot.go",
+ "devicepath.go",
"efivarfs.go",
- "format.go",
+ "variables.go",
],
importpath = "source.monogon.dev/metropolis/pkg/efivarfs",
visibility = ["//visibility:public"],
deps = [
+ "//metropolis/pkg/msguid",
"@com_github_google_uuid//:uuid",
"@org_golang_x_text//encoding/unicode",
- "@org_golang_x_text//transform",
+ ],
+)
+
+go_test(
+ name = "efivarfs_test",
+ srcs = [
+ "boot_test.go",
+ "devicepath_test.go",
+ ],
+ embed = [":efivarfs"],
+ gc_goopts = ["-d=libfuzzer"],
+ deps = [
+ "@com_github_google_go_cmp//cmp",
+ "@com_github_google_uuid//:uuid",
],
)