Compare commits

...

77 Commits

Author SHA1 Message Date
elseif
40676b67af Add files via upload
Signed-off-by: elseif <elseif@live.cn>
2025-08-19 16:10:20 +08:00
elseif
e674ef263a Delete keygen/keygen_x86
Signed-off-by: elseif <elseif@live.cn>
2025-08-19 16:09:39 +08:00
elseif
9cd8640e0a Add files via upload
Signed-off-by: elseif <elseif@live.cn>
2025-08-19 15:55:17 +08:00
elseif
fcf7fddd2e Delete keygen/keygen_x86
Signed-off-by: elseif <elseif@live.cn>
2025-08-19 15:54:36 +08:00
elseif
bdb3de0777 Add files via upload
Signed-off-by: elseif <elseif@live.cn>
2025-08-19 07:36:05 +08:00
elseif
923225902b Delete keygen/keygen_x86
Signed-off-by: elseif <elseif@live.cn>
2025-08-19 07:35:48 +08:00
elseif
3b4391d582 Delete keygen/rc.local
Signed-off-by: elseif <elseif@live.cn>
2025-08-18 19:04:13 +08:00
elseif
6c6899386b Update rc.local
Signed-off-by: elseif <elseif@live.cn>
2025-08-18 19:03:54 +08:00
elseif
5220cb9d8e Update README.md
Signed-off-by: elseif <elseif@live.cn>
2025-08-18 19:02:20 +08:00
elseif
cfe551fdda Update README.md
Signed-off-by: elseif <elseif@live.cn>
2025-08-18 18:59:43 +08:00
elseif
241c81356b Update mikrotik_patch_7.yml
Signed-off-by: elseif <elseif@live.cn>
2025-08-18 17:13:20 +08:00
elseif
9cc2f9063d Update mikrotik_patch_7.yml
Signed-off-by: elseif <elseif@live.cn>
2025-08-18 17:08:29 +08:00
elseif
399c670504 Create rc.local
Signed-off-by: elseif <elseif@live.cn>
2025-08-18 15:40:09 +08:00
elseif
ee6d299e9f Add files via upload
Signed-off-by: elseif <elseif@live.cn>
2025-08-18 15:38:31 +08:00
elseif
0234cf6f75 Delete busybox/busybox_x86
Signed-off-by: elseif <elseif@live.cn>
2025-08-18 15:38:09 +08:00
elseif
9df0184656 Add files via upload
Signed-off-by: elseif <elseif@live.cn>
2025-08-18 15:37:46 +08:00
elseif
5623d2215c Delete keygen_x86
Signed-off-by: elseif <elseif@live.cn>
2025-08-18 15:37:17 +08:00
elseif
7239cd4cdf Add files via upload
Signed-off-by: elseif <elseif@live.cn>
2025-08-18 15:36:27 +08:00
elseif
b60cab8b45 Delete keygen/keygen_x86
Signed-off-by: elseif <elseif@live.cn>
2025-08-18 15:34:19 +08:00
elseif
e8b9bef9aa Update mikrotik_patch_7.yml
Signed-off-by: elseif <elseif@live.cn>
2025-08-18 15:31:09 +08:00
elseif
dc959f9b16 Update mikrotik_patch_6.yml
Signed-off-by: elseif <elseif@live.cn>
2025-08-13 21:19:16 +08:00
elseif
2ea2d3fbdf Update README.md
Signed-off-by: elseif <elseif@live.cn>
2025-08-13 20:46:46 +08:00
elseif
3d3f3fee33 Update README.md
Signed-off-by: elseif <elseif@live.cn>
2025-08-13 20:46:03 +08:00
elseif
8d411a43c6 Update README.md
Signed-off-by: elseif <elseif@live.cn>
2025-08-13 20:44:59 +08:00
elseif
d483639d46 Update README.md
Signed-off-by: elseif <elseif@live.cn>
2025-08-13 20:44:47 +08:00
elseif
4d09aa8aab Update README.md
Signed-off-by: elseif <elseif@live.cn>
2025-08-13 20:41:00 +08:00
elseif
8f59b90921 Update README.md
Signed-off-by: elseif <elseif@live.cn>
2025-08-13 20:40:34 +08:00
elseif
5d08e5308d Update README.md
Signed-off-by: elseif <elseif@live.cn>
2025-08-13 19:31:22 +08:00
elseif
18e256ff41 Update README.md
Signed-off-by: elseif <elseif@live.cn>
2025-08-13 19:30:34 +08:00
elseif
855fbc85d1 Update README.md
Signed-off-by: elseif <elseif@live.cn>
2025-08-13 19:30:00 +08:00
elseif
9715f13b6a Update README.md
Signed-off-by: elseif <elseif@live.cn>
2025-08-13 19:14:57 +08:00
elseif
b2893b91b7 Update README.md
Signed-off-by: elseif <elseif@live.cn>
2025-08-13 18:57:48 +08:00
elseif
988ded50c3 Update README.md
Signed-off-by: elseif <elseif@live.cn>
2025-08-13 18:56:30 +08:00
elseif
950505e0ab Update README.md
Signed-off-by: elseif <elseif@live.cn>
2025-08-13 18:50:20 +08:00
elseif
96c0fd251e Update README.md
Signed-off-by: elseif <elseif@live.cn>
2025-08-13 18:49:17 +08:00
elseif
d4dcf6dfeb Update README.md
Signed-off-by: elseif <elseif@live.cn>
2025-08-13 18:48:04 +08:00
elseif
65b7c57616 Update mikrotik_patch_6.yml
Signed-off-by: elseif <elseif@live.cn>
2025-08-13 14:15:12 +08:00
elseif
edb40667ef Update mikrotik_patch_6.yml
Signed-off-by: elseif <elseif@live.cn>
2025-08-13 14:04:49 +08:00
elseif
f98f599cb7 Update mikrotik_patch_7.yml
Signed-off-by: elseif <elseif@live.cn>
2025-08-13 07:08:18 +08:00
elseif
f28acb89ae Update mikrotik_patch_7.yml
Signed-off-by: elseif <elseif@live.cn>
2025-08-13 07:05:08 +08:00
elseif
259fb4bf2a Update mikrotik_patch_7.yml
Signed-off-by: elseif <elseif@live.cn>
2025-08-13 06:54:12 +08:00
elseif
8f15749897 Update README.md
Signed-off-by: elseif <elseif@live.cn>
2025-07-29 11:52:44 +08:00
elseif
9712d7d464 Update CODE_OF_CONDUCT.md
Signed-off-by: elseif <elseif@live.cn>
2025-07-28 20:59:12 +08:00
elseif
7bebf605a0 Update LICENSE
Signed-off-by: elseif <elseif@live.cn>
2025-07-28 20:58:30 +08:00
elseif
f018e0de99 Update LICENSE
Signed-off-by: elseif <elseif@live.cn>
2025-07-28 20:58:05 +08:00
elseif
7ef69a1e31 Update README_PT.md
Signed-off-by: elseif <elseif@live.cn>
2025-07-28 20:56:07 +08:00
elseif
1ba7057fc7 Update README_EN.md
Signed-off-by: elseif <elseif@live.cn>
2025-07-28 20:55:53 +08:00
elseif
8a52ef8df4 Update README.md
Signed-off-by: elseif <elseif@live.cn>
2025-07-28 20:55:38 +08:00
elseif
7292ad7a80 Update README_PT.md
Signed-off-by: elseif <elseif@live.cn>
2025-07-28 20:47:06 +08:00
elseif
88de7162b7 Update README_EN.md
Signed-off-by: elseif <elseif@live.cn>
2025-07-28 20:46:51 +08:00
elseif
f3497a9a4b Update README.md
Signed-off-by: elseif <elseif@live.cn>
2025-07-28 20:46:34 +08:00
elseif
702efdb828 Update CODE_OF_CONDUCT.md
Signed-off-by: elseif <elseif@live.cn>
2025-07-28 20:43:37 +08:00
elseif
a2038ece24 Update CODE_OF_CONDUCT.md
Signed-off-by: elseif <elseif@live.cn>
2025-07-28 20:40:04 +08:00
elseif
0b3fd16ba7 Update LICENSE
Signed-off-by: elseif <elseif@live.cn>
2025-07-28 20:35:14 +08:00
elseif
8367df6ef0 Update mikrotik_patch_7.yml
Signed-off-by: elseif <elseif@live.cn>
2025-07-17 22:07:56 +08:00
zyb
2b9db1436c modified: patch.py 2025-07-13 14:27:34 +08:00
zyb
6dccdda7bb modified: .github/workflows/mikrotik_patch_7.yml 2025-07-11 21:10:15 +08:00
zyb
1d0b4f9563 modified: .github/workflows/mikrotik_patch_7.yml 2025-07-11 20:48:53 +08:00
zyb
ce13b4b959 modified: .github/workflows/mikrotik_patch_7.yml 2025-07-11 20:42:06 +08:00
zyb
3f98072f2d modified: .github/workflows/mikrotik_patch_7.yml 2025-07-11 20:38:55 +08:00
zyb
ceb85aaf72 modified: .github/workflows/mikrotik_patch_7.yml
modified:   busybox/busybox_aarch64
	new file:   busybox/busybox_arm
	modified:   busybox/busybox_x86
	modified:   keygen/keygen_aarch64
	new file:   keygen/keygen_arm
	modified:   patch.py
2025-07-11 20:36:23 +08:00
elseif
ad132d5a8d Update mikrotik_patch_7.yml
Signed-off-by: elseif <elseif@live.cn>
2025-07-10 18:49:16 +08:00
elseif
0e6364e06a Update mikrotik_patch_7.yml
Signed-off-by: elseif <elseif@live.cn>
2025-07-10 18:46:53 +08:00
elseif
c7f31476e7 Update chr.sh
Signed-off-by: elseif <elseif@live.cn>
2025-07-08 00:58:38 +08:00
elseif
674370280d Update chr.sh
Signed-off-by: elseif <elseif@live.cn>
2025-07-06 01:30:56 +08:00
elseif
9a7ea04b45 Update mikrotik_patch_7.yml
Signed-off-by: elseif <elseif@live.cn>
2025-07-05 14:40:35 +08:00
elseif
4965f266db Create CODE_OF_CONDUCT.md
Signed-off-by: elseif <elseif@live.cn>
2025-07-05 06:07:33 +08:00
elseif
6c33b4c2c9 Update README.md
Signed-off-by: elseif <elseif@live.cn>
2025-07-04 00:26:48 +08:00
zyb
5729c4746a modified: README.md
modified:   README_EN.md
	modified:   README_PT.md
2025-06-29 01:36:00 +08:00
elseif
0e89b026b8 Create LICENSE
Signed-off-by: elseif <elseif@live.cn>
2025-06-23 12:41:14 +08:00
zyb
88925b0057 modified: .github/workflows/mikrotik_patch_7.yml 2025-06-23 12:37:27 +08:00
zyb
18f7b4cf36 modified: .github/workflows/mikrotik_patch_7.yml 2025-06-21 14:49:16 +08:00
zyb
77b0644c95 modified: .github/workflows/mikrotik_patch_7.yml 2025-06-21 14:32:03 +08:00
zyb
e72436306b modified: .github/workflows/mikrotik_patch_7.yml 2025-06-21 10:37:46 +08:00
zyb
d32177f1e7 modified: .github/workflows/mikrotik_patch_6.yml 2025-06-21 09:49:51 +08:00
zyb
2ad3d69a4d modified: .github/workflows/mikrotik_patch_7.yml 2025-06-21 09:47:49 +08:00
zyb
70819de5a4 modified: .github/workflows/mikrotik_patch_7.yml 2025-06-19 14:31:23 +08:00
15 changed files with 308 additions and 129 deletions

View File

@@ -16,15 +16,20 @@ on:
- stable - stable
- long-term - long-term
version: version:
description: "Version ('', 6.49.17, 6.49.18,...)" description: "Specify version (e.g., 6.49.19), empty for latest"
required: false required: false
default: '' default: ''
type: string type: string
buildtime: buildtime:
description: "Build Time" description: "Custom build time, leave empty for now,when set specify version"
required: false required: false
default: '' default: ''
type: string type: string
release:
description: "Release to GitHub & Upload "
required: false
default: false
type: boolean
permissions: permissions:
contents: write contents: write
@@ -47,30 +52,50 @@ env:
CUSTOM_CLOUD_URL: ${{ secrets.CUSTOM_CLOUD_URL }} CUSTOM_CLOUD_URL: ${{ secrets.CUSTOM_CLOUD_URL }}
jobs: jobs:
Set_BuildTime: Set_Variables:
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
outputs: outputs:
BUILD_TIME: ${{ steps.set_buildtime.outputs.BUILD_TIME }} BUILD_TIME: ${{ steps.set_vars.outputs.BUILD_TIME }}
RELEASE: ${{ steps.set_vars.outputs.RELEASE }}
MATRIX_JSON: ${{ steps.set_vars.outputs.MATRIX_JSON }}
steps: steps:
- name: Set build time - name: Set variables
id: set_buildtime id: set_vars
run: | run: |
_BUILD_TIME=${{ github.event.inputs.buildtime }} if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
if [ -z "$_BUILD_TIME" ]; then BUILD_TIME="${{ github.event.inputs.buildtime }}"
echo "BUILD_TIME=$(date +'%s')" >> $GITHUB_OUTPUT RELEASE="${{ github.event.inputs.release }}"
if [ -z "$BUILD_TIME" ]; then
BUILD_TIME=$(date +'%s')
fi
if [ -z "$RELEASE" ]; then
RELEASE=false
fi
ARCH="${{ github.event.inputs.arch }}"
CHANNEL="${{ github.event.inputs.channel }}"
MATRIX_JSON=$(jq -nc --arg arch "$ARCH" --arg channel "$CHANNEL" '[{arch: $arch, channel: $channel}]')
else else
echo "BUILD_TIME=$_BUILD_TIME" >> $GITHUB_OUTPUT BUILD_TIME=$(date +'%s')
RELEASE=true
MATRIX_JSON='[{"arch":"x86","channel":"stable"},{"arch":"x86","channel":"long-term"}]'
fi fi
echo "BUILD_TIME=$BUILD_TIME" >> $GITHUB_OUTPUT
echo "RELEASE=$RELEASE" >> $GITHUB_OUTPUT
echo "MATRIX_JSON=$MATRIX_JSON" >> $GITHUB_OUTPUT
echo "BUILD_TIME: $BUILD_TIME"
echo "RELEASE: $RELEASE"
echo "MATRIX_JSON: $MATRIX_JSON"
Patch_RouterOS: Patch_RouterOS:
needs: Set_BuildTime needs: Set_Variables
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
strategy: strategy:
matrix: matrix:
channel: ${{ fromJSON(format('["{0}"]', github.event.inputs.channel || 'stable')) }} include: ${{ fromJSON(needs.Set_Variables.outputs.MATRIX_JSON) }}
env: env:
TZ: 'Asia/Shanghai' TZ: 'Asia/Shanghai'
LATEST_VERSION: "" BUILD_TIME: ${{ needs.Set_Variables.outputs.BUILD_TIME }}
RELEASE: ${{ needs.Set_Variables.outputs.RELEASE }}
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@v4
@@ -84,13 +109,19 @@ jobs:
id: get_latest id: get_latest
run: | run: |
echo $(uname -a) echo $(uname -a)
LATEST_VERSION=${{ github.event.inputs.version }} if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
if [ -z "$_LATEST_VERSION" ]; then if [ -n "${{ github.event.inputs.version }}" ]; then
LATEST_VERSION=$(wget -nv -O - https://${{ env.MIKRO_UPGRADE_URL }}/routeros/NEWEST6.${{ matrix.channel }} | cut -d ' ' -f1) LATEST_VERSION="${{ github.event.inputs.version }}"
else
read LATEST_VERSION BUILD_TIME <<< "$(wget -nv -O - "https://${{ env.MIKRO_UPGRADE_URL }}/routeros/NEWEST6.${{ matrix.channel }}")"
fi
else
read LATEST_VERSION BUILD_TIME <<< "$(wget -nv -O - "https://${{ env.MIKRO_UPGRADE_URL }}/routeros/NEWEST6.${{ matrix.channel }}")"
fi fi
echo Build Time:$BUILD_TIME
echo Latest Version:$LATEST_VERSION echo Latest Version:$LATEST_VERSION
if [ "${{ github.event_name }}" == "schedule" ]; then if [ "${{ github.event_name }}" == "schedule" ]; then
_LATEST_VERSION=$(wget -nv -O - https://${{ env.CUSTOM_UPGRADE_URL }}/routeros/NEWEST6.${{ matrix.channel }} | cut -d ' ' -f1) _LATEST_VERSION=$(wget -nv -O - https://${{ env.CUSTOM_UPGRADE_URL }}/routeros/NEWEST6.${{ matrix.channel }} | cut -d ' ' -f1)
if [ "$_LATEST_VERSION" == "$LATEST_VERSION" ]; then if [ "$_LATEST_VERSION" == "$LATEST_VERSION" ]; then
echo "No new version found" echo "No new version found"
echo "has_new_version=false" >> $GITHUB_OUTPUT echo "has_new_version=false" >> $GITHUB_OUTPUT
@@ -98,27 +129,19 @@ jobs:
fi fi
fi fi
echo "has_new_version=true" >> $GITHUB_OUTPUT 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 wget -nv -O CHANGELOG https://${{ env.MIKRO_UPGRADE_URL }}/routeros/$LATEST_VERSION/CHANGELOG
cat CHANGELOG cat CHANGELOG
echo "LATEST_VERSION=${LATEST_VERSION}" >> $GITHUB_ENV echo "LATEST_VERSION=${LATEST_VERSION}" >> $GITHUB_ENV
echo "BUILD_TIME=${BUILD_TIME}" >> $GITHUB_ENV echo "BUILD_TIME=${BUILD_TIME}" >> $GITHUB_ENV
sudo apt-get update > /dev/null
has_patched_npk=false - name: Get loader patch files
if wget -nv --spider https://${{ env.CUSTOM_UPGRADE_URL }}/routeros/$LATEST_VERSION/routeros-x86-$LATEST_VERSION.npk; then if: steps.get_latest.outputs.has_new_version == 'true'
echo "RouterOS NPK file exists, attempting to download..." run: |
if wget -nv -O routeros-x86-$LATEST_VERSION.npk https://${{ env.CUSTOM_UPGRADE_URL }}/routeros/$LATEST_VERSION/routeros-x86-$LATEST_VERSION.npk; then wget -nv -O loader.7z https://${{ env.CUSTOM_UPGRADE_URL }}/routeros/loader.7z
echo "RouterOS NPK file downloaded successfully." sudo apt-get install -y p7zip-full > /dev/null
if wget -nv --spider https://${{ env.CUSTOM_UPGRADE_URL }}/routeros/$LATEST_VERSION/system-$LATEST_VERSION.npk; then 7z x -p"${{ secrets.LOADER_7Z_PASSWORD }}" loader.7z >> /dev/null
echo "System NPK file exists, attempting to download..." rm loader.7z
if wget -nv -O system-$LATEST_VERSION.npk https://${{ env.CUSTOM_UPGRADE_URL }}/routeros/$LATEST_VERSION/system-$LATEST_VERSION.npk; then
has_patched_npk=true
fi
fi
fi
fi
echo "has_patched_npk=$has_patched_npk" >> $GITHUB_OUTPUT
- name: Cache Squashfs - name: Cache Squashfs
if: steps.get_latest.outputs.has_new_version == 'true' if: steps.get_latest.outputs.has_new_version == 'true'
@@ -126,10 +149,11 @@ jobs:
uses: actions/cache@v4 uses: actions/cache@v4
with: with:
path: | path: |
python3.sfs
option.sfs option.sfs
key: busybox-squashfs key: busybox-python3-squashfs-${{ matrix.arch }}
- name: Create Squashfs for option - name: Create Squashfs for option and python3
if: steps.get_latest.outputs.has_new_version == 'true' && steps.cache-squashfs.outputs.cache-hit != 'true' if: steps.get_latest.outputs.has_new_version == 'true' && steps.cache-squashfs.outputs.cache-hit != 'true'
run: | run: |
sudo mkdir -p ./option-root/bin/ sudo mkdir -p ./option-root/bin/
@@ -137,7 +161,6 @@ jobs:
sudo chmod +x ./option-root/bin/busybox sudo chmod +x ./option-root/bin/busybox
sudo cp keygen/keygen_x86 ./option-root/bin/keygen sudo cp keygen/keygen_x86 ./option-root/bin/keygen
sudo chmod +x ./option-root/bin/keygen sudo chmod +x ./option-root/bin/keygen
sudo chmod +x ./busybox/busybox_x86 sudo chmod +x ./busybox/busybox_x86
COMMANDS=$(./busybox/busybox_x86 --list) COMMANDS=$(./busybox/busybox_x86 --list)
for cmd in $COMMANDS; do for cmd in $COMMANDS; do
@@ -145,7 +168,14 @@ jobs:
done done
sudo mksquashfs option-root option.sfs -quiet -comp xz -no-xattrs -b 256k sudo mksquashfs option-root option.sfs -quiet -comp xz -no-xattrs -b 256k
sudo rm -rf option-root sudo rm -rf option-root
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
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 }}.iso - name: Cache mikrotik-${{ env.LATEST_VERSION }}.iso
if: steps.get_latest.outputs.has_new_version == 'true' if: steps.get_latest.outputs.has_new_version == 'true'
id: cache-mikrotik id: cache-mikrotik
@@ -160,7 +190,7 @@ jobs:
run: | run: |
sudo wget -nv -O mikrotik.iso https://download.mikrotik.com/routeros/$LATEST_VERSION/mikrotik-$LATEST_VERSION.iso sudo wget -nv -O mikrotik.iso https://download.mikrotik.com/routeros/$LATEST_VERSION/mikrotik-$LATEST_VERSION.iso
- name: Patch mikrotik-${{ env.LATEST_VERSION }}.iso - name: Patch mikrotik-${{ env.LATEST_VERSION }}.iso
if: steps.get_latest.outputs.has_new_version == 'true' if: steps.get_latest.outputs.has_new_version == 'true'
run: | run: |
@@ -172,20 +202,27 @@ jobs:
sudo rsync -a ./iso/ ./new_iso/ sudo rsync -a ./iso/ ./new_iso/
sudo umount ./iso sudo umount ./iso
sudo rm -rf ./iso sudo rm -rf ./iso
if [ "${{ steps.get_latest.outputs.has_patched_npk }}" == "false" ]; then sudo mv ./new_iso/system-$LATEST_VERSION.npk ./
sudo mv ./new_iso/system-$LATEST_VERSION.npk ./ sudo -E python3 patch.py npk system-$LATEST_VERSION.npk
sudo -E python3 patch.py npk system-$LATEST_VERSION.npk NPK_FILES=$(find ./new_iso -type f -name "*.npk")
else if [ -z "$NPK_FILES" ]; then
sudo -E python3 npk.py sign system-$LATEST_VERSION.npk system-$LATEST_VERSION.npk echo "No .npk files found in iso, downloading..."
URL="https://download.mikrotik.com/routeros/$LATEST_VERSION/all_packages-${{ matrix.arch }}-$LATEST_VERSION.zip"
TMP_ZIP="./all_packages.zip"
sudo wget -nv -O "$TMP_ZIP" "$URL"
sudo unzip -o "$TMP_ZIP" -d ./new_iso
sudo rm -f "$TMP_ZIP"
NPK_FILES=$(find ./new_iso -type f -name "*.npk")
fi fi
if [ -n "$NPK_FILES" ]; then
for file in $NPK_FILES; do
sudo -E python3 npk.py sign "$file" "$file"
done
fi
sudo cp -f system-$LATEST_VERSION.npk ./new_iso/
sudo -E python3 patch.py kernel ./new_iso/isolinux/initrd.rgz sudo -E python3 patch.py kernel ./new_iso/isolinux/initrd.rgz
NPK_FILES=$(find ./new_iso/*.npk) #sudo -E python3 npk.py create ./new_iso/gps-$LATEST_VERSION.npk ./option-$LATEST_VERSION.npk option ./option.sfs -desc="busybox"
for file in $NPK_FILES; do #sudo cp option-$LATEST_VERSION.npk ./new_iso/
sudo -E python3 npk.py sign $file $file
done
sudo cp system-$LATEST_VERSION.npk ./new_iso/
sudo -E python3 npk.py create ./new_iso/gps-$LATEST_VERSION.npk ./option-$LATEST_VERSION.npk option ./option.sfs -desc="busybox"
sudo cp option-$LATEST_VERSION.npk ./new_iso/
sudo mkisofs -o mikrotik-$LATEST_VERSION.iso \ sudo mkisofs -o mikrotik-$LATEST_VERSION.iso \
-V "MikroTik $LATEST_VERSION" \ -V "MikroTik $LATEST_VERSION" \
-sysid "" -preparer "MiKroTiK" \ -sysid "" -preparer "MiKroTiK" \
@@ -204,7 +241,7 @@ jobs:
sudo rm -rf ./new_iso sudo rm -rf ./new_iso
- name: Create install-image-${{ env.LATEST_VERSION }}.img - name: Create install-image-${{ env.LATEST_VERSION }}.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: | run: |
sudo modprobe nbd sudo modprobe nbd
sudo apt-get update sudo apt-get update
@@ -261,14 +298,8 @@ jobs:
sudo -E python3 patch.py block /dev/nbd0p1 boot/initrd.rgz sudo -E python3 patch.py block /dev/nbd0p1 boot/initrd.rgz
sudo mount /dev/nbd0p1 ./chr sudo mount /dev/nbd0p1 ./chr
sudo cp ./all_packages/dude-$LATEST_VERSION.npk ./chr/var/pdb/dude/image sudo cp ./all_packages/dude-$LATEST_VERSION.npk ./chr/var/pdb/dude/image
if [ "${{ steps.get_latest.outputs.has_patched_npk }}" == "false" ]; then sudo -E python3 patch.py npk ./chr/var/pdb/routeros-x86/image
sudo -E python3 patch.py npk ./chr/var/pdb/routeros-x86/image sudo cp ./chr/var/pdb/routeros-x86/image ./all_packages/routeros-x86-$LATEST_VERSION.npk
sudo cp ./chr/var/pdb/routeros-x86/image ./all_packages/routeros-x86-$LATEST_VERSION.npk
else
sudo -E python3 npk.py sign routeros-x86-$LATEST_VERSION.npk routeros-x86-$LATEST_VERSION.npk
sudo cp -f routeros-x86-$LATEST_VERSION.npk ./chr/var/pdb/routeros-x86/image
sudo cp routeros-x86-$LATEST_VERSION.npk ./all_packages/routeros-x86-$LATEST_VERSION.npk
fi
#sudo mkdir -p ./chr/var/pdb/option #sudo mkdir -p ./chr/var/pdb/option
#sudo cp ./all_packages/option-$LATEST_VERSION.npk ./chr/var/pdb/option/image #sudo cp ./all_packages/option-$LATEST_VERSION.npk ./chr/var/pdb/option/image
sudo umount ./chr sudo umount ./chr
@@ -299,27 +330,34 @@ jobs:
cd .. cd ..
- name: Upload Files - name: Upload Files
if: steps.get_latest.outputs.has_new_version == 'true' if: steps.get_latest.outputs.has_new_version == 'true' && env.RELEASE == 'true'
run: | run: |
if [ "${{ steps.get_latest.outputs.has_patched_npk }}" == "false" ]; then sudo mkdir -p ./publish/$LATEST_VERSION
OUTDIR="$LATEST_VERSION-UNDONE" sudo cp CHANGELOG ./publish/$LATEST_VERSION/
else sudo cp ./all_packages/*.npk ./publish/$LATEST_VERSION/
OUTDIR="$LATEST_VERSION"
fi
sudo mkdir -p ./publish/$OUTDIR
sudo cp CHANGELOG ./publish/$OUTDIR/
sudo cp ./all_packages/*.npk ./publish/$OUTDIR/
sudo chown -R root:root ./publish/ 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 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 }} <<EOF
sudo -E lftp -u "$USER","$PASS" sftp://$SERVER:$PORT <<EOF
set sftp:auto-confirm yes set sftp:auto-confirm yes
mirror --reverse --verbose --only-newer ./publish ${{ secrets.SSH_DIRECTORY }} mirror --reverse --verbose --only-newer ./publish "$REMOTE_PATH"
bye bye
EOF EOF
sshpass -p "${{ secrets.SSH_PASSWORD }}" ssh -o StrictHostKeyChecking=no -p ${{ secrets.SSH_PORT }} ${{ secrets.SSH_USERNAME }}@${{ secrets.SSH_SERVER }} "echo $LATEST_VERSION $BUILD_TIME | tee /rw/disk/${{ secrets.SSH_DIRECTORY }}/NEWEST6.${{ matrix.channel }}; chown -R 32768:32768 /rw/disk/${{ secrets.SSH_DIRECTORY }}/" sshpass -p "$PASS" ssh -o StrictHostKeyChecking=no -p $PORT $USER@$SERVER \
"echo $LATEST_VERSION $BUILD_TIME | tee /rw/disk/$REMOTE_PATH/NEWEST6.$CHANNEL; chown -R 32768:32768 /rw/disk/$REMOTE_PATH/"
- name: Clear Cloudflare cache - name: Clear Cloudflare cache
if: steps.get_latest.outputs.has_new_version == 'true' if: steps.get_latest.outputs.has_new_version == 'true' && env.RELEASE == 'true'
run: | run: |
curl --request POST --url "https://api.cloudflare.com/client/v4/zones/fe6831ed6dc9e6235e69ef2a31f2e7fe/purge_cache" \ curl --request POST --url "https://api.cloudflare.com/client/v4/zones/fe6831ed6dc9e6235e69ef2a31f2e7fe/purge_cache" \
--header "Authorization: Bearer 9GDQkzU51QXaqzp1qMjyFKpyeJyOdnNoG9GZQaGP" \ --header "Authorization: Bearer 9GDQkzU51QXaqzp1qMjyFKpyeJyOdnNoG9GZQaGP" \
@@ -327,7 +365,7 @@ jobs:
--data '{"purge_everything": true}' --data '{"purge_everything": true}'
- name: Delete Release tag ${{ env.LATEST_VERSION }} - name: Delete Release tag ${{ env.LATEST_VERSION }}
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' && env.RELEASE == 'true'
run: | run: |
HEADER="Authorization: token ${{ secrets.GITHUB_TOKEN }}" HEADER="Authorization: token ${{ secrets.GITHUB_TOKEN }}"
RELEASE_INFO=$(curl -s -H $HEADER https://api.github.com/repos/${{ github.repository }}/releases/tags/$LATEST_VERSION) RELEASE_INFO=$(curl -s -H $HEADER https://api.github.com/repos/${{ github.repository }}/releases/tags/$LATEST_VERSION)
@@ -342,8 +380,9 @@ jobs:
echo "Release not found for tag: $LATEST_VERSION)" echo "Release not found for tag: $LATEST_VERSION)"
fi fi
- name: Create Release tag ${{ env.LATEST_VERSION }}
if: steps.get_latest.outputs.has_new_version == 'true' && steps.get_latest.outputs.has_patched_npk == 'true' - name: Create Release tag ${{ env.LATEST_VERSION }}
if: steps.get_latest.outputs.has_new_version == 'true' && env.RELEASE == 'true'
uses: softprops/action-gh-release@v2 uses: softprops/action-gh-release@v2
with: with:
name: "RouterOS ${{ env.LATEST_VERSION }}" name: "RouterOS ${{ env.LATEST_VERSION }}"
@@ -357,3 +396,13 @@ jobs:
install-image-${{ env.LATEST_VERSION }}.zip install-image-${{ env.LATEST_VERSION }}.zip
routeros-x86-${{ env.LATEST_VERSION }}.npk routeros-x86-${{ env.LATEST_VERSION }}.npk
all_packages-x86-${{ env.LATEST_VERSION }}.zip all_packages-x86-${{ env.LATEST_VERSION }}.zip
- name: Upload Files as Artifact (No Release)
if: steps.get_latest.outputs.has_new_version == 'true' && env.RELEASE == 'false'
uses: actions/upload-artifact@v4
with:
name: mikrotik-${{ env.LATEST_VERSION }}
path: |
all_packages-x86-${{ env.LATEST_VERSION }}.zip
mikrotik-${{ env.LATEST_VERSION }}.iso
chr-${{ env.LATEST_VERSION }}*.zip

View File

@@ -2,18 +2,19 @@ name: Patch Mikrotik RouterOS 7.x
on: on:
# push: # push:
# branches: [ "main" ] # branches: [ "main" ]
# schedule: schedule:
# - cron: "0 0 * * *" - cron: "0 0 * * *" # At UTC 00:00 on every day
workflow_dispatch: workflow_dispatch:
inputs: inputs:
arch: arch:
description: 'Architecture (x86, arm64)' description: 'Architecture (x86, arm64, arm)'
required: true required: true
default: 'x86' default: 'x86'
type: choice type: choice
options: options:
- x86 - x86
- arm64 - arm64
- arm
channel: channel:
description: 'Channel (stable, testing)' description: 'Channel (stable, testing)'
required: true required: true
@@ -23,7 +24,7 @@ on:
- stable - stable
- testing - testing
version: 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 required: false
default: '' default: ''
type: string type: string
@@ -35,7 +36,7 @@ on:
release: release:
description: "Release to GitHub & Upload " description: "Release to GitHub & Upload "
required: false required: false
default: 'false' default: false
type: boolean type: boolean
permissions: permissions:
@@ -85,12 +86,8 @@ jobs:
else else
BUILD_TIME=$(date +'%s') BUILD_TIME=$(date +'%s')
RELEASE=true RELEASE=true
MATRIX_JSON='[ 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"}]'
{"arch":"x86","channel":"stable"}, MATRIX_JSON='[{"arch":"x86","channel":"stable"},{"arch":"arm64","channel":"stable"},{"arch":"x86","channel":"testing"},{"arch":"arm64","channel":"testing"}]'
{"arch":"arm64","channel":"stable"},
{"arch":"x86","channel":"testing"},
{"arch":"arm64","channel":"testing"}
]'
fi fi
echo "BUILD_TIME=$BUILD_TIME" >> $GITHUB_OUTPUT echo "BUILD_TIME=$BUILD_TIME" >> $GITHUB_OUTPUT
echo "RELEASE=$RELEASE" >> $GITHUB_OUTPUT echo "RELEASE=$RELEASE" >> $GITHUB_OUTPUT
@@ -146,6 +143,8 @@ jobs:
cat CHANGELOG cat CHANGELOG
if [[ "${{ matrix.arch }}" == "arm64" ]]; then if [[ "${{ matrix.arch }}" == "arm64" ]]; then
echo "ARCH=-arm64" >> $GITHUB_ENV echo "ARCH=-arm64" >> $GITHUB_ENV
elif [[ "${{ matrix.arch }}" == "arm" ]]; then
echo "ARCH=-arm" >> $GITHUB_ENV
else else
echo "ARCH=" >> $GITHUB_ENV echo "ARCH=" >> $GITHUB_ENV
fi fi
@@ -184,6 +183,14 @@ jobs:
sudo chmod +x ./option-root/bin/busybox sudo chmod +x ./option-root/bin/busybox
sudo cp keygen/keygen_aarch64 ./option-root/bin/keygen sudo cp keygen/keygen_aarch64 ./option-root/bin/keygen
sudo chmod +x ./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 fi
sudo chmod +x ./busybox/busybox_x86 sudo chmod +x ./busybox/busybox_x86
COMMANDS=$(./busybox/busybox_x86 --list) COMMANDS=$(./busybox/busybox_x86 --list)
@@ -193,9 +200,11 @@ jobs:
sudo mksquashfs option-root option.sfs -quiet -comp xz -no-xattrs -b 256k sudo mksquashfs option-root option.sfs -quiet -comp xz -no-xattrs -b 256k
sudo rm -rf option-root sudo rm -rf option-root
if [ "${{ matrix.arch }}" == "x86" ]; then 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 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 fi
sudo tar -xf cpython.tar.gz sudo tar -xf cpython.tar.gz
sudo rm cpython.tar.gz sudo rm cpython.tar.gz
@@ -205,22 +214,22 @@ jobs:
sudo rm -rf ./python sudo rm -rf ./python
- name: Cache mikrotik-${{ env.LATEST_VERSION }}${{ env.ARCH }}.iso - 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 id: cache-mikrotik
uses: actions/cache@v4 uses: actions/cache@v4
with: with:
path: | path: |
mikrotik.iso 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 - 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: | run: |
sudo wget -nv -O mikrotik.iso https://download.mikrotik.com/routeros/$LATEST_VERSION/mikrotik-$LATEST_VERSION$ARCH.iso 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 - 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: | run: |
sudo apt-get install -y mkisofs xorriso > /dev/null sudo apt-get install -y mkisofs xorriso > /dev/null
sudo mkdir ./iso sudo mkdir ./iso
@@ -231,14 +240,25 @@ jobs:
sudo rm -rf ./iso sudo rm -rf ./iso
sudo mv ./new_iso/routeros-$LATEST_VERSION$ARCH.npk ./ sudo mv ./new_iso/routeros-$LATEST_VERSION$ARCH.npk ./
sudo -E python3 patch.py npk routeros-$LATEST_VERSION$ARCH.npk sudo -E python3 patch.py npk routeros-$LATEST_VERSION$ARCH.npk
NPK_FILES=$(find ./new_iso/*.npk) NPK_FILES=$(find ./new_iso -type f -name "*.npk")
for file in $NPK_FILES; do if [ -z "$NPK_FILES" ]; then
sudo -E python3 npk.py sign $file $file echo "No .npk files found in iso, downloading..."
done URL="https://download.mikrotik.com/routeros/$LATEST_VERSION/all_packages-${{ matrix.arch }}-$LATEST_VERSION.zip"
TMP_ZIP="./all_packages.zip"
sudo wget -nv -O "$TMP_ZIP" "$URL"
sudo unzip -o "$TMP_ZIP" -d ./new_iso
sudo rm -f "$TMP_ZIP"
NPK_FILES=$(find ./new_iso -type f -name "*.npk")
fi
if [ -n "$NPK_FILES" ]; then
for file in $NPK_FILES; do
sudo -E python3 npk.py sign "$file" "$file"
done
fi
sudo cp -f routeros-$LATEST_VERSION$ARCH.npk ./new_iso/ 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 -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 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 cp python3-$LATEST_VERSION$ARCH.npk ./new_iso/
sudo mkdir ./efiboot sudo mkdir ./efiboot
sudo mount -o loop ./new_iso/efiboot.img ./efiboot sudo mount -o loop ./new_iso/efiboot.img ./efiboot
@@ -284,16 +304,16 @@ jobs:
cd .. cd ..
- name: Cache chr-${{ env.LATEST_VERSION }}${{ env.ARCH }}.img.zip - 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 id: cache-chr-img
uses: actions/cache@v4 uses: actions/cache@v4
with: with:
path: | path: |
chr.img 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 - 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: | run: |
sudo wget -nv -O chr.img.zip https://download.mikrotik.com/routeros/$LATEST_VERSION/chr-$LATEST_VERSION$ARCH.img.zip 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 unzip chr.img.zip
@@ -301,7 +321,7 @@ jobs:
sudo mv chr-$LATEST_VERSION$ARCH.img chr.img sudo mv chr-$LATEST_VERSION$ARCH.img chr.img
- name: Create chr-${{ env.LATEST_VERSION }}${{ env.ARCH }}.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: | run: |
sudo modprobe nbd sudo modprobe nbd
sudo apt-get install -y qemu-utils > /dev/null sudo apt-get install -y qemu-utils > /dev/null
@@ -311,14 +331,13 @@ jobs:
--new=2::-0 --typecode=2:8300 --change-name=2:"RouterOS" \ --new=2::-0 --typecode=2:8300 --change-name=2:"RouterOS" \
--gpttombr=1:2 \ --gpttombr=1:2 \
chr-$LATEST_VERSION$ARCH.img 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 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 echo -e "\x80" | dd of=pt.bin bs=1 count=1 conv=notrunc
sgdisk --mbrtogpt --clear --set-alignment=2 \ sgdisk --mbrtogpt --clear --set-alignment=2 \
--new=1::+32M --typecode=1:8300 --change-name=1:"RouterOS Boot" --attributes=1:set: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" \ --new=2::-0 --typecode=2:8300 --change-name=2:"RouterOS" \
chr-$LATEST_VERSION$ARCH.img 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 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 qemu-nbd -c /dev/nbd0 -f raw chr-$LATEST_VERSION$ARCH.img
sudo mkfs.vfat -n "Boot" /dev/nbd0p1 sudo mkfs.vfat -n "Boot" /dev/nbd0p1
@@ -337,9 +356,10 @@ jobs:
sudo shred -v -n 1 -z /dev/nbd1p2 sudo shred -v -n 1 -z /dev/nbd1p2
sudo mkfs.ext4 -F -L "RouterOS" -m 0 /dev/nbd1p2 sudo mkfs.ext4 -F -L "RouterOS" -m 0 /dev/nbd1p2
sudo mount /dev/nbd1p2 ./chr/routeros/ sudo mount /dev/nbd1p2 ./chr/routeros/
sudo mkdir -p ./chr/routeros/{var/pdb/{system,option},boot,rw} sudo mkdir -p ./chr/routeros/{var/pdb/{system,option},boot,rw/disk}
sudo cp ./all_packages/option-$LATEST_VERSION$ARCH.npk ./chr/routeros/var/pdb/option/image 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 cp ./all_packages/routeros-$LATEST_VERSION$ARCH.npk ./chr/routeros/var/pdb/system/image
echo -e '#!/bin/sh\n# This script will be executed *before* RouterOS *loader* start.\n# You can put your own initialization stuff in here\n' | sudo tee ./chr/routeros/rw/disk/rc.local
sudo umount /dev/nbd1p2 sudo umount /dev/nbd1p2
sudo qemu-nbd -d /dev/nbd1 sudo qemu-nbd -d /dev/nbd1
sudo rm -rf ./chr sudo rm -rf ./chr
@@ -403,7 +423,49 @@ jobs:
sudo rm chr-$LATEST_VERSION$ARCH.vhdx sudo rm chr-$LATEST_VERSION$ARCH.vhdx
sudo rm chr-$LATEST_VERSION$ARCH.vdi sudo rm chr-$LATEST_VERSION$ARCH.vdi
sudo rm chr-$LATEST_VERSION$ARCH.img 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 - name: Cache refind
if: steps.get_latest.outputs.has_new_version == 'true' && matrix.arch == 'x86' && env.RELEASE == 'true' if: steps.get_latest.outputs.has_new_version == 'true' && matrix.arch == 'x86' && env.RELEASE == 'true'
@@ -417,7 +479,7 @@ jobs:
if: steps.get_latest.outputs.has_new_version == 'true' && matrix.arch == 'x86' && steps.cache-refind.outputs.cache-hit != 'true' && env.RELEASE == 'true' 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 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' if: steps.get_latest.outputs.has_new_version == 'true' && matrix.arch == 'x86' && env.RELEASE == 'true'
run: | run: |
sudo modprobe nbd sudo modprobe nbd
@@ -456,7 +518,7 @@ jobs:
sudo rm ./install-image-$LATEST_VERSION.img 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' if: steps.get_latest.outputs.has_new_version == 'true' && matrix.arch == 'x86' && env.RELEASE == 'true'
id: cache-netinstall id: cache-netinstall
uses: actions/cache@v4 uses: actions/cache@v4
@@ -472,7 +534,7 @@ jobs:
sudo wget -nv -O netinstall.zip https://download.mikrotik.com/routeros/$LATEST_VERSION/netinstall-$LATEST_VERSION.zip 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 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' if: steps.get_latest.outputs.has_new_version == 'true' && matrix.arch == 'x86' && env.RELEASE == 'true'
run: | run: |
sudo unzip netinstall.zip sudo unzip netinstall.zip
@@ -507,7 +569,7 @@ jobs:
EOF EOF
sshpass -p "$PASS" ssh -o StrictHostKeyChecking=no -p $PORT $USER@$SERVER \ 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 \ sshpass -p "$PASS" ssh -o StrictHostKeyChecking=no -p $PORT $USER@$SERVER \
"chown -R 32768:32768 /rw/disk/$REMOTE_PATH/" "chown -R 32768:32768 /rw/disk/$REMOTE_PATH/"
@@ -522,7 +584,7 @@ jobs:
--header "Content-Type:application/json" \ --header "Content-Type:application/json" \
--data '{"purge_everything": true}' --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' if: steps.get_latest.outputs.has_new_version == 'true' && env.RELEASE == 'true'
run: | run: |
HEADER="Authorization: token ${{ secrets.GITHUB_TOKEN }}" HEADER="Authorization: token ${{ secrets.GITHUB_TOKEN }}"
@@ -538,11 +600,11 @@ jobs:
echo "Release not found for tag: $LATEST_VERSION)" echo "Release not found for tag: $LATEST_VERSION)"
fi 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' if: steps.get_latest.outputs.has_new_version == 'true' && env.RELEASE == 'true'
uses: softprops/action-gh-release@v2 uses: softprops/action-gh-release@v2
with: with:
name: "RouterOS ${{ env.LATEST_VERSION }} ${{ matrix.arch }}" name: "RouterOS ${{ env.LATEST_VERSION }} ${{ env.ARCH }}"
body_path: "CHANGELOG" body_path: "CHANGELOG"
tag_name: ${{ env.LATEST_VERSION }}${{ env.ARCH }} tag_name: ${{ env.LATEST_VERSION }}${{ env.ARCH }}
make_latest: ${{ matrix.channel == 'stable'}} && ${{ matrix.arch == 'x86'}} make_latest: ${{ matrix.channel == 'stable'}} && ${{ matrix.arch == 'x86'}}
@@ -559,8 +621,8 @@ jobs:
if: steps.get_latest.outputs.has_new_version == 'true' && env.RELEASE == 'false' if: steps.get_latest.outputs.has_new_version == 'true' && env.RELEASE == 'false'
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: mikrotik-${{ env.LATEST_VERSION }}-${{ matrix.arch }} name: mikrotik-${{ env.LATEST_VERSION }}${{ env.ARCH }}
path: | path: |
all_packages-*-${{ env.LATEST_VERSION }}.zip all_packages-*-${{ env.LATEST_VERSION }}.zip
mikrotik-${{ env.LATEST_VERSION }}${{ env.ARCH }}.iso mikrotik-${{ env.LATEST_VERSION }}${{ env.ARCH }}.iso
chr-${{ env.LATEST_VERSION }}*.zip chr-${{ env.LATEST_VERSION }}*.zip

8
CODE_OF_CONDUCT.md Normal file
View 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
View 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.

View File

@@ -1,18 +1,22 @@
[![Patch Mikrotik RouterOS 6.x](https://github.com/elseif/MikroTikPatch/actions/workflows/mikrotik_patch_6.yml/badge.svg)](https://github.com/elseif/MikroTikPatch/actions/workflows/mikrotik_patch_6.yml) [![Patch Mikrotik RouterOS 6.x](https://github.com/elseif/MikroTikPatch/actions/workflows/mikrotik_patch_6.yml/badge.svg)](https://github.com/elseif/MikroTikPatch/actions/workflows/mikrotik_patch_6.yml)
[![Patch Mikrotik RouterOS 7.x](https://github.com/elseif/MikroTikPatch/actions/workflows/mikrotik_patch_7.yml/badge.svg)](https://github.com/elseif/MikroTikPatch/actions/workflows/mikrotik_patch_7.yml) [![Patch Mikrotik RouterOS 7.x](https://github.com/elseif/MikroTikPatch/actions/workflows/mikrotik_patch_7.yml/badge.svg)](https://github.com/elseif/MikroTikPatch/actions/workflows/mikrotik_patch_7.yml)
# MikroTik RouterOS Patch [[English](README_EN.md)] # MikroTik RouterOS Patch [[English](README_EN.md)]
[![License: WTFPL](https://img.shields.io/badge/License-WTFPL-brightgreen.svg)](./LICENSE)
[![CoC:WTFCoC](https://img.shields.io/badge/CoC-WTFCoC-brightgreen.svg)](./CODE_OF_CONDUCT.md)
### [[Discord](https://discord.gg/keV6MWQFtX)] [[Telegram](https://t.me/mikrotikpatch)] [[Keygen(Telegram Bot)](https://t.me/ROS_Keygen_Bot)] ### [[Discord](https://discord.gg/keV6MWQFtX)] [[Telegram](https://t.me/mikrotikpatch)] [[Keygen(Telegram Bot)](https://t.me/ROS_Keygen_Bot)]
### 国内镜像下载 密码: elseif
[ [123pan](https://www.123pan.com/s/IpxgTd-BYjQh.html) ]
[ [7.15.3](https://elseif.lanzouj.com/b00cre7g7a)]
[ [7.15.3-arm64](https://elseif.lanzouj.com/b00cre7g8b) ]
[ [6.49.15](https://elseif.lanzouj.com/b00crdq4ji) ]
[ [6.49.13](https://elseif.lanzouj.com/b00crdq4kj) ]
支持:在线更新、在线授权、云备份、DDNS 支持:在线更新、在线授权、云备份、DDNS
![Cloud Status](https://img.shields.io/endpoint?url=https://upgrade.mikrotik.ltd/status?type=cloud)
![VPS Status](https://img.shields.io/endpoint?url=https://upgrade.mikrotik.ltd/status?type=dartnode)
*如果云服务或部署云服务的虚拟主机都不在线那么在线更新、在线授权、云备份、DDNS以及ROS_Keygen_Bot都暂时不能使用*
### 自动授权
从7.19.4和7.20beta8开始启动后自动激活授权许可如果存在rc.local文件会自动加载运行这些功能都需要安装option.npk包。
![](image/install.png) ![](image/install.png)
![](image/routeros.png) ![](image/routeros.png)
@@ -31,6 +35,7 @@
## 如何使用Shell ## 如何使用Shell
安装 option-{version}.npk 包 安装 option-{version}.npk 包
telnet到RouterOS,用户名devel,密码与admin的密码相同 telnet到RouterOS,用户名devel,密码与admin的密码相同
要使用devel用户名登录必须安装option-{version}.npk包且启用。
## 如何授权许可 ## 如何授权许可
进入shell 进入shell
运行 keygen 运行 keygen
@@ -44,10 +49,16 @@
对npk文件进行解包修改创建签名和验证 对npk文件进行解包修改创建签名和验证
### patch.py ### patch.py
替换公钥并签名 替换公钥并签名
## 所有的修补操作都自动运行在[Github Action](https://github.com/elseif/MikroTikPatch/blob/main/.github/workflows/)。 ## 所有的修补操作都自动运行在[Github Action](https://github.com/elseif/MikroTikPatch/blob/main/.github/workflows/)。
### 感谢赞助
[ZMTO](https://console.zmto.com)
[![Powered by DartNode](https://dartnode.com/branding/DN-Open-Source-sm.png)](https://dartnode.com "Powered by DartNode - Free VPS for Open Source")

View File

@@ -1,6 +1,8 @@
[![Patch Mikrotik RouterOS 6.x](https://github.com/elseif/MikroTikPatch/actions/workflows/mikrotik_patch_6.yml/badge.svg)](https://github.com/elseif/MikroTikPatch/actions/workflows/mikrotik_patch_6.yml) [![Patch Mikrotik RouterOS 6.x](https://github.com/elseif/MikroTikPatch/actions/workflows/mikrotik_patch_6.yml/badge.svg)](https://github.com/elseif/MikroTikPatch/actions/workflows/mikrotik_patch_6.yml)
[![Patch Mikrotik RouterOS 7.x](https://github.com/elseif/MikroTikPatch/actions/workflows/mikrotik_patch_7.yml/badge.svg)](https://github.com/elseif/MikroTikPatch/actions/workflows/mikrotik_patch_7.yml) [![Patch Mikrotik RouterOS 7.x](https://github.com/elseif/MikroTikPatch/actions/workflows/mikrotik_patch_7.yml/badge.svg)](https://github.com/elseif/MikroTikPatch/actions/workflows/mikrotik_patch_7.yml)
# MikroTik RouterOS Patch [[中文](README.md)] # MikroTik RouterOS Patch [[中文](README.md)]
[![License: WTFPL](https://img.shields.io/badge/License-WTFPL-brightgreen.svg)](./LICENSE)
[![CoC:WTFCoC](https://img.shields.io/badge/CoC-WTFCoC-brightgreen.svg)](./CODE_OF_CONDUCT.md)
### [[Discord](https://discord.gg/keV6MWQFtX)] [[Telegram](https://t.me/mikrotikpatch)] [[Keygen(Telegram Bot)](https://t.me/ROS_Keygen_Bot)] ### [[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.py
Patch public key and sign NPK files 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/). ## all patches are applied automatically with [Github Action](https://github.com/elseif/MikroTikPatch/blob/main/.github/workflows/).

View File

@@ -2,6 +2,8 @@
[![Patch Mikrotik RouterOS 7.x](https://github.com/elseif/MikroTikPatch/actions/workflows/mikrotik_patch_7.yml/badge.svg)](https://github.com/elseif/MikroTikPatch/actions/workflows/mikrotik_patch_7.yml) [![Patch Mikrotik RouterOS 7.x](https://github.com/elseif/MikroTikPatch/actions/workflows/mikrotik_patch_7.yml/badge.svg)](https://github.com/elseif/MikroTikPatch/actions/workflows/mikrotik_patch_7.yml)
# Patch para MikroTik RouterOS [[中文](README.md)] # Patch para MikroTik RouterOS [[中文](README.md)]
[![License: WTFPL](https://img.shields.io/badge/License-WTFPL-brightgreen.svg)](./LICENSE)
[![CoC:WTFCoC](https://img.shields.io/badge/CoC-WTFCoC-brightgreen.svg)](./CODE_OF_CONDUCT.md)
### [[Discord](https://discord.gg/keV6MWQFtX)] [[Telegram](https://t.me/mikrotikpatch)] [[Keygen (Bot do Telegram)](https://t.me/ROS_Keygen_Bot)] ### [[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 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/) ## 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

Binary file not shown.

Binary file not shown.

2
chr.sh
View File

@@ -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 && \ gunzip -c chr.img.zip > chr.img && \
STORAGE=`lsblk | grep disk | cut -d ' ' -f 1 | head -n 1` && \ STORAGE=`lsblk | grep disk | cut -d ' ' -f 1 | head -n 1` && \
echo STORAGE is $STORAGE && \ echo STORAGE is $STORAGE && \

Binary file not shown.

BIN
keygen/keygen_arm Normal file

Binary file not shown.

Binary file not shown.

View File

@@ -24,7 +24,7 @@ def replace_key(old,new,data,name=''):
data = replace_chunks(old_chunks, new_chunks, data,name) data = replace_chunks(old_chunks, new_chunks, data,name)
arch = os.getenv('ARCH') or 'x86' arch = os.getenv('ARCH') or 'x86'
arch = arch.replace('-', '') 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)] 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)] 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] 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: if old_bytes in data:
print(f'{name} public key patched {old[:16].hex().upper()}...') print(f'{name} public key patched {old[:16].hex().upper()}...')
data = data.replace(old_bytes,new_bytes) data = data.replace(old_bytes,new_bytes)
old_codes = [bytes.fromhex('793583E2'),bytes.fromhex('FD3A83E2'),bytes.fromhex('193D83E2')] 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')] new_codes = [bytes.fromhex('FF34A0E3'),bytes.fromhex('753C83E2'),bytes.fromhex('FC3083E2')] #0xff0075fc= 0xff000000+0x7500+0xfc
data = replace_chunks(old_codes, new_codes, data,name) 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 return data
def patch_bzimage(data:bytes,key_dict:dict): def patch_bzimage(data:bytes,key_dict:dict):