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  }