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  }