Compare commits

...

14 Commits

Author SHA1 Message Date
Tero Marttila d65f28d109
Merge pull request #6 from neingeist/fix/restrict-family
🐛 Fix restricting address family when watching for changes
2022-06-24 15:51:21 +03:00
neingeist d774220311 🐛 Fix restricting address family when watching for changes 2022-06-24 14:07:29 +02:00
Tero Marttila 44eb5ea262
Merge pull request #8 from SpComb/github-actions-lint
github workflows: add go fmt, vet checks
2022-06-24 12:34:02 +03:00
Tero Marttila c09c90d0a9 github actions: experiment with workflow error commands 2022-06-24 12:31:15 +03:00
Tero Marttila b06e86edc2 github workflows: add go fmt, vet checks 2022-06-24 12:21:11 +03:00
Tero Marttila 51b9e521ae
Merge pull request #7 from SpComb/github-actions
Setup GitHub Actions
2022-06-24 11:54:58 +03:00
Tero Marttila fefb9ea807 README: whitespace cleanup 2022-06-24 11:54:18 +03:00
Tero Marttila 9fa22b01eb README: add github actions status badge 2022-06-24 11:54:05 +03:00
Tero Marttila d5da1015fc github workflows: upload build artifact 2022-06-24 11:53:24 +03:00
Tero Marttila 18a763eee9 github workflows: use go mod 2022-06-24 11:50:43 +03:00
Tero Marttila 703c5a8fdf setup go module 2022-06-24 11:42:09 +03:00
Tero Marttila 31c8d113f3 github workflows: add go build workflow 2022-06-24 11:37:33 +03:00
Tero Marttila ff4182b7a5
Merge pull request #3 from neingeist/fix/netlink-api
Fix netlink API usage
2022-06-19 14:16:18 +03:00
neingeist fb04ebe13a Fix netlink API usage
netlink changed its API, e.g. there are now separate data structs for
Addr and AddrUpdate, and Addr has IPNet. Fix the build by building an
Addr from an AddrUpdate & unpacking Addr.IPNet.IP.
2022-06-17 12:57:10 +02:00
6 changed files with 132 additions and 9 deletions

15
.github/workflow-scripts/check-gofmt.sh vendored Executable file
View File

@ -0,0 +1,15 @@
#!/bin/sh
set -ue
fmt_list="$(gofmt -l "$@")"
if [ -n "$fmt_list" ]; then
echo "Check gofmt failed: " >&2
for file in "$fmt_list"; do
echo "::error file=${file},title=gofmt::gofmt check failed"
echo "\t$file" >&2
done
exit 1
fi

44
.github/workflows/build.yml vendored Normal file
View File

@ -0,0 +1,44 @@
name: Go build
on:
pull_request:
branches:
- 'master'
push:
branches:
- 'master'
jobs:
go-build:
runs-on: ubuntu-20.04
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup Go
uses: actions/setup-go@v3
with:
go-version: 1.15
cache: true
- name: Download dependencies
run: go mod download
- name: Check gofmt
run: .github/workflow-scripts/check-gofmt.sh .
- name: Build
run: go build -v
- name: Test
run: go test -v
- name: Vet
run: go vet
- name: Upload
uses: actions/upload-artifact@v3
with:
name: go-build
path: ./go-nsupdate

View File

@ -1,3 +1,5 @@
[![Go build](https://github.com/SpComb/go-nsupdate/actions/workflows/build.yml/badge.svg)](https://github.com/SpComb/go-nsupdate/actions/workflows/build.yml)
# go-nsupdate # go-nsupdate
Update dynamic DNS records from netlink. Update dynamic DNS records from netlink.
@ -103,4 +105,3 @@ The DNS update requests are retried in the background (XXX: currently blocks for
;; TSIG PSEUDOSECTION: ;; TSIG PSEUDOSECTION:
yzzrt.dyn.qmsk.net. 0 ANY TSIG hmac-sha256. 20160619184635 300 32 1F7F1EB8A3D5213EAAA163AE78388D48911495A0F3E2870688F3338160905EC9 30973 0 yzzrt.dyn.qmsk.net. 0 ANY TSIG hmac-sha256. 20160619184635 300 32 1F7F1EB8A3D5213EAAA163AE78388D48911495A0F3E2870688F3338160905EC9 30973 0

17
addr.go
View File

@ -2,16 +2,19 @@ package main
import ( import (
"fmt" "fmt"
"github.com/vishvananda/netlink"
"io" "io"
"log" "log"
"net" "net"
"github.com/vishvananda/netlink"
"github.com/vishvananda/netlink/nl"
) )
type AddrSet struct { type AddrSet struct {
linkAttrs netlink.LinkAttrs linkAttrs netlink.LinkAttrs
linkChan chan netlink.LinkUpdate linkChan chan netlink.LinkUpdate
addrChan chan netlink.AddrUpdate addrChan chan netlink.AddrUpdate
family Family
addrs map[string]net.IP addrs map[string]net.IP
} }
@ -36,6 +39,7 @@ func InterfaceAddrs(iface string, family Family) (*AddrSet, error) {
return nil, fmt.Errorf("netlink.LinkByName %v: %v", iface, err) return nil, fmt.Errorf("netlink.LinkByName %v: %v", iface, err)
} else { } else {
addrs.linkAttrs = *link.Attrs() addrs.linkAttrs = *link.Attrs()
addrs.family = family
} }
// list // list
@ -90,8 +94,15 @@ func (addrs *AddrSet) Read() error {
continue continue
} }
addrUpdateFamily := Family(nl.GetIPFamily(addrUpdate.LinkAddress.IP))
if addrs.family != netlink.FAMILY_ALL && addrUpdateFamily != addrs.family {
continue
}
// XXX: scope and other filters? // XXX: scope and other filters?
addrs.updateAddr(addrUpdate.Addr, addrUpdate.NewAddr) addrs.updateAddr(netlink.Addr{
IPNet: &addrUpdate.LinkAddress,
Scope: addrUpdate.Scope}, addrUpdate.NewAddr)
return nil return nil
} }
@ -104,7 +115,7 @@ func (addrs *AddrSet) updateAddr(addr netlink.Addr, up bool) {
return return
} }
ip := addr.IP ip := addr.IPNet.IP
if up { if up {
log.Printf("%v: up %v", addrs, ip) log.Printf("%v: up %v", addrs, ip)

9
go.mod Normal file
View File

@ -0,0 +1,9 @@
module github.com/SpComb/go-nsupdate
go 1.15
require (
github.com/jessevdk/go-flags v1.5.0
github.com/miekg/dns v1.1.50
github.com/vishvananda/netlink v1.1.0
)

43
go.sum Normal file
View File

@ -0,0 +1,43 @@
github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc=
github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4=
github.com/miekg/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA=
github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME=
github.com/vishvananda/netlink v1.1.0 h1:1iyaYNBLmP6L0220aDnYQpo1QEV4t4hJ+xEEhhJH8j0=
github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE=
github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df h1:OviZH7qLw/7ZovXvuNyL3XQl8UFofeikI1NW1Gypu7k=
github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU=
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985 h1:4CSI6oo7cOjJKajidEljs9h+uP0rRZBPPPhcCbj5mw8=
golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2 h1:BonxutuHCTL0rBDnZlKjpGIQFTjyUVTexFOdWkB6Fg0=
golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=