mirror of
https://github.com/elseif/MikroTikPatch.git
synced 2026-08-26 10:05:50 +00:00
Compare commits
33 Commits
7.19.2
...
7.20beta7-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8f15749897 | ||
|
|
9712d7d464 | ||
|
|
7bebf605a0 | ||
|
|
f018e0de99 | ||
|
|
7ef69a1e31 | ||
|
|
1ba7057fc7 | ||
|
|
8a52ef8df4 | ||
|
|
7292ad7a80 | ||
|
|
88de7162b7 | ||
|
|
f3497a9a4b | ||
|
|
702efdb828 | ||
|
|
a2038ece24 | ||
|
|
0b3fd16ba7 | ||
|
|
8367df6ef0 | ||
|
|
2b9db1436c | ||
|
|
6dccdda7bb | ||
|
|
1d0b4f9563 | ||
|
|
ce13b4b959 | ||
|
|
3f98072f2d | ||
|
|
ceb85aaf72 | ||
|
|
ad132d5a8d | ||
|
|
0e6364e06a | ||
|
|
c7f31476e7 | ||
|
|
674370280d | ||
|
|
9a7ea04b45 | ||
|
|
4965f266db | ||
|
|
6c33b4c2c9 | ||
|
|
5729c4746a | ||
|
|
0e89b026b8 | ||
|
|
88925b0057 | ||
|
|
18f7b4cf36 | ||
|
|
77b0644c95 | ||
|
|
e72436306b |
107
.github/workflows/mikrotik_patch_7.yml
vendored
107
.github/workflows/mikrotik_patch_7.yml
vendored
@@ -3,17 +3,18 @@ on:
|
||||
# push:
|
||||
# branches: [ "main" ]
|
||||
schedule:
|
||||
- cron: "0 0 * * *"
|
||||
- cron: "0 0 * * *" # At UTC 00:00 on every day
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
arch:
|
||||
description: 'Architecture (x86, arm64)'
|
||||
description: 'Architecture (x86, arm64, arm)'
|
||||
required: true
|
||||
default: 'x86'
|
||||
type: choice
|
||||
options:
|
||||
- x86
|
||||
- arm64
|
||||
- arm
|
||||
channel:
|
||||
description: 'Channel (stable, testing)'
|
||||
required: true
|
||||
@@ -23,7 +24,7 @@ on:
|
||||
- stable
|
||||
- testing
|
||||
version:
|
||||
description: "Specify version (e.g., 7.17.2), empty for latest"
|
||||
description: "Specify version (e.g., 7.19.2), empty for latest"
|
||||
required: false
|
||||
default: ''
|
||||
type: string
|
||||
@@ -35,7 +36,7 @@ on:
|
||||
release:
|
||||
description: "Release to GitHub & Upload "
|
||||
required: false
|
||||
default: 'false'
|
||||
default: false
|
||||
type: boolean
|
||||
|
||||
permissions:
|
||||
@@ -85,6 +86,7 @@ jobs:
|
||||
else
|
||||
BUILD_TIME=$(date +'%s')
|
||||
RELEASE=true
|
||||
MATRIX_JSON='[{"arch":"x86","channel":"stable"},{"arch":"arm64","channel":"stable"},{"arch":"arm","channel":"stable"},{"arch":"x86","channel":"testing"},{"arch":"arm64","channel":"testing"},{"arch":"arm","channel":"testing"}]'
|
||||
MATRIX_JSON='[{"arch":"x86","channel":"stable"},{"arch":"arm64","channel":"stable"},{"arch":"x86","channel":"testing"},{"arch":"arm64","channel":"testing"}]'
|
||||
fi
|
||||
echo "BUILD_TIME=$BUILD_TIME" >> $GITHUB_OUTPUT
|
||||
@@ -141,6 +143,8 @@ jobs:
|
||||
cat CHANGELOG
|
||||
if [[ "${{ matrix.arch }}" == "arm64" ]]; then
|
||||
echo "ARCH=-arm64" >> $GITHUB_ENV
|
||||
elif [[ "${{ matrix.arch }}" == "arm" ]]; then
|
||||
echo "ARCH=-arm" >> $GITHUB_ENV
|
||||
else
|
||||
echo "ARCH=" >> $GITHUB_ENV
|
||||
fi
|
||||
@@ -179,6 +183,14 @@ jobs:
|
||||
sudo chmod +x ./option-root/bin/busybox
|
||||
sudo cp keygen/keygen_aarch64 ./option-root/bin/keygen
|
||||
sudo chmod +x ./option-root/bin/keygen
|
||||
elif [ "${{ matrix.arch }}" == "arm" ]; then
|
||||
sudo cp busybox/busybox_arm ./option-root/bin/busybox
|
||||
sudo chmod +x ./option-root/bin/busybox
|
||||
sudo cp keygen/keygen_arm ./option-root/bin/keygen
|
||||
sudo chmod +x ./option-root/bin/keygen
|
||||
else
|
||||
echo "Unsupported architecture: ${{ matrix.arch }}"
|
||||
exit 1
|
||||
fi
|
||||
sudo chmod +x ./busybox/busybox_x86
|
||||
COMMANDS=$(./busybox/busybox_x86 --list)
|
||||
@@ -188,9 +200,11 @@ jobs:
|
||||
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
|
||||
sudo wget -O cpython.tar.gz -nv https://github.com/indygreg/python-build-standalone/releases/download/20250708/cpython-3.11.13+20250708-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
|
||||
sudo wget -O cpython.tar.gz -nv https://github.com/indygreg/python-build-standalone/releases/download/20250708/cpython-3.11.13+20250708-aarch64-unknown-linux-gnu-install_only_stripped.tar.gz
|
||||
elif [ "${{ matrix.arch }}" == "arm" ]; then
|
||||
sudo wget -O cpython.tar.gz -nv https://github.com/indygreg/python-build-standalone/releases/download/20250708/cpython-3.11.13+20250708-armv7-unknown-linux-gnueabi-install_only_stripped.tar.gz
|
||||
fi
|
||||
sudo tar -xf cpython.tar.gz
|
||||
sudo rm cpython.tar.gz
|
||||
@@ -200,22 +214,22 @@ jobs:
|
||||
sudo rm -rf ./python
|
||||
|
||||
- name: Cache mikrotik-${{ env.LATEST_VERSION }}${{ env.ARCH }}.iso
|
||||
if: steps.get_latest.outputs.has_new_version == 'true'
|
||||
if: steps.get_latest.outputs.has_new_version == 'true' && (matrix.arch == 'x86' || matrix.arch == 'arm64')
|
||||
id: cache-mikrotik
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: |
|
||||
mikrotik.iso
|
||||
key: mikrotik-${{ env.LATEST_VERSION }}-${{ matrix.arch }}
|
||||
key: mikrotik-${{ env.LATEST_VERSION }}${{ env.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'
|
||||
if: steps.get_latest.outputs.has_new_version == 'true' && steps.cache-mikrotik.outputs.cache-hit != 'true' && (matrix.arch == 'x86' || matrix.arch == 'arm64')
|
||||
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'
|
||||
if: steps.get_latest.outputs.has_new_version == 'true' && (matrix.arch == 'x86' || matrix.arch == 'arm64')
|
||||
run: |
|
||||
sudo apt-get install -y mkisofs xorriso > /dev/null
|
||||
sudo mkdir ./iso
|
||||
@@ -233,7 +247,7 @@ jobs:
|
||||
sudo cp -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 cp 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 -E python3 npk.py create ./new_iso/gps-$LATEST_VERSION$ARCH.npk ./python3-$LATEST_VERSION$ARCH.npk python3 ./python3.sfs -desc="python 3.11.13"
|
||||
sudo cp python3-$LATEST_VERSION$ARCH.npk ./new_iso/
|
||||
sudo mkdir ./efiboot
|
||||
sudo mount -o loop ./new_iso/efiboot.img ./efiboot
|
||||
@@ -279,16 +293,16 @@ jobs:
|
||||
cd ..
|
||||
|
||||
- name: Cache chr-${{ env.LATEST_VERSION }}${{ env.ARCH }}.img.zip
|
||||
if: steps.get_latest.outputs.has_new_version == 'true'
|
||||
if: steps.get_latest.outputs.has_new_version == 'true' && (matrix.arch == 'x86' || matrix.arch == 'arm64')
|
||||
id: cache-chr-img
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: |
|
||||
chr.img
|
||||
key: chr-${{ env.LATEST_VERSION }}-${{ matrix.arch }}.img
|
||||
key: chr-${{ env.LATEST_VERSION }}${{ env.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'
|
||||
if: steps.get_latest.outputs.has_new_version == 'true' && steps.cache-chr-img.outputs.cache-hit != 'true' && (matrix.arch == 'x86' || matrix.arch == 'arm64')
|
||||
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
|
||||
@@ -296,7 +310,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'
|
||||
if: steps.get_latest.outputs.has_new_version == 'true' && (matrix.arch == 'x86' || matrix.arch == 'arm64')
|
||||
run: |
|
||||
sudo modprobe nbd
|
||||
sudo apt-get install -y qemu-utils > /dev/null
|
||||
@@ -306,14 +320,13 @@ 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 \
|
||||
--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=chr.img 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 qemu-nbd -c /dev/nbd0 -f raw chr-$LATEST_VERSION$ARCH.img
|
||||
sudo mkfs.vfat -n "Boot" /dev/nbd0p1
|
||||
@@ -398,7 +411,49 @@ jobs:
|
||||
sudo rm chr-$LATEST_VERSION$ARCH.vhdx
|
||||
sudo rm chr-$LATEST_VERSION$ARCH.vdi
|
||||
sudo rm chr-$LATEST_VERSION$ARCH.img
|
||||
|
||||
- name: Cache all_packages${{ env.ARCH }}-${{ env.LATEST_VERSION }}.zip
|
||||
if: steps.get_latest.outputs.has_new_version == 'true' && matrix.arch != 'x86' && matrix.arch != 'arm64'
|
||||
id: cache-all-packages
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: all_packages.zip
|
||||
key: all_packages${{ env.ARCH }}-${{ env.LATEST_VERSION }}.zip
|
||||
|
||||
- name: Get all_packages{{ env.ARCH }}-${{ env.LATEST_VERSION }}.zip
|
||||
if: steps.get_latest.outputs.has_new_version == 'true' && steps.cache-all-packages.outputs.cache-hit != 'true' && matrix.arch != 'x86' && matrix.arch != 'arm64'
|
||||
run: |
|
||||
sudo wget -nv -O all_packages.zip https://download.mikrotik.com/routeros/$LATEST_VERSION/all_packages-${{ matrix.arch }}-$LATEST_VERSION.zip
|
||||
|
||||
- name: Cache Main package routeros-${{ env.LATEST_VERSION }}${{ env.ARCH }}.npk
|
||||
if: steps.get_latest.outputs.has_new_version == 'true' && matrix.arch != 'x86' && matrix.arch != 'arm64'
|
||||
id: cache-main-package
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: routeros.npk
|
||||
key: routeros-${{ env.LATEST_VERSION }}${{ env.ARCH }}.npk
|
||||
|
||||
- name: Get Main package routeros-${{ env.LATEST_VERSION }}${{ env.ARCH }}.npk
|
||||
if: steps.get_latest.outputs.has_new_version == 'true' && steps.cache-main-package.outputs.cache-hit != 'true' && matrix.arch != 'x86' && matrix.arch != 'arm64'
|
||||
run: |
|
||||
sudo wget -nv -O routeros.npk https://download.mikrotik.com/routeros/$LATEST_VERSION/routeros-$LATEST_VERSION$ARCH.npk
|
||||
|
||||
- name: Patch all_packages{{ env.ARCH }}-${{ env.LATEST_VERSION }}.zip
|
||||
if: steps.get_latest.outputs.has_new_version == 'true' && matrix.arch != 'x86' && matrix.arch != 'arm64'
|
||||
run: |
|
||||
sudo unzip all_packages.zip -d ./all_packages
|
||||
sudo cp routeros.npk routeros-$LATEST_VERSION$ARCH.npk
|
||||
sudo -E python3 patch.py npk routeros-$LATEST_VERSION$ARCH.npk
|
||||
NPK_FILES=$(find ./all_packages/*.npk)
|
||||
for file in $NPK_FILES; do
|
||||
sudo -E python3 npk.py sign $file $file
|
||||
done
|
||||
sudo cp -f routeros-$LATEST_VERSION$ARCH.npk ./all_packages/routeros-$LATEST_VERSION$ARCH.npk
|
||||
sudo -E python3 npk.py create ./all_packages/gps-$LATEST_VERSION$ARCH.npk ./all_packages/option-$LATEST_VERSION$ARCH.npk option ./option.sfs -desc="busybox"
|
||||
sudo -E python3 npk.py create ./all_packages/gps-$LATEST_VERSION$ARCH.npk ./all_packages/python3-$LATEST_VERSION$ARCH.npk python3 ./python3.sfs -desc="python 3.11.13"
|
||||
cd ./all_packages
|
||||
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' && env.RELEASE == 'true'
|
||||
@@ -412,7 +467,7 @@ jobs:
|
||||
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
|
||||
- name: Create install-image-${{ env.LATEST_VERSION }}${{ env.ARCH }}.img
|
||||
if: steps.get_latest.outputs.has_new_version == 'true' && matrix.arch == 'x86' && env.RELEASE == 'true'
|
||||
run: |
|
||||
sudo modprobe nbd
|
||||
@@ -451,7 +506,7 @@ jobs:
|
||||
sudo rm ./install-image-$LATEST_VERSION.img
|
||||
|
||||
|
||||
- name: Cache NetInstall ${{ env.LATEST_VERSION }}
|
||||
- name: Cache NetInstall ${{ env.LATEST_VERSION }}${{ env.ARCH }}
|
||||
if: steps.get_latest.outputs.has_new_version == 'true' && matrix.arch == 'x86' && env.RELEASE == 'true'
|
||||
id: cache-netinstall
|
||||
uses: actions/cache@v4
|
||||
@@ -467,7 +522,7 @@ jobs:
|
||||
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 }}
|
||||
- name: Patch netinstall ${{ env.LATEST_VERSION }}${{ env.ARCH }}
|
||||
if: steps.get_latest.outputs.has_new_version == 'true' && matrix.arch == 'x86' && env.RELEASE == 'true'
|
||||
run: |
|
||||
sudo unzip netinstall.zip
|
||||
@@ -502,7 +557,7 @@ jobs:
|
||||
EOF
|
||||
|
||||
sshpass -p "$PASS" ssh -o StrictHostKeyChecking=no -p $PORT $USER@$SERVER \
|
||||
"echo $LATEST_VERSION $BUILD_TIME | tee /rw/disk/$REMOTE_PATH/NEWESTa7.$CHANNEL; /rw/disk/$REMOTE_PATH/packages.sh /rw/disk/$REMOTE_PATH/$LATEST_VERSION"
|
||||
"echo $LATEST_VERSION $BUILD_TIME | tee /rw/disk/$REMOTE_PATH/NEWESTa7.$CHANNEL; bash /rw/disk/$REMOTE_PATH/packages.sh /rw/disk/$REMOTE_PATH/$LATEST_VERSION"
|
||||
|
||||
sshpass -p "$PASS" ssh -o StrictHostKeyChecking=no -p $PORT $USER@$SERVER \
|
||||
"chown -R 32768:32768 /rw/disk/$REMOTE_PATH/"
|
||||
@@ -517,7 +572,7 @@ jobs:
|
||||
--header "Content-Type:application/json" \
|
||||
--data '{"purge_everything": true}'
|
||||
|
||||
- name: Delete Release tag ${{ env.LATEST_VERSION }} ${{ matrix.arch }}
|
||||
- name: Delete Release tag ${{ env.LATEST_VERSION }} ${{ env.ARCH }}
|
||||
if: steps.get_latest.outputs.has_new_version == 'true' && env.RELEASE == 'true'
|
||||
run: |
|
||||
HEADER="Authorization: token ${{ secrets.GITHUB_TOKEN }}"
|
||||
@@ -533,11 +588,11 @@ jobs:
|
||||
echo "Release not found for tag: $LATEST_VERSION)"
|
||||
fi
|
||||
|
||||
- name: Create Release tag ${{ env.LATEST_VERSION }} ${{ matrix.arch }}
|
||||
- name: Create Release tag ${{ env.LATEST_VERSION }} ${{ env.ARCH }}
|
||||
if: steps.get_latest.outputs.has_new_version == 'true' && env.RELEASE == 'true'
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
name: "RouterOS ${{ env.LATEST_VERSION }} ${{ matrix.arch }}"
|
||||
name: "RouterOS ${{ env.LATEST_VERSION }} ${{ env.ARCH }}"
|
||||
body_path: "CHANGELOG"
|
||||
tag_name: ${{ env.LATEST_VERSION }}${{ env.ARCH }}
|
||||
make_latest: ${{ matrix.channel == 'stable'}} && ${{ matrix.arch == 'x86'}}
|
||||
@@ -554,8 +609,8 @@ jobs:
|
||||
if: steps.get_latest.outputs.has_new_version == 'true' && env.RELEASE == 'false'
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: mikrotik-${{ env.LATEST_VERSION }}-${{ matrix.arch }}
|
||||
name: mikrotik-${{ env.LATEST_VERSION }}${{ env.ARCH }}
|
||||
path: |
|
||||
all_packages-*-${{ env.LATEST_VERSION }}.zip
|
||||
mikrotik-${{ env.LATEST_VERSION }}${{ env.ARCH }}.iso
|
||||
chr-${{ env.LATEST_VERSION }}*.zip
|
||||
chr-${{ env.LATEST_VERSION }}*.zip
|
||||
|
||||
8
CODE_OF_CONDUCT.md
Normal file
8
CODE_OF_CONDUCT.md
Normal file
@@ -0,0 +1,8 @@
|
||||
# WTF Code of Conduct (WTFCoC)
|
||||
*"Do What The Fuck You Want, But Don't Be A Dick"*
|
||||
|
||||
1. **Do whatever you want** with the code
|
||||
2. **Don't be a dick** to others
|
||||
3. **No bureaucracy** - handle problems like adults
|
||||
4. **You're on your own** - this isn't a safe space
|
||||
5. **Final rule**: If this bothers you, re-read the WTFPL license name (words 2-4)
|
||||
13
LICENSE
Normal file
13
LICENSE
Normal file
@@ -0,0 +1,13 @@
|
||||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||
Version 2, December 2004
|
||||
|
||||
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim or modified
|
||||
copies of this license document, and changing it is allowed as long
|
||||
as the name is changed.
|
||||
|
||||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. You just DO WHAT THE FUCK YOU WANT TO.
|
||||
13
README.md
13
README.md
@@ -1,6 +1,8 @@
|
||||
[](https://github.com/elseif/MikroTikPatch/actions/workflows/mikrotik_patch_6.yml)
|
||||
[](https://github.com/elseif/MikroTikPatch/actions/workflows/mikrotik_patch_7.yml)
|
||||
# MikroTik RouterOS Patch [[English](README_EN.md)]
|
||||
[](./LICENSE)
|
||||
[](./CODE_OF_CONDUCT.md)
|
||||
|
||||
### [[Discord](https://discord.gg/keV6MWQFtX)] [[Telegram](https://t.me/mikrotikpatch)] [[Keygen(Telegram Bot)](https://t.me/ROS_Keygen_Bot)]
|
||||
|
||||
@@ -31,6 +33,7 @@
|
||||
## 如何使用Shell
|
||||
安装 option-{version}.npk 包
|
||||
telnet到RouterOS,用户名devel,密码与admin的密码相同
|
||||
要使用devel用户名登录必须安装option-{version}.npk包,且启用。
|
||||
## 如何授权许可
|
||||
进入shell
|
||||
运行 keygen
|
||||
@@ -44,10 +47,16 @@
|
||||
对npk文件进行解包,修改,创建,签名和验证
|
||||
### patch.py
|
||||
替换公钥并签名
|
||||
|
||||
|
||||
|
||||
## 所有的修补操作都自动运行在[Github Action](https://github.com/elseif/MikroTikPatch/blob/main/.github/workflows/)。
|
||||
|
||||
### 感谢赞助
|
||||
[ZMTO](https://console.zmto.com)
|
||||
|
||||
[](https://dartnode.com "Powered by DartNode - Free VPS for Open Source")
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
[](https://github.com/elseif/MikroTikPatch/actions/workflows/mikrotik_patch_6.yml)
|
||||
[](https://github.com/elseif/MikroTikPatch/actions/workflows/mikrotik_patch_7.yml)
|
||||
# MikroTik RouterOS Patch [[中文](README.md)]
|
||||
[](./LICENSE)
|
||||
[](./CODE_OF_CONDUCT.md)
|
||||
|
||||
### [[Discord](https://discord.gg/keV6MWQFtX)] [[Telegram](https://t.me/mikrotikpatch)] [[Keygen(Telegram Bot)](https://t.me/ROS_Keygen_Bot)]
|
||||
|
||||
@@ -40,6 +42,9 @@
|
||||
### patch.py
|
||||
Patch public key and sign NPK files
|
||||
|
||||
## Thanks for sponsoring
|
||||
[ZMTO](https://console.zmto.com/)
|
||||
|
||||
## all patches are applied automatically with [Github Action](https://github.com/elseif/MikroTikPatch/blob/main/.github/workflows/).
|
||||
|
||||
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
[](https://github.com/elseif/MikroTikPatch/actions/workflows/mikrotik_patch_7.yml)
|
||||
|
||||
# Patch para MikroTik RouterOS [[中文](README.md)]
|
||||
[](./LICENSE)
|
||||
[](./CODE_OF_CONDUCT.md)
|
||||
|
||||
### [[Discord](https://discord.gg/keV6MWQFtX)] [[Telegram](https://t.me/mikrotikpatch)] [[Keygen (Bot do Telegram)](https://t.me/ROS_Keygen_Bot)]
|
||||
|
||||
@@ -58,4 +60,7 @@ Assina, verifica, cria e extrai arquivos .npk
|
||||
Altera a chave pública e assina arquivos .npk
|
||||
```
|
||||
|
||||
## Thanks for sponsoring
|
||||
[ZMTO](https://console.zmto.com/)
|
||||
|
||||
## Todos os patches são aplicados automaticamente com [GitHub Actions](https://github.com/elseif/MikroTikPatch/blob/main/.github/workflows/)
|
||||
|
||||
Binary file not shown.
BIN
busybox/busybox_arm
Normal file
BIN
busybox/busybox_arm
Normal file
Binary file not shown.
Binary file not shown.
2
chr.sh
2
chr.sh
@@ -1,4 +1,4 @@
|
||||
curl -# -L https://github.com/elseif/MikroTikPatch/releases/download/7.19.1/chr-7.19.1-legacy-bios.img.zip -o /tmp/chr.img.zip && cd /tmp && \
|
||||
curl -# -L https://github.com/elseif/MikroTikPatch/releases/download/7.19.3/chr-7.19.3-legacy-bios.img.zip -o /tmp/chr.img.zip && cd /tmp && \
|
||||
gunzip -c chr.img.zip > chr.img && \
|
||||
STORAGE=`lsblk | grep disk | cut -d ' ' -f 1 | head -n 1` && \
|
||||
echo STORAGE is $STORAGE && \
|
||||
|
||||
Binary file not shown.
BIN
keygen/keygen_arm
Normal file
BIN
keygen/keygen_arm
Normal file
Binary file not shown.
32
patch.py
32
patch.py
@@ -24,7 +24,7 @@ def replace_key(old,new,data,name=''):
|
||||
data = replace_chunks(old_chunks, new_chunks, data,name)
|
||||
arch = os.getenv('ARCH') or 'x86'
|
||||
arch = arch.replace('-', '')
|
||||
if arch == 'arm64':
|
||||
if arch in ['arm64','arm']:
|
||||
old_chunks = [old[i:i+4] for i in range(0, len(old), 4)]
|
||||
new_chunks = [new[i:i+4] for i in range(0, len(new), 4)]
|
||||
old_bytes = old_chunks[4] + old_chunks[5] + old_chunks[2] + old_chunks[0] + old_chunks[1] + old_chunks[6] + old_chunks[7]
|
||||
@@ -32,9 +32,35 @@ def replace_key(old,new,data,name=''):
|
||||
if old_bytes in data:
|
||||
print(f'{name} public key patched {old[:16].hex().upper()}...')
|
||||
data = data.replace(old_bytes,new_bytes)
|
||||
old_codes = [bytes.fromhex('793583E2'),bytes.fromhex('FD3A83E2'),bytes.fromhex('193D83E2')]
|
||||
new_codes = [bytes.fromhex('FF34A0E3'),bytes.fromhex('753C83E2'),bytes.fromhex('FC3083E2')]
|
||||
old_codes = [bytes.fromhex('793583E2'),bytes.fromhex('FD3A83E2'),bytes.fromhex('193D83E2')] #0x1e400000+0xfd000+0x640
|
||||
new_codes = [bytes.fromhex('FF34A0E3'),bytes.fromhex('753C83E2'),bytes.fromhex('FC3083E2')] #0xff0075fc= 0xff000000+0x7500+0xfc
|
||||
data = replace_chunks(old_codes, new_codes, data,name)
|
||||
else:
|
||||
def conver_chunks(data:bytes):
|
||||
ret = [
|
||||
(data[2] << 16) | (data[1] << 8) | data[0] | ((data[3] << 24) & 0x03000000),
|
||||
(data[3] >> 2) | (data[4] << 6) | (data[5] << 14) | ((data[6] << 22) & 0x1C00000),
|
||||
(data[6] >> 3) | (data[7] << 5) | (data[8] << 13) | ((data[9] << 21) & 0x3E00000),
|
||||
(data[9] >> 5) | (data[10] << 3) | (data[11] << 11) | ((data[12] << 19) & 0x1F80000),
|
||||
(data[12] >> 6) | (data[13] << 2) | (data[14] << 10) | (data[15] << 18),
|
||||
data[16] | (data[17] << 8) | (data[18] << 16) | ((data[19] << 24) & 0x01000000),
|
||||
(data[19] >> 1) | (data[20] << 7) | (data[21] << 15) | ((data[22] << 23) & 0x03800000),
|
||||
(data[22] >> 3) | (data[23] << 5) | (data[24] << 13) | ((data[25] << 21) & 0x1E00000),
|
||||
(data[25] >> 4) | (data[26] << 4) | (data[27] << 12) | ((data[28] << 20) & 0x3F00000),
|
||||
(data[28] >> 6) | (data[29] << 2) | (data[30] << 10) | (data[31] << 18)
|
||||
]
|
||||
return [struct.pack('<I', x ) for x in ret]
|
||||
old_chunks = conver_chunks(old)
|
||||
new_chunks = conver_chunks(new)
|
||||
old_bytes = b''.join([v for i,v in enumerate(old_chunks) if i != 8])
|
||||
new_bytes = b''.join([v for i,v in enumerate(new_chunks) if i != 8])
|
||||
if old_bytes in data:
|
||||
print(f'{name} public key patched {old[:16].hex().upper()}...')
|
||||
data = data.replace(old_bytes,new_bytes)
|
||||
old_codes = [bytes.fromhex('713783E2'),bytes.fromhex('223A83E2'),bytes.fromhex('8D3F83E2')] #0x1C40000+0x22000+0x234
|
||||
new_codes = [bytes.fromhex('973303E3'),bytes.fromhex('DD3883E3'),bytes.fromhex('033483E3')] #0x03DD3397 = 0x3397|0x00DD0000|0x03000000
|
||||
data = replace_chunks(old_codes, new_codes, data,name)
|
||||
|
||||
return data
|
||||
|
||||
def patch_bzimage(data:bytes,key_dict:dict):
|
||||
|
||||
Reference in New Issue
Block a user