go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/providers/os/resources/packages/pacman_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  	"fmt"
     9  	"io"
    10  	"regexp"
    11  
    12  	"github.com/cockroachdb/errors"
    13  	"go.mondoo.com/cnquery/providers/os/connection/shared"
    14  )
    15  
    16  const (
    17  	PacmanPkgFormat = "pacman"
    18  )
    19  
    20  var PACMAN_REGEX = regexp.MustCompile(`^([\w-]*)\s([\w\d-+.:]+)$`)
    21  
    22  func ParsePacmanPackages(input io.Reader) []Package {
    23  	pkgs := []Package{}
    24  	scanner := bufio.NewScanner(input)
    25  	for scanner.Scan() {
    26  		line := scanner.Text()
    27  		m := PACMAN_REGEX.FindStringSubmatch(line)
    28  		if m != nil {
    29  			pkgs = append(pkgs, Package{
    30  				Name:    m[1],
    31  				Version: m[2],
    32  				Format:  PacmanPkgFormat,
    33  			})
    34  		}
    35  	}
    36  	return pkgs
    37  }
    38  
    39  // Arch, Manjaro
    40  type PacmanPkgManager struct {
    41  	conn shared.Connection
    42  }
    43  
    44  func (ppm *PacmanPkgManager) Name() string {
    45  	return "Pacman Package Manager"
    46  }
    47  
    48  func (ppm *PacmanPkgManager) Format() string {
    49  	return PacmanPkgFormat
    50  }
    51  
    52  func (ppm *PacmanPkgManager) List() ([]Package, error) {
    53  	cmd, err := ppm.conn.RunCommand("pacman -Q")
    54  	if err != nil {
    55  		return nil, fmt.Errorf("could not read package list")
    56  	}
    57  
    58  	return ParsePacmanPackages(cmd.Stdout), nil
    59  }
    60  
    61  func (ppm *PacmanPkgManager) Available() (map[string]PackageUpdate, error) {
    62  	return nil, errors.New("Available() not implemented for pacman")
    63  }