Skip to content

Commit 07b85b9

Browse files
committed
backupd: serve /perm via rsync, too
This allows for more efficient incremental backup.
1 parent fe43422 commit 07b85b9

File tree

3 files changed

+69
-11
lines changed

3 files changed

+69
-11
lines changed

cmd/backupd/backupd.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@
1616
package main
1717

1818
import (
19+
"context"
1920
"net"
2021
"net/http"
2122
"os"
2223
"os/signal"
2324
"syscall"
2425

2526
"github.com/gokrazy/gokrazy"
27+
"github.com/gokrazy/rsync/rsyncd"
2628

2729
"github.com/rtr7/router7/internal/backup"
2830
"github.com/rtr7/router7/internal/multilisten"
@@ -33,6 +35,51 @@ var log = teelogger.NewConsole()
3335

3436
var httpListeners = multilisten.NewPool()
3537

38+
var rsyncListeners = multilisten.NewPool()
39+
40+
type rsyncListener struct {
41+
addr string
42+
listener net.Listener
43+
cancel context.CancelFunc
44+
}
45+
46+
func (r *rsyncListener) ListenAndServe() error {
47+
ln, err := net.Listen("tcp", r.addr)
48+
if err != nil {
49+
return err
50+
}
51+
r.listener = ln
52+
ctx, cancel := context.WithCancel(context.Background())
53+
r.cancel = cancel
54+
rsyncServer, err := rsyncd.NewServer([]rsyncd.Module{
55+
{
56+
Name: "perm",
57+
Path: "/perm",
58+
},
59+
})
60+
if err != nil {
61+
return err
62+
}
63+
64+
go func() {
65+
if err := rsyncServer.Serve(ctx, ln); err != nil {
66+
log.Print(err)
67+
}
68+
}()
69+
70+
return nil
71+
}
72+
73+
func (r *rsyncListener) Close() error {
74+
if r.cancel != nil {
75+
r.cancel()
76+
r.cancel = nil
77+
r.listener.Close()
78+
r.listener = nil
79+
}
80+
return nil
81+
}
82+
3683
func updateListeners() error {
3784
hosts, err := gokrazy.PrivateInterfaceAddrs()
3885
if err != nil {
@@ -42,6 +89,11 @@ func updateListeners() error {
4289
httpListeners.ListenAndServe(hosts, func(host string) multilisten.Listener {
4390
return &http.Server{Addr: net.JoinHostPort(host, "8077")}
4491
})
92+
93+
rsyncListeners.ListenAndServe(hosts, func(host string) multilisten.Listener {
94+
return &rsyncListener{addr: net.JoinHostPort(host, "8873")} // unprivileged rsync
95+
})
96+
4597
return nil
4698
}
4799

go.mod

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ require (
77
github.com/digineo/go-ping v1.0.1
88
github.com/eclipse/paho.mqtt.golang v1.4.1
99
github.com/gokrazy/gokrazy v0.0.0-20230812092215-346db1998f83
10+
github.com/gokrazy/rsync v0.2.1
1011
github.com/google/go-cmp v0.6.0
1112
github.com/google/gopacket v1.1.19
1213
github.com/google/nftables v0.2.1-0.20240422065334-aa8348f7904c
@@ -24,10 +25,10 @@ require (
2425
github.com/rtr7/dhcp4 v0.0.0-20220302171438-18c84d089b46
2526
github.com/vishvananda/netlink v1.2.1-beta.2
2627
github.com/vishvananda/netns v0.0.4
27-
golang.org/x/crypto v0.31.0
28+
golang.org/x/crypto v0.33.0
2829
golang.org/x/net v0.23.0
29-
golang.org/x/sync v0.7.0
30-
golang.org/x/sys v0.28.0
30+
golang.org/x/sync v0.11.0
31+
golang.org/x/sys v0.30.0
3132
golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9
3233
golang.zx2c4.com/wireguard/wgctrl v0.0.0-20220504211119-3d4a969bb56b
3334
)
@@ -45,6 +46,7 @@ require (
4546
github.com/mdlayher/netlink v1.7.2 // indirect
4647
github.com/mdlayher/socket v0.5.0 // indirect
4748
github.com/mdlayher/watchdog v0.0.0-20221003142519-49be0df7b3b5 // indirect
49+
github.com/mmcloughlin/md4 v0.1.2 // indirect
4850
github.com/prometheus/client_model v0.6.1 // indirect
4951
github.com/prometheus/common v0.53.0 // indirect
5052
github.com/prometheus/procfs v0.14.0 // indirect

go.sum

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ github.com/gokrazy/gokrazy v0.0.0-20230812092215-346db1998f83 h1:Y4sADvUYd/c0eqn
2121
github.com/gokrazy/gokrazy v0.0.0-20230812092215-346db1998f83/go.mod h1:9q5Tg+q+YvRjC3VG0gfMFut46dhbhtAnvUEp4lPjc6c=
2222
github.com/gokrazy/internal v0.0.0-20230211171410-9608422911d0 h1:QTi0skQ/OM7he/5jEWA9k/DYgdwGAhw3hrUoiPGGZHM=
2323
github.com/gokrazy/internal v0.0.0-20230211171410-9608422911d0/go.mod h1:ddHcxXZ/VVQOSAWcRBbkYY58+QOw4L145ye6phyDmRA=
24+
github.com/gokrazy/rsync v0.2.1 h1:2eHa9780NQPYet6VuLO6IyXSHLjx8k/HHP/csNW3+z0=
25+
github.com/gokrazy/rsync v0.2.1/go.mod h1:dz2L8Dmv1fFpRlp6YuLNZ1UIqOfFqYir14J/8efsz6w=
2426
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
2527
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
2628
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
@@ -93,6 +95,8 @@ github.com/miekg/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA=
9395
github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME=
9496
github.com/mikioh/ipaddr v0.0.0-20190404000644-d465c8ab6721 h1:RlZweED6sbSArvlE924+mUcZuXKLBHA35U7LN621Bws=
9597
github.com/mikioh/ipaddr v0.0.0-20190404000644-d465c8ab6721/go.mod h1:Ickgr2WtCLZ2MDGd4Gr0geeCH5HybhRJbonOgQpvSxc=
98+
github.com/mmcloughlin/md4 v0.1.2 h1:kGYl+iNbxhyz4u76ka9a+0TXP9KWt/LmnM0QhZwhcBo=
99+
github.com/mmcloughlin/md4 v0.1.2/go.mod h1:AAxFX59fddW0IguqNzWlf1lazh1+rXeIt/Bj49cqDTQ=
96100
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
97101
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
98102
github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU=
@@ -131,8 +135,8 @@ gitlab.com/golang-commonmark/puny v0.0.0-20191124015043-9f83538fa04f/go.mod h1:T
131135
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
132136
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
133137
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
134-
golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
135-
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
138+
golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus=
139+
golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M=
136140
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
137141
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
138142
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
@@ -156,8 +160,8 @@ golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
156160
golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
157161
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
158162
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
159-
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
160-
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
163+
golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w=
164+
golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
161165
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
162166
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
163167
golang.org/x/sys v0.0.0-20190411185658-b44545bcd369/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -183,11 +187,11 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w
183187
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
184188
golang.org/x/sys v0.0.0-20210525143221-35b2ab0089ea/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
185189
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
186-
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
187-
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
190+
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
191+
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
188192
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
189-
golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q=
190-
golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
193+
golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU=
194+
golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s=
191195
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
192196
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
193197
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=

0 commit comments

Comments
 (0)