// sessionLogWriter returns a writer that will persist the session output func (t *operations) SessionLog(session *tether.SessionConfig) (dio.DynamicMultiWriter, dio.DynamicMultiWriter, error) { com := "COM3" defer trace.End(trace.Begin("configure session log writer")) if t.logging { detail := "unable to log more than one session concurrently" log.Error(detail) return nil, nil, errors.New(detail) } t.logging = true // redirect backchannel to the serial connection log.Infof("opening %s%s for session logging", pathPrefix, com) f, err := OpenPort(fmt.Sprintf("%s%s", pathPrefix, com)) if err != nil { detail := fmt.Sprintf("failed to open serial port for session log: %s", err) log.Error(detail) return nil, nil, errors.New(detail) } // use multi-writer so it goes to both screen and session log return dio.MultiWriter(f, os.Stdout), dio.MultiWriter(f, os.Stderr), nil }
// sessionLogWriter returns a writer that will persist the session output func (t *operations) SessionLog(session *tether.SessionConfig) (dio.DynamicMultiWriter, dio.DynamicMultiWriter, error) { defer trace.End(trace.Begin("configure session log writer")) name := session.ID if name == "" { name = session.Name } logPath := strings.Join([]string{pathPrefix, logDir, name + ".log"}, string(os.PathSeparator)) // open SttyS2 for session logging log.Infof("opening %s for session logging", logPath) f, err := os.OpenFile(logPath, os.O_RDWR|os.O_CREATE|os.O_APPEND|os.O_SYNC|syscall.O_NOCTTY, 0777) if err != nil { detail := fmt.Sprintf("failed to open file for session log: %s", err) log.Error(detail) return nil, nil, errors.New(detail) } // use multi-writer so it goes to both screen and session log return dio.MultiWriter(f, os.Stdout), dio.MultiWriter(f, os.Stderr), nil }
// sessionLogWriter returns a writer that will persist the session output func (t *operations) SessionLog(session *tether.SessionConfig) (dio.DynamicMultiWriter, dio.DynamicMultiWriter, error) { defer trace.End(trace.Begin("configure session log writer")) if t.logging { detail := "unable to log more than one session concurrently" log.Error(detail) return nil, nil, errors.New(detail) } t.logging = true // open SttyS2 for session logging log.Info("opening ttyS2 for session logging") f, err := os.OpenFile(pathPrefix+"/ttyS2", os.O_RDWR|os.O_SYNC|syscall.O_NOCTTY, 777) if err != nil { detail := fmt.Sprintf("failed to open serial port for session log: %s", err) log.Error(detail) return nil, nil, errors.New(detail) } // use multi-writer so it goes to both screen and session log return dio.MultiWriter(f, os.Stdout), dio.MultiWriter(f, os.Stderr), nil }
func (t *Mocker) SessionLog(session *tether.SessionConfig) (dio.DynamicMultiWriter, error) { return dio.MultiWriter(&t.SessionLogBuffer), nil }