Files
echo-ip/ip-checker/main.go
PhatPhuckDave c8a1a9eb17 Add ipchecker
2024-07-21 20:51:29 +02:00

144 lines
3.1 KiB
Go

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
}