117 lines
2.7 KiB
Go
117 lines
2.7 KiB
Go
package main
|
|
|
|
import (
|
|
_ "embed"
|
|
"fmt"
|
|
"io"
|
|
"log"
|
|
"net/smtp"
|
|
"os"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/joho/godotenv"
|
|
"gopkg.in/fsnotify.v1"
|
|
)
|
|
|
|
var Error *log.Logger
|
|
var Warning *log.Logger
|
|
|
|
func init() {
|
|
log.SetFlags(log.Lmicroseconds | log.Lshortfile)
|
|
logFile, err := os.Create("main.log")
|
|
if err != nil {
|
|
log.Printf("Error creating log file: %v", err)
|
|
os.Exit(1)
|
|
}
|
|
logger := io.MultiWriter(os.Stdout, logFile)
|
|
log.SetOutput(logger)
|
|
|
|
Error = log.New(io.MultiWriter(logFile, os.Stderr, os.Stdout),
|
|
fmt.Sprintf("%sERROR:%s ", "\033[0;101m", "\033[0m"),
|
|
log.Lmicroseconds|log.Lshortfile)
|
|
Warning = log.New(io.MultiWriter(logFile, os.Stdout),
|
|
fmt.Sprintf("%sWarning:%s ", "\033[0;93m", "\033[0m"),
|
|
log.Lmicroseconds|log.Lshortfile)
|
|
}
|
|
|
|
//go:embed .env
|
|
var env string
|
|
var envvar map[string]string
|
|
var queued bool
|
|
var changes = []*fsnotify.Event{}
|
|
|
|
func main() {
|
|
var err error
|
|
envvar, err = godotenv.Parse(strings.NewReader(env))
|
|
if err != nil {
|
|
Error.Fatalf("Error parsing .env file: %v", err)
|
|
return
|
|
}
|
|
|
|
root, ok := envvar["ROOT"]
|
|
if !ok {
|
|
Error.Fatalf("Error parsing ROOT variable: %v", err)
|
|
return
|
|
}
|
|
|
|
WatchRecursively(root, func(event fsnotify.Event) {
|
|
if !queued {
|
|
delay := 5 * time.Minute
|
|
log.Printf("Mailing changes in %v seconds", delay.Seconds())
|
|
time.AfterFunc(delay, func() {
|
|
err := doNotify()
|
|
if err != nil {
|
|
Error.Printf("Error sending mail: %v", err)
|
|
return
|
|
}
|
|
})
|
|
queued = true
|
|
}
|
|
changes = append(changes, &event)
|
|
})
|
|
}
|
|
|
|
func doNotify() error {
|
|
defer func() { queued = false }()
|
|
|
|
smtpHost, ok := envvar["SMTP_HOST"]
|
|
if !ok {
|
|
return fmt.Errorf("error getting env var SMTP_HOST")
|
|
}
|
|
smtpPort, ok := envvar["SMTP_PORT"]
|
|
if !ok {
|
|
return fmt.Errorf("error getting env var SMTP_PORT")
|
|
}
|
|
smtpUser, ok := envvar["SMTP_USER"]
|
|
if !ok {
|
|
return fmt.Errorf("error getting env var SMTP_USER")
|
|
}
|
|
smtpPass, ok := envvar["SMTP_PASSWORD"]
|
|
if !ok {
|
|
return fmt.Errorf("error getting env var SMTP_PASSWORD")
|
|
}
|
|
log.Printf("Mailing %v changes", len(changes))
|
|
strchanges := make([]string, 0, len(changes))
|
|
for _, change := range changes {
|
|
strchanges = append(strchanges, change.String())
|
|
}
|
|
|
|
from := "admin@quack-lab.dev"
|
|
to := []string{"david.majdandzic@hotmail.com"}
|
|
subject := "New files:"
|
|
body := strings.Join(strchanges, "\n")
|
|
|
|
msg := []byte(fmt.Sprintf("Subject: %s\nFrom: %s\nTo: %s\n\n%s", subject, from, strings.Join(to, ","), body))
|
|
|
|
auth := smtp.PlainAuth("", smtpUser, smtpPass, smtpHost)
|
|
err := smtp.SendMail(smtpHost+":"+smtpPort, auth, from, to, msg)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
log.Println("Sent mail")
|
|
changes = []*fsnotify.Event{}
|
|
|
|
return nil
|
|
}
|