aboutsummaryrefslogtreecommitdiff
path: root/internal/manager/manager.go
blob: 33207e9f4fae4a09270f8145bfd9c616b5f3223a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
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")
}