Commit 8ffb597

bryfry <bryon@fryer.io>
2024-09-18 16:59:57
read config from env
1 parent f7c61e8
Changed files (3)
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)
+	}
 }