From 5a262c1edaf68766e1b37695c5cce161addf99df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rcio=20Fernandes?= Date: Sun, 5 Oct 2025 00:25:00 +0000 Subject: [PATCH] first commit :) --- .devcontainer/.zshrc | 109 ++++++++++++++++++++++ .devcontainer/devcontainer.json | 37 ++++++++ .devcontainer/scripts/postCreate.sh | 5 + .gitea/workflows/docker-image-deploy.yaml | 27 ++++++ .gitignore | 1 + DockerFile | 12 +++ README.md | 24 ++++- src/update-ip.sh | 52 +++++++++++ 8 files changed, 266 insertions(+), 1 deletion(-) create mode 100644 .devcontainer/.zshrc create mode 100644 .devcontainer/devcontainer.json create mode 100644 .devcontainer/scripts/postCreate.sh create mode 100644 .gitea/workflows/docker-image-deploy.yaml create mode 100644 .gitignore create mode 100644 DockerFile create mode 100755 src/update-ip.sh diff --git a/.devcontainer/.zshrc b/.devcontainer/.zshrc new file mode 100644 index 0000000..f267201 --- /dev/null +++ b/.devcontainer/.zshrc @@ -0,0 +1,109 @@ +# If you come from bash you might have to change your $PATH. +# export PATH=$HOME/bin:$HOME/.local/bin:/usr/local/bin:$PATH + +# Path to your Oh My Zsh installation. +export ZSH="$HOME/.oh-my-zsh" + +# Set name of the theme to load --- if set to "random", it will +# load a random theme each time Oh My Zsh is loaded, in which case, +# to know which specific one was loaded, run: echo $RANDOM_THEME +# See https://github.com/ohmyzsh/ohmyzsh/wiki/Themes +ZSH_THEME="gnzh" + +# Set list of themes to pick from when loading at random +# Setting this variable when ZSH_THEME="devcontainers" +# a theme from this variable instead of looking in $ZSH/themes/ +# If set to an empty array, this variable will have no effect. +# ZSH_THEME_RANDOM_CANDIDATES=( "robbyrussell" "agnoster" ) + +# Uncomment the following line to use case-sensitive completion. +# CASE_SENSITIVE="true" + +# Uncomment the following line to use hyphen-insensitive completion. +# Case-sensitive completion must be off. _ and - will be interchangeable. +# HYPHEN_INSENSITIVE="true" + +# Uncomment one of the following lines to change the auto-update behavior +# zstyle ':omz:update' mode disabled # disable automatic updates +# zstyle ':omz:update' mode auto # update automatically without asking +# zstyle ':omz:update' mode reminder # just remind me to update when it's time + +# Uncomment the following line to change how often to auto-update (in days). +# zstyle ':omz:update' frequency 13 + +# Uncomment the following line if pasting URLs and other text is messed up. +# DISABLE_MAGIC_FUNCTIONS="true" + +# Uncomment the following line to disable colors in ls. +# DISABLE_LS_COLORS="true" + +# Uncomment the following line to disable auto-setting terminal title. +# DISABLE_AUTO_TITLE="true" + +# Uncomment the following line to enable command auto-correction. +# ENABLE_CORRECTION="true" + +# Uncomment the following line to display red dots whilst waiting for completion. +# You can also set it to another string to have that shown instead of the default red dots. +# e.g. COMPLETION_WAITING_DOTS="%F{yellow}waiting...%f" +# Caution: this setting can cause issues with multiline prompts in zsh < 5.7.1 (see #5765) +# COMPLETION_WAITING_DOTS="true" + +# Uncomment the following line if you want to disable marking untracked files +# under VCS as dirty. This makes repository status check for large repositories +# much, much faster. +# DISABLE_UNTRACKED_FILES_DIRTY="true" + +# Uncomment the following line if you want to change the command execution time +# stamp shown in the history command output. +# You can set one of the optional three formats: +# "mm/dd/yyyy"|"dd.mm.yyyy"|"yyyy-mm-dd" +# or set a custom format using the strftime function format specifications, +# see 'man strftime' for details. +# HIST_STAMPS="mm/dd/yyyy" + +# Would you like to use another custom folder than $ZSH/custom? +# ZSH_CUSTOM=/path/to/new-custom-folder + +# Which plugins would you like to load? +# Standard plugins can be found in $ZSH/plugins/ +# Custom plugins may be added to $ZSH_CUSTOM/plugins/ +# Example format: plugins=(rails git textmate ruby lighthouse) +# Add wisely, as too many plugins slow down shell startup. +plugins=(git timer web-search ssh kubectl helm colorize zsh-autosuggestions rclone ansible) +ZSH_COLORIZE_TOOL=chroma + +source $ZSH/oh-my-zsh.sh + +# User configuration + +# export MANPATH="/usr/local/man:$MANPATH" + +# You may need to manually set your language environment +# export LANG=en_US.UTF-8 + +# Preferred editor for local and remote sessions +# if [[ -n $SSH_CONNECTION ]]; then +# export EDITOR='vim' +# else +# export EDITOR='nvim' +# fi + +# Compilation flags +# export ARCHFLAGS="-arch $(uname -m)" + +# Set personal aliases, overriding those provided by Oh My Zsh libs, +# plugins, and themes. Aliases can be placed here, though Oh My Zsh +# users are encouraged to define aliases within a top-level file in +# the $ZSH_CUSTOM folder, with .zsh extension. Examples: +# - $ZSH_CUSTOM/aliases.zsh +# - $ZSH_CUSTOM/macos.zsh +# For a full list of active aliases, run `alias`. +# +# Example aliases +# alias zshconfig="mate ~/.zshrc" +# alias ohmyzsh="mate ~/.oh-my-zsh" +DISABLE_AUTO_UPDATE=true +DISABLE_UPDATE_PROMPT=true + +export PATH=$PATH:/home/vscode/lib \ No newline at end of file diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..1afceb4 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,37 @@ +// For format details, see https://aka.ms/devcontainer.json. For config options, see the +// README at: https://github.com/devcontainers/templates/tree/main/src/ubuntu +{ + "name": "cloudflare-updateip-dev", + // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile + "image": "mcr.microsoft.com/devcontainers/base:jammy", + "features": { + "ghcr.io/devcontainers/features/docker-outside-of-docker": {}, + }, + // "features": {}, + + // Use 'forwardPorts' to make a list of ports inside the container available locally. + // "forwardPorts": [], + // Configure tool-specific properties. + // "customizations": {}, + + "mounts": [ + "source=${localWorkspaceFolder}/.devcontainer/.zshrc,target=/home/vscode/.zshrc,type=bind", + "source=${localEnv:HOME}/.gitconfig,target=/home/vscode/.gitconfig,type=bind,consistency=cached", + "source=${localEnv:HOME}/.ssh,target=/home/vscode/.ssh,type=bind,consistency=cached" + ], + "postCreateCommand": "bash .devcontainer/scripts/postCreate.sh", + "customizations": { + "vscode": { + "extensions": [ + "stateful.runme", + "yzhang.markdown-all-in-one", + "davidanson.vscode-markdownlint", + "eamodio.gitlens", + "m4ns0ur.base64" + ], + "settings": { + "terminal.integrated.defaultProfile.linux": "zsh" + } + } + } +} diff --git a/.devcontainer/scripts/postCreate.sh b/.devcontainer/scripts/postCreate.sh new file mode 100644 index 0000000..52bd296 --- /dev/null +++ b/.devcontainer/scripts/postCreate.sh @@ -0,0 +1,5 @@ +#setup chroma for zsh colorize +#chmod +x /home/vscode/lib/chroma + + + diff --git a/.gitea/workflows/docker-image-deploy.yaml b/.gitea/workflows/docker-image-deploy.yaml new file mode 100644 index 0000000..95fd5cb --- /dev/null +++ b/.gitea/workflows/docker-image-deploy.yaml @@ -0,0 +1,27 @@ +on: + push +jobs: + + build-docker-image: + runs-on: ubuntu-latest + + steps: + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Log in to git.limbosolutions.com docker registry + uses: docker/login-action@v3 + with: + registry: git.limbosolutions.com + username: ${{ secrets.GITLIMBO_DOCKER_REGISTRY_USERNAME }} + password: ${{ secrets.GITLIMBO_DOCKER_REGISTRY_PASSWORD }} + + - name: Build and push Docker images + id: push + uses: docker/build-push-action@v6 + with: + context: ${{gitea.workspace}} + file: ${{gitea.workspace}}/Dockerfile + push: true + tags: git.limbosolutions.com/mylimbo/cloudflare-update-dns:latest \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2eea525 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.env \ No newline at end of file diff --git a/DockerFile b/DockerFile new file mode 100644 index 0000000..850aa11 --- /dev/null +++ b/DockerFile @@ -0,0 +1,12 @@ +# Start from Alpine base image +FROM alpine:latest + +# Install bash and curl +RUN apk update && apk add --no-cache curl bash +COPY src /app/scripts +RUN chmod +x /app/scripts -R + +ENV LOOP=60 + +# Set bash as the default shell +CMD ["/bin/sh","-c", "/app/scripts/update-ip.sh"] \ No newline at end of file diff --git a/README.md b/README.md index dee8372..6a8ab3e 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,24 @@ -# cloudflare-updatedns +# cloudflare-updateip +## run + +``` bash +# requires .env file check script for required variables +docker run --name mylimbo-cloudflare-updatedns --env-file ./.env git.limbosolutions.com/mylimbo/cloudflare-updatedns:latest +``` + +## execute direcly without docker + +```bash +# requires .env file check script for required variables +set -a +source .env +set +a +bash -c ./src/update-ip.sh +``` + +## build local image + +``` bash +docker build -f DockerFile -t git.limbosolutions.com/mylimbo/cloudflare-updatedns:latest . +``` diff --git a/src/update-ip.sh b/src/update-ip.sh new file mode 100755 index 0000000..ba1c218 --- /dev/null +++ b/src/update-ip.sh @@ -0,0 +1,52 @@ +#!/bin/bash + +# environments variables: +# CLOUDFLARE_API_TOKEN=CLoudflare api token +# CLOUDFLARE_ZONE_ID=cloudflare zone id +# CLOUDFLARE_RECORD_ID=cloudflare zone id +# SLEEP=60s + +# script source: https://medium.com/@adrian.punga_29809/dynamic-dns-with-cloudflare-761c1efcd84 + +LAST_IP="" +MY_IP="" + + +: "${CLOUDFLARE_API_TOKEN:?Environment variable CLOUDFLARE_API_TOKEN is not set}" +: "${CLOUDFLARE_ZONE_ID:?Environment variable CLOUDFLARE_ZONE_ID is not set}" +: "${CLOUDFLARE_RECORD_ID:?Environment variable CLOUDFLARE_RECORD_ID is not set}" + +updateCloudFlare() { + #echo "curl -X PATCH \"https://api.cloudflare.com/client/v4/zones/${CLOUDFLARE_ZONE_ID}/dns_records/${CLOUDFLARE_RECORD_ID}\"" + #echo "--data \"{\"content\":\"${MY_IP}\"}\"" + #echo "Authorization: Bearer ${CLOUDFLARE_API_TOKEN}" + #--silent + curl --silent -X PATCH "https://api.cloudflare.com/client/v4/zones/${CLOUDFLARE_ZONE_ID}/dns_records/${CLOUDFLARE_RECORD_ID}" \ + -H "Authorization: Bearer ${CLOUDFLARE_API_TOKEN}" \ + -H "Content-Type: application/json" \ + --data "{\"content\":\"${MY_IP}\"}" ; echo #to end the line on output + } + + +checkIp() { + MY_IP="$(curl --silent ifconfig.me)" + if [ "${MY_IP}" != "${LAST_IP}" ]; then + echo "info: Public IP changed. From ${LAST_IP} to ${MY_IP}". + updateCloudFlare + LAST_IP=${MY_IP} + else + echo "info: Public IP ${LAST_IP} remained the same." + fi +} + + +if [ -n "${SLEEP}" ]; then + while : + do + checkIp + sleep ${SLEEP} + done + +else + checkIp +fi