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

     1  // Copyright (c) Mondoo, Inc.
     2  // SPDX-License-Identifier: BUSL-1.1
     3  
     4  package resources
     5  
     6  import (
     7  	"fmt"
     8  
     9  	"github.com/rs/zerolog/log"
    10  	"go.mondoo.com/cnquery/llx"
    11  	"go.mondoo.com/cnquery/providers-sdk/v1/plugin"
    12  	"go.mondoo.com/cnquery/providers/os/connection/shared"
    13  	"go.mondoo.com/cnquery/providers/os/resources/mount"
    14  	"go.mondoo.com/cnquery/types"
    15  )
    16  
    17  func (m *mqlMount) id() (string, error) {
    18  	return "mount", nil
    19  }
    20  
    21  func (m *mqlMount) list() ([]interface{}, error) {
    22  	// find suitable mount manager
    23  	conn := m.MqlRuntime.Connection.(shared.Connection)
    24  	mm, err := mount.ResolveManager(conn)
    25  	if mm == nil || err != nil {
    26  		return nil, fmt.Errorf("could not detect suitable mount manager for platform")
    27  	}
    28  
    29  	// retrieve all system packages
    30  	osMounts, err := mm.List()
    31  	if err != nil {
    32  		return nil, fmt.Errorf("could not retrieve mount list for platform")
    33  	}
    34  	log.Debug().Int("mounts", len(osMounts)).Msg("mql[mount]> mounted volumes")
    35  
    36  	// create MQL mount entry resources for each mount
    37  	mountEntries := make([]interface{}, len(osMounts))
    38  	for i, osMount := range osMounts {
    39  		// convert options
    40  		opts := map[string]interface{}{}
    41  		for k := range osMount.Options {
    42  			opts[k] = osMount.Options[k]
    43  		}
    44  
    45  		o, err := CreateResource(m.MqlRuntime, "mount.point", map[string]*llx.RawData{
    46  			"device":  llx.StringData(osMount.Device),
    47  			"path":    llx.StringData(osMount.MountPoint),
    48  			"fstype":  llx.StringData(osMount.FSType),
    49  			"options": llx.MapData(opts, types.String),
    50  			"mounted": llx.BoolTrue,
    51  		})
    52  		if err != nil {
    53  			return nil, err
    54  		}
    55  		mountEntries[i] = o.(*mqlMountPoint)
    56  	}
    57  
    58  	// return the mounts as new entries
    59  	return mountEntries, nil
    60  }
    61  
    62  func (m *mqlMountPoint) id() (string, error) {
    63  	return m.Path.Data, nil
    64  }
    65  
    66  func initMountPoint(runtime *plugin.Runtime, args map[string]*llx.RawData) (map[string]*llx.RawData, plugin.Resource, error) {
    67  	if len(args) > 2 {
    68  		return args, nil, nil
    69  	}
    70  
    71  	pathRaw := args["path"]
    72  	if pathRaw == nil {
    73  		return args, nil, nil
    74  	}
    75  
    76  	path, ok := pathRaw.Value.(string)
    77  	if !ok {
    78  		return args, nil, nil
    79  	}
    80  
    81  	obj, err := CreateResource(runtime, "mount", map[string]*llx.RawData{})
    82  	if err != nil {
    83  		return nil, nil, err
    84  	}
    85  	mount := obj.(*mqlMount)
    86  
    87  	list := mount.GetList()
    88  	if list.Error != nil {
    89  		return nil, nil, list.Error
    90  	}
    91  
    92  	for i := range list.Data {
    93  		mp := list.Data[i].(*mqlMountPoint)
    94  		if mp.Path.Data == path {
    95  			return nil, mp, nil
    96  		}
    97  	}
    98  
    99  	return map[string]*llx.RawData{
   100  		"device":  llx.StringData(""),
   101  		"path":    llx.StringData(path),
   102  		"fstype":  llx.StringData(""),
   103  		"options": llx.MapData(nil, types.String),
   104  		"mounted": llx.BoolFalse,
   105  	}, nil, nil
   106  }