From ca68c88fa9a9001cb3c17287303511ec07a5c8dd Mon Sep 17 00:00:00 2001 From: Sebastiaan de Schaetzen Date: Fri, 12 Jul 2024 23:17:24 +0200 Subject: [PATCH] Add spider-net and auto docker stuff --- .gitignore | 1 + docker-compose.yml | 15 +++++++ docker-socat/Dockerfile | 3 ++ docker.sh | 3 ++ get-ip.lua | 42 ++++++++++++++++++ spider-net/.gitignore | 1 + spider-net/Dockerfile | 13 ++++++ spider-net/build_and_upload.sh | 3 ++ spider-net/go.mod | 10 +++++ spider-net/go.sum | 8 ++++ spider-net/main.go | 68 +++++++++++++++++++++++++++++ upload.lua => upload-controller.lua | 0 upload.sh => upload-controller.sh | 0 13 files changed, 167 insertions(+) create mode 100644 docker-compose.yml create mode 100644 docker-socat/Dockerfile create mode 100755 docker.sh create mode 100644 get-ip.lua create mode 100644 spider-net/.gitignore create mode 100644 spider-net/Dockerfile create mode 100755 spider-net/build_and_upload.sh create mode 100644 spider-net/go.mod create mode 100644 spider-net/go.sum create mode 100644 spider-net/main.go rename upload.lua => upload-controller.lua (100%) rename upload.sh => upload-controller.sh (100%) diff --git a/.gitignore b/.gitignore index 01261b5..177ac77 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *.zip .vscode +.idea diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..1981d5c --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,15 @@ +services: + spider-net: + build: spider-net + network_mode: host + restart: unless-stopped + environment: + SPIDER_HOSTNAME: spider + + docker-socat: + build: docker-socat + restart: unless-stopped + ports: + - "2345:2375/tcp" + volumes: + - /var/run/docker.sock:/var/run/docker.sock diff --git a/docker-socat/Dockerfile b/docker-socat/Dockerfile new file mode 100644 index 0000000..10dac2f --- /dev/null +++ b/docker-socat/Dockerfile @@ -0,0 +1,3 @@ +FROM alpine:3.20 +RUN apk add --no-cache socat +CMD ["/usr/bin/socat","tcp-listen:2375,reuseaddr,fork","unix:/var/run/docker.sock"] \ No newline at end of file diff --git a/docker.sh b/docker.sh new file mode 100755 index 0000000..2a8f647 --- /dev/null +++ b/docker.sh @@ -0,0 +1,3 @@ +export DOCKER_HOST=`lua get-ip.lua spider`:2345 +echo Docker host is $DOCKER_HOST +docker $@ \ No newline at end of file diff --git a/get-ip.lua b/get-ip.lua new file mode 100644 index 0000000..18a1971 --- /dev/null +++ b/get-ip.lua @@ -0,0 +1,42 @@ +package.path = package.path .. ';./controller-host/?/init.lua;./controller-host/?.lua' +local mqtt = require("mqtt") +local client + +local host = ... + +function printTable(table, indentation) + indentation = indentation or "" + for name, value in pairs(table) do + print(indentation .. tostring(name) .. ": " .. tostring(value)) + end +end + +local function onMessage(data) + print(data.payload) + os.exit() +end + +local function onConnect(connack) + if connack.rc ~= 0 then + print("Connection to broker failed:", connack:reason_string()) + os.exit(1) + end + + assert(client:subscribe{ + topic = "host/" .. host + }) +end + +client = mqtt.client { + uri = "mqtt.seeseepuff.be", + username = "tools", + clean = true, + reconnect = 5, +} + +client:on { + connect = onConnect, + message = onMessage, +} + +mqtt.run_ioloop(client) diff --git a/spider-net/.gitignore b/spider-net/.gitignore new file mode 100644 index 0000000..23bb0bd --- /dev/null +++ b/spider-net/.gitignore @@ -0,0 +1 @@ +spider-net \ No newline at end of file diff --git a/spider-net/Dockerfile b/spider-net/Dockerfile new file mode 100644 index 0000000..2830b11 --- /dev/null +++ b/spider-net/Dockerfile @@ -0,0 +1,13 @@ +FROM golang:1.22.5 + +WORKDIR /app + +#COPY go.mod go.sum ./ +#RUN go mod download + +#COPY *.go ./ +#RUN CGO_ENABLED=0 GOOS=linux go build -o /spider-net + +COPY spider-net /spider-net + +CMD ["/spider-net"] \ No newline at end of file diff --git a/spider-net/build_and_upload.sh b/spider-net/build_and_upload.sh new file mode 100755 index 0000000..20ef8c4 --- /dev/null +++ b/spider-net/build_and_upload.sh @@ -0,0 +1,3 @@ +CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -o spider-net +cd .. +./docker.sh compose up spider-net -d --build diff --git a/spider-net/go.mod b/spider-net/go.mod new file mode 100644 index 0000000..34db728 --- /dev/null +++ b/spider-net/go.mod @@ -0,0 +1,10 @@ +module spider-mqtt + +go 1.22 + +require ( + github.com/eclipse/paho.mqtt.golang v1.4.3 // indirect + github.com/gorilla/websocket v1.5.0 // indirect + golang.org/x/net v0.8.0 // indirect + golang.org/x/sync v0.1.0 // indirect +) diff --git a/spider-net/go.sum b/spider-net/go.sum new file mode 100644 index 0000000..cf663d6 --- /dev/null +++ b/spider-net/go.sum @@ -0,0 +1,8 @@ +github.com/eclipse/paho.mqtt.golang v1.4.3 h1:2kwcUGn8seMUfWndX0hGbvH8r7crgcJguQNCyp70xik= +github.com/eclipse/paho.mqtt.golang v1.4.3/go.mod h1:CSYvoAlsMkhYOXh/oKyxa8EcBci6dVkLCbo5tTC1RIE= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= diff --git a/spider-net/main.go b/spider-net/main.go new file mode 100644 index 0000000..397713c --- /dev/null +++ b/spider-net/main.go @@ -0,0 +1,68 @@ +package main + +import ( + "fmt" + mqtt "github.com/eclipse/paho.mqtt.golang" + "log" + "net" + "os" + "time" +) + +func getLocalIP() (string, error) { + addrs, err := net.InterfaceAddrs() + if err != nil { + return "", err + } + for _, addr := range addrs { + if ipnet, ok := addr.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { + if ipnet.IP.To4() != nil { + return ipnet.IP.String(), nil + } + } + } + return "", fmt.Errorf("no IP address found") +} + +func publishIp(client mqtt.Client, topic string) { + log.Printf("Publishing IP") + ip, err := getLocalIP() + if err != nil { + log.Printf("Error getting IP address: %v\n", err) + return + } + token := client.Publish(topic, 0, true, ip) + token.Wait() + if token.Error() != nil { + log.Printf("Error publishing IP address: %v\n", token.Error()) + } else { + log.Printf("Published IP address: %s\n", ip) + } +} + +func main() { + broker := "tcp://mqtt.seeseepuff.be:1883" + topic := "host/" + os.Getenv("SPIDER_HOSTNAME") + + opts := mqtt.NewClientOptions() + opts.AddBroker(broker) + opts.SetClientID("spider-host-client") + client := mqtt.NewClient(opts) + + token := client.Connect() + token.Wait() + if token.Error() != nil { + log.Fatalf("Error connecting to MQTT broker: %v\n", token.Error()) + } + + ticker := time.NewTicker(60 * time.Second) + defer ticker.Stop() + + publishIp(client, topic) + for { + select { + case <-ticker.C: + publishIp(client, topic) + } + } +} diff --git a/upload.lua b/upload-controller.lua similarity index 100% rename from upload.lua rename to upload-controller.lua diff --git a/upload.sh b/upload-controller.sh similarity index 100% rename from upload.sh rename to upload-controller.sh