initial commit
This commit is contained in:
commit
7761fa4b0c
5 changed files with 130 additions and 0 deletions
19
.woodpecker/build.yaml
Normal file
19
.woodpecker/build.yaml
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
when:
|
||||||
|
- event: push
|
||||||
|
branch: main
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: publish
|
||||||
|
image: woodpeckerci/plugin-kaniko
|
||||||
|
settings:
|
||||||
|
platforms: linux/amd64
|
||||||
|
repo: git.sakoma.wang/llamprecht/advent20xx
|
||||||
|
registry: git.sakoma.wang
|
||||||
|
tags: ${CI_COMMIT_SHA}
|
||||||
|
cache: true
|
||||||
|
username: llamprecht
|
||||||
|
build_args:
|
||||||
|
- COMMIT_SHA=${CI_COMMIT_SHA}
|
||||||
|
- COMMIT_AUTHOR_EMAIL=${CI_COMMIT_AUTHOR_EMAIL}
|
||||||
|
password:
|
||||||
|
from_secret: container_registry_token
|
||||||
19
Containerfile
Normal file
19
Containerfile
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
FROM golang:latest AS build
|
||||||
|
|
||||||
|
WORKDIR /build
|
||||||
|
|
||||||
|
COPY go.mod go.sum ./
|
||||||
|
|
||||||
|
RUN go mod download
|
||||||
|
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
RUN go build -o /dynv6-update
|
||||||
|
|
||||||
|
FROM scratch
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
COPY --from=build /dynv6-update /app/dynv6-update
|
||||||
|
|
||||||
|
CMD ["/app/dynv6-update"]
|
||||||
3
README.md
Normal file
3
README.md
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
## dynv6-update
|
||||||
|
|
||||||
|
A simple client to update the IPv6 Prefix using the dynv6 API
|
||||||
3
go.mod
Normal file
3
go.mod
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
module git.sakoma.wang/llamprecht/dynv6-update
|
||||||
|
|
||||||
|
go 1.24.2
|
||||||
86
main.go
Normal file
86
main.go
Normal file
|
|
@ -0,0 +1,86 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"net"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type conf struct {
|
||||||
|
zone string
|
||||||
|
token string
|
||||||
|
server string
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
conf, err := readConfigVars()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
lastIPv6 := ""
|
||||||
|
for {
|
||||||
|
time.Sleep(1 * time.Second)
|
||||||
|
if newIPv6, ok := checkForNewV6(lastIPv6); ok {
|
||||||
|
lastIPv6 = newIPv6
|
||||||
|
sendNewIP(conf)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func checkForNewV6(lastIPv6 string) (string, bool) {
|
||||||
|
interfaces, err := net.Interfaces()
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return lastIPv6, false
|
||||||
|
}
|
||||||
|
currentIPv6 := ""
|
||||||
|
for _, inter := range interfaces {
|
||||||
|
addresses, err := inter.Addrs()
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return lastIPv6, false
|
||||||
|
}
|
||||||
|
for _, addr := range addresses {
|
||||||
|
if ip, ok := addr.(*net.IPNet); ok && !ip.IP.IsLoopback() {
|
||||||
|
if ip.IP.To4() == nil {
|
||||||
|
currentIPv6 = ip.IP.String()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if currentIPv6 != lastIPv6 {
|
||||||
|
return currentIPv6, true
|
||||||
|
}
|
||||||
|
return lastIPv6, false
|
||||||
|
}
|
||||||
|
|
||||||
|
func sendNewIP(config conf) error {
|
||||||
|
_, err := http.Get(fmt.Sprintf("https://ipv6.dynv6.com/api/update?ipv6prefix=auto&token=%s&zone=%s", config.token, config.zone))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func readConfigVars() (conf, error) {
|
||||||
|
var zone, token, server string
|
||||||
|
var present bool
|
||||||
|
if zone, present = os.LookupEnv("ZONE"); !present {
|
||||||
|
return conf{}, errors.New("No Zone Specified")
|
||||||
|
}
|
||||||
|
if token, present = os.LookupEnv("TOKEN"); !present {
|
||||||
|
return conf{}, errors.New("No Token Specified")
|
||||||
|
}
|
||||||
|
if server, present = os.LookupEnv("SERVER"); !present {
|
||||||
|
server = "ipv6.dynv6.com"
|
||||||
|
}
|
||||||
|
return conf{
|
||||||
|
zone: zone,
|
||||||
|
token: token,
|
||||||
|
server: server,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue