sshpiper/cmd/sshpiperd/typescript.go
Boshi Lian 2603cdfa8b
support handle ping@openssh packet (#582)
* chore: Update dependencies in go.mod and go.sum

* chore: Update submodule commit for crypto

* refactor: Update hook functions to return ssh.PipePackageHookMethod for better integration

* fix: Increase sleep duration in TestFixed to ensure proper execution

* fix: Increase sleep duration in TestFixed to ensure proper file flush

* fix: Update docker-compose service images and modify test to use host-password-old

* refactor: Simplify hook functions to return error instead of PipePackageHookMethod for better error handling

* feat: Add reply-ping flag to enable ping response for compatibility with older sshd

* fix: Update subproject commit reference in crypto
2025-05-08 11:53:40 -07:00

88 lines
1.5 KiB
Go

package main
import (
"fmt"
"os"
"path"
"time"
)
const (
msgChannelData = 94
)
type filePtyLogger struct {
typescript *os.File
timing *os.File
oldtime time.Time
}
func newFilePtyLogger(outputdir string) (*filePtyLogger, error) {
now := time.Now()
filename := fmt.Sprintf("%d", now.Unix())
typescript, err := os.OpenFile(path.Join(outputdir, fmt.Sprintf("%v.typescript", filename)), os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600)
if err != nil {
return nil, err
}
_, err = typescript.Write([]byte(fmt.Sprintf("Script started on %v\n", now.Format(time.ANSIC))))
if err != nil {
return nil, err
}
timing, err := os.OpenFile(path.Join(outputdir, fmt.Sprintf("%v.timing", filename)), os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600)
if err != nil {
return nil, err
}
return &filePtyLogger{
typescript: typescript,
timing: timing,
oldtime: time.Now(),
}, nil
}
func (l *filePtyLogger) loggingTty(msg []byte) error {
if msg[0] == msgChannelData {
buf := msg[9:]
now := time.Now()
delta := now.Sub(l.oldtime)
// see term-utils/script.c
fmt.Fprintf(l.timing, "%v.%06v %v\n", int64(delta/time.Second), int64(delta%time.Second/time.Microsecond), len(buf))
l.oldtime = now
_, err := l.typescript.Write(buf)
if err != nil {
return err
}
}
return nil
}
func (l *filePtyLogger) Close() (err error) {
// if _, err = ; err != nil {
// return err
// }
_, _ = l.typescript.Write([]byte(fmt.Sprintf("Script done on %v\n", time.Now().Format(time.ANSIC))))
l.typescript.Close()
l.timing.Close()
return nil // TODO
}