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 }