diff options
| author | nippy <you@example.com> | 2026-04-18 13:49:56 +0200 |
|---|---|---|
| committer | nippy <you@example.com> | 2026-04-18 13:49:56 +0200 |
| commit | 5d94c0a7d44a2255b81815a52a7056a94a39842d (patch) | |
| tree | 759bdea9645c6a62f9e1e4c001f7d81cccd120d2 /raveos-theme/hyprland/theme-data/DankMaterialShell/core/internal/log | |
| parent | e79cdf210b267f21a186255ce1a4d50029439d54 (diff) | |
| download | RaveOS-PKGBUILD-5d94c0a7d44a2255b81815a52a7056a94a39842d.tar.gz RaveOS-PKGBUILD-5d94c0a7d44a2255b81815a52a7056a94a39842d.zip | |
update Raveos themes
Diffstat (limited to 'raveos-theme/hyprland/theme-data/DankMaterialShell/core/internal/log')
| -rw-r--r-- | raveos-theme/hyprland/theme-data/DankMaterialShell/core/internal/log/filelogger.go | 114 | ||||
| -rw-r--r-- | raveos-theme/hyprland/theme-data/DankMaterialShell/core/internal/log/log.go | 116 |
2 files changed, 230 insertions, 0 deletions
diff --git a/raveos-theme/hyprland/theme-data/DankMaterialShell/core/internal/log/filelogger.go b/raveos-theme/hyprland/theme-data/DankMaterialShell/core/internal/log/filelogger.go new file mode 100644 index 0000000..e3ff42b --- /dev/null +++ b/raveos-theme/hyprland/theme-data/DankMaterialShell/core/internal/log/filelogger.go @@ -0,0 +1,114 @@ +package log + +import ( + "bufio" + "fmt" + "os" + "path/filepath" + "regexp" + "sync" + "time" +) + +type FileLogger struct { + file *os.File + writer *bufio.Writer + logPath string + mu sync.Mutex + stopChan chan struct{} + doneChan chan struct{} + passwordRe *regexp.Regexp +} + +func NewFileLogger() (*FileLogger, error) { + timestamp := time.Now().Unix() + + // Use DANKINSTALL_LOG_DIR if set, otherwise fall back to /tmp. + logDir := os.Getenv("DANKINSTALL_LOG_DIR") + if logDir == "" { + logDir = "/tmp" + } + if err := os.MkdirAll(logDir, 0o755); err != nil { + return nil, fmt.Errorf("failed to create log directory: %w", err) + } + logPath := filepath.Join(logDir, fmt.Sprintf("dankinstall-%d.log", timestamp)) + + file, err := os.Create(logPath) + if err != nil { + return nil, fmt.Errorf("failed to create log file: %w", err) + } + + passwordRe := regexp.MustCompile(`(?i)(password[:\s=]+)[^\s]+`) + + logger := &FileLogger{ + file: file, + writer: bufio.NewWriter(file), + logPath: logPath, + stopChan: make(chan struct{}), + doneChan: make(chan struct{}), + passwordRe: passwordRe, + } + + header := fmt.Sprintf("=== DankInstall Log ===\nStarted: %s\n\n", time.Now().Format(time.RFC3339)) + logger.writeToFile(header) + + return logger, nil +} + +func (l *FileLogger) GetLogPath() string { + return l.logPath +} + +func (l *FileLogger) redactPassword(message string) string { + redacted := l.passwordRe.ReplaceAllString(message, "${1}[REDACTED]") + + redacted = regexp.MustCompile(`echo\s+'[^']+'`).ReplaceAllString(redacted, "echo '[REDACTED]'") + + return redacted +} + +func (l *FileLogger) writeToFile(message string) { + l.mu.Lock() + defer l.mu.Unlock() + + redacted := l.redactPassword(message) + timestamp := time.Now().Format("15:04:05.000") + + fmt.Fprintf(l.writer, "[%s] %s\n", timestamp, redacted) + l.writer.Flush() +} + +func (l *FileLogger) StartListening(logChan <-chan string) { + go func() { + defer close(l.doneChan) + for { + select { + case msg, ok := <-logChan: + if !ok { + return + } + l.writeToFile(msg) + case <-l.stopChan: + return + } + } + }() +} + +func (l *FileLogger) Close() error { + close(l.stopChan) + <-l.doneChan + + l.mu.Lock() + defer l.mu.Unlock() + + footer := fmt.Sprintf("\n=== DankInstall Log End ===\nCompleted: %s\n", time.Now().Format(time.RFC3339)) + l.writer.WriteString(footer) //nolint:errcheck + l.writer.Flush() + + if err := l.file.Sync(); err != nil { + return err + } + + return l.file.Close() +} diff --git a/raveos-theme/hyprland/theme-data/DankMaterialShell/core/internal/log/log.go b/raveos-theme/hyprland/theme-data/DankMaterialShell/core/internal/log/log.go new file mode 100644 index 0000000..6b3ede3 --- /dev/null +++ b/raveos-theme/hyprland/theme-data/DankMaterialShell/core/internal/log/log.go @@ -0,0 +1,116 @@ +package log + +import ( + "os" + "strings" + "sync" + + "github.com/charmbracelet/lipgloss" + cblog "github.com/charmbracelet/log" +) + +// Logger embeds the Charm Logger and adds Printf/Fatalf +type Logger struct{ *cblog.Logger } + +// Printf routes goose/info-style logs through Infof. +func (l *Logger) Printf(format string, v ...any) { l.Infof(format, v...) } + +// Fatalf keeps goose’s contract of exiting the program. +func (l *Logger) Fatalf(format string, v ...any) { l.Logger.Fatalf(format, v...) } + +var ( + logger *Logger + initLogger sync.Once +) + +func parseLogLevel(level string) cblog.Level { + switch strings.ToLower(level) { + case "debug": + return cblog.DebugLevel + case "info": + return cblog.InfoLevel + case "warn", "warning": + return cblog.WarnLevel + case "error": + return cblog.ErrorLevel + case "fatal": + return cblog.FatalLevel + default: + return cblog.InfoLevel + } +} + +func GetQtLoggingRules() string { + level := os.Getenv("DMS_LOG_LEVEL") + if level == "" { + level = "info" + } + + var rules []string + switch strings.ToLower(level) { + case "fatal": + rules = []string{"*.debug=false", "*.info=false", "*.warning=false", "*.critical=false"} + case "error": + rules = []string{"*.debug=false", "*.info=false", "*.warning=false"} + case "warn", "warning": + rules = []string{"*.debug=false", "*.info=false"} + case "info": + rules = []string{"*.debug=false"} + case "debug": + return "" + default: + rules = []string{"*.debug=false"} + } + + return strings.Join(rules, ";") +} + +// GetLogger returns a logger instance +func GetLogger() *Logger { + initLogger.Do(func() { + styles := cblog.DefaultStyles() + // Attempt to match the colors used by qml/quickshell logs + styles.Levels[cblog.FatalLevel] = lipgloss.NewStyle(). + SetString(" FATAL"). + Foreground(lipgloss.Color("1")) + styles.Levels[cblog.ErrorLevel] = lipgloss.NewStyle(). + SetString(" ERROR"). + Foreground(lipgloss.Color("9")) + styles.Levels[cblog.WarnLevel] = lipgloss.NewStyle(). + SetString(" WARN"). + Foreground(lipgloss.Color("3")) + styles.Levels[cblog.InfoLevel] = lipgloss.NewStyle(). + SetString(" INFO"). + Foreground(lipgloss.Color("2")) + styles.Levels[cblog.DebugLevel] = lipgloss.NewStyle(). + SetString(" DEBUG"). + Foreground(lipgloss.Color("4")) + + base := cblog.New(os.Stderr) + base.SetStyles(styles) + base.SetReportTimestamp(false) + + level := cblog.InfoLevel + if envLevel := os.Getenv("DMS_LOG_LEVEL"); envLevel != "" { + level = parseLogLevel(envLevel) + } + base.SetLevel(level) + base.SetPrefix(" go") + + logger = &Logger{base} + }) + return logger +} + +// * Convenience wrappers + +func Debug(msg any, keyvals ...any) { GetLogger().Debug(msg, keyvals...) } +func Debugf(format string, v ...any) { GetLogger().Debugf(format, v...) } +func Info(msg any, keyvals ...any) { GetLogger().Info(msg, keyvals...) } +func Infof(format string, v ...any) { GetLogger().Infof(format, v...) } +func Warn(msg any, keyvals ...any) { GetLogger().Warn(msg, keyvals...) } +func Warnf(format string, v ...any) { GetLogger().Warnf(format, v...) } +func Error(msg any, keyvals ...any) { GetLogger().Error(msg, keyvals...) } +func Errorf(format string, v ...any) { GetLogger().Errorf(format, v...) } +func Fatal(msg any, keyvals ...any) { GetLogger().Fatal(msg, keyvals...) } +func Fatalf(format string, v ...any) { GetLogger().Fatalf(format, v...) } |