package manager import ( "context" "encoding/json" "fmt" "os" "time" "gitlab.torproject.org/rgdd/ct/pkg/metadata" "rgdd.se/silent-ct/pkg/monitor" "rgdd.se/silent-ct/pkg/server" ) const ( DefaultStateDir = "/home/rgdd/.local/share/silent-ct" // FIXME DefaultMetadataRefreshInterval = 1 * time.Hour ) type Config struct { StateDir string Nodes server.Nodes MetadataRefreshInterval time.Duration } type Manager struct { Config } func New(cfg Config) (Manager, error) { if cfg.StateDir == "" { cfg.StateDir = DefaultStateDir } if cfg.MetadataRefreshInterval == 0 { cfg.MetadataRefreshInterval = DefaultMetadataRefreshInterval } return Manager{Config: cfg}, nil } func (mgr *Manager) Run(ctx context.Context, serverCh chan server.MessageNodeSubmission, monitorCh chan monitor.MessageLogProgress, configCh chan []monitor.MessageLogConfig, errorCh chan error) error { md, err := mgr.metadataRead() if err != nil { return fmt.Errorf("read metadata: %v\n", err) } configCh <- selectLogs(md) ticker := time.NewTicker(mgr.MetadataRefreshInterval) defer ticker.Stop() for { select { case <-ctx.Done(): return nil case <-ticker.C: mu, err := mgr.metadataUpdate(ctx, md) if err != nil { continue } if mu.Version.Major <= md.Version.Major { continue } md = mu configCh <- selectLogs(md) case ev := <-monitorCh: fmt.Printf("DEBUG: received event from monitor with %d matches\n", len(ev.Matches)) case ev := <-serverCh: fmt.Printf("DEBUG: received event from server: %v\n", ev) case err := <-errorCh: fmt.Printf("DEBUG: received error: %v\n", err) } } } func (mgr *Manager) metadataRead() (metadata.Metadata, error) { b, err := os.ReadFile(mgr.StateDir + "/metadata.json") if err != nil { return metadata.Metadata{}, err } var md metadata.Metadata if err := json.Unmarshal(b, &md); err != nil { return metadata.Metadata{}, err } return md, nil } func (mgr *Manager) metadataUpdate(ctx context.Context, old metadata.Metadata) (metadata.Metadata, error) { return metadata.Metadata{}, fmt.Errorf("TODO: update metadata") }