From d9c83f823676881fb45efcd16a9f69e38957e44b Mon Sep 17 00:00:00 2001 From: Raphanus Lo Date: Mon, 2 Dec 2024 18:31:54 +0800 Subject: [PATCH] fix(preflight): check package install by status flag Signed-off-by: Raphanus Lo --- pkg/local/preflight/packagemanager/apt.go | 19 +++++++++++++++++-- .../packagemanager/packagemanager.go | 3 +++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/pkg/local/preflight/packagemanager/apt.go b/pkg/local/preflight/packagemanager/apt.go index bdcbd305..a7684e4f 100644 --- a/pkg/local/preflight/packagemanager/apt.go +++ b/pkg/local/preflight/packagemanager/apt.go @@ -1,6 +1,7 @@ package packagemanager import ( + "strings" "time" commonns "github.com/longhorn/go-common-libs/ns" @@ -64,6 +65,20 @@ func (c *AptPackageManager) GetServiceStatus(name string) (string, error) { } // CheckPackageInstalled checks if a package is installed -func (c *AptPackageManager) CheckPackageInstalled(name string) (string, error) { - return c.executor.Execute([]string{}, "dpkg-query", []string{"-l", name}, commontypes.ExecuteNoTimeout) +func (c *AptPackageManager) CheckPackageInstalled(name string) (output string, err error) { + // Check man 1 dpkg-query for status flags. + // example for an installed package: + // $ dpkg-query -f='${binary:Package} ${db:Status-Abbrev}' -W nfs-common + // nfs-common ii + output, err = c.executor.Execute([]string{}, "dpkg-query", []string{"-f=${binary:Package} ${db:Status-Abbrev}", "-W", name}, commontypes.ExecuteNoTimeout) + if err != nil { + return + } + fields := strings.Fields(strings.TrimSpace(output)) + if len(fields) == 2 { + if fields[0] == name && fields[1] == "ii" { + return output, nil + } + } + return output, packageNotInstalledError } diff --git a/pkg/local/preflight/packagemanager/packagemanager.go b/pkg/local/preflight/packagemanager/packagemanager.go index 5c21c9c1..6df4f54d 100644 --- a/pkg/local/preflight/packagemanager/packagemanager.go +++ b/pkg/local/preflight/packagemanager/packagemanager.go @@ -1,6 +1,7 @@ package packagemanager import ( + "errors" "fmt" "time" @@ -19,6 +20,8 @@ const ( // PackageManagerQlist = PackageManagerType("qlist") ) +var packageNotInstalledError = errors.New("package not installed") + type PackageManager interface { UpdatePackageList() (string, error) InstallPackage(name string) (string, error)