mirror of
https://github.com/zrepl/zrepl.git
synced 2025-08-13 16:57:04 +02:00
cmd: support logging reads & writes from sshbytestream to a file.
This commit is contained in:
40
util/io.go
40
util/io.go
@ -2,8 +2,48 @@ package util
|
||||
|
||||
import (
|
||||
"io"
|
||||
"os"
|
||||
)
|
||||
|
||||
type ReadWriteCloserLogger struct {
|
||||
RWC io.ReadWriteCloser
|
||||
ReadFile *os.File
|
||||
WriteFile *os.File
|
||||
}
|
||||
|
||||
func NewReadWriteCloserLogger(rwc io.ReadWriteCloser, readlog, writelog string) (l *ReadWriteCloserLogger, err error) {
|
||||
l = &ReadWriteCloserLogger{
|
||||
RWC: rwc,
|
||||
}
|
||||
flags := os.O_CREATE | os.O_WRONLY
|
||||
if l.ReadFile, err = os.OpenFile(readlog, flags, 0600); err != nil {
|
||||
return
|
||||
}
|
||||
if l.WriteFile, err = os.OpenFile(writelog, flags, 0600); err != nil {
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (c *ReadWriteCloserLogger) Read(buf []byte) (n int, err error) {
|
||||
n, err = c.RWC.Read(buf)
|
||||
if _, writeErr := c.ReadFile.Write(buf[0:n]); writeErr != nil {
|
||||
panic(writeErr)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (c *ReadWriteCloserLogger) Write(buf []byte) (n int, err error) {
|
||||
n, err = c.RWC.Write(buf)
|
||||
if _, writeErr := c.WriteFile.Write(buf[0:n]); writeErr != nil {
|
||||
panic(writeErr)
|
||||
}
|
||||
return
|
||||
}
|
||||
func (c *ReadWriteCloserLogger) Close() error {
|
||||
return c.RWC.Close()
|
||||
}
|
||||
|
||||
type ChainedReader struct {
|
||||
Readers []io.Reader
|
||||
curReader int
|
||||
|
Reference in New Issue
Block a user