Rework engine to apply changes at the end & add pushover notification
This commit is contained in:
parent
4b1861fa9b
commit
50dcc9d994
6 changed files with 186 additions and 57 deletions
188
main.go
188
main.go
|
|
@ -1,6 +1,7 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"slices"
|
||||
"strings"
|
||||
|
||||
|
|
@ -96,7 +97,16 @@ func main() {
|
|||
log.Fatal(err)
|
||||
}
|
||||
|
||||
log.Info("Starting sync (step 1: create/update)", "dry_run", config.DryRun)
|
||||
// Keep operations in these slices
|
||||
// Sync is only performed after diff calculation is done
|
||||
var recordsToCreate []hetzner.Record
|
||||
var recordsToUpdate []hetzner.Record
|
||||
var recordsToDelete []hetzner.Record
|
||||
|
||||
// PushOver message, will only be sent if PushOver enabled and message not empty
|
||||
var pushoverMessages []string
|
||||
|
||||
log.Info("Calculating sync diff (step 1: create/update)")
|
||||
var keepTheseIds []string
|
||||
for _, zone := range zones {
|
||||
if zone.DefaultTTL <= 0 {
|
||||
|
|
@ -105,7 +115,7 @@ func main() {
|
|||
|
||||
for _, hZone := range hZones {
|
||||
if strings.EqualFold(zone.Domain, hZone.Name) {
|
||||
log.Info("Syncing zone", "step", 1, "name", zone.Domain)
|
||||
log.Info("Calculating sync diff for zone", "name", zone.Domain)
|
||||
|
||||
var alreadyFoundIds []string
|
||||
for _, record := range zone.Records {
|
||||
|
|
@ -162,57 +172,58 @@ func main() {
|
|||
|
||||
if updateNeeded {
|
||||
log.Info(
|
||||
"Updating record",
|
||||
"Marking record for update",
|
||||
"id", id,
|
||||
"name", record.Name,
|
||||
"type", record.Type,
|
||||
"id", id,
|
||||
"value", record.Value,
|
||||
"ttl", record.TTL,
|
||||
)
|
||||
|
||||
if !config.DryRun {
|
||||
newRecord, err := hetzner.UpdateRecord(&hetzner.Record{
|
||||
ID: id,
|
||||
Type: record.Type,
|
||||
Name: record.Name,
|
||||
Value: record.Value,
|
||||
TTL: record.TTL,
|
||||
ZoneID: hZone.ID,
|
||||
})
|
||||
if err != nil {
|
||||
log.Error(err)
|
||||
}
|
||||
|
||||
log.Info(
|
||||
"Record updated",
|
||||
"ID", newRecord.ID,
|
||||
)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
log.Info(
|
||||
"Creating record",
|
||||
"name", record.Name,
|
||||
"type", record.Type,
|
||||
"value", record.Value,
|
||||
"ttl", record.TTL,
|
||||
)
|
||||
|
||||
if !config.DryRun {
|
||||
newRecord, err := hetzner.CreateRecord(&hetzner.Record{
|
||||
recordsToUpdate = append(recordsToUpdate, hetzner.Record{
|
||||
ID: id,
|
||||
Type: record.Type,
|
||||
Name: record.Name,
|
||||
Value: record.Value,
|
||||
TTL: record.TTL,
|
||||
ZoneID: hZone.ID,
|
||||
})
|
||||
if err != nil {
|
||||
log.Error(err)
|
||||
}
|
||||
|
||||
log.Info(
|
||||
"Record created",
|
||||
"ID", newRecord.ID,
|
||||
)
|
||||
pushoverMessages = append(pushoverMessages, fmt.Sprintf(
|
||||
"Action: update\nZone: %s\nRecord: %s\nType: %s\nValue: %s\nTTL: %d",
|
||||
zone.Domain,
|
||||
record.Name,
|
||||
record.Type,
|
||||
record.Value,
|
||||
record.TTL,
|
||||
))
|
||||
}
|
||||
} else {
|
||||
log.Info(
|
||||
"Marking record for creation",
|
||||
"zone_id", hZone.ID,
|
||||
"name", record.Name,
|
||||
"type", record.Type,
|
||||
"value", record.Value,
|
||||
"ttl", record.TTL,
|
||||
)
|
||||
|
||||
recordsToCreate = append(recordsToCreate, hetzner.Record{
|
||||
Type: record.Type,
|
||||
Name: record.Name,
|
||||
Value: record.Value,
|
||||
TTL: record.TTL,
|
||||
ZoneID: hZone.ID,
|
||||
})
|
||||
|
||||
pushoverMessages = append(pushoverMessages, fmt.Sprintf(
|
||||
"Action: create\nZone: %s\nRecord: %s\nType: %s\nValue: %s\nTTL: %d",
|
||||
zone.Domain,
|
||||
record.Name,
|
||||
record.Type,
|
||||
record.Value,
|
||||
record.TTL,
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -221,34 +232,35 @@ func main() {
|
|||
}
|
||||
}
|
||||
|
||||
log.Info("Starting sync (step 2: delete)", "dry_run", config.DryRun)
|
||||
log.Info("Calculating sync diff (step 2: delete)")
|
||||
for _, zone := range zones {
|
||||
for _, hZone := range hZones {
|
||||
if strings.EqualFold(zone.Domain, hZone.Name) {
|
||||
log.Info("Syncing zone", "setp", 2, "name", zone.Domain)
|
||||
log.Info("Calculating sync diff for zone", "name", zone.Domain)
|
||||
|
||||
for _, hRecord := range hZone.Records {
|
||||
if !slices.Contains(keepTheseIds, hRecord.ID) {
|
||||
log.Info(
|
||||
"Deleting record",
|
||||
"Marking record for deletion",
|
||||
"id", hRecord.ID,
|
||||
"name", hRecord.Name,
|
||||
"type", hRecord.Type,
|
||||
"id", hRecord.ID,
|
||||
"value", hRecord.Value,
|
||||
"ttl", hRecord.TTL,
|
||||
)
|
||||
|
||||
if !config.DryRun {
|
||||
hetzner.DeleteRecord(&hetzner.Record{
|
||||
ID: hRecord.ID,
|
||||
})
|
||||
if err != nil {
|
||||
log.Error(err)
|
||||
}
|
||||
recordsToDelete = append(recordsToDelete, hetzner.Record{
|
||||
ID: hRecord.ID,
|
||||
})
|
||||
|
||||
log.Info(
|
||||
"Record deleted",
|
||||
"ID", hRecord.ID,
|
||||
)
|
||||
}
|
||||
pushoverMessages = append(pushoverMessages, fmt.Sprintf(
|
||||
"Action: delete\nZone: %s\nRecord: %s\nType: %s\nValue: %s\nTTL: %d",
|
||||
hZone.Name,
|
||||
hRecord.Name,
|
||||
hRecord.Type,
|
||||
hRecord.Value,
|
||||
hRecord.TTL,
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -257,5 +269,67 @@ func main() {
|
|||
}
|
||||
}
|
||||
|
||||
log.Info("Starting sync (step 1: delete)", "dry_run", config.DryRun)
|
||||
for _, record := range recordsToDelete {
|
||||
if !config.DryRun {
|
||||
hetzner.DeleteRecord(&record)
|
||||
if err != nil {
|
||||
log.Error(err)
|
||||
}
|
||||
|
||||
log.Warn(
|
||||
"Record deleted",
|
||||
"ID", record.ID,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
log.Info("Starting sync (step 2: create)", "dry_run", config.DryRun)
|
||||
for _, record := range recordsToCreate {
|
||||
if !config.DryRun {
|
||||
newRecord, err := hetzner.UpdateRecord(&record)
|
||||
if err != nil {
|
||||
log.Error(err)
|
||||
}
|
||||
|
||||
log.Warn(
|
||||
"Record created",
|
||||
"ID", newRecord.ID,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
log.Info("Starting sync (step 3: update)", "dry_run", config.DryRun)
|
||||
for _, record := range recordsToUpdate {
|
||||
if !config.DryRun {
|
||||
newRecord, err := hetzner.UpdateRecord(&record)
|
||||
if err != nil {
|
||||
log.Error(err)
|
||||
}
|
||||
|
||||
log.Warn(
|
||||
"Record updated",
|
||||
"ID", newRecord.ID,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
log.Info("Sync is finished, all done!")
|
||||
|
||||
if !config.DryRun && config.PushOver.Enable && len(pushoverMessages) > 0 {
|
||||
log.Info("Changes made, sending PushOver notifications")
|
||||
|
||||
for _, message := range pushoverMessages {
|
||||
err = helpers.PushoverSendMessage(helpers.PushoverMessage{
|
||||
Message: message,
|
||||
Title: "Changes made to DNS record",
|
||||
AppKey: config.PushOver.AppKey,
|
||||
UserKey: config.PushOver.UserKey,
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
log.Error(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue