diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 811883a..4a1afef 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,3 +1,3 @@ # These are supported funding model platforms -custom: [https://pay.cloudtips.ru/p/937f48ac, https://boosty.to/evilfreelancer] +custom: [https://pay.cloudtips.ru/p/937f48ac, https://boosty.to/evilfreelancer] \ No newline at end of file diff --git a/.github/workflows/build-and-push.yml b/.github/workflows/build-and-push.yml new file mode 100644 index 0000000..3e51da4 --- /dev/null +++ b/.github/workflows/build-and-push.yml @@ -0,0 +1,69 @@ +name: Check for new RouterOS versions, build and push containers + +on: + workflow_dispatch: + schedule: + - cron: '0 0 * * *' # Every day at midnight + +jobs: + check-and-build: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v5 + + - name: Install dependencies + run: sudo apt-get install -y curl jq + + - name: Get latest RouterOS version + id: get_routeros_version + run: | + VERSION=$( + curl https://mikrotik.com/download/archive -o - 2>/dev/null | \ + grep -o '> $GITHUB_OUTPUT + + - name: Get Docker Hub tags + id: docker_hub_tags + run: | + OWNER="evilfreelancer" + REPO="docker-routeros" + URL="https://registry.hub.docker.com/v2/repositories/${OWNER}/${REPO}/tags/" + TAGS=$(curl -s "$URL" | jq -r '.results[].name' | grep -v "latest") + echo "tags=$(echo $TAGS | tr '\n' ' ')" >> $GITHUB_OUTPUT + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build and test if new version + if: ${{ !contains(steps.docker_hub_tags.outputs.tags, steps.get_routeros_version.outputs.version) }} + run: | + VERSION="${{ steps.get_routeros_version.outputs.version }}" + OWNER="evilfreelancer" + REPO="docker-routeros" + + # Set up Docker Buildx + docker buildx create --use --name routeros_builder + + # Build and push images + docker buildx build --push \ + --platform linux/amd64,linux/arm64 \ + --tag $OWNER/$REPO:$VERSION \ + --tag $OWNER/$REPO:latest \ + --build-arg ROUTEROS_VERSION=$VERSION . + + - name: Skip build + if: ${{ contains(steps.docker_hub_tags.outputs.tags, steps.get_routeros_version.outputs.version) }} + run: echo "Version ${{ steps.get_routeros_version.outputs.version }} already exists. Skipping build." diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml deleted file mode 100644 index b2ef7d0..0000000 --- a/.github/workflows/cd.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: "Build docker image and push to DockerHub when a tag is pushed" - -on: - workflow_dispatch: - push: - tags: - - '*' - -jobs: - build: - name: "Build images" - runs-on: "ubuntu-latest" - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - name: Docker metadata from Git - id: meta - uses: docker/metadata-action@v5 - with: - images: evilfreelancer/docker-routeros - - name: Login to DockerHub - if: ${{ !env.ACT }} - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Build with Docker - uses: docker/build-push-action@v6 - with: - context: . - push: ${{ !env.ACT }} - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 8ad2c72..0000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,46 +0,0 @@ -name: "Continuous Integration Tests" - -on: - push: - pull_request: - workflow_dispatch: - workflow_call: - -jobs: - test: - name: "Build & Test images" - runs-on: "ubuntu-latest" - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Download docker-compose when using act - run: | - sudo curl -L "https://github.com/docker/compose/releases/download/v2.29.6/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose - sudo chmod +x /usr/local/bin/docker-compose - - - name: Test with Docker - run: | - # start the container - docker-compose -f docker-compose.dist.yml up --build -d routeros-local - # wait for the container to start - sleep 5 - DOCKERID=$(docker ps --format '{{.ID}}.{{.Names}}.{{.Image}}'|grep evilfreelancer/docker-routeros|cut -f 1 -d '.') - echo "Watching $DOCKERID for Mikrotik login..." - while true - do - if docker logs "$DOCKERID" 2>&1|grep 'MikroTik' - then - break - fi - echo "Not found yet, sleeping..." - sleep 5 - done - # display logs - echo "Container logs:" - docker logs "$DOCKERID" - # download resource and check platform is Mikrotik - curl --retry 12 --retry-all-errors -k -u admin: http://127.0.0.1:7777/rest/system/resource | jq .platform |grep -i mikrotik - - - name: Stop container - run: docker-compose -f docker-compose.dist.yml down diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml deleted file mode 100644 index dbb13a9..0000000 --- a/.github/workflows/lint.yml +++ /dev/null @@ -1,14 +0,0 @@ -name: Lint github-action - -on: [ 'pull_request' ] - -jobs: - lint: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Lint - uses: docker://rhysd/actionlint:1.6.26 - with: - args: -color diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml deleted file mode 100644 index 07256ab..0000000 --- a/.github/workflows/pr.yml +++ /dev/null @@ -1,47 +0,0 @@ -name: "Check for update on Mikrotik website and generate a PR if necessary" - -on: - workflow_dispatch: - schedule: - - cron: "0 4 * * *" - -jobs: - routeros: - name: "Build & Test images" - runs-on: "ubuntu-latest" - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - fetch-depth: '1' - - - name: Check new release - id: check_release - run: | - LAST_MIKROTIK_RELEASE=$( curl https://mikrotik.com/download/archive -o - 2>/dev/null | grep -o ' "$GITHUB_OUTPUT" - echo "new=true" >> "$GITHUB_OUTPUT" - else - echo "No new version found" - echo "new=false" >> "$GITHUB_OUTPUT" - fi - - - name: Edit Dockerfile - if: ${{ steps.check_release.outputs.new == 'true' }} - run: | - sed -r "s/(ROUTEROS_VERSION=\")(.*)(\")/\1${{ steps.check_release.outputs.release }}\3/g" -i Dockerfile - git diff - - - name: Create Pull Request - if: ${{ steps.check_release.outputs.new == 'true' && !env.ACT }} - uses: peter-evans/create-pull-request@v7 - with: - commit-message: "Update RouterOS version to ${{ steps.check_release.outputs.release }}" - committer: "GitHub Actions" - body: 'Created by Github action' - title: 'Update RouterOS version to ${{ steps.check_release.outputs.release }}' - branch: update-routeros diff --git a/.github/workflows/tag.yml b/.github/workflows/tag.yml deleted file mode 100644 index 6cfad76..0000000 --- a/.github/workflows/tag.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: "Tag master with new version of RouterOS when CI pass" - -on: - push: - branches: - - "master" - -permissions: - contents: write - pull-requests: read - -jobs: - call_test: - uses: EvilFreelancer/docker-routeros/.github/workflows/ci.yml@master - - tag: - name: "Add a tag to git" - runs-on: "ubuntu-latest" - needs: call_test - if: always() && needs.call_test.result == 'success' - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - fetch-depth: '0' - - - name: Add new tag on git - id: tag - run: | - NEW_TAG=$(grep 'ROUTEROS_VERSION="' Dockerfile |cut -d '"' -f 2) - git config user.name 'GitHub Actions' - git config user.email 'github-actions@users.noreply.github.com' - git tag "$NEW_TAG" - echo "new_tag=$NEW_TAG" >> "$GITHUB_OUTPUT" - - - name: Push new tag to git - if: ${{ !env.ACT }} - run: git push origin ${{ steps.tag.outputs.new_tag }} diff --git a/.gitignore b/.gitignore index 42efebe..178ed4b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /.idea/ /*.vdi /docker-compose.yml +build.txt \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index ce1330e..fe8f4e5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine:3.21.2 +FROM alpine:3.22.1 # For access via VNC EXPOSE 5900 @@ -9,6 +9,8 @@ EXPOSE 1194 1701 1723 1812/udp 1813/udp 21 22 23 443 4500/udp 50 500/udp 51 2021 # Change work dir (it will also create this folder if is not exist) WORKDIR /routeros +RUN mkdir -p /routeros_source + # Install dependencies RUN set -xe \ && apk add --no-cache --update \ @@ -17,16 +19,17 @@ RUN set -xe \ bridge-utils iptables jq bash python3 # Environments which may be change -ENV ROUTEROS_VERSION="7.17" +ARG ROUTEROS_VERSION +ENV ROUTEROS_VERSION=${ROUTEROS_VERSION} ENV ROUTEROS_IMAGE="chr-${ROUTEROS_VERSION}.vdi" ENV ROUTEROS_PATH="https://cdn.mikrotik.com/routeros/${ROUTEROS_VERSION}/${ROUTEROS_IMAGE}.zip" # Download VDI image from remote site -RUN wget "$ROUTEROS_PATH" -O "/routeros/${ROUTEROS_IMAGE}.zip" && \ - unzip "/routeros/${ROUTEROS_IMAGE}.zip" -d "/routeros" && \ - rm -f "/routeros/${ROUTEROS_IMAGE}.zip" +RUN wget "$ROUTEROS_PATH" -O "/routeros_source/${ROUTEROS_IMAGE}.zip" && \ + unzip "/routeros_source/${ROUTEROS_IMAGE}.zip" -d "/routeros_source" && \ + rm -f "/routeros_source/${ROUTEROS_IMAGE}.zip" # Copy script to routeros folder -ADD ["./scripts", "/routeros"] +ADD ["./scripts", "/routeros_source"] -ENTRYPOINT ["/routeros/entrypoint.sh"] +ENTRYPOINT ["/routeros_source/entrypoint.sh"] diff --git a/scripts/entrypoint.sh b/scripts/entrypoint.sh index 7240d84..8701ef8 100755 --- a/scripts/entrypoint.sh +++ b/scripts/entrypoint.sh @@ -1,5 +1,13 @@ #!/usr/bin/env bash +if [[ ! -e "/routeros/generate-dhcpd-conf.py" ]]; then + + cp -r /routeros_source/. /routeros +fi + + +cd /routeros + QEMU_BRIDGE_ETH1='qemubr1' default_dev1='eth0' @@ -41,13 +49,14 @@ KVM_OPTS="" if [ -e /dev/kvm ]; then if grep -q -e vmx -e svm /proc/cpuinfo; then echo "Enabling KVM" - CPU_FEATURES=",kvm=on" + CPU_FEATURES="host,kvm=on" KVM_OPTS="-machine accel=kvm -enable-kvm" fi fi if [ "$CPU_FEATURES" = "" ]; then echo "KVM not available, running in emulation mode. This will be slow." + CPU_FEATURES="qemu64" fi # And run the VM! A brief explanation of the options here: @@ -62,7 +71,7 @@ exec qemu-system-x86_64 \ -nographic \ -m 512 \ -smp 4,sockets=1,cores=4,threads=1 \ - -cpu host$CPU_FEATURES \ + -cpu $CPU_FEATURES \ $KVM_OPTS \ -nic tap,id=qemu1,mac=54:05:AB:CD:12:31,script=$QEMU_IFUP,downscript=$QEMU_IFDOWN \ "$@" \