From 80e8c9cadcb3ab1f2a8fa619d81cf13d240b7b34 Mon Sep 17 00:00:00 2001 From: James Shubin Date: Wed, 25 Sep 2024 16:25:55 -0400 Subject: [PATCH] util: arch: Use small arch util library Put all of the arch stuff that we can into this library. --- engine/resources/packagekit/packagekit.go | 27 +------- util/arch/arch.go | 80 +++++++++++++++++++++++ 2 files changed, 83 insertions(+), 24 deletions(-) create mode 100644 util/arch/arch.go diff --git a/engine/resources/packagekit/packagekit.go b/engine/resources/packagekit/packagekit.go index 2a2212f2..4e46cf42 100644 --- a/engine/resources/packagekit/packagekit.go +++ b/engine/resources/packagekit/packagekit.go @@ -39,6 +39,7 @@ import ( engineUtil "github.com/purpleidea/mgmt/engine/util" "github.com/purpleidea/mgmt/util" + archUtil "github.com/purpleidea/mgmt/util/arch" "github.com/purpleidea/mgmt/util/errwrap" "github.com/godbus/dbus/v5" @@ -62,28 +63,6 @@ const ( PkIfaceTransaction = PkIface + ".Transaction" ) -var ( - // PkArchMap contains the mapping from PackageKit arch to GOARCH. - // GOARCH's: 386, amd64, arm, arm64, mips64, mips64le, ppc64, ppc64le - PkArchMap = map[string]string{ // map of PackageKit arch to GOARCH - // TODO: add more values - // noarch - "noarch": "ANY", // special value "ANY" (noarch as seen in Fedora) - "any": "ANY", // special value "ANY" ('any' as seen in ArchLinux) - "all": "ANY", // special value "ANY" ('all' as seen in Debian) - // fedora - "x86_64": "amd64", - "aarch64": "arm64", - // debian, from: https://www.debian.org/ports/ - "amd64": "amd64", - "arm64": "arm64", - "i386": "386", - "i486": "386", - "i586": "386", - "i686": "386", - } -) - // type enum_filter uint64 // https://github.com/hughsie/PackageKit/blob/master/lib/packagekit-glib2/pk-enum.c const ( //static const PkEnumMatch enum_filter[] @@ -985,12 +964,12 @@ func FmtTransactionMethod(method string) string { // IsMyArch determines if a PackageKit architecture matches the current os arch. func IsMyArch(arch string) (bool, error) { - goarch, ok := PkArchMap[arch] + goarch, ok := archUtil.MapPackageKitArchToGoArch[arch] if !ok { // if you get this error, please update the PkArchMap const return false, fmt.Errorf("arch '%s', not found", arch) } - if goarch == "ANY" { // special value that corresponds to noarch + if goarch == archUtil.Any { // special value that corresponds to noarch return true, nil } return goarch == runtime.GOARCH, nil diff --git a/util/arch/arch.go b/util/arch/arch.go new file mode 100644 index 00000000..118bbb7c --- /dev/null +++ b/util/arch/arch.go @@ -0,0 +1,80 @@ +// Mgmt +// Copyright (C) 2013-2024+ James Shubin and the project contributors +// Written by James Shubin and the project contributors +// +// 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 +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// Additional permission under GNU GPL version 3 section 7 +// +// If you modify this program, or any covered work, by linking or combining it +// with embedded mcl code and modules (and that the embedded mcl code and +// modules which link with this program, contain a copy of their source code in +// the authoritative form) containing parts covered by the terms of any other +// license, the licensors of this program grant you additional permission to +// convey the resulting work. Furthermore, the licensors of this program grant +// the original author, James Shubin, additional permission to update this +// additional permission if he deems it necessary to achieve the goals of this +// additional permission. + +// Package arch is for utilities that deal with cpu architectures. Best to keep +// these all in one place so that adding this data happens all in the same file. +package arch + +var ( + // Any is a special value meaning noarch or any arch. + Any = "*" + + // MapPackageKitArchToGoArch contains the mapping from PackageKit arch + // to GOARCH. + MapPackageKitArchToGoArch = map[string]string{ + // TODO: add more values + // noarch + "noarch": "ANY", // as seen in Fedora + "any": "ANY", // as seen in ArchLinux + "all": "ANY", // as seen in Debian + // fedora + "x86_64": "amd64", + "aarch64": "arm64", + // debian, from: https://www.debian.org/ports/ + "amd64": "amd64", + "arm64": "arm64", + "i386": "386", + "i486": "386", + "i586": "386", + "i686": "386", + } + + // MapGoArchToVirtBuilderArch is a map of GOARCH to virt-builder format. + MapGoArchToVirtBuilderArch = map[string]string{ + // TODO: add more values + "386": "i686", + "amd64": "x86_64", + //"arm": "armv7l", // TODO: is this correct? + "arm64": "aarch64", + //"s390x": "?", // TODO: add me + //"?": "ppc64le", // TODO: add me + //"?": "ppc64", // TODO: add me + //"mips64": "?", // TODO: add me + //"mips64le": "?", // TODO: add me + //"ppc64": "?", // TODO: add me + //"ppc64le": "?", // TODO: add me + } +) + +// GoArchToVirtBuilderArch returns the virt-builder arch corresponding to the +// golang GOARCH value. This returns false if the value doesn't exist. +func GoArchToVirtBuilderArch(goarch string) (string, bool) { + s, exists := MapGoArchToVirtBuilderArch[goarch] + return s, exists +}