From c8a1a9eb1762e76243591e0ed5226d459818367b Mon Sep 17 00:00:00 2001 From: PhatPhuckDave <> Date: Sun, 21 Jul 2024 20:50:46 +0200 Subject: [PATCH] Add ipchecker --- .gitignore | 5 ++ ip-checker/deploy.sh | 3 + ip-checker/dockerfile | 32 ++++++++++ ip-checker/go.mod | 5 ++ ip-checker/go.sum | 2 + ip-checker/main.go | 143 ++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 190 insertions(+) create mode 100644 ip-checker/deploy.sh create mode 100644 ip-checker/dockerfile create mode 100644 ip-checker/go.mod create mode 100644 ip-checker/go.sum create mode 100644 ip-checker/main.go diff --git a/.gitignore b/.gitignore index 2dd0ac8..8746df5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,7 @@ main.exe echo-ip.tar +ip-checker/main.log +ip-checker/.env +ip-checker/ip-notifier.tar +ip-checker/ip +ip-checker/ip-checker.tar diff --git a/ip-checker/deploy.sh b/ip-checker/deploy.sh new file mode 100644 index 0000000..21d39f5 --- /dev/null +++ b/ip-checker/deploy.sh @@ -0,0 +1,3 @@ +go build main +docker build -t ip-checker . +docker save -o ip-checker.tar ip-checker \ No newline at end of file diff --git a/ip-checker/dockerfile b/ip-checker/dockerfile new file mode 100644 index 0000000..0f1e916 --- /dev/null +++ b/ip-checker/dockerfile @@ -0,0 +1,32 @@ +FROM golang:1.22.4-bullseye as base + +RUN adduser \ + --disabled-password \ + --gecos "" \ + --home "/nonexistent" \ + --shell "/sbin/nologin" \ + --no-create-home \ + --uid 65532 \ + small-user + +WORKDIR $GOPATH/src/app/ + +COPY . . + +RUN go mod download +RUN go mod verify + +RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o /main . + +FROM scratch + +COPY --from=base /usr/share/zoneinfo /usr/share/zoneinfo +COPY --from=base /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ +COPY --from=base /etc/passwd /etc/passwd +COPY --from=base /etc/group /etc/group + +COPY --from=base /main . + +USER small-user:small-user + +CMD ["/main"] \ No newline at end of file diff --git a/ip-checker/go.mod b/ip-checker/go.mod new file mode 100644 index 0000000..d224587 --- /dev/null +++ b/ip-checker/go.mod @@ -0,0 +1,5 @@ +module main + +go 1.22.4 + +require github.com/joho/godotenv v1.5.1 diff --git a/ip-checker/go.sum b/ip-checker/go.sum new file mode 100644 index 0000000..d61b19e --- /dev/null +++ b/ip-checker/go.sum @@ -0,0 +1,2 @@ +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= diff --git a/ip-checker/main.go b/ip-checker/main.go new file mode 100644 index 0000000..9c6fd87 --- /dev/null +++ b/ip-checker/main.go @@ -0,0 +1,143 @@ +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 +}