Read email addresses from $CERTSPOTTER_CONFIG_DIR/email_recipients

This commit is contained in:
Andrew Ayer 2023-02-20 10:14:10 -05:00
parent 8b7cef7f61
commit cd1b7a80ca
1 changed files with 34 additions and 1 deletions

View File

@ -10,6 +10,7 @@
package main package main
import ( import (
"bufio"
"context" "context"
"errors" "errors"
"flag" "flag"
@ -102,6 +103,9 @@ func defaultWatchListPathIfExists() string {
func defaultScriptDir() string { func defaultScriptDir() string {
return filepath.Join(defaultConfigDir(), "hooks.d") return filepath.Join(defaultConfigDir(), "hooks.d")
} }
func defaultEmailFile() string {
return filepath.Join(defaultConfigDir(), "email_recipients")
}
func simplifyError(err error) error { func simplifyError(err error) error {
var pathErr *fs.PathError var pathErr *fs.PathError
@ -121,6 +125,25 @@ func readWatchListFile(filename string) (monitor.WatchList, error) {
return monitor.ReadWatchList(file) return monitor.ReadWatchList(file)
} }
func readEmailFile(filename string) ([]string, error) {
file, err := os.Open(filename)
if err != nil {
return nil, simplifyError(err)
}
defer file.Close()
var emails []string
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text()
if line == "" {
continue
}
emails = append(emails, line)
}
return emails, err
}
func appendFunc(slice *[]string) func(string) error { func appendFunc(slice *[]string) func(string) error {
return func(value string) error { return func(value string) error {
*slice = append(*slice, value) *slice = append(*slice, value)
@ -183,9 +206,19 @@ func main() {
HealthCheckInterval: flags.healthcheck, HealthCheckInterval: flags.healthcheck,
} }
if len(config.Email) == 0 && config.Script == "" && !fileExists(config.ScriptDir) && config.Stdout == false { emailFileExists := false
if emailRecipients, err := readEmailFile(defaultEmailFile()); err == nil {
emailFileExists = true
config.Email = append(config.Email, emailRecipients...)
} else if !errors.Is(err, fs.ErrNotExist) {
fmt.Fprintf(os.Stderr, "%s: error reading email recipients file %q: %s\n", programName, defaultEmailFile(), err)
os.Exit(1)
}
if len(config.Email) == 0 && !emailFileExists && config.Script == "" && !fileExists(config.ScriptDir) && config.Stdout == false {
fmt.Fprintf(os.Stderr, "%s: no notification methods were specified\n", programName) fmt.Fprintf(os.Stderr, "%s: no notification methods were specified\n", programName)
fmt.Fprintf(os.Stderr, "Please specify at least one of the following notification methods:\n") fmt.Fprintf(os.Stderr, "Please specify at least one of the following notification methods:\n")
fmt.Fprintf(os.Stderr, " - Place one or more email addresses in %s (one address per line)\n", defaultEmailFile())
fmt.Fprintf(os.Stderr, " - Place one or more executable scripts in the %s directory\n", config.ScriptDir) fmt.Fprintf(os.Stderr, " - Place one or more executable scripts in the %s directory\n", config.ScriptDir)
fmt.Fprintf(os.Stderr, " - Specify an email address using the -email flag\n") fmt.Fprintf(os.Stderr, " - Specify an email address using the -email flag\n")
fmt.Fprintf(os.Stderr, " - Specify the path to an executable script using the -script flag\n") fmt.Fprintf(os.Stderr, " - Specify the path to an executable script using the -script flag\n")