2021-02-16 22:29:25 +00:00
|
|
|
package ssh
|
|
|
|
|
|
|
|
import (
|
|
|
|
"io"
|
|
|
|
|
|
|
|
"github.com/git-lfs/pktline"
|
|
|
|
"github.com/rubyist/tracerx"
|
|
|
|
)
|
|
|
|
|
|
|
|
func pktlineReader(p Pktline) io.Reader {
|
|
|
|
if pl, ok := p.(*pktline.Pktline); ok {
|
|
|
|
return pktline.NewPktlineReaderFromPktline(pl, 65536)
|
|
|
|
}
|
|
|
|
tp := p.(*TraceablePktline)
|
|
|
|
return pktline.NewPktlineReaderFromPktline(tp.pl, 65536)
|
|
|
|
}
|
|
|
|
|
|
|
|
type Pktline interface {
|
|
|
|
ReadPacketList() ([]string, error)
|
|
|
|
ReadPacketTextWithLength() (string, int, error)
|
|
|
|
WritePacket([]byte) error
|
|
|
|
WritePacketText(string) error
|
|
|
|
WriteDelim() error
|
|
|
|
WriteFlush() error
|
|
|
|
}
|
|
|
|
|
|
|
|
type TraceablePktline struct {
|
2021-03-30 16:34:09 +00:00
|
|
|
id int
|
2021-02-16 22:29:25 +00:00
|
|
|
pl *pktline.Pktline
|
|
|
|
}
|
|
|
|
|
|
|
|
func (tp *TraceablePktline) ReadPacketList() ([]string, error) {
|
|
|
|
var list []string
|
|
|
|
for {
|
|
|
|
data, pktLen, err := tp.pl.ReadPacketTextWithLength()
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
if pktLen <= 1 {
|
2021-03-30 16:34:09 +00:00
|
|
|
tracerx.Printf("packet %02x < %04x", tp.id, pktLen)
|
2021-02-16 22:29:25 +00:00
|
|
|
} else {
|
2021-03-30 16:34:09 +00:00
|
|
|
tracerx.Printf("packet %02x < %s", tp.id, data)
|
2021-02-16 22:29:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if pktLen == 0 {
|
|
|
|
break
|
|
|
|
}
|
|
|
|
|
|
|
|
list = append(list, data)
|
|
|
|
}
|
|
|
|
|
|
|
|
return list, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (tp *TraceablePktline) ReadPacketTextWithLength() (string, int, error) {
|
|
|
|
s, pktLen, err := tp.pl.ReadPacketTextWithLength()
|
|
|
|
if err != nil {
|
|
|
|
return "", 0, err
|
|
|
|
}
|
|
|
|
|
|
|
|
if pktLen <= 1 {
|
2021-03-30 16:34:09 +00:00
|
|
|
tracerx.Printf("packet %02x < %04x", tp.id, pktLen)
|
2021-02-16 22:29:25 +00:00
|
|
|
} else {
|
2021-03-30 16:34:09 +00:00
|
|
|
tracerx.Printf("packet %02x < %s", tp.id, s)
|
2021-02-16 22:29:25 +00:00
|
|
|
}
|
|
|
|
return s, pktLen, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (tp *TraceablePktline) WritePacket(b []byte) error {
|
|
|
|
// Don't trace because this is probably binary data.
|
|
|
|
return tp.pl.WritePacket(b)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (tp *TraceablePktline) WritePacketText(s string) error {
|
2021-03-30 16:34:09 +00:00
|
|
|
tracerx.Printf("packet %02x > %s", tp.id, s)
|
2021-02-16 22:29:25 +00:00
|
|
|
return tp.pl.WritePacketText(s)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (tp *TraceablePktline) WriteDelim() error {
|
2021-03-30 16:34:09 +00:00
|
|
|
tracerx.Printf("packet %02x > 0001", tp.id)
|
2021-02-16 22:29:25 +00:00
|
|
|
return tp.pl.WriteDelim()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (tp *TraceablePktline) WriteFlush() error {
|
2021-03-30 16:34:09 +00:00
|
|
|
tracerx.Printf("packet %02x > 0000", tp.id)
|
2021-02-16 22:29:25 +00:00
|
|
|
return tp.pl.WriteFlush()
|
|
|
|
}
|