diff --git a/cli/Dockerfile b/cli/Dockerfile index 838f5440..49609b51 100644 --- a/cli/Dockerfile +++ b/cli/Dockerfile @@ -5,4 +5,4 @@ WORKDIR /app RUN go build -o infra_cli . RUN adduser -S -D -H -h /app appuser USER appuser -CMD ["./main"] +CMD ["./infra_cli", "-h"] diff --git a/cli/infra_cli b/cli/infra_cli new file mode 100755 index 00000000..e202dde0 Binary files /dev/null and b/cli/infra_cli differ diff --git a/cli/main.go b/cli/main.go index c8f3224d..1e9580b5 100644 --- a/cli/main.go +++ b/cli/main.go @@ -180,6 +180,11 @@ func run() error { glog.Infof("IPs of dyndns and current ip match, nothing to do: current=%s, dyndns=%s", currIP, newIP) return nil } + // Send notification as glue records can't be modified programatically for godaddy :/ + err = notifyForIPChange(currIP, newIP) + if err != nil { + return errors.Wrapf(err, "failed to notify for ip change. this must succeed otherwise the glue records won't be updated") + } // setup git repo gitFs, err := NewGitFS(repository) if err != nil { diff --git a/cli/update_viktorbarzin_me.go b/cli/update_viktorbarzin_me.go index f6df4860..0bf4fff0 100644 --- a/cli/update_viktorbarzin_me.go +++ b/cli/update_viktorbarzin_me.go @@ -1,12 +1,15 @@ package main import ( + "bytes" "fmt" "io/ioutil" "net" + "net/http" "os" "strings" + "github.com/golang/glog" "github.com/pkg/errors" ) @@ -73,3 +76,30 @@ func getNewContent(gitFs *GitFS, currIp, newIp net.IP) (string, error) { } return strings.Join(newLines, "\n"), nil } + +func notifyForIPChange(oldIP, newIP net.IP) error { + // Notify if dyndns ip is different to public + // Currently send a message to Viktor via the webhook handler + const url = "https://webhook.viktorbarzin.me/fb/message-viktor" + body := []byte(fmt.Sprintf("Public IP (%s) is different than dynamic dns IP (%s)", oldIP.String(), newIP.String())) + + // Send the HTTP request + resp, err := http.Post(url, "application/json", bytes.NewBuffer(body)) + if err != nil { + return errors.Wrapf(err, "Error sending request") + } + defer resp.Body.Close() + + // Check the response status code + if resp.StatusCode != http.StatusOK { + return fmt.Errorf("Request failed. Status code: %d", resp.StatusCode) + } + + // Read the response body + responseBody, err := ioutil.ReadAll(resp.Body) + if err != nil { + return errors.Wrapf(err, "Error reading response") + } + glog.Infof("Response:", string(responseBody)) + return nil +} diff --git a/modules/kubernetes/infra-maintenance/main.tf b/modules/kubernetes/infra-maintenance/main.tf new file mode 100644 index 00000000..fb708ba3 --- /dev/null +++ b/modules/kubernetes/infra-maintenance/main.tf @@ -0,0 +1,42 @@ +# Module to run some infra-specific things like updating the public ip + + +resource "kubernetes_cron_job_v1" "update-public-ip" { + metadata { + name = "update-public-ip" + namespace = "default" + } + spec { + schedule = "* * * * *" + concurrency_policy = "Forbid" + job_template { + metadata { + name = "update-public-ip" + } + spec { + template { + metadata { + name = "update-public-ip" + } + spec { + priority_class_name = "system-cluster-critical" + container { + name = "update-public-ip" + image = "viktorbarzin/infra" + command = ["./infra_cli"] + args = ["-use-case", "update-public-ip"] + } + restart_policy = "Never" + # service_account_name = "descheduler-sa" + # volume { + # name = "policy-volume" + # config_map { + # name = "policy-configmap" + # } + # } + } + } + } + } + } +} diff --git a/modules/kubernetes/main.tf b/modules/kubernetes/main.tf index be29c4c7..cbb0878a 100644 --- a/modules/kubernetes/main.tf +++ b/modules/kubernetes/main.tf @@ -280,6 +280,9 @@ module "excalidraw" { tls_secret_name = var.tls_secret_name } +module "infra-maintenance" { + source = "./infra-maintenance" +} # module "metrics_api" { # source = "./metrics_api"