Skip to content

Commit 5e2ed3a

Browse files
committed
fix tunnel embed, acme renew
1 parent 097696b commit 5e2ed3a

2 files changed

Lines changed: 39 additions & 28 deletions

File tree

cmd/relay-server/tunnel.go

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ import (
55
"encoding/hex"
66
"fmt"
77
"net/http"
8-
"os"
9-
"path/filepath"
108
"strings"
119
)
1210

@@ -199,46 +197,36 @@ func serveTunnelBinary(w http.ResponseWriter, r *http.Request) {
199197
slug = strings.TrimSuffix(slug, ".sha256")
200198
}
201199

202-
path, ok := tunnelBinaryPathBySlug(slug)
200+
data, filename, ok := tunnelBinaryBySlug(slug)
203201
if !ok {
204202
http.NotFound(w, r)
205203
return
206204
}
207-
208-
data, err := os.ReadFile(path)
209-
if err != nil {
210-
http.NotFound(w, r)
211-
return
212-
}
213205
sum := sha256.Sum256(data)
214206
checksumHex := hex.EncodeToString(sum[:])
215207

216208
if checksumRequest {
217209
w.Header().Set("Content-Type", "text/plain; charset=utf-8")
218210
if r.Method == http.MethodGet {
219-
_, _ = fmt.Fprintf(w, "%s portal-tunnel-%s\n", checksumHex, slug)
211+
_, _ = fmt.Fprintf(w, "%s %s\n", checksumHex, filename)
220212
}
221213
return
222214
}
223215

224216
w.Header().Set("Content-Type", "application/octet-stream")
217+
w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%q", filename))
225218
w.Header().Set("X-Checksum-Sha256", checksumHex)
226219
if r.Method == http.MethodGet {
227220
_, _ = w.Write(data)
228221
}
229222
}
230223

231-
func tunnelBinaryPathBySlug(slug string) (string, bool) {
232-
candidates := []string{
233-
filepath.Join("dist", "tunnel", tunnelBinaryName(slug)),
234-
filepath.Join("bin", tunnelBinaryName(slug)),
235-
}
236-
for _, candidate := range candidates {
237-
if _, err := os.Stat(candidate); err == nil {
238-
return candidate, true
239-
}
224+
func tunnelBinaryBySlug(slug string) ([]byte, string, bool) {
225+
filename := tunnelBinaryName(slug)
226+
if data, err := embeddedDistFS.ReadFile("dist/tunnel/" + filename); err == nil {
227+
return data, filename, true
240228
}
241-
return "", false
229+
return nil, "", false
242230
}
243231

244232
func tunnelBinaryName(slug string) string {

portal/acme/acme.go

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
lego "github.com/go-acme/lego/v4/lego"
2525
"github.com/go-acme/lego/v4/providers/dns/cloudflare"
2626
"github.com/go-acme/lego/v4/registration"
27+
"github.com/rs/zerolog/log"
2728
)
2829

2930
const (
@@ -32,6 +33,9 @@ const (
3233
accountKeyFileName = "acme-account.key"
3334
registrationFileName = "acme-registration.json"
3435
defaultACMEEmailPrefix = "acme@"
36+
defaultRenewInterval = 24 * time.Hour
37+
defaultDNSSyncInterval = 10 * time.Minute
38+
defaultSyncTimeout = 2 * time.Minute
3539
)
3640

3741
type Config struct {
@@ -99,7 +103,7 @@ func (m *Manager) EnsureCertificate(ctx context.Context) (string, string, error)
99103
return "", "", errors.New("cloudflare token is required for non-local relay certificates")
100104
}
101105

102-
if err := EnsureDNSRecords(ctx, m.cfg.BaseDomain, m.cfg.CloudflareToken); err != nil {
106+
if err := m.syncDNS(ctx); err != nil {
103107
return "", "", fmt.Errorf("ensure dns records: %w", err)
104108
}
105109

@@ -124,7 +128,7 @@ func (m *Manager) Start(ctx context.Context) {
124128

125129
m.startOnce.Do(func() {
126130
m.wg.Add(1)
127-
go m.renewalLoop(ctx)
131+
go m.maintenanceLoop(ctx)
128132
})
129133
}
130134

@@ -195,29 +199,48 @@ func (m *Manager) provision(ctx context.Context) error {
195199
return nil
196200
}
197201

198-
func (m *Manager) renewalLoop(ctx context.Context) {
202+
func (m *Manager) maintenanceLoop(ctx context.Context) {
199203
defer m.wg.Done()
200204

201-
ticker := time.NewTicker(24 * time.Hour)
202-
defer ticker.Stop()
205+
renewTicker := time.NewTicker(defaultRenewInterval)
206+
dnsTicker := time.NewTicker(defaultDNSSyncInterval)
207+
defer renewTicker.Stop()
208+
defer dnsTicker.Stop()
203209

204210
for {
205211
select {
206212
case <-ctx.Done():
207213
return
208214
case <-m.stopCh:
209215
return
210-
case <-ticker.C:
216+
case <-dnsTicker.C:
217+
syncCtx, cancel := context.WithTimeout(ctx, defaultSyncTimeout)
218+
err := m.syncDNS(syncCtx)
219+
cancel()
220+
if err != nil {
221+
log.Warn().Err(err).Str("base_domain", m.cfg.BaseDomain).Msg("sync dns records")
222+
}
223+
case <-renewTicker.C:
211224
if !m.shouldRenew() {
212225
continue
213226
}
214-
renewCtx, cancel := context.WithTimeout(ctx, 2*time.Minute)
215-
_ = m.provision(renewCtx)
227+
renewCtx, cancel := context.WithTimeout(ctx, defaultSyncTimeout)
228+
err := m.provision(renewCtx)
216229
cancel()
230+
if err != nil {
231+
log.Warn().Err(err).Str("base_domain", m.cfg.BaseDomain).Msg("renew acme certificate")
232+
}
217233
}
218234
}
219235
}
220236

237+
func (m *Manager) syncDNS(ctx context.Context) error {
238+
if m == nil || isLocalhost(m.cfg.BaseDomain) || m.cfg.CloudflareToken == "" {
239+
return nil
240+
}
241+
return EnsureDNSRecords(ctx, m.cfg.BaseDomain, m.cfg.CloudflareToken)
242+
}
243+
221244
func (m *Manager) shouldRenew() bool {
222245
m.mu.RLock()
223246
defer m.mu.RUnlock()

0 commit comments

Comments
 (0)