go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/_motor/providers/winrm/cat/cat.go (about) 1 // Copyright (c) Mondoo, Inc. 2 // SPDX-License-Identifier: BUSL-1.1 3 4 package cat 5 6 import ( 7 "bytes" 8 "fmt" 9 "io/ioutil" 10 "os" 11 "time" 12 13 "github.com/cockroachdb/errors" 14 "github.com/spf13/afero" 15 os_provider "go.mondoo.com/cnquery/motor/providers/os" 16 "go.mondoo.com/cnquery/motor/providers/os/powershell" 17 ) 18 19 type CommandRunner interface { 20 RunCommand(command string) (*os_provider.Command, error) 21 } 22 23 func New(cmdRunner CommandRunner) *CatFs { 24 return &CatFs{ 25 commandRunner: cmdRunner, 26 } 27 } 28 29 type CatFs struct { 30 commandRunner CommandRunner 31 } 32 33 func (cat *CatFs) Name() string { 34 return "Winrm Cat FS" 35 } 36 37 func (cat *CatFs) Open(name string) (afero.File, error) { 38 // NOTE: do not use type here since it does not work well with file names like 'C:\Program Files\New Text Document.txt' 39 cmd, err := cat.commandRunner.RunCommand(fmt.Sprintf("powershell -c \"Get-Content '%s'\"", name)) 40 if err != nil { 41 return nil, err 42 } 43 44 if cmd.ExitStatus != 0 { 45 return nil, os.ErrNotExist 46 } 47 48 data, err := ioutil.ReadAll(cmd.Stdout) 49 if err != nil { 50 return nil, err 51 } 52 53 return NewFile(name, bytes.NewBuffer(data)), nil 54 } 55 56 func (cat *CatFs) Stat(name string) (os.FileInfo, error) { 57 cmd, err := cat.commandRunner.RunCommand(fmt.Sprintf("powershell -c \"Get-Item -LiteralPath '%s' | ConvertTo-JSON\"", name)) 58 if err != nil { 59 return nil, err 60 } 61 62 if cmd.ExitStatus != 0 { 63 return nil, os.ErrNotExist 64 } 65 66 item, err := ParseGetItem(cmd.Stdout) 67 if err != nil { 68 return nil, err 69 } 70 71 return &fileStat{ 72 name: item.BaseName, 73 FileSize: item.Length, 74 FileAttributes: item.Attributes, 75 CreationTime: powershell.PSJsonTimestamp(item.CreationTime), 76 LastAccessTime: powershell.PSJsonTimestamp(item.LastAccessTime), 77 LastWriteTime: powershell.PSJsonTimestamp(item.LastWriteTime), 78 }, nil 79 } 80 81 func (cat *CatFs) Create(name string) (afero.File, error) { 82 return nil, errors.New("not implemented") 83 } 84 85 func (cat *CatFs) Mkdir(name string, perm os.FileMode) error { 86 return errors.New("not implemented") 87 } 88 89 func (cat *CatFs) MkdirAll(path string, perm os.FileMode) error { 90 return errors.New("not implemented") 91 } 92 93 func (cat *CatFs) OpenFile(name string, flag int, perm os.FileMode) (afero.File, error) { 94 return nil, errors.New("not implemented") 95 } 96 97 func (cat *CatFs) Remove(name string) error { 98 return errors.New("not implemented") 99 } 100 101 func (cat *CatFs) RemoveAll(path string) error { 102 return errors.New("not implemented") 103 } 104 105 func (cat *CatFs) Rename(oldname, newname string) error { 106 return errors.New("not implemented") 107 } 108 109 func (cat *CatFs) Chmod(name string, mode os.FileMode) error { 110 return errors.New("not implemented") 111 } 112 113 func (cat *CatFs) Chtimes(name string, atime time.Time, mtime time.Time) error { 114 return errors.New("not implemented") 115 } 116 117 func (cat *CatFs) Chown(name string, uid, gid int) error { 118 return errors.New("not implemented") 119 }