From 3f988f27edae3e216459ab81240355eab516c868 Mon Sep 17 00:00:00 2001 From: zyb Date: Thu, 19 Jun 2025 12:09:51 +0800 Subject: [PATCH] modified: .github/workflows/mikrotik_patch_7.yml deleted: .github/workflows/self_hosted_patch.yml modified: .gitignore --- .github/workflows/mikrotik_patch_7.yml | 351 +++++++-------- .github/workflows/self_hosted_patch.yml | 548 ------------------------ .gitignore | 1 + 3 files changed, 179 insertions(+), 721 deletions(-) delete mode 100644 .github/workflows/self_hosted_patch.yml diff --git a/.github/workflows/mikrotik_patch_7.yml b/.github/workflows/mikrotik_patch_7.yml index fb9c51d..9b690eb 100644 --- a/.github/workflows/mikrotik_patch_7.yml +++ b/.github/workflows/mikrotik_patch_7.yml @@ -23,15 +23,21 @@ on: - stable - testing version: - description: "Version ('', 7.17, 7.17.1, 7.17.2,...)" + description: "Specify version (e.g., 7.17.2), empty for latest" required: false default: '' type: string buildtime: - description: "Build Time" + description: "Custom build time, leave empty for now" required: false default: '' type: string + release: + description: "Release to GitHub & Upload " + required: false + default: 'false' + type: boolean + permissions: contents: write @@ -54,32 +60,50 @@ env: CUSTOM_CLOUD_URL: ${{ secrets.CUSTOM_CLOUD_URL }} jobs: - Set_BuildTime: + + Set_Variables: runs-on: ubuntu-22.04 outputs: - BUILD_TIME: ${{ steps.set_buildtime.outputs.BUILD_TIME }} + BUILD_TIME: ${{ steps.set_vars.outputs.BUILD_TIME }} + RELEASE: ${{ steps.set_vars.outputs.RELEASE }} steps: - - name: Set build time - id: set_buildtime + - name: Set variables + id: set_vars run: | - _BUILD_TIME=${{ github.event.inputs.buildtime }} - if [ -z "$_BUILD_TIME" ]; then - echo "BUILD_TIME=$(date +'%s')" >> $GITHUB_OUTPUT + if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then + BUILD_TIME="${{ github.event.inputs.buildtime }}" + RELEASE="${{ github.event.inputs.release }}" + if [ -z "$BUILD_TIME" ]; then + BUILD_TIME=$(date +'%Y%m%d%H%M%S') + fi + if [ -z "$RELEASE" ]; then + RELEASE=false + fi else - echo "BUILD_TIME=$_BUILD_TIME" >> $GITHUB_OUTPUT + BUILD_TIME=$(date +'%Y%m%d%H%M%S') + RELEASE=true fi + echo "BUILD_TIME=$BUILD_TIME" >> $GITHUB_OUTPUT + echo "RELEASE=$RELEASE" >> $GITHUB_OUTPUT + echo "Build time is $BUILD_TIME" + echo "Release flag is $RELEASE" Patch_RouterOS: - needs: Set_BuildTime + needs: Set_Variables runs-on: ubuntu-22.04 strategy: matrix: - arch: ${{ fromJSON(format('["{0}"]', github.event.inputs.arch || 'x86')) }} - channel: ${{ fromJSON(format('["{0}"]', github.event.inputs.channel || 'stable')) }} + arch: ['x86','arm64'] + channel: ['stable','testing'] + if: > + github.event_name == 'schedule' || + (github.event_name == 'workflow_dispatch' && + matrix.arch == github.event.inputs.arch && + matrix.channel == github.event.inputs.channel) env: TZ: 'Asia/Shanghai' - LATEST_VERSION: "" - ARCH: "" + BUILD_TIME: ${{ needs.Set_Variables.outputs.BUILD_TIME }} + RELEASE: ${{ needs.Set_Variables.outputs.RELEASE }} steps: - name: Checkout repository uses: actions/checkout@v4 @@ -87,14 +111,20 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: '3.11' + python-version: '3.12' - name: Get latest routeros version id: get_latest run: | echo $(uname -a) - LATEST_VERSION=${{ github.event.inputs.version }} - if [ -z "$_LATEST_VERSION" ]; then + echo Build Time:$BUILD_TIME + if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then + if [ -n "${{ github.event.inputs.version }}" ]; then + LATEST_VERSION="${{ github.event.inputs.version }}" + else + LATEST_VERSION=$(wget -nv -O - https://${{ env.MIKRO_UPGRADE_URL }}/routeros/NEWESTa7.${{ matrix.channel }} | cut -d ' ' -f1) + fi + else LATEST_VERSION=$(wget -nv -O - https://${{ env.MIKRO_UPGRADE_URL }}/routeros/NEWESTa7.${{ matrix.channel }} | cut -d ' ' -f1) fi echo Latest Version:$LATEST_VERSION @@ -107,38 +137,24 @@ jobs: fi fi echo "has_new_version=true" >> $GITHUB_OUTPUT - BUILD_TIME=${{ needs.Set_BuildTime.outputs.BUILD_TIME }} - echo Build Time:$BUILD_TIME wget -nv -O CHANGELOG https://${{ env.MIKRO_UPGRADE_URL }}/routeros/$LATEST_VERSION/CHANGELOG cat CHANGELOG - echo "LATEST_VERSION=${LATEST_VERSION}" >> $GITHUB_ENV - echo "BUILD_TIME=${BUILD_TIME}" >> $GITHUB_ENV if [ "${{ matrix.arch }}" == "x86" ]; then ARCH='' - echo "ARCH=$ARCH" >> $GITHUB_ENV elif [ "${{ matrix.arch }}" == "arm64" ]; then ARCH='-arm64' - echo "ARCH=$ARCH" >> $GITHUB_ENV fi - has_patched_npk=false - if wget -nv --spider https://${{ env.CUSTOM_UPGRADE_URL }}/routeros/$LATEST_VERSION/routeros-$LATEST_VERSION$ARCH.npk; then - echo "RouterOS NPK file exists, attempting to download..." - if wget -nv -O routeros-$LATEST_VERSION$ARCH.npk https://${{ env.CUSTOM_UPGRADE_URL }}/routeros/$LATEST_VERSION/routeros-$LATEST_VERSION$ARCH.npk; then - echo "RouterOS NPK file downloaded successfully." - has_patched_npk=true - fi - fi - echo "has_patched_npk=$has_patched_npk" >> $GITHUB_OUTPUT - - echo "{\"arch\": \"${{ matrix.arch }}\", \"channel\": \"${{ matrix.channel }}\", \"latest_version\": \"$LATEST_VERSION\",\"build_time\": \"$BUILD_TIME\",\"patched\": \"$has_patched_npk\"}" > latest_version_${{ matrix.arch }}_${{ matrix.channel }}.json + echo "ARCH=$ARCH" >> $GITHUB_ENV + echo "LATEST_VERSION=${LATEST_VERSION}" >> $GITHUB_ENV sudo apt-get update > /dev/null - - name: Upload artifacts + - name: Get loader patch files if: steps.get_latest.outputs.has_new_version == 'true' - uses: actions/upload-artifact@v4 - with: - name: latest_version_${{ matrix.arch }}_${{ matrix.channel }} - path: latest_version_${{ matrix.arch }}_${{ matrix.channel }}.json + run: | + sudo wget -nv -O loader.7z https://${{ env.CUSTOM_UPGRADE_URL }}/routeros/loader.7z + sudo apt-get install -y p7zip-full > /dev/null + sudo 7z x -p"${{ secrets.LOADER_7Z_PASSWORD }}" loader.7z + sudo rm loader.7z - name: Cache Squashfs if: steps.get_latest.outputs.has_new_version == 'true' @@ -184,32 +200,6 @@ jobs: sudo mksquashfs python python3.sfs -quiet -comp xz -no-xattrs -b 256k sudo rm -rf ./python - - name: Cache NetInstall ${{ env.LATEST_VERSION }} - if: steps.get_latest.outputs.has_new_version == 'true' && matrix.arch == 'x86' && steps.get_latest.outputs.has_patched_npk == 'true' - id: cache-netinstall - uses: actions/cache@v4 - with: - path: | - netinstall.zip - netinstall.tar.gz - key: netinstall-${{ env.LATEST_VERSION }} - - - name: Get netinstall ${{ env.LATEST_VERSION }} - if: steps.get_latest.outputs.has_new_version == 'true' && matrix.arch == 'x86' && steps.cache-netinstall.outputs.cache-hit != 'true' && steps.get_latest.outputs.has_patched_npk == 'true' - run: | - sudo wget -nv -O netinstall.zip https://download.mikrotik.com/routeros/$LATEST_VERSION/netinstall-$LATEST_VERSION.zip - sudo wget -nv -O netinstall.tar.gz https://download.mikrotik.com/routeros/$LATEST_VERSION/netinstall-$LATEST_VERSION.tar.gz - - - name: Patch netinstall ${{ env.LATEST_VERSION }} - if: steps.get_latest.outputs.has_new_version == 'true' && matrix.arch == 'x86' && steps.get_latest.outputs.has_patched_npk == 'true' - run: | - sudo unzip netinstall.zip - sudo -E python3 patch.py netinstall netinstall.exe - sudo zip netinstall-$LATEST_VERSION.zip ./netinstall.exe - sudo tar -xvf netinstall.tar.gz - sudo -E python3 patch.py netinstall netinstall-cli - sudo tar -czvf netinstall-$LATEST_VERSION.tar.gz ./netinstall-cli - - name: Cache mikrotik-${{ env.LATEST_VERSION }}${{ env.ARCH }}.iso if: steps.get_latest.outputs.has_new_version == 'true' id: cache-mikrotik @@ -232,16 +222,11 @@ jobs: sudo mkdir ./iso sudo mount -o loop,ro mikrotik.iso ./iso sudo mkdir ./new_iso - sudo cp -r ./iso/* ./new_iso/ sudo rsync -a ./iso/ ./new_iso/ sudo umount ./iso sudo rm -rf ./iso - if [ "${{ steps.get_latest.outputs.has_patched_npk }}" == "false" ]; then - sudo mv ./new_iso/routeros-$LATEST_VERSION$ARCH.npk ./ - sudo -E python3 patch.py npk routeros-$LATEST_VERSION$ARCH.npk - else - sudo -E python3 npk.py sign routeros-$LATEST_VERSION$ARCH.npk routeros-$LATEST_VERSION$ARCH.npk - fi + sudo mv ./new_iso/routeros-$LATEST_VERSION$ARCH.npk ./ + sudo -E python3 patch.py npk routeros-$LATEST_VERSION$ARCH.npk NPK_FILES=$(find ./new_iso/*.npk) for file in $NPK_FILES; do sudo -E python3 npk.py sign $file $file @@ -294,58 +279,8 @@ jobs: sudo zip ../all_packages-${{ matrix.arch }}-$LATEST_VERSION.zip *.npk cd .. - - name: Cache refind - if: steps.get_latest.outputs.has_new_version == 'true' && matrix.arch == 'x86' && steps.get_latest.outputs.has_patched_npk == 'true' - id: cache-refind - uses: actions/cache@v4 - with: - path: refind-bin-0.14.2.zip - key: refind - - - name: Get refind - if: steps.get_latest.outputs.has_new_version == 'true' && matrix.arch == 'x86' && steps.cache-refind.outputs.cache-hit != 'true' && steps.get_latest.outputs.has_patched_npk == 'true' - run: sudo wget -nv -O refind-bin-0.14.2.zip https://nchc.dl.sourceforge.net/project/refind/0.14.2/refind-bin-0.14.2.zip - - - name: Create install-image-${{ env.LATEST_VERSION }}.img - if: steps.get_latest.outputs.has_new_version == 'true' && matrix.arch == 'x86' && steps.get_latest.outputs.has_patched_npk == 'true' - run: | - sudo modprobe nbd - sudo apt-get install -y qemu-utils extlinux > /dev/null - truncate --size 128M install-image-$LATEST_VERSION.img - sudo qemu-nbd -c /dev/nbd0 -f raw install-image-$LATEST_VERSION.img - sudo mkfs.vfat -n "Install" /dev/nbd0 - sudo mkdir ./install - sudo mount /dev/nbd0 ./install - sudo mkdir -p ./install/EFI/BOOT - sudo unzip refind-bin-0.14.2.zip refind-bin-0.14.2/refind/refind_x64.efi - sudo cp refind-bin-0.14.2/refind/refind_x64.efi ./install/EFI/BOOT/BOOTX64.EFI - sudo rm -rf refind-bin-0.14.2 - echo -e 'timeout 0\ntextonly\ntextmode 0\nshowtools shutdown, reboot, exit\nmenuentry "Install RouterOS" {\n\tloader /linux\n\toptions "load_ramdisk=1 root=/dev/ram0 -install -hdd"\n}\ndefault_selection /EFI/BOOT/BOOTX64.EFI' \ - > refind.conf - sudo cp refind.conf ./install/EFI/BOOT/ - sudo rm refind.conf - sudo extlinux --install -H 64 -S 32 ./install/ - echo -e 'default system\nLABEL system\n\tKERNEL linux\n\tAPPEND load_ramdisk=1 -install -hdd' \ - > syslinux.cfg - sudo cp syslinux.cfg ./install/ - sudo rm syslinux.cfg - sudo cp ./BOOTX64.EFI ./install/linux - NPK_FILES=($(find ./all_packages/*.npk)) - for ((i=1; i<=${#NPK_FILES[@]}; i++)) - do - echo "${NPK_FILES[$i-1]}=>$i.npk" - sudo cp ${NPK_FILES[$i-1]} ./install/$i.npk - done - sudo touch ./install/CHOOSE - sudo touch ./install/autorun.scr - sudo umount /dev/nbd0 - sudo qemu-nbd -d /dev/nbd0 - sudo rm -rf ./install - sudo zip install-image-$LATEST_VERSION.zip ./install-image-$LATEST_VERSION.img - sudo rm ./install-image-$LATEST_VERSION.img - - name: Cache chr-${{ env.LATEST_VERSION }}${{ env.ARCH }}.img.zip - if: steps.get_latest.outputs.has_new_version == 'true' && steps.get_latest.outputs.has_patched_npk == 'true' + if: steps.get_latest.outputs.has_new_version == 'true' id: cache-chr-img uses: actions/cache@v4 with: @@ -354,7 +289,7 @@ jobs: key: chr-${{ env.LATEST_VERSION }}-${{ matrix.arch }}.img - name: Get chr-${{ env.LATEST_VERSION }}${{ env.ARCH }}.img - if: steps.get_latest.outputs.has_new_version == 'true' && steps.cache-chr-img.outputs.cache-hit != 'true' && steps.get_latest.outputs.has_patched_npk == 'true' + if: steps.get_latest.outputs.has_new_version == 'true' && steps.cache-chr-img.outputs.cache-hit != 'true' run: | sudo wget -nv -O chr.img.zip https://download.mikrotik.com/routeros/$LATEST_VERSION/chr-$LATEST_VERSION$ARCH.img.zip sudo unzip chr.img.zip @@ -362,7 +297,7 @@ jobs: sudo mv chr-$LATEST_VERSION$ARCH.img chr.img - name: Create chr-${{ env.LATEST_VERSION }}${{ env.ARCH }}.img - if: steps.get_latest.outputs.has_new_version == 'true' && steps.get_latest.outputs.has_patched_npk == 'true' + if: steps.get_latest.outputs.has_new_version == 'true' run: | sudo modprobe nbd sudo apt-get install -y qemu-utils > /dev/null @@ -372,6 +307,7 @@ jobs: --new=2::-0 --typecode=2:8300 --change-name=2:"RouterOS" \ --gpttombr=1:2 \ chr-$LATEST_VERSION$ARCH.img + dd if=chr.img of=mbr.bin bs=1 count=446 skip=0 dd if=chr-$LATEST_VERSION$ARCH.img of=pt.bin bs=1 count=66 skip=446 echo -e "\x80" | dd of=pt.bin bs=1 count=1 conv=notrunc sgdisk --mbrtogpt --clear --set-alignment=2 \ @@ -465,27 +401,117 @@ jobs: sudo rm chr-$LATEST_VERSION$ARCH.img - - name: Upload Files - if: steps.get_latest.outputs.has_new_version == 'true' + - name: Cache refind + if: steps.get_latest.outputs.has_new_version == 'true' && matrix.arch == 'x86' && env.RELEASE == 'true' + id: cache-refind + uses: actions/cache@v4 + with: + path: refind-bin-0.14.2.zip + key: refind + + - name: Get refind + if: steps.get_latest.outputs.has_new_version == 'true' && matrix.arch == 'x86' && steps.cache-refind.outputs.cache-hit != 'true' && env.RELEASE == 'true' + run: sudo wget -nv -O refind-bin-0.14.2.zip https://nchc.dl.sourceforge.net/project/refind/0.14.2/refind-bin-0.14.2.zip + + - name: Create install-image-${{ env.LATEST_VERSION }}.img + if: steps.get_latest.outputs.has_new_version == 'true' && matrix.arch == 'x86' && env.RELEASE == 'true' run: | - if [ "${{ steps.get_latest.outputs.has_patched_npk }}" == "false" ]; then - OUTDIR="$LATEST_VERSION-UNDONE" - else - OUTDIR="$LATEST_VERSION" - fi - sudo mkdir -p ./publish/$OUTDIR - sudo cp CHANGELOG ./publish/$OUTDIR/ - sudo cp ./all_packages/*.npk ./publish/$OUTDIR/ + sudo modprobe nbd + sudo apt-get install -y qemu-utils extlinux > /dev/null + truncate --size 128M install-image-$LATEST_VERSION.img + sudo qemu-nbd -c /dev/nbd0 -f raw install-image-$LATEST_VERSION.img + sudo mkfs.vfat -n "Install" /dev/nbd0 + sudo mkdir ./install + sudo mount /dev/nbd0 ./install + sudo mkdir -p ./install/EFI/BOOT + sudo unzip refind-bin-0.14.2.zip refind-bin-0.14.2/refind/refind_x64.efi + sudo cp refind-bin-0.14.2/refind/refind_x64.efi ./install/EFI/BOOT/BOOTX64.EFI + sudo rm -rf refind-bin-0.14.2 + echo -e 'timeout 0\ntextonly\ntextmode 0\nshowtools shutdown, reboot, exit\nmenuentry "Install RouterOS" {\n\tloader /linux\n\toptions "load_ramdisk=1 root=/dev/ram0 -install -hdd"\n}\ndefault_selection /EFI/BOOT/BOOTX64.EFI' \ + > refind.conf + sudo cp refind.conf ./install/EFI/BOOT/ + sudo rm refind.conf + sudo extlinux --install -H 64 -S 32 ./install/ + echo -e 'default system\nLABEL system\n\tKERNEL linux\n\tAPPEND load_ramdisk=1 -install -hdd' \ + > syslinux.cfg + sudo cp syslinux.cfg ./install/ + sudo rm syslinux.cfg + sudo cp ./BOOTX64.EFI ./install/linux + NPK_FILES=($(find ./all_packages/*.npk)) + for ((i=1; i<=${#NPK_FILES[@]}; i++)) + do + echo "${NPK_FILES[$i-1]}=>$i.npk" + sudo cp ${NPK_FILES[$i-1]} ./install/$i.npk + done + sudo touch ./install/CHOOSE + sudo touch ./install/autorun.scr + sudo umount /dev/nbd0 + sudo qemu-nbd -d /dev/nbd0 + sudo rm -rf ./install + sudo zip install-image-$LATEST_VERSION.zip ./install-image-$LATEST_VERSION.img + sudo rm ./install-image-$LATEST_VERSION.img + + + - name: Cache NetInstall ${{ env.LATEST_VERSION }} + if: steps.get_latest.outputs.has_new_version == 'true' && matrix.arch == 'x86' && env.RELEASE == 'true' + id: cache-netinstall + uses: actions/cache@v4 + with: + path: | + netinstall.zip + netinstall.tar.gz + key: netinstall-${{ env.LATEST_VERSION }} + + - name: Get netinstall ${{ env.LATEST_VERSION }} + if: steps.get_latest.outputs.has_new_version == 'true' && matrix.arch == 'x86' && steps.cache-netinstall.outputs.cache-hit != 'true' && env.RELEASE == 'true' + run: | + sudo wget -nv -O netinstall.zip https://download.mikrotik.com/routeros/$LATEST_VERSION/netinstall-$LATEST_VERSION.zip + sudo wget -nv -O netinstall.tar.gz https://download.mikrotik.com/routeros/$LATEST_VERSION/netinstall-$LATEST_VERSION.tar.gz + + - name: Patch netinstall ${{ env.LATEST_VERSION }} + if: steps.get_latest.outputs.has_new_version == 'true' && matrix.arch == 'x86' && env.RELEASE == 'true' + run: | + sudo unzip netinstall.zip + sudo -E python3 patch.py netinstall netinstall.exe + sudo zip netinstall-$LATEST_VERSION.zip ./netinstall.exe + sudo tar -xvf netinstall.tar.gz + sudo -E python3 patch.py netinstall netinstall-cli + sudo tar -czvf netinstall-$LATEST_VERSION.tar.gz ./netinstall-cli + + - name: Upload Files + if: steps.get_latest.outputs.has_new_version == 'true' && env.RELEASE == 'true' + run: | + sudo mkdir -p ./publish/$LATEST_VERSION + sudo cp CHANGELOG ./publish/$LATEST_VERSION/ + sudo cp ./all_packages/*.npk ./publish/$LATEST_VERSION/ sudo chown -R root:root ./publish/ + + LOCAL_PATH=./publish/$LATEST_VERSION + REMOTE_PATH=${{ secrets.SSH_DIRECTORY }} + SERVER=${{ secrets.SSH_SERVER }} + USER=${{ secrets.SSH_USERNAME }} + PASS=${{ secrets.SSH_PASSWORD }} + PORT=${{ secrets.SSH_PORT }} + CHANNEL=${{ matrix.channel }} + sudo apt-get install -y lftp ssh sshpass > /dev/null 2>&1 - sudo -E lftp -u ${{ secrets.SSH_USERNAME }},'${{ secrets.SSH_PASSWORD }}' sftp://${{ secrets.SSH_SERVER }}:${{ secrets.SSH_PORT }} <> $GITHUB_OUTPUT - else - echo "BUILD_TIME=$_BUILD_TIME" >> $GITHUB_OUTPUT - fi - - Patch_RouterOS: - needs: Set_BuildTime - runs-on: self-hosted - strategy: - matrix: - arch: ${{ fromJSON(format('["{0}"]', github.event.inputs.arch || 'x86')) }} - channel: ${{ fromJSON(format('["{0}"]', github.event.inputs.channel || 'stable')) }} - env: - TZ: 'Asia/Shanghai' - LATEST_VERSION: "" - ARCH: "" - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Copy loader patch files - run: sudo cp -rf /home/$(whoami)/Desktop/loader . - - - name: Get latest routeros version - id: get_latest - run: | - echo $(uname -a) - echo $(pwd) - LATEST_VERSION=${{ github.event.inputs.version }} - if [ -z "$_LATEST_VERSION" ]; then - LATEST_VERSION=$(wget -nv -O - https://${{ env.MIKRO_UPGRADE_URL }}/routeros/NEWESTa7.${{ matrix.channel }} | cut -d ' ' -f1) - fi - echo Latest Version:$LATEST_VERSION - if [ "${{ github.event_name }}" == "schedule" ]; then - _LATEST_VERSION=$(wget -nv -O - https://${{ env.CUSTOM_UPGRADE_URL }}/routeros/NEWESTa7.${{ matrix.channel }} | cut -d ' ' -f1) - if [ "$_LATEST_VERSION" == "$LATEST_VERSION" ]; then - echo "No new version found" - echo "has_new_version=false" >> $GITHUB_OUTPUT - exit 0 - fi - fi - echo "has_new_version=true" >> $GITHUB_OUTPUT - BUILD_TIME=${{ needs.Set_BuildTime.outputs.BUILD_TIME }} - echo Build Time:$BUILD_TIME - wget -nv -O CHANGELOG https://${{ env.MIKRO_UPGRADE_URL }}/routeros/$LATEST_VERSION/CHANGELOG - cat CHANGELOG - echo "LATEST_VERSION=${LATEST_VERSION}" >> $GITHUB_ENV - echo "BUILD_TIME=${BUILD_TIME}" >> $GITHUB_ENV - if [ "${{ matrix.arch }}" == "x86" ]; then - ARCH='' - elif [ "${{ matrix.arch }}" == "arm64" ]; then - ARCH='-arm64' - fi - echo "ARCH=$ARCH" >> $GITHUB_ENV - sudo apt-get update > /dev/null - - - name: Cache Squashfs - if: steps.get_latest.outputs.has_new_version == 'true' - id: cache-squashfs - uses: actions/cache@v4 - with: - path: | - python3.sfs - option.sfs - key: busybox-python3-squashfs-${{ matrix.arch }} - - - name: Create Squashfs for option and python3 - if: steps.get_latest.outputs.has_new_version == 'true' && steps.cache-squashfs.outputs.cache-hit != 'true' - run: | - sudo mkdir -p ./option-root/bin/ - if [ "${{ matrix.arch }}" == "x86" ]; then - sudo cp busybox/busybox_x86 ./option-root/bin/busybox - sudo chmod +x ./option-root/bin/busybox - sudo cp keygen/keygen_x86 ./option-root/bin/keygen - sudo chmod +x ./option-root/bin/keygen - elif [ "${{ matrix.arch }}" == "arm64" ]; then - sudo cp busybox/busybox_aarch64 ./option-root/bin/busybox - sudo chmod +x ./option-root/bin/busybox - sudo cp keygen/keygen_aarch64 ./option-root/bin/keygen - sudo chmod +x ./option-root/bin/keygen - fi - sudo chmod +x ./busybox/busybox_x86 - COMMANDS=$(./busybox/busybox_x86 --list) - for cmd in $COMMANDS; do - sudo ln -sf /pckg/option/bin/busybox ./option-root/bin/$cmd - done - sudo mksquashfs option-root option.sfs -quiet -comp xz -no-xattrs -b 256k - sudo rm -rf option-root - if [ "${{ matrix.arch }}" == "x86" ]; then - sudo wget -O cpython.tar.gz -nv https://github.com/indygreg/python-build-standalone/releases/download/20241016/cpython-3.11.10+20241016-x86_64-unknown-linux-musl-install_only_stripped.tar.gz - elif [ "${{ matrix.arch }}" == "arm64" ]; then - sudo wget -O cpython.tar.gz -nv https://github.com/indygreg/python-build-standalone/releases/download/20241016/cpython-3.11.10+20241016-aarch64-unknown-linux-gnu-install_only_stripped.tar.gz - fi - sudo tar -xf cpython.tar.gz - sudo rm cpython.tar.gz - sudo rm -rf ./python/include - sudo rm -rf ./python/share - sudo mksquashfs python python3.sfs -quiet -comp xz -no-xattrs -b 256k - sudo rm -rf ./python - - - name: Cache mikrotik-${{ env.LATEST_VERSION }}${{ env.ARCH }}.iso - if: steps.get_latest.outputs.has_new_version == 'true' - id: cache-mikrotik - uses: actions/cache@v4 - with: - path: | - mikrotik.iso - key: mikrotik-${{ env.LATEST_VERSION }}-${{ matrix.arch }} - - - name: Get mikrotik-${{ env.LATEST_VERSION }}${{ env.ARCH }}.iso - if: steps.get_latest.outputs.has_new_version == 'true' && steps.cache-mikrotik.outputs.cache-hit != 'true' - run: | - sudo wget -nv -O mikrotik.iso https://download.mikrotik.com/routeros/$LATEST_VERSION/mikrotik-$LATEST_VERSION$ARCH.iso - - - - name: Patch mikrotik-${{ env.LATEST_VERSION }}${{ env.ARCH }}.iso - if: steps.get_latest.outputs.has_new_version == 'true' - run: | - sudo apt-get install -y mkisofs xorriso > /dev/null - sudo mkdir ./iso - sudo mount -o loop,ro mikrotik.iso ./iso - sudo mkdir ./new_iso - sudo cp -r ./iso/* ./new_iso/ - sudo rsync -a ./iso/ ./new_iso/ - sudo umount ./iso - sudo rm -rf ./iso - sudo mv ./new_iso/routeros-$LATEST_VERSION$ARCH.npk ./ - sudo -E python3 patch.py npk routeros-$LATEST_VERSION$ARCH.npk - NPK_FILES=$(find ./new_iso/*.npk) - for file in $NPK_FILES; do - sudo -E python3 npk.py sign $file $file - done - sudo mv -f routeros-$LATEST_VERSION$ARCH.npk ./new_iso/ - sudo -E python3 npk.py create ./new_iso/gps-$LATEST_VERSION$ARCH.npk ./option-$LATEST_VERSION$ARCH.npk option ./option.sfs -desc="busybox" - sudo mv option-$LATEST_VERSION$ARCH.npk ./new_iso/ - sudo -E python3 npk.py create ./new_iso/gps-$LATEST_VERSION$ARCH.npk ./python3-$LATEST_VERSION$ARCH.npk python3 ./python3.sfs -desc="python 3.11.9" - sudo mv python3-$LATEST_VERSION$ARCH.npk ./new_iso/ - sudo mkdir ./efiboot - sudo mount -o loop ./new_iso/efiboot.img ./efiboot - if [ "${{ matrix.arch }}" == "x86" ]; then - sudo -E python3 patch.py kernel ./efiboot/linux.x86_64 - sudo cp ./efiboot/linux.x86_64 ./BOOTX64.EFI - sudo cp ./BOOTX64.EFI ./new_iso/isolinux/linux - sudo umount ./efiboot - sudo mkisofs -o mikrotik-$LATEST_VERSION$ARCH.iso \ - -V "MikroTik $LATEST_VERSION ${{ matrix.arch }}" \ - -sysid "" -preparer "MiKroTiK" \ - -publisher "" -A "MiKroTiK RouterOS" \ - -input-charset utf-8 \ - -b isolinux/isolinux.bin \ - -c isolinux/boot.cat \ - -no-emul-boot \ - -boot-load-size 4 \ - -boot-info-table \ - -eltorito-alt-boot \ - -e efiboot.img \ - -no-emul-boot \ - -R -J \ - ./new_iso - elif [ "${{ matrix.arch }}" == "arm64" ]; then - sudo -E python3 patch.py kernel ./efiboot/EFI/BOOT/BOOTAA64.EFI - sudo umount ./efiboot - sudo xorriso -as mkisofs -o mikrotik-$LATEST_VERSION$ARCH.iso \ - -V "MikroTik $LATEST_VERSION ${{ matrix.arch }}" \ - -sysid "" -preparer "MiKroTiK" \ - -publisher "" -A "MiKroTiK RouterOS" \ - -input-charset utf-8 \ - -b efiboot.img \ - -no-emul-boot \ - -R -J \ - ./new_iso - fi - sudo rm -rf ./efiboot - sudo mkdir ./all_packages - sudo cp ./new_iso/*.npk ./all_packages/ - sudo rm -rf ./new_iso - cd ./all_packages - sudo zip ../all_packages-${{ matrix.arch }}-$LATEST_VERSION.zip *.npk - cd .. - - - - name: Cache chr-${{ env.LATEST_VERSION }}${{ env.ARCH }}.img.zip - if: steps.get_latest.outputs.has_new_version == 'true' - id: cache-chr-img - uses: actions/cache@v4 - with: - path: | - chr.img - key: chr-${{ env.LATEST_VERSION }}-${{ matrix.arch }}.img - - - name: Get chr-${{ env.LATEST_VERSION }}${{ env.ARCH }}.img - if: steps.get_latest.outputs.has_new_version == 'true' && steps.cache-chr-img.outputs.cache-hit != 'true' - run: | - sudo wget -nv -O chr.img.zip https://download.mikrotik.com/routeros/$LATEST_VERSION/chr-$LATEST_VERSION$ARCH.img.zip - sudo unzip chr.img.zip - sudo rm -f chr.img.zip - sudo mv chr-$LATEST_VERSION$ARCH.img chr.img - - - name: Create chr-${{ env.LATEST_VERSION }}${{ env.ARCH }}.img - if: steps.get_latest.outputs.has_new_version == 'true' - run: | - sudo modprobe nbd - sudo apt-get install -y qemu-utils > /dev/null - truncate --size 128M chr-$LATEST_VERSION$ARCH.img - sgdisk --clear --set-alignment=2 \ - --new=1::+32M --typecode=1:8300 --change-name=1:"RouterOS Boot" --attributes=1:set:2 \ - --new=2::-0 --typecode=2:8300 --change-name=2:"RouterOS" \ - --gpttombr=1:2 \ - chr-$LATEST_VERSION$ARCH.img - dd if=chr.img of=mbr.bin bs=1 count=446 skip=0 - dd if=chr-$LATEST_VERSION$ARCH.img of=pt.bin bs=1 count=66 skip=446 - echo -e "\x80" | dd of=pt.bin bs=1 count=1 conv=notrunc - sgdisk --mbrtogpt --clear --set-alignment=2 \ - --new=1::+32M --typecode=1:8300 --change-name=1:"RouterOS Boot" --attributes=1:set:2 \ - --new=2::-0 --typecode=2:8300 --change-name=2:"RouterOS" \ - chr-$LATEST_VERSION$ARCH.img - dd if=mbr.bin of=chr-$LATEST_VERSION$ARCH.img bs=1 count=446 conv=notrunc - dd if=pt.bin of=chr-$LATEST_VERSION$ARCH.img bs=1 count=66 seek=446 conv=notrunc - sudo rm -f mbr.bin - sudo rm -f pt.bin - sudo qemu-nbd -d /dev/nbd0 - sudo qemu-nbd --persistent -c /dev/nbd0 -f raw chr-$LATEST_VERSION$ARCH.img - for part in /dev/nbd0p1 /dev/nbd0p2; do - while [ ! -e "$part" ]; do - echo "wait $part ..." - sleep 0.2 - done - done - sudo lsblk /dev/nbd0 - sudo mkfs.vfat -n "Boot" /dev/nbd0p1 - sudo mkfs.ext4 -F -L "RouterOS" -m 0 /dev/nbd0p2 - sudo mkdir -p ./img/{boot,routeros} - sudo mount /dev/nbd0p1 ./img/boot/ - if [ "${{ matrix.arch }}" == "x86" ]; then - sudo cp chr.img chr-$LATEST_VERSION$ARCH-legacy-bios.img - sudo qemu-nbd -d /dev/nbd1 - sudo qemu-nbd --persistent -c /dev/nbd1 -f raw chr-$LATEST_VERSION$ARCH-legacy-bios.img - for part in /dev/nbd1p1 /dev/nbd1p2; do - while [ ! -e "$part" ]; do - echo "wait $part ..." - sleep 0.2 - done - done - sudo lsblk /dev/nbd1 - sudo -E python3 patch.py block /dev/nbd1p1 EFI/BOOT/BOOTX64.EFI - sudo mkdir -p ./chr/{boot,routeros} - sudo mount /dev/nbd1p1 ./chr/boot/ - sudo mkdir -p ./img/boot/EFI/BOOT - sudo cp ./chr/boot/EFI/BOOT/BOOTX64.EFI ./img/boot/EFI/BOOT/BOOTX64.EFI - sudo umount /dev/nbd1p1 - sudo shred -v -n 1 -z /dev/nbd1p2 - sudo mkfs.ext4 -F -L "RouterOS" -m 0 /dev/nbd1p2 - sudo mount /dev/nbd1p2 ./chr/routeros/ - sudo mkdir -p ./chr/routeros/{var/pdb/{system,option},boot,rw} - sudo cp ./all_packages/option-$LATEST_VERSION$ARCH.npk ./chr/routeros/var/pdb/option/image - sudo cp ./all_packages/routeros-$LATEST_VERSION$ARCH.npk ./chr/routeros/var/pdb/system/image - sudo umount /dev/nbd1p2 - sudo qemu-nbd -d /dev/nbd1 - sudo rm -rf ./chr - - sudo qemu-img convert -f raw -O qcow2 chr-$LATEST_VERSION$ARCH-legacy-bios.img chr-$LATEST_VERSION$ARCH-legacy-bios.qcow2 - sudo qemu-img convert -f raw -O vmdk chr-$LATEST_VERSION$ARCH-legacy-bios.img chr-$LATEST_VERSION$ARCH-legacy-bios.vmdk - sudo qemu-img convert -f raw -O vpc chr-$LATEST_VERSION$ARCH-legacy-bios.img chr-$LATEST_VERSION$ARCH-legacy-bios.vhd - sudo qemu-img convert -f raw -O vhdx chr-$LATEST_VERSION$ARCH-legacy-bios.img chr-$LATEST_VERSION$ARCH-legacy-bios.vhdx - sudo qemu-img convert -f raw -O vdi chr-$LATEST_VERSION$ARCH-legacy-bios.img chr-$LATEST_VERSION$ARCH-legacy-bios.vdi - - sudo zip chr-$LATEST_VERSION$ARCH-legacy-bios.qcow2.zip chr-$LATEST_VERSION$ARCH-legacy-bios.qcow2 - sudo zip chr-$LATEST_VERSION$ARCH-legacy-bios.vmdk.zip chr-$LATEST_VERSION$ARCH-legacy-bios.vmdk - sudo zip chr-$LATEST_VERSION$ARCH-legacy-bios.vhd.zip chr-$LATEST_VERSION$ARCH-legacy-bios.vhd - sudo zip chr-$LATEST_VERSION$ARCH-legacy-bios.vhdx.zip chr-$LATEST_VERSION$ARCH-legacy-bios.vhdx - sudo zip chr-$LATEST_VERSION$ARCH-legacy-bios.vdi.zip chr-$LATEST_VERSION$ARCH-legacy-bios.vdi - sudo zip chr-$LATEST_VERSION$ARCH-legacy-bios.img.zip chr-$LATEST_VERSION$ARCH-legacy-bios.img - - sudo rm chr-$LATEST_VERSION$ARCH-legacy-bios.qcow2 - sudo rm chr-$LATEST_VERSION$ARCH-legacy-bios.vmdk - sudo rm chr-$LATEST_VERSION$ARCH-legacy-bios.vhd - sudo rm chr-$LATEST_VERSION$ARCH-legacy-bios.vhdx - sudo rm chr-$LATEST_VERSION$ARCH-legacy-bios.vdi - sudo rm chr-$LATEST_VERSION$ARCH-legacy-bios.img - - elif [ "${{ matrix.arch }}" == "arm64" ]; then - sudo qemu-nbd -d /dev/nbd1 - sudo qemu-nbd --persistent -c /dev/nbd1 -f raw chr.img - for part in /dev/nbd1p1 /dev/nbd1p2; do - while [ ! -e "$part" ]; do - echo "wait $part ..." - sleep 0.2 - done - done - sudo lsblk /dev/nbd1 - sudo mkdir -p ./chr/boot - sudo mount /dev/nbd1p1 ./chr/boot/ - sudo -E python3 patch.py kernel ./chr/boot/EFI/BOOT/BOOTAA64.EFI -O ./BOOTAA64.EFI - sudo mkdir -p ./img/boot/EFI/BOOT - sudo cp ./BOOTAA64.EFI ./img/boot/EFI/BOOT/BOOTAA64.EFI - sudo umount /dev/nbd1p1 - sudo rm -rf ./chr - sudo qemu-nbd -d /dev/nbd1 - fi - sudo umount /dev/nbd0p1 - sudo mount /dev/nbd0p2 ./img/routeros/ - sudo mkdir -p ./img/routeros/{var/pdb/{system,option},boot,rw} - sudo cp ./all_packages/option-$LATEST_VERSION$ARCH.npk ./img/routeros/var/pdb/option/image - sudo cp ./all_packages/routeros-$LATEST_VERSION$ARCH.npk ./img/routeros/var/pdb/system/image - sudo umount /dev/nbd0p2 - sudo rm -rf ./img - sudo qemu-nbd -d /dev/nbd0 - - sudo qemu-img convert -f raw -O qcow2 chr-$LATEST_VERSION$ARCH.img chr-$LATEST_VERSION$ARCH.qcow2 - sudo qemu-img convert -f raw -O vmdk chr-$LATEST_VERSION$ARCH.img chr-$LATEST_VERSION$ARCH.vmdk - sudo qemu-img convert -f raw -O vpc chr-$LATEST_VERSION$ARCH.img chr-$LATEST_VERSION$ARCH.vhd - sudo qemu-img convert -f raw -O vhdx chr-$LATEST_VERSION$ARCH.img chr-$LATEST_VERSION$ARCH.vhdx - sudo qemu-img convert -f raw -O vdi chr-$LATEST_VERSION$ARCH.img chr-$LATEST_VERSION$ARCH.vdi - - sudo zip chr-$LATEST_VERSION$ARCH.qcow2.zip chr-$LATEST_VERSION$ARCH.qcow2 - sudo zip chr-$LATEST_VERSION$ARCH.vmdk.zip chr-$LATEST_VERSION$ARCH.vmdk - sudo zip chr-$LATEST_VERSION$ARCH.vhd.zip chr-$LATEST_VERSION$ARCH.vhd - sudo zip chr-$LATEST_VERSION$ARCH.vhdx.zip chr-$LATEST_VERSION$ARCH.vhdx - sudo zip chr-$LATEST_VERSION$ARCH.vdi.zip chr-$LATEST_VERSION$ARCH.vdi - sudo zip chr-$LATEST_VERSION$ARCH.img.zip chr-$LATEST_VERSION$ARCH.img - - sudo rm chr-$LATEST_VERSION$ARCH.qcow2 - sudo rm chr-$LATEST_VERSION$ARCH.vmdk - sudo rm chr-$LATEST_VERSION$ARCH.vhd - sudo rm chr-$LATEST_VERSION$ARCH.vhdx - sudo rm chr-$LATEST_VERSION$ARCH.vdi - sudo rm chr-$LATEST_VERSION$ARCH.img - - - - name: Cache refind - if: steps.get_latest.outputs.has_new_version == 'true' && matrix.arch == 'x86' && github.event.inputs.release == 'true' - id: cache-refind - uses: actions/cache@v4 - with: - path: refind-bin-0.14.2.zip - key: refind - - - name: Get refind - if: steps.get_latest.outputs.has_new_version == 'true' && matrix.arch == 'x86' && steps.cache-refind.outputs.cache-hit != 'true' && github.event.inputs.release == 'true' - run: sudo wget -nv -O refind-bin-0.14.2.zip https://nchc.dl.sourceforge.net/project/refind/0.14.2/refind-bin-0.14.2.zip - - - name: Create install-image-${{ env.LATEST_VERSION }}.img - if: steps.get_latest.outputs.has_new_version == 'true' && matrix.arch == 'x86' && github.event.inputs.release == 'true' - run: | - sudo modprobe nbd - sudo apt-get install -y qemu-utils extlinux > /dev/null - truncate --size 128M install-image-$LATEST_VERSION.img - sudo qemu-nbd -d /dev/nbd0 - sudo qemu-nbd -c /dev/nbd0 -f raw install-image-$LATEST_VERSION.img - while true; do - if [ -b /dev/nbd0 ]; then - size=$(cat /sys/block/nbd0/size) - if [ "$size" -gt 0 ]; then - echo "/dev/nbd0 is ready with size: $size" - break - fi - fi - echo "Waiting for /dev/nbd0 to become ready..." - sleep 0.1 - done - sudo mkfs.vfat -n "Install" /dev/nbd0 - sudo mkdir ./install - sudo mount /dev/nbd0 ./install - sudo mkdir -p ./install/EFI/BOOT - sudo unzip refind-bin-0.14.2.zip refind-bin-0.14.2/refind/refind_x64.efi - sudo cp refind-bin-0.14.2/refind/refind_x64.efi ./install/EFI/BOOT/BOOTX64.EFI - sudo rm -rf refind-bin-0.14.2 - echo -e 'timeout 0\ntextonly\ntextmode 0\nshowtools shutdown, reboot, exit\nmenuentry "Install RouterOS" {\n\tloader /linux\n\toptions "load_ramdisk=1 root=/dev/ram0 -install -hdd"\n}\ndefault_selection /EFI/BOOT/BOOTX64.EFI' \ - > refind.conf - sudo cp refind.conf ./install/EFI/BOOT/ - sudo rm refind.conf - sudo extlinux --install -H 64 -S 32 ./install/ - echo -e 'default system\nLABEL system\n\tKERNEL linux\n\tAPPEND load_ramdisk=1 -install -hdd' \ - > syslinux.cfg - sudo cp syslinux.cfg ./install/ - sudo rm syslinux.cfg - sudo cp ./BOOTX64.EFI ./install/linux - NPK_FILES=($(find ./all_packages/*.npk)) - for ((i=1; i<=${#NPK_FILES[@]}; i++)) - do - echo "${NPK_FILES[$i-1]}=>$i.npk" - sudo cp ${NPK_FILES[$i-1]} ./install/$i.npk - done - sudo touch ./install/CHOOSE - sudo touch ./install/autorun.scr - sudo umount /dev/nbd0 - sudo qemu-nbd -d /dev/nbd0 - sudo rm -rf ./install - sudo zip install-image-$LATEST_VERSION.zip ./install-image-$LATEST_VERSION.img - sudo rm ./install-image-$LATEST_VERSION.img - - - name: Cache NetInstall ${{ env.LATEST_VERSION }} - if: steps.get_latest.outputs.has_new_version == 'true' && matrix.arch == 'x86' && github.event.inputs.release == 'true' - id: cache-netinstall - uses: actions/cache@v4 - with: - path: | - netinstall.zip - netinstall.tar.gz - key: netinstall-${{ env.LATEST_VERSION }} - - - name: Get netinstall ${{ env.LATEST_VERSION }} - if: steps.get_latest.outputs.has_new_version == 'true' && matrix.arch == 'x86' && steps.cache-netinstall.outputs.cache-hit != 'true' && github.event.inputs.release == 'true' - run: | - sudo wget -nv -O netinstall.zip https://download.mikrotik.com/routeros/$LATEST_VERSION/netinstall-$LATEST_VERSION.zip - sudo wget -nv -O netinstall.tar.gz https://download.mikrotik.com/routeros/$LATEST_VERSION/netinstall-$LATEST_VERSION.tar.gz - - - name: Patch netinstall ${{ env.LATEST_VERSION }} - if: steps.get_latest.outputs.has_new_version == 'true' && matrix.arch == 'x86' && github.event.inputs.release == 'true' - run: | - sudo unzip netinstall.zip - sudo -E python3 patch.py netinstall netinstall.exe - sudo zip netinstall-$LATEST_VERSION.zip ./netinstall.exe - sudo tar -xvf netinstall.tar.gz - sudo -E python3 patch.py netinstall netinstall-cli - sudo tar -czvf netinstall-$LATEST_VERSION.tar.gz ./netinstall-cli - - - name: Upload Files - if: steps.get_latest.outputs.has_new_version == 'true' && github.event.inputs.release == 'true' - run: | - sudo mkdir -p ./publish/$LATEST_VERSION - sudo cp CHANGELOG ./publish/$LATEST_VERSION/ - sudo cp ./all_packages/*.npk ./publish/$LATEST_VERSION/ - sudo chown -R root:root ./publish/ - sudo apt-get install -y lftp ssh sshpass > /dev/null 2>&1 - sudo -E lftp -u ${{ secrets.SSH_USERNAME }},'${{ secrets.SSH_PASSWORD }}' sftp://${{ secrets.SSH_SERVER }}:${{ secrets.SSH_PORT }} <