github.com/telepresenceio/telepresence/v2@v2.20.0-pro.6.0.20240517030216-236ea954e789/pkg/client/logging/cached_timed_level.go (about)

     1  package logging
     2  
     3  import (
     4  	"context"
     5  	"os"
     6  	"time"
     7  
     8  	"github.com/telepresenceio/telepresence/v2/pkg/client/cache"
     9  	"github.com/telepresenceio/telepresence/v2/pkg/log"
    10  )
    11  
    12  type cachedTLData struct {
    13  	Level   string `json:"level"`
    14  	Expires int64  // Seconds since epoch
    15  }
    16  
    17  func SetAndStoreTimedLevel(ctx context.Context, tl log.TimedLevel, level string, duration time.Duration, procName string) error {
    18  	tl.Set(ctx, level, duration)
    19  	cd := cachedTLData{Level: level}
    20  	if duration > 0 {
    21  		cd.Expires = time.Now().Add(duration).Unix()
    22  	}
    23  	return cache.SaveToUserCache(ctx, &cd, procName+".loglevel", cache.Public)
    24  }
    25  
    26  func LoadTimedLevelFromCache(ctx context.Context, tl log.TimedLevel, procName string) error {
    27  	file := procName + ".loglevel"
    28  	cd := cachedTLData{}
    29  	if err := cache.LoadFromUserCache(ctx, &cd, file); err != nil {
    30  		if os.IsNotExist(err) {
    31  			err = nil
    32  		}
    33  		return err
    34  	}
    35  	if cd.Expires == 0 {
    36  		tl.Set(ctx, cd.Level, 0)
    37  	} else if duration := time.Until(time.Unix(cd.Expires, 0)); duration > 0 {
    38  		tl.Set(ctx, cd.Level, duration)
    39  	} else {
    40  		// Time has expired, just drop the cache.
    41  		_ = cache.DeleteFromUserCache(ctx, file)
    42  	}
    43  	return nil
    44  }