monitor: Enable to exec into the container

Signed-off-by: Kohei Tokunaga <ktokunaga.mail@gmail.com>
This commit is contained in:
Kohei Tokunaga
2023-02-14 21:16:29 +09:00
parent eefe27ff42
commit e8f55a3cf7
14 changed files with 1249 additions and 481 deletions

View File

@ -159,15 +159,27 @@ func (f *SingleForwarder) doForward() {
var r io.ReadCloser
for {
readerInvalid := false
var readerInvalidMu sync.Mutex
copyReaderToWriter := false
if r != nil {
copyReaderToWriter = true
}
if copyReaderToWriter {
srcR := r
go func() {
buf := make([]byte, 4096)
readerClosed := false
for {
n, readErr := r.Read(buf)
if readErr != nil && !errors.Is(readErr, io.EOF) && !errors.Is(readErr, io.ErrClosedPipe) {
logrus.Debugf("single forwarder: reader error: %v", readErr)
return
n, readErr := srcR.Read(buf)
if readErr != nil {
srcR.Close()
readerClosed = true
if !errors.Is(readErr, io.EOF) && !errors.Is(readErr, io.ErrClosedPipe) {
logrus.Debugf("single forwarder: reader error: %v", readErr)
return
}
}
f.curWMu.Lock()
w := f.curW
f.curWMu.Unlock()
@ -176,10 +188,14 @@ func (f *SingleForwarder) doForward() {
logrus.Debugf("single forwarder: writer error: %v", err)
}
}
if readerInvalid {
readerInvalidMu.Lock()
ri := readerInvalid
readerInvalidMu.Unlock()
if ri || readerClosed {
return
}
if readErr != io.EOF {
logrus.Debugf("unknown error: %v\n", readErr)
continue
}
@ -202,7 +218,9 @@ func (f *SingleForwarder) doForward() {
}
f.curR = newR
r = newR
readerInvalidMu.Lock()
readerInvalid = true
readerInvalidMu.Unlock()
f.curRMu.Unlock()
case <-f.doneCh:
return

View File

@ -133,6 +133,27 @@ func (m *MuxIO) Enable(i int) {
m.enabled[i] = struct{}{}
}
func (m *MuxIO) SwitchTo(i int) error {
m.mu.Lock()
defer m.mu.Unlock()
if m.cur == i {
return nil
}
if _, ok := m.enabled[i]; !ok {
return errors.Errorf("IO index %d isn't active", i)
}
if m.outs[m.cur].DisableHook != nil {
m.outs[m.cur].DisableHook()
}
prev := m.cur
m.cur = i
if m.outs[m.cur].EnableHook != nil {
m.outs[m.cur].EnableHook()
}
fmt.Fprint(m.in.Stdout, m.toggleMessage(prev, i))
return nil
}
func (m *MuxIO) Disable(i int) error {
m.mu.Lock()
defer m.mu.Unlock()