github.com/nextlinux/gosbom@v0.81.1-0.20230627115839-1ff50c281391/gosbom/pkg/cataloger/kernel/package.go (about)

     1  package kernel
     2  
     3  import (
     4  	"strings"
     5  
     6  	"github.com/nextlinux/gosbom/gosbom/file"
     7  	"github.com/nextlinux/gosbom/gosbom/pkg"
     8  
     9  	"github.com/anchore/packageurl-go"
    10  )
    11  
    12  const linuxKernelPackageName = "linux-kernel"
    13  
    14  func newLinuxKernelPackage(metadata pkg.LinuxKernelMetadata, archiveLocation file.Location) pkg.Package {
    15  	p := pkg.Package{
    16  		Name:         linuxKernelPackageName,
    17  		Version:      metadata.Version,
    18  		Locations:    file.NewLocationSet(archiveLocation.WithAnnotation(pkg.EvidenceAnnotationKey, pkg.PrimaryEvidenceAnnotation)),
    19  		PURL:         packageURL(linuxKernelPackageName, metadata.Version),
    20  		Type:         pkg.LinuxKernelPkg,
    21  		MetadataType: pkg.LinuxKernelMetadataType,
    22  		Metadata:     metadata,
    23  	}
    24  
    25  	p.SetID()
    26  
    27  	return p
    28  }
    29  
    30  func newLinuxKernelModulePackage(metadata pkg.LinuxKernelModuleMetadata, kmLocation file.Location) pkg.Package {
    31  	p := pkg.Package{
    32  		Name:         metadata.Name,
    33  		Version:      metadata.Version,
    34  		Locations:    file.NewLocationSet(kmLocation.WithAnnotation(pkg.EvidenceAnnotationKey, pkg.PrimaryEvidenceAnnotation)),
    35  		Licenses:     pkg.NewLicenseSet(pkg.NewLicensesFromLocation(kmLocation, metadata.License)...),
    36  		PURL:         packageURL(metadata.Name, metadata.Version),
    37  		Type:         pkg.LinuxKernelModulePkg,
    38  		MetadataType: pkg.LinuxKernelModuleMetadataType,
    39  		Metadata:     metadata,
    40  	}
    41  
    42  	p.SetID()
    43  
    44  	return p
    45  }
    46  
    47  // packageURL returns the PURL for the specific Kernel package (see https://github.com/package-url/purl-spec)
    48  func packageURL(name, version string) string {
    49  	var namespace string
    50  
    51  	fields := strings.SplitN(name, "/", 2)
    52  	if len(fields) > 1 {
    53  		namespace = fields[0]
    54  		name = fields[1]
    55  	}
    56  
    57  	return packageurl.NewPackageURL(
    58  		packageurl.TypeGeneric,
    59  		namespace,
    60  		name,
    61  		version,
    62  		nil,
    63  		"",
    64  	).ToString()
    65  }