Add ipchecker
This commit is contained in:
5
.gitignore
vendored
5
.gitignore
vendored
@@ -1,2 +1,7 @@
|
|||||||
main.exe
|
main.exe
|
||||||
echo-ip.tar
|
echo-ip.tar
|
||||||
|
ip-checker/main.log
|
||||||
|
ip-checker/.env
|
||||||
|
ip-checker/ip-notifier.tar
|
||||||
|
ip-checker/ip
|
||||||
|
ip-checker/ip-checker.tar
|
||||||
|
3
ip-checker/deploy.sh
Normal file
3
ip-checker/deploy.sh
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
go build main
|
||||||
|
docker build -t ip-checker .
|
||||||
|
docker save -o ip-checker.tar ip-checker
|
32
ip-checker/dockerfile
Normal file
32
ip-checker/dockerfile
Normal file
@@ -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"]
|
5
ip-checker/go.mod
Normal file
5
ip-checker/go.mod
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
module main
|
||||||
|
|
||||||
|
go 1.22.4
|
||||||
|
|
||||||
|
require github.com/joho/godotenv v1.5.1
|
2
ip-checker/go.sum
Normal file
2
ip-checker/go.sum
Normal file
@@ -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=
|
143
ip-checker/main.go
Normal file
143
ip-checker/main.go
Normal file
@@ -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
|
||||||
|
}
|
Reference in New Issue
Block a user