go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/providers/os/connection/ssh/cat/cat.go (about)

     1  // Copyright (c) Mondoo, Inc.
     2  // SPDX-License-Identifier: BUSL-1.1
     3  
     4  package cat
     5  
     6  import (
     7  	"os"
     8  	"time"
     9  
    10  	"github.com/cockroachdb/errors"
    11  	"github.com/rs/zerolog/log"
    12  	"github.com/spf13/afero"
    13  	"go.mondoo.com/cnquery/providers/os/connection/local/statutil"
    14  	"go.mondoo.com/cnquery/providers/os/connection/shared"
    15  )
    16  
    17  type CommandRunner interface {
    18  	RunCommand(command string) (*shared.Command, error)
    19  }
    20  
    21  func New(cmdRunner CommandRunner) *Fs {
    22  	return &Fs{
    23  		commandRunner: cmdRunner,
    24  	}
    25  }
    26  
    27  type Fs struct {
    28  	commandRunner CommandRunner
    29  	base64        *bool
    30  }
    31  
    32  func (cat *Fs) Name() string {
    33  	return "Cat FS"
    34  }
    35  
    36  func (cat *Fs) useBase64encoding() bool {
    37  	if cat.base64 != nil {
    38  		return *cat.base64
    39  	}
    40  
    41  	b := cat.base64available()
    42  	cat.base64 = &b
    43  	return b
    44  }
    45  
    46  func (cat *Fs) base64available() bool {
    47  	cmd, err := cat.commandRunner.RunCommand("command -v base64")
    48  	if err != nil {
    49  		log.Debug().Msg("base64 command not found on target system")
    50  		return false
    51  	}
    52  	log.Debug().Msg("use base64 encoding for data transfer")
    53  	return cmd.ExitStatus == 0
    54  }
    55  
    56  func (cat *Fs) Open(name string) (afero.File, error) {
    57  	_, err := statutil.New(cat.commandRunner).Stat(name)
    58  	if err != nil {
    59  		return nil, err
    60  	}
    61  
    62  	return NewFile(cat, name, cat.useBase64encoding()), nil
    63  }
    64  
    65  func (cat *Fs) Stat(name string) (os.FileInfo, error) {
    66  	return statutil.New(cat.commandRunner).Stat(name)
    67  }
    68  
    69  func (cat *Fs) Create(name string) (afero.File, error) {
    70  	return nil, errors.New("not implemented")
    71  }
    72  
    73  func (cat *Fs) Mkdir(name string, perm os.FileMode) error {
    74  	return errors.New("not implemented")
    75  }
    76  
    77  func (cat *Fs) MkdirAll(path string, perm os.FileMode) error {
    78  	return errors.New("not implemented")
    79  }
    80  
    81  func (cat *Fs) OpenFile(name string, flag int, perm os.FileMode) (afero.File, error) {
    82  	return nil, errors.New("not implemented")
    83  }
    84  
    85  func (cat *Fs) Remove(name string) error {
    86  	return errors.New("not implemented")
    87  }
    88  
    89  func (cat *Fs) RemoveAll(path string) error {
    90  	return errors.New("not implemented")
    91  }
    92  
    93  func (cat *Fs) Rename(oldname, newname string) error {
    94  	return errors.New("not implemented")
    95  }
    96  
    97  func (cat *Fs) Chmod(name string, mode os.FileMode) error {
    98  	return errors.New("not implemented")
    99  }
   100  
   101  func (cat *Fs) Chtimes(name string, atime time.Time, mtime time.Time) error {
   102  	return errors.New("not implemented")
   103  }
   104  
   105  func (cat *Fs) Chown(name string, uid, gid int) error {
   106  	return errors.New("not implemented")
   107  }