X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=frontend%2Flog.go;h=bb7824253f300fc7e06e6ab644146f132ea9322f;hb=HEAD;hp=33fa1d0e24e68e15211b489067dfb77dfc15b40e;hpb=c899e17495d4eb932e0b4f428ec91882d845f1bc;p=safcm%2Fsafcm.git diff --git a/frontend/log.go b/frontend/log.go index 33fa1d0..bb78242 100644 --- a/frontend/log.go +++ b/frontend/log.go @@ -1,23 +1,14 @@ // Frontend: Logging functions for programs using the safcm library -// Copyright (C) 2021 Simon Ruderich -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . +// SPDX-License-Identifier: GPL-3.0-or-later +// Copyright (C) 2021-2024 Simon Ruderich package frontend import ( + "fmt" + "log" + "ruderich.org/simon/safcm" "ruderich.org/simon/safcm/rpc" ) @@ -50,3 +41,67 @@ func (l *Loop) Log(host Host, level safcm.LogLevel, escaped bool, Escaped: escaped, } } + +// LogEvent logs events using the log package. It can be used to implement +// Loop.LogEventFunc. It's used by cmd/safcm to log events. +func LogEvent(x 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 + if x.Error != nil { + prefix = "[error]" + data = x.Error.Error() + color = ColorRed + // We logged an error, tell the caller + *failed = true + } else if x.Log.Level != 0 { + if level < x.Log.Level { + return + } + // LogError and LogDebug3 should not occur here + switch x.Log.Level { + case safcm.LogInfo: + prefix = "[info]" + case safcm.LogVerbose: + prefix = "[verbose]" + case safcm.LogDebug: + prefix = "[debug]" + case safcm.LogDebug2: + prefix = "[debug2]" + default: + prefix = fmt.Sprintf("[INVALID=%d]", x.Log.Level) + color = ColorRed + } + data = x.Log.Text + } else { + switch x.ConnEvent.Type { + case rpc.ConnEventStderr: + prefix = "[stderr]" + case rpc.ConnEventDebug: + prefix = "[debug3]" + case rpc.ConnEventUpload: + if level < safcm.LogInfo { + return + } + prefix = "[info]" + x.ConnEvent.Data = "remote helper upload in progress" + default: + prefix = fmt.Sprintf("[INVALID=%d]", x.ConnEvent.Type) + color = ColorRed + } + data = x.ConnEvent.Data + } + + host := x.Host.Name() + if color != 0 { + host = ColorString(isTTY, color, host) + } + // Make sure to escape control characters to prevent terminal + // injection attacks + if !x.Escaped { + data = EscapeControlCharacters(isTTY, data) + } + log.Printf("%-9s [%s] %s", prefix, host, data) +}