isTTY bool
+ loop *frontend.Loop
logFunc func(level safcm.LogLevel, escaped bool, msg string)
}
flag.CommandLine.Parse(args[2:])
- var level safcm.LogLevel
- switch *optionLog {
- case "error":
- level = safcm.LogError
- case "info":
- level = safcm.LogInfo
- case "verbose":
- level = safcm.LogVerbose
- case "debug":
- level = safcm.LogDebug
- case "debug2":
- level = safcm.LogDebug2
- case "debug3":
- level = safcm.LogDebug3
- default:
- return fmt.Errorf("invalid -log value %q", *optionLog)
+ level, err := safcm.ParseLogLevel(*optionLog)
+ if err != nil {
+ return fmt.Errorf("-log: %v", err)
}
names := flag.Args()
var hosts []frontend.Host
for _, x := range toSync {
s := &Sync{
- host: x,
- config: cfg,
- allHosts: allHosts,
- allGroups: allGroups,
- isTTY: isTTY,
- }
+ host: x,
+ config: cfg,
+ allHosts: allHosts,
+ allGroups: allGroups,
+ isTTY: isTTY,
+ loop: loop,
+ }
s.logFunc = func(level safcm.LogLevel, escaped bool,
msg string) {
- loop.Log(s, level, escaped, msg)
+ s.loop.Log(s, level, escaped, msg)
}
hosts = append(hosts, s)
}
func logEvent(x frontend.Event, level safcm.LogLevel, isTTY bool, failed *bool) {
// We have multiple event sources so this is somewhat ugly.
var prefix, data string
- var color Color
+ var color frontend.Color
if x.Error != nil {
prefix = "[error]"
data = x.Error.Error()
- color = ColorRed
+ color = frontend.ColorRed
// We logged an error, tell the caller
*failed = true
} else if x.Log.Level != 0 {
prefix = "[debug2]"
default:
prefix = fmt.Sprintf("[INVALID=%d]", x.Log.Level)
- color = ColorRed
+ color = frontend.ColorRed
}
data = x.Log.Text
} else {
x.ConnEvent.Data = "remote helper upload in progress"
default:
prefix = fmt.Sprintf("[INVALID=%d]", x.ConnEvent.Type)
- color = ColorRed
+ color = frontend.ColorRed
}
data = x.ConnEvent.Data
}
host := x.Host.Name()
if color != 0 {
- host = ColorString(isTTY, color, host)
+ host = frontend.ColorString(isTTY, color, host)
}
// Make sure to escape control characters to prevent terminal
// injection attacks
if !x.Escaped {
- data = EscapeControlCharacters(isTTY, data)
+ data = frontend.EscapeControlCharacters(isTTY, data)
}
log.Printf("%-9s [%s] %s", prefix, host, data)
}
func (s *Sync) logVerbosef(format string, a ...interface{}) {
s.log(safcm.LogVerbose, false, fmt.Sprintf(format, a...))
}
-
-// sendRecv sends a message over conn and waits for the response. Any MsgLog
-// messages received before the final (non MsgLog) response are passed to
-// s.log.
-func (s *Sync) sendRecv(conn *rpc.Conn, msg safcm.Msg) (safcm.Msg, error) {
- err := conn.Send(msg)
- if err != nil {
- return nil, err
- }
- for {
- x, err := conn.Recv()
- if err != nil {
- return nil, err
- }
- log, ok := x.(safcm.MsgLog)
- if ok {
- s.log(log.Level, false, log.Text)
- continue
- }
- return x, nil
- }
-}