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 { // time.AfterFunc(5*time.Minute, func() { doNotify() }) delay := 5*time.Second log.Printf("Mailing changes in %v seconds", delay.Seconds()) time.AfterFunc(delay, func() { doNotify() }) 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 }