-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathinit.go
115 lines (95 loc) · 3.45 KB
/
init.go
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package main
import (
"flag"
"log/slog"
"os"
"os/signal"
"strings"
"syscall"
ct "github.com/google/certificate-transparency-go"
)
var DomainToOutput func(string)
var DomainsToOutput func([]string)
var DomainProcessor func([]ct.LogEntry)
type Flags struct {
// Application loglevel
appLogLevel string
// Options for normal operation
outputFilename string
resumeFilename string
resume bool
lookUpSizeFlag uint64
operatorsToSkip arrayFlags
logsToSkip arrayFlags
hasSuffix string
onlyOperator string
onlyLog string
includePrecert bool
// List actions
actionList bool
operatorToList string
logToList string
entryToList uint64
}
var flags Flags
type arrayFlags []string
func (i *arrayFlags) String() string {
return "my string representation"
}
func (i *arrayFlags) Set(value string) error {
*i = append(*i, value)
return nil
}
func init() {
slog.Debug("Seting up signal handler")
c := make(chan os.Signal)
//lint:ignore SA1017 We don't want to buffer signals
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
go func() {
<-c
Abort("Interrupted by user.")
}()
// Application loglevel
flag.StringVar(&flags.appLogLevel, "loglevel", "INFO", "Application loglevel (INFO (default), DEBUG, ERROR, WARN)")
// Options for normal operation
var skipResume bool
flag.BoolVar(&skipResume, "no-resume", false, "Do not use chache (default false)")
flags.resume = !skipResume
flag.Uint64Var(&flags.lookUpSizeFlag, "num-entries", 20, "number of entries to query at once")
flag.StringVar(&flags.outputFilename, "output", "./log-output.log", "Output filename. Use - for stdout. (default ./output.log)")
flag.StringVar(&flags.resumeFilename, "resume", "./log-resume.json", "Resume filename (default ./log-resume.json)")
flag.Var(&flags.operatorsToSkip, "skip-operator", "URLs of operators to skip (can be repeated)")
flag.Var(&flags.logsToSkip, "skip-log", "URLs of logs to skip (can be repeated)")
flag.StringVar(&flags.onlyOperator, "only-operator", "", "Name of the only operator to process")
flag.StringVar(&flags.onlyLog, "only-log", "", "URL of the single log to process")
flag.BoolVar(&flags.includePrecert, "include-precert", false, "Include data from precertificates in output")
flag.StringVar(&flags.hasSuffix, "required-postfix", "", "Postfixe to require. (will not output domains not matching postfix)")
// List actions
flag.BoolVar(&flags.actionList, "list", false, "List something defined by operator/log/entry (default lists operators)")
flag.StringVar(&flags.operatorToList, "operator", "", "Operator for listing (if only this, will lists logs for this operator)")
flag.StringVar(&flags.logToList, "log", "", "Log for listing (does not make sense without --entry)")
flag.Uint64Var(&flags.entryToList, "entry", 0, "Entry to list from --operator's --log")
slog.Debug("Parsing command line flags")
flag.Parse()
if flags.outputFilename == "-" {
DomainToOutput = DomainToOutputStdout
DomainsToOutput = DomainsToOutputStdout
} else {
DomainToOutput = DomainToOutputFile
DomainsToOutput = DomainsToOutputFile
}
flags.appLogLevel = strings.ToUpper(flags.appLogLevel)
switch flags.appLogLevel {
case "DEBUG":
slog.SetLogLoggerLevel(slog.LevelDebug)
case "INFO":
slog.SetLogLoggerLevel(slog.LevelInfo)
case "WARN":
slog.SetLogLoggerLevel(slog.LevelWarn)
case "ERROR":
slog.SetLogLoggerLevel(slog.LevelError)
default:
slog.Error("Log level must be one of INFO, DEBUG, ERROR, WARN")
os.Exit(1)
}
}