github.com/kubri/kubri@v0.5.1-0.20240317001612-bda2aaef967e/integrations/apt/control.go (about)

     1  package apt
     2  
     3  import (
     4  	"archive/tar"
     5  	"bytes"
     6  	"io"
     7  	"path"
     8  	"strings"
     9  
    10  	"github.com/blakesmith/ar"
    11  
    12  	"github.com/kubri/kubri/integrations/apt/deb"
    13  )
    14  
    15  func getControl(b []byte) (*Package, error) {
    16  	r := ar.NewReader(bytes.NewReader(b))
    17  
    18  	for {
    19  		h, err := r.Next()
    20  		if err != nil {
    21  			return nil, err
    22  		}
    23  		if !strings.HasPrefix(h.Name, "control.tar") {
    24  			continue
    25  		}
    26  
    27  		r, err := decompress(path.Ext(h.Name))(r)
    28  		if err != nil {
    29  			return nil, err
    30  		}
    31  		defer r.Close()
    32  
    33  		tr := tar.NewReader(r)
    34  
    35  		for {
    36  			h, err := tr.Next()
    37  			if err != nil {
    38  				return nil, err
    39  			}
    40  			if path.Base(h.Name) != "control" {
    41  				continue
    42  			}
    43  
    44  			b, err := io.ReadAll(tr)
    45  			if err != nil {
    46  				return nil, err
    47  			}
    48  			p := &Package{}
    49  			if err = deb.Unmarshal(b, p); err != nil {
    50  				return nil, err
    51  			}
    52  
    53  			return p, nil
    54  		}
    55  	}
    56  }