4 Commits

Author SHA1 Message Date
d1d4c5f062 style: logger formatting
All checks were successful
CI / test (pull_request) Successful in 39s
2024-12-27 19:49:52 +01:00
cc01b5bb96 feat: further instrument main file with logging 2024-12-27 19:49:35 +01:00
39c6664a78 feat: introduce logger into realDynDns main loop 2024-12-27 19:49:03 +01:00
75e527737c feat: introduce logger to config
All checks were successful
CI / test (pull_request) Successful in 37s
2024-12-27 17:09:57 +01:00
4 changed files with 42 additions and 87 deletions

View File

@@ -1,23 +0,0 @@
name: CodeQL Analysis
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
codeql-analysis:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
languages: "go"
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3

View File

@@ -38,7 +38,6 @@ domains:
- www - www
check_interval: 0 0 0/6 * * * * check_interval: 0 0 0/6 * * * *
mode: Scheduled mode: Scheduled
log_level: info
``` ```
The config file is expected to be in the same directory as the binary and called `config.yaml`. For the OCR image, the root directory is `/app`. The config file is expected to be in the same directory as the binary and called `config.yaml`. For the OCR image, the root directory is `/app`.

View File

@@ -21,4 +21,3 @@ domains:
- www - www
check_interval: 0 0 0/6 * * * * check_interval: 0 0 0/6 * * * *
mode: Scheduled mode: Scheduled
log_level: info

View File

@@ -3,7 +3,6 @@ package realDynDns
import ( import (
"fmt" "fmt"
"log/slog" "log/slog"
"sync"
"time" "time"
"realdnydns/pkg/config" "realdnydns/pkg/config"
@@ -71,82 +70,63 @@ func (c *ChangeDetector) detectAndApplyChanges() (int, error) {
return 0, err return 0, err
} }
var wg sync.WaitGroup var numberUpdated int
numberUpdatedChannel := make(chan int)
for _, domain := range c.domains { for _, domain := range c.domains {
for _, subdomain := range domain.Subdomains { for _, subdomain := range domain.Subdomains {
wg.Add(1) c.logger.Info("Checking record",
slog.String("tld", domain.TLD),
go func(domain config.DomainConfig, subdomain string) { slog.String("subdomain", subdomain),
defer wg.Done() )
currentRecord, err := c.dnsProvider.GetRecord(domain.TLD, subdomain)
c.logger.Info("Checking record", if err != nil {
c.logger.Error("Failed to retrieve record",
slog.String("error", err.Error()),
slog.String("tld", domain.TLD), slog.String("tld", domain.TLD),
slog.String("subdomain", subdomain), slog.String("subdomain", subdomain),
) )
currentRecord, err := c.dnsProvider.GetRecord(domain.TLD, subdomain) return numberUpdated, err
}
if currentRecord.IP != externalIp.String() {
c.logger.Info("Record has changed",
slog.String("tld", domain.TLD),
slog.String("subdomain", subdomain),
slog.String("current_ip", currentRecord.IP),
slog.String("external_ip", externalIp.String()),
)
err = c.notificationProvider.SendNotification(
fmt.Sprintf("Update %s.%s", subdomain, domain.TLD),
fmt.Sprintf("The IP of %s has changed from %s to %s", domain.TLD, currentRecord.IP, externalIp.String()),
)
if err != nil { if err != nil {
c.logger.Error("Failed to retrieve record", c.logger.Warn("Failed to send notification",
slog.String("error", err.Error()),
)
return numberUpdated, err
}
c.logger.Info("Updating record",
slog.String("tld", domain.TLD),
slog.String("subdomain", subdomain),
slog.String("current_ip", currentRecord.IP),
slog.String("external_ip", externalIp.String()),
)
_, err = c.dnsProvider.UpdateRecord(domain.TLD, subdomain, externalIp, currentRecord.TTL, currentRecord.Prio, currentRecord.Disabled)
if err != nil {
c.logger.Error("Failed to update record",
slog.String("error", err.Error()), slog.String("error", err.Error()),
slog.String("tld", domain.TLD), slog.String("tld", domain.TLD),
slog.String("subdomain", subdomain), slog.String("subdomain", subdomain),
) )
return return numberUpdated, err
} }
numberUpdated++
if currentRecord.IP != externalIp.String() { }
c.logger.Info("Record has changed",
slog.String("tld", domain.TLD),
slog.String("subdomain", subdomain),
slog.String("current_ip", currentRecord.IP),
slog.String("external_ip", externalIp.String()),
)
err = c.notificationProvider.SendNotification(
fmt.Sprintf("Update %s.%s", subdomain, domain.TLD),
fmt.Sprintf("The IP of %s has changed from %s to %s", domain.TLD, currentRecord.IP, externalIp.String()),
)
if err != nil {
c.logger.Warn("Failed to send notification",
slog.String("error", err.Error()),
)
return
}
c.logger.Info("Updating record",
slog.String("tld", domain.TLD),
slog.String("subdomain", subdomain),
slog.String("current_ip", currentRecord.IP),
slog.String("external_ip", externalIp.String()),
)
_, err = c.dnsProvider.UpdateRecord(domain.TLD, subdomain, externalIp, currentRecord.TTL, currentRecord.Prio, currentRecord.Disabled)
if err != nil {
c.logger.Error("Failed to update record",
slog.String("error", err.Error()),
slog.String("tld", domain.TLD),
slog.String("subdomain", subdomain),
)
return
}
numberUpdatedChannel <- 1
}
}(domain, subdomain)
} }
} }
go func() {
wg.Wait()
close(numberUpdatedChannel)
}()
numberUpdated := 0
for v := range numberUpdatedChannel {
numberUpdated += v
}
c.logger.Info("Run completed", slog.Int("number_of_changes", numberUpdated)) c.logger.Info("Run completed", slog.Int("number_of_changes", numberUpdated))
return numberUpdated, nil return numberUpdated, nil
} }