Commit 8ffb597
cmd/root.go
@@ -1,6 +1,8 @@
package cmd
import (
+ "errors"
+ "fmt"
"os"
"github.com/bryfry/cfdns/internal/cf"
@@ -8,42 +10,66 @@ import (
"github.com/spf13/cobra"
)
-var rootCmd = &cobra.Command{
- Use: "cfdns",
- Short: "update cloudflare dns",
- RunE: func(cmd *cobra.Command, args []string) error {
-
- ipDetails, err := iplookup.Discover()
- if err != nil {
- return err
- }
-
- zoneName := ""
- subdomainName := ""
- apiToken := ""
-
- cfdns, err := cf.New(
- zoneName,
- subdomainName,
- apiToken)
- if err != nil {
- return err
- }
- err = cfdns.SetIP(ipDetails.Address)
- if err != nil {
- return err
- }
- return nil
- },
+const (
+ _cfdnsEnvZoneName = "CFDNS_ZONE_NAME"
+ _cfdnsEnvSubdomainName = "CFDNS_SUBDOMAIN_NAME"
+ _cfdnsEnvAPIToken = "CFDNS_API_TOKEN"
+)
+
+var (
+ _envErrFmt = "required env variable %s not found or empty"
+ ErrZoneNameRequired = errors.New(fmt.Sprintf(_envErrFmt, _cfdnsEnvZoneName))
+ ErrSubdomainNameRequired = errors.New(fmt.Sprintf(_envErrFmt, _cfdnsEnvSubdomainName))
+ ErrAPITokenRequired = errors.New(fmt.Sprintf(_envErrFmt, _cfdnsEnvAPIToken))
+)
+
+func RootCmd() *cobra.Command {
+ root := &cobra.Command{
+ Use: "cfdns",
+ Short: "update cloudflare dns",
+ Version: "0.0.1",
+ Args: cobra.NoArgs,
+ SilenceUsage: true,
+ RunE: rootE,
+ }
+ return root
}
-func Execute() {
- err := rootCmd.Execute()
+func rootE(cmd *cobra.Command, args []string) error {
+
+ zoneName, zoneNameExists := os.LookupEnv(_cfdnsEnvZoneName)
+ if !zoneNameExists || len(zoneName) == 0 {
+ return ErrZoneNameRequired
+ }
+ subdomainName, subdomainNameExists := os.LookupEnv(_cfdnsEnvSubdomainName)
+ if !subdomainNameExists || len(subdomainName) == 0 {
+ return ErrSubdomainNameRequired
+ }
+ apiToken, apiTokenExists := os.LookupEnv(_cfdnsEnvAPIToken)
+ if !apiTokenExists || len(apiToken) == 0 {
+ return ErrAPITokenRequired
+ }
+
+ ipDetails, err := iplookup.Discover()
if err != nil {
- os.Exit(1)
+ return err
+ }
+ fmt.Printf("External IP: %s\n", ipDetails.Address)
+ fmt.Printf("DNS Record Name: %s\n", subdomainName)
+
+ cfdns, err := cf.New(
+ zoneName,
+ subdomainName,
+ apiToken)
+ if err != nil {
+ return err
}
-}
-func init() {
- rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
+ fmt.Printf("Current DNS Record IP: %s\n", cfdns.IP())
+ err = cfdns.SetIP(ipDetails.Address)
+ if err != nil {
+ return err
+ }
+ fmt.Printf("Updated DNS Record IP: %s\n", cfdns.IP())
+ return nil
}
internal/cf/main.go
@@ -70,6 +70,19 @@ func New(
return cf, nil
}
+func (cf *CF) IP() string {
+ if cf.zone == nil {
+ return "unknown: lookup failed, no zone"
+ }
+ if cf.record == nil || cf.record.Name == "" {
+ return "unknown: lookup failed, no record"
+ }
+ if !cf.recordExists {
+ return "unset"
+ }
+ return cf.record.Content
+}
+
func (cf *CF) SetIP(ip string) error {
if cf.zone == nil {
@@ -95,6 +108,7 @@ func (cf *CF) SetIP(ip string) error {
err)
}
cf.record = &record
+ cf.recordExists = true
return nil
}
@@ -114,5 +128,5 @@ func (cf *CF) SetIP(ip string) error {
err)
}
cf.record = &record
- return err
+ return nil
}
main.go
@@ -1,10 +1,14 @@
-/*
-Copyright © 2024 NAME HERE <EMAIL ADDRESS>
-*/
package main
-import "github.com/bryfry/cfdns/cmd"
+import (
+ "os"
+
+ "github.com/bryfry/cfdns/cmd"
+)
func main() {
- cmd.Execute()
+ err := cmd.RootCmd().Execute()
+ if err != nil {
+ os.Exit(1)
+ }
}