package main import ( _ "embed" "fmt" "io" "log" "net/http" "net/smtp" "os" "strings" "time" "github.com/joho/godotenv" ) //go:embed .env var env string var envvar map[string]string var Error *log.Logger func init() { log.SetFlags(log.Lmicroseconds | log.Ldate) // 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) log.SetOutput(logger) Error = log.New(io.MultiWriter(os.Stderr, os.Stdout), fmt.Sprintf("%sERROR:%s ", "\033[0;101m", "\033[0m"), log.Lmicroseconds|log.Lshortfile) } var oldIP, newIP string const REMOTE_URL = "http://141.147.53.95:5000" const IP_FILE = "ip" var ipFile *os.File var lastMailed time.Time func main() { var err error envvar, err = godotenv.Parse(strings.NewReader(env)) if err != nil { Error.Fatalf("Error parsing .env file: %v", err) os.Exit(1) } ipFile, err = os.OpenFile(IP_FILE, os.O_RDWR|os.O_CREATE, 0644) if err != nil { Error.Fatalf("Error opening IP file: %v", err) os.Exit(1) } fileIP, err := io.ReadAll(ipFile) if err != nil { Error.Fatalf("Error reading IP file: %v", err) os.Exit(1) } oldIP = string(fileIP) for { newIP = checkIP() if newIP != oldIP { err := doNotify() if err != nil { Error.Fatalf("Error sending email: %v", err) } oldIP = newIP ipFile.Truncate(0) ipFile.Seek(0, 0) _, err = ipFile.WriteString(newIP) if err != nil { Error.Fatalf("Error writing to IP file: %v", err) } } else { log.Println("ips same") } time.Sleep(1 * time.Second) } } func checkIP() string { http.NewRequest("GET", REMOTE_URL, nil) resp, err := http.Get(REMOTE_URL) if err != nil { Error.Fatalf("Error getting IP: %v", err) return "" } defer resp.Body.Close() body, err := io.ReadAll(resp.Body) if err != nil { Error.Fatalf("Error reading response body: %v", err) return "" } return string(body) } func doNotify() error { if time.Since(lastMailed) < 30*time.Minute { return nil } 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") } from := "admin@quack-lab.dev" to := []string{"david.majdandzic@hotmail.com"} subject := "IP Changed!" body := fmt.Sprintf("Old IP: %s; New IP: %s", oldIP, newIP) 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") lastMailed = time.Now() return nil }