go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/providers/os/resources/docker.go (about)

     1  // Copyright (c) Mondoo, Inc.
     2  // SPDX-License-Identifier: BUSL-1.1
     3  
     4  package resources
     5  
     6  import (
     7  	"context"
     8  	"os"
     9  
    10  	docker_types "github.com/docker/docker/api/types"
    11  	"github.com/docker/docker/client"
    12  	"go.mondoo.com/cnquery/llx"
    13  	"go.mondoo.com/cnquery/types"
    14  )
    15  
    16  func (p *mqlDocker) images() ([]interface{}, error) {
    17  	cl, err := dockerClient()
    18  	if err != nil {
    19  		return nil, err
    20  	}
    21  
    22  	dImages, err := cl.ImageList(context.Background(), docker_types.ImageListOptions{})
    23  	if err != nil {
    24  		return nil, err
    25  	}
    26  
    27  	imgs := make([]interface{}, len(dImages))
    28  	for i, dImg := range dImages {
    29  		labels := make(map[string]interface{})
    30  		for key := range dImg.Labels {
    31  			labels[key] = dImg.Labels[key]
    32  		}
    33  
    34  		tags := []interface{}{}
    35  		for i := range dImg.RepoTags {
    36  			tags = append(tags, dImg.RepoTags[i])
    37  		}
    38  
    39  		r, err := CreateResource(p.MqlRuntime, "docker.image", map[string]*llx.RawData{
    40  			"id":          llx.StringData(dImg.ID),
    41  			"size":        llx.IntData(dImg.Size),
    42  			"virtualsize": llx.IntData(dImg.VirtualSize),
    43  			"labels":      llx.MapData(labels, types.String),
    44  			"tags":        llx.ArrayData(tags, types.String),
    45  		})
    46  		if err != nil {
    47  			return nil, err
    48  		}
    49  
    50  		imgs[i] = r.(*mqlDockerImage)
    51  	}
    52  
    53  	return imgs, nil
    54  }
    55  
    56  func (p *mqlDocker) containers() ([]interface{}, error) {
    57  	cl, err := dockerClient()
    58  	if err != nil {
    59  		return nil, err
    60  	}
    61  
    62  	dContainers, err := cl.ContainerList(context.Background(), docker_types.ContainerListOptions{})
    63  	if err != nil {
    64  		return nil, err
    65  	}
    66  
    67  	container := make([]interface{}, len(dContainers))
    68  
    69  	for i, dContainer := range dContainers {
    70  		labels := make(map[string]interface{})
    71  		for key := range dContainer.Labels {
    72  			labels[key] = dContainer.Labels[key]
    73  		}
    74  
    75  		names := []interface{}{}
    76  		for i := range dContainer.Names {
    77  			names = append(names, dContainer.Names[i])
    78  		}
    79  
    80  		/*
    81  			FIXME: ??? not used?
    82  			conn, err := connection.NewDockerEngineContainer(dContainer.ID)
    83  			if err != nil {
    84  				return nil, err
    85  			}
    86  		*/
    87  
    88  		o, err := CreateResource(p.MqlRuntime, "docker.container", map[string]*llx.RawData{
    89  			"id":      llx.StringData(dContainer.ID),
    90  			"image":   llx.StringData(dContainer.Image),
    91  			"imageid": llx.StringData(dContainer.ImageID),
    92  			"command": llx.StringData(dContainer.Command),
    93  			"state":   llx.StringData(dContainer.State),
    94  			"status":  llx.StringData(dContainer.Status),
    95  			"labels":  llx.MapData(labels, types.String),
    96  			"names":   llx.ArrayData(names, types.String),
    97  		})
    98  		if err != nil {
    99  			return nil, err
   100  		}
   101  
   102  		container[i] = o.(*mqlDockerContainer)
   103  	}
   104  
   105  	return container, nil
   106  }
   107  
   108  func (p *mqlDockerContainer) os() (*mqlOsLinux, error) {
   109  	res, err := CreateResource(p.MqlRuntime, "os.linux", map[string]*llx.RawData{})
   110  	if err != nil {
   111  		return nil, err
   112  	}
   113  	return res.(*mqlOsLinux), nil
   114  }
   115  
   116  func (p *mqlDockerImage) id() (string, error) {
   117  	return p.Id.Data, nil
   118  }
   119  
   120  func (p *mqlDockerContainer) id() (string, error) {
   121  	return p.Id.Data, nil
   122  }
   123  
   124  func dockerClient() (*client.Client, error) {
   125  	// set docker api version for macos
   126  	os.Setenv("DOCKER_API_VERSION", "1.26")
   127  	// Start new docker container
   128  	return client.NewClientWithOpts(client.FromEnv)
   129  }