go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/providers/os/resources/packages/freebsd_packages.go (about) 1 // Copyright (c) Mondoo, Inc. 2 // SPDX-License-Identifier: BUSL-1.1 3 4 package packages 5 6 import ( 7 "bufio" 8 "encoding/json" 9 "fmt" 10 "io" 11 12 "go.mondoo.com/cnquery/providers/os/connection/shared" 13 ) 14 15 const ( 16 FreebsdPkgFormat = "freebsd" 17 ) 18 19 type FreeBSDPackage struct { 20 Maintainer string 21 Name string 22 Comment string 23 Desc string 24 Version string 25 Origin string 26 Arch string 27 } 28 29 func ParseFreeBSDPackages(r io.Reader) ([]Package, error) { 30 pkgs := []Package{} 31 32 // the raw list does not return a valid json slice, therefore 33 // we need to read and parse each line individually 34 // https://github.com/freebsd/pkg/issues/1287 35 reader := bufio.NewReader(r) 36 for { 37 line, err := reader.ReadString('\n') 38 if err == io.EOF { 39 break 40 } else if err != nil { 41 return nil, err 42 } 43 44 var freeBSDPkg FreeBSDPackage 45 err = json.Unmarshal([]byte(line), &freeBSDPkg) 46 if err != nil { 47 return nil, err 48 } 49 50 pkgs = append(pkgs, Package{ 51 Name: freeBSDPkg.Name, 52 Version: freeBSDPkg.Version, 53 Description: freeBSDPkg.Desc, 54 Arch: freeBSDPkg.Arch, 55 Origin: freeBSDPkg.Origin, 56 Format: FreebsdPkgFormat, 57 }) 58 } 59 60 return pkgs, nil 61 } 62 63 type FreeBSDPkgManager struct { 64 conn shared.Connection 65 } 66 67 func (f *FreeBSDPkgManager) Name() string { 68 return "FreeBSD Package Manager" 69 } 70 71 func (f *FreeBSDPkgManager) Format() string { 72 return FreebsdPkgFormat 73 } 74 75 func (f *FreeBSDPkgManager) List() ([]Package, error) { 76 cmd, err := f.conn.RunCommand("pkg info --raw --raw-format json-compact --all") 77 if err != nil { 78 return nil, fmt.Errorf("could not read freebsd package list") 79 } 80 81 return ParseFreeBSDPackages(cmd.Stdout) 82 } 83 84 func (f *FreeBSDPkgManager) Available() (map[string]PackageUpdate, error) { 85 return map[string]PackageUpdate{}, nil 86 }