summaryrefslogtreecommitdiff
path: root/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/log
diff options
context:
space:
mode:
authorAlexanderCurl <alexc@alexc.hu>2026-04-18 17:46:06 +0100
committerAlexanderCurl <alexc@alexc.hu>2026-04-18 17:46:06 +0100
commit70ca3fef77ee8bdc6e3ac28589a6fa08c024cc69 (patch)
treeab1123d4067c1b086dd6faa7ee4ea643236b565a /raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/log
parent5d94c0a7d44a2255b81815a52a7056a94a39842d (diff)
downloadRaveOS-PKGBUILD-70ca3fef77ee8bdc6e3ac28589a6fa08c024cc69.tar.gz
RaveOS-PKGBUILD-70ca3fef77ee8bdc6e3ac28589a6fa08c024cc69.zip
Replaced file structures for themes in the correct format
Diffstat (limited to 'raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/log')
-rw-r--r--raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/log/filelogger.go114
-rw-r--r--raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/log/log.go116
2 files changed, 230 insertions, 0 deletions
diff --git a/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/log/filelogger.go b/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/log/filelogger.go
new file mode 100644
index 0000000..e3ff42b
--- /dev/null
+++ b/raveos-hyprland-theme/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-hyprland-theme/theme-data/DankMaterialShell/core/internal/log/log.go b/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/log/log.go
new file mode 100644
index 0000000..6b3ede3
--- /dev/null
+++ b/raveos-hyprland-theme/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...) }