2024-11-06 00:09:54 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"encoding/csv"
|
2024-11-06 04:34:16 +00:00
|
|
|
"flag"
|
2024-11-06 00:09:54 +00:00
|
|
|
"fmt"
|
|
|
|
"io"
|
|
|
|
"log"
|
|
|
|
"sort"
|
|
|
|
"strconv"
|
|
|
|
"time"
|
|
|
|
|
2024-11-06 04:34:16 +00:00
|
|
|
"code.stevenpolley.net/steven/cfcleaner/cf"
|
|
|
|
)
|
2024-11-06 00:09:54 +00:00
|
|
|
|
2024-11-06 04:34:16 +00:00
|
|
|
func init() {
|
2024-11-06 00:09:54 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2024-11-06 04:34:16 +00:00
|
|
|
func main() {
|
2024-11-06 00:09:54 +00:00
|
|
|
|
2024-11-06 04:34:16 +00:00
|
|
|
cfAPIKey := flag.String("cfapikey", "", "in cf, my profile -> API Tokens -> Create Token")
|
|
|
|
flag.Parse()
|
2024-11-06 00:09:54 +00:00
|
|
|
|
2024-11-06 04:34:16 +00:00
|
|
|
if *cfAPIKey == "" {
|
|
|
|
fmt.Println("you must specify an API key with the -cfapikey=<key> parameter")
|
|
|
|
return
|
|
|
|
}
|
2024-11-06 00:09:54 +00:00
|
|
|
|
2024-11-06 04:34:16 +00:00
|
|
|
cfClient := cf.NewClient(*cfAPIKey)
|
2024-11-06 00:09:54 +00:00
|
|
|
|
2024-11-06 04:34:16 +00:00
|
|
|
zones, err := cfClient.GetZones()
|
2024-11-06 00:09:54 +00:00
|
|
|
if err != nil {
|
|
|
|
log.Fatalf("failed to get zones: %v", err)
|
|
|
|
}
|
|
|
|
|
2024-11-06 04:34:16 +00:00
|
|
|
outRows := make([]cf.Record, 0)
|
2024-11-06 00:09:54 +00:00
|
|
|
|
|
|
|
for _, zone := range zones {
|
|
|
|
log.Printf("processing zone '%s' with ID '%s'", zone.Name, zone.ID)
|
|
|
|
|
2024-11-06 04:34:16 +00:00
|
|
|
records, err := cfClient.GetRecords(zone)
|
2024-11-06 00:09:54 +00:00
|
|
|
if err != nil {
|
|
|
|
log.Printf("failed to get records for zone '%s' with ID '%s': %v", zone.Name, zone.ID, err)
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, record := range records {
|
2024-11-06 04:34:16 +00:00
|
|
|
analytic, err := cfClient.GetRecordAnalytic(record)
|
2024-11-06 00:09:54 +00:00
|
|
|
if err != nil {
|
|
|
|
log.Printf("failed to get record report for record '%s' in zone '%s' with ID '%s': %v", record.Name, zone.Name, zone.ID, err)
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
record.NumberQueries = analytic.Result.Totals.QueryCount
|
|
|
|
outRows = append(outRows, record)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
sort.Slice(outRows, func(i, j int) bool {
|
|
|
|
return outRows[i].NumberQueries < outRows[j].NumberQueries
|
|
|
|
})
|
|
|
|
|
|
|
|
buf := bytes.NewBuffer(nil)
|
|
|
|
writer := csv.NewWriter(buf)
|
|
|
|
writer.Write([]string{"Name", "Type", "NumberQueries", "CreatedOn", "ModifiedOn", "Comment", "Content"})
|
|
|
|
|
|
|
|
for _, row := range outRows {
|
|
|
|
writer.Write([]string{row.Name, row.Type, strconv.Itoa(row.NumberQueries), row.CreatedOn.Format(time.RFC3339), row.ModifiedOn.Format(time.RFC3339), row.Comment, row.Content})
|
|
|
|
}
|
|
|
|
writer.Flush()
|
|
|
|
|
|
|
|
b, err := io.ReadAll(buf)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatalf("failed to read bytes from output buffer: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
fmt.Println(string(b))
|
|
|
|
|
|
|
|
}
|