Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
47020c7e56 | ||
|
|
7e5242349c | ||
|
|
cd40c45fa4 | ||
|
|
62e4b267de | ||
|
|
a2c196f453 | ||
|
|
5e21346aba | ||
|
|
7f6b276a59 | ||
|
|
23ba1abd70 | ||
|
|
d53d454828 |
256
.github/workflows/autobuild.yml
vendored
Normal file
256
.github/workflows/autobuild.yml
vendored
Normal file
@@ -0,0 +1,256 @@
|
||||
#
|
||||
# Copyright (C) 2024 AuxXxilium <https://github.com/AuxXxilium>
|
||||
#
|
||||
# This is free software, licensed under the MIT License.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
name: Build Arc Image Development
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
runs:
|
||||
description: "runs-on"
|
||||
type: choice
|
||||
options:
|
||||
- ubuntu-latest
|
||||
- self-hosted
|
||||
version:
|
||||
description: "version (1.0.0)"
|
||||
required: true
|
||||
type: string
|
||||
next:
|
||||
description: "next"
|
||||
default: true
|
||||
type: boolean
|
||||
stable:
|
||||
description: "stable"
|
||||
default: true
|
||||
type: boolean
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ${{ inputs.runs }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@main
|
||||
|
||||
# Install Dependencies
|
||||
- name: Install Dependencies
|
||||
if: ${{ inputs.runs == 'ubuntu-latest' }}
|
||||
run: |
|
||||
git config --global user.email "info@auxxxilium.tech"
|
||||
git config --global user.name "AuxXxilium"
|
||||
sudo timedatectl set-timezone "Europe/Berlin"
|
||||
|
||||
sudo apt update
|
||||
sudo apt install -y jq gawk cpio gettext libelf-dev qemu-utils busybox dialog curl sed
|
||||
sudo snap install yq
|
||||
|
||||
df -h
|
||||
|
||||
# Get extractor, LKM, Addons, Modules, Theme and Configs
|
||||
- name: Get Buildroot
|
||||
run: |
|
||||
. scripts/func.sh
|
||||
|
||||
echo "Get Dependencies"
|
||||
getAddons "files/p3/addons"
|
||||
getModules "files/p3/modules"
|
||||
getConfigs "files/p3/configs"
|
||||
getPatches "files/p3/patches"
|
||||
getCustom "files/p3/custom"
|
||||
getOffline "files/p3/configs"
|
||||
getLKMs "files/p3/lkms"
|
||||
getTheme "files/p1/boot/grub"
|
||||
getBuildrootx "brx"
|
||||
getBuildroots "brs"
|
||||
|
||||
# Export Dependencies Version to env
|
||||
echo "ADDONTAG=${ADDONTAG}" >> $GITHUB_ENV
|
||||
echo "MODULETAG=${MODULETAG}" >> $GITHUB_ENV
|
||||
echo "CONFIGTAG=${CONFIGTAG}" >> $GITHUB_ENV
|
||||
echo "PATCHTAG=${PATCHTAG}" >> $GITHUB_ENV
|
||||
echo "CUSTOMTAG=${CUSTOMTAG}" >> $GITHUB_ENV
|
||||
echo "LKMTAG=${LKMTAG}" >> $GITHUB_ENV
|
||||
echo "THEMETAG=${THEMETAG}" >> $GITHUB_ENV
|
||||
echo "BRXTAG=${BRXTAG}" >> $GITHUB_ENV
|
||||
echo "BRSTAG=${BRSTAG}" >> $GITHUB_ENV
|
||||
echo "BUILD_TIME=$(date +'%Y-%m-%d %H:%M')" >> $GITHUB_ENV
|
||||
|
||||
echo "OK"
|
||||
|
||||
# Build incremental
|
||||
- name: Build Next Image
|
||||
if: ${{ inputs.next == true }}
|
||||
run: |
|
||||
. scripts/func.sh
|
||||
|
||||
# Modify Source File
|
||||
ARC_BUILD="`date +'%y%m%d'`"
|
||||
ARC_VERSION="${{ inputs.version }}-dev"
|
||||
ARC_BRANCH="next"
|
||||
echo "${ARC_BUILD}" >files/p1/ARC-BUILD
|
||||
echo "${ARC_VERSION}" >files/p1/ARC-VERSION
|
||||
echo "${ARC_BRANCH}" >files/p1/ARC-BRANCH
|
||||
echo "ARC_BUILD=${ARC_BUILD}" >> $GITHUB_ENV
|
||||
echo "ARC_VERSION=${ARC_VERSION}" >> $GITHUB_ENV
|
||||
echo "ARC_BRANCH=${ARC_BRANCH}" >> $GITHUB_ENV
|
||||
|
||||
echo "Create Arc Image"
|
||||
IMAGE_FILE="arc.img"
|
||||
gzip -dc "files/initrd/opt/arc/grub.img.gz" >"${IMAGE_FILE}"
|
||||
fdisk -l "${IMAGE_FILE}"
|
||||
|
||||
LOOPX=$(sudo losetup -f)
|
||||
sudo losetup -P "${LOOPX}" "${IMAGE_FILE}"
|
||||
|
||||
echo "Mounting Image File"
|
||||
mkdir -p "/tmp/p1"
|
||||
mkdir -p "/tmp/p3"
|
||||
sudo mount ${LOOPX}p1 "/tmp/p1"
|
||||
sudo mount ${LOOPX}p3 "/tmp/p3"
|
||||
|
||||
[ ! -f "brx/bzImage-arc" ] || [ ! -f "brx/initrd-arc" ] && return 1
|
||||
|
||||
echo "Repack initrd"
|
||||
cp -f "brx/bzImage-arc" "files/p3/bzImage-arc"
|
||||
#cp -f "brx/initrd-arc" "files/p3/initrd-arc"
|
||||
repackInitrd "brx/initrd-arc" "files/initrd" "files/p3/initrd-arc"
|
||||
|
||||
echo "Copying files"
|
||||
sudo cp -rf "files/p1/"* "/tmp/p1"
|
||||
sudo cp -rf "files/p3/"* "/tmp/p3"
|
||||
sudo sync
|
||||
|
||||
echo "Unmount image file"
|
||||
sudo umount "/tmp/p1"
|
||||
sudo umount "/tmp/p3"
|
||||
rmdir "/tmp/p1"
|
||||
rmdir "/tmp/p3"
|
||||
|
||||
sudo losetup --detach ${LOOPX}
|
||||
|
||||
echo "Image Converter"
|
||||
qemu-img convert ${IMAGE_FILE} -O vmdk -o adapter_type=lsilogic arc-dyn.vmdk
|
||||
qemu-img convert ${IMAGE_FILE} -O vmdk -o adapter_type=lsilogic,subformat=monolithicFlat arc.vmdk
|
||||
qemu-img convert ${IMAGE_FILE} -O vhdx -o subformat=dynamic arc.vhdx
|
||||
|
||||
# Zip image and generate checksum
|
||||
- name: Pack Next Image
|
||||
if: ${{ inputs.next == true }}
|
||||
run: |
|
||||
if [ -n "${{ env.ARC_VERSION }}" ]; then
|
||||
zip -9 "arc-${{ env.ARC_VERSION }}-${{ env.ARC_BRANCH }}.img.zip" arc.img
|
||||
zip -9 "arc-${{ env.ARC_VERSION }}-${{ env.ARC_BRANCH }}.vmdk-dyn.zip" arc-dyn.vmdk
|
||||
zip -9 "arc-${{ env.ARC_VERSION }}-${{ env.ARC_BRANCH }}.vmdk-flat.zip" arc.vmdk arc-flat.vmdk
|
||||
zip -9 "arc-${{ env.ARC_VERSION }}-${{ env.ARC_BRANCH }}.vhdx.zip" arc.vhdx
|
||||
(cd files && zip -r ../update-${{ env.ARC_VERSION }}-${{ env.ARC_BRANCH }}.zip ./p1 ./p3)
|
||||
fi
|
||||
|
||||
# Cleanup
|
||||
- name: Cleanup
|
||||
run: |
|
||||
rm -rf "arc.img" "arc.vmdk" "arc-dyn.vmdk" "arc.vhdx" "arc-flat.vmdk"
|
||||
|
||||
# Build incremental
|
||||
- name: Build Stable Image
|
||||
if: ${{ inputs.stable }}
|
||||
run: |
|
||||
. scripts/func.sh
|
||||
|
||||
# Modify Source File
|
||||
ARC_BUILD="`date +'%y%m%d'`"
|
||||
ARC_VERSION="${{ inputs.version }}-dev"
|
||||
ARC_BRANCH="stable"
|
||||
echo "${ARC_BUILD}" >files/p1/ARC-BUILD
|
||||
echo "${ARC_VERSION}" >files/p1/ARC-VERSION
|
||||
echo "${ARC_BRANCH}" >files/p1/ARC-BRANCH
|
||||
echo "ARC_BUILD=${ARC_BUILD}" >> $GITHUB_ENV
|
||||
echo "ARC_VERSION=${ARC_VERSION}" >> $GITHUB_ENV
|
||||
echo "ARC_BRANCH=${ARC_BRANCH}" >> $GITHUB_ENV
|
||||
|
||||
echo "Create Arc Image"
|
||||
IMAGE_FILE="arc.img"
|
||||
gzip -dc "files/initrd/opt/arc/grub.img.gz" >"${IMAGE_FILE}"
|
||||
fdisk -l "${IMAGE_FILE}"
|
||||
|
||||
LOOPX=$(sudo losetup -f)
|
||||
sudo losetup -P "${LOOPX}" "${IMAGE_FILE}"
|
||||
|
||||
echo "Mounting Image File"
|
||||
mkdir -p "/tmp/p1"
|
||||
mkdir -p "/tmp/p3"
|
||||
sudo mount ${LOOPX}p1 "/tmp/p1"
|
||||
sudo mount ${LOOPX}p3 "/tmp/p3"
|
||||
|
||||
[ ! -f "brs/bzImage-arc" ] || [ ! -f "brs/initrd-arc" ] && return 1
|
||||
|
||||
echo "Repack initrd"
|
||||
cp -f "brs/bzImage-arc" "files/p3/bzImage-arc"
|
||||
#cp -f "brs/initrd-arc" "files/p3/initrd-arc"
|
||||
repackInitrd "brs/initrd-arc" "files/initrd" "files/p3/initrd-arc"
|
||||
|
||||
echo "Copying files"
|
||||
sudo cp -rf "files/p1/"* "/tmp/p1"
|
||||
sudo cp -rf "files/p3/"* "/tmp/p3"
|
||||
sudo sync
|
||||
|
||||
echo "Unmount image file"
|
||||
sudo umount "/tmp/p1"
|
||||
sudo umount "/tmp/p3"
|
||||
rmdir "/tmp/p1"
|
||||
rmdir "/tmp/p3"
|
||||
|
||||
sudo losetup --detach ${LOOPX}
|
||||
|
||||
echo "Image Converter"
|
||||
qemu-img convert ${IMAGE_FILE} -O vmdk -o adapter_type=lsilogic arc-dyn.vmdk
|
||||
qemu-img convert ${IMAGE_FILE} -O vmdk -o adapter_type=lsilogic,subformat=monolithicFlat arc.vmdk
|
||||
qemu-img convert ${IMAGE_FILE} -O vhdx -o subformat=dynamic arc.vhdx
|
||||
|
||||
# Zip image and generate checksum
|
||||
- name: Pack Stable Image
|
||||
if: ${{ inputs.stable }}
|
||||
run: |
|
||||
if [ -n "${{ env.ARC_VERSION }}" ]; then
|
||||
zip -9 "arc-${{ env.ARC_VERSION }}-${{ env.ARC_BRANCH }}.img.zip" arc.img
|
||||
zip -9 "arc-${{ env.ARC_VERSION }}-${{ env.ARC_BRANCH }}.vmdk-dyn.zip" arc-dyn.vmdk
|
||||
zip -9 "arc-${{ env.ARC_VERSION }}-${{ env.ARC_BRANCH }}.vmdk-flat.zip" arc.vmdk arc-flat.vmdk
|
||||
zip -9 "arc-${{ env.ARC_VERSION }}-${{ env.ARC_BRANCH }}.vhdx.zip" arc.vhdx
|
||||
(cd files && zip -r ../update-${{ env.ARC_VERSION }}-${{ env.ARC_BRANCH }}.zip ./p1 ./p3)
|
||||
fi
|
||||
|
||||
# Publish a release if is a tag
|
||||
- name: Release
|
||||
if: success() && env.ARC_VERSION != ''
|
||||
uses: ncipollo/release-action@v1
|
||||
with:
|
||||
tag: ${{ env.ARC_VERSION }}
|
||||
prerelease: true
|
||||
makeLatest: false
|
||||
allowUpdates: true
|
||||
body: |
|
||||
### Note:
|
||||
- Development Build
|
||||
|
||||
### Information:
|
||||
- Full Changelog is available in my Discord
|
||||
- Discord Account for Arc Patch needed
|
||||
|
||||
### Dependencies:
|
||||
- Addons: ${{ env.ADDONTAG }}
|
||||
- Modules: ${{ env.MODULETAG }}
|
||||
- Configs: ${{ env.CONFIGTAG }}
|
||||
- Patches: ${{ env.PATCHTAG }}
|
||||
- Custom: ${{ env.CUSTOMTAG }}
|
||||
- LKMs: ${{ env.LKMTAG }}
|
||||
- Buildroot Stable: ${{ env.BRSTAG }}
|
||||
- Buildroot Next: ${{ env.BRXTAG }}
|
||||
|
||||
### Release
|
||||
- ${{ env.BUILD_TIME }}
|
||||
artifacts: |
|
||||
arc-*.zip
|
||||
update-*.zip
|
||||
153
.github/workflows/build.yml
vendored
153
.github/workflows/build.yml
vendored
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (C) 2025 AuxXxilium <https://github.com/AuxXxilium>
|
||||
# Copyright (C) 2024 AuxXxilium <https://github.com/AuxXxilium>
|
||||
#
|
||||
# This is free software, licensed under the MIT License.
|
||||
# See /LICENSE for more information.
|
||||
@@ -32,6 +32,14 @@ on:
|
||||
description: "pre release"
|
||||
default: false
|
||||
type: boolean
|
||||
next:
|
||||
description: "next"
|
||||
default: true
|
||||
type: boolean
|
||||
stable:
|
||||
description: "stable"
|
||||
default: true
|
||||
type: boolean
|
||||
clean:
|
||||
description: "clean"
|
||||
default: false
|
||||
@@ -45,14 +53,14 @@ jobs:
|
||||
uses: actions/checkout@main
|
||||
|
||||
- name: Delete releases and workflows runs
|
||||
if: ${{ inputs.clean }}
|
||||
if: ${{ inputs.clean == true }}
|
||||
uses: ophub/delete-releases-workflows@main
|
||||
with:
|
||||
delete_releases: true
|
||||
releases_keep_latest: 1
|
||||
delete_workflows: false
|
||||
delete_tags: true
|
||||
gh_token: ${{ secrets.BUILD_TOKEN }}
|
||||
gh_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
# Install Dependencies
|
||||
- name: Install Dependencies
|
||||
@@ -63,19 +71,15 @@ jobs:
|
||||
sudo timedatectl set-timezone "Europe/Berlin"
|
||||
|
||||
sudo apt update
|
||||
sudo apt install -y locales busybox dialog gettext sed gawk jq curl
|
||||
sudo apt install -y python-is-python3 python3-pip libelf-dev qemu-utils cpio xz-utils lz4 lzma bzip2 gzip zstd
|
||||
# sudo snap install yq
|
||||
if ! command -v yq &>/dev/null || ! yq --version 2>/dev/null | grep -q "v4."; then
|
||||
sudo curl -kL https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -o /usr/bin/yq && sudo chmod a+x /usr/bin/yq
|
||||
fi
|
||||
sudo apt install -y jq gawk cpio gettext libelf-dev qemu-utils busybox dialog curl sed
|
||||
sudo snap install yq
|
||||
|
||||
df -h
|
||||
|
||||
# Get extractor, LKM, Addons, Modules, Theme and Configs
|
||||
- name: Get Dependencies for all Image
|
||||
run: |
|
||||
. scripts/func.sh "${{ secrets.BUILD_TOKEN }}"
|
||||
. scripts/func.sh
|
||||
|
||||
echo "Get Dependencies"
|
||||
getAddons "files/p3/addons"
|
||||
@@ -86,7 +90,8 @@ jobs:
|
||||
getOffline "files/p3/configs"
|
||||
getLKMs "files/p3/lkms"
|
||||
getTheme "files/p1/boot/grub"
|
||||
getBuildroot "evo" "br"
|
||||
getBuildrootx "brx"
|
||||
getBuildroots "brs"
|
||||
|
||||
# Export Dependencies Version to env
|
||||
echo "ADDONTAG=${ADDONTAG}" >> $GITHUB_ENV
|
||||
@@ -96,25 +101,27 @@ jobs:
|
||||
echo "CUSTOMTAG=${CUSTOMTAG}" >> $GITHUB_ENV
|
||||
echo "LKMTAG=${LKMTAG}" >> $GITHUB_ENV
|
||||
echo "THEMETAG=${THEMETAG}" >> $GITHUB_ENV
|
||||
echo "BRTAG=${BRTAG}" >> $GITHUB_ENV
|
||||
echo "BRXTAG=${BRXTAG}" >> $GITHUB_ENV
|
||||
echo "BRSTAG=${BRSTAG}" >> $GITHUB_ENV
|
||||
echo "BUILD_TIME=$(date +'%Y-%m-%d %H:%M')" >> $GITHUB_ENV
|
||||
|
||||
echo "OK"
|
||||
|
||||
# Build incremental
|
||||
- name: Build Image
|
||||
- name: Build Next Image
|
||||
if: ${{ inputs.next == true }}
|
||||
run: |
|
||||
. scripts/func.sh
|
||||
|
||||
# Modify Source File
|
||||
ARC_BUILD="$(date +'%y%m%d')"
|
||||
ARC_BUILD="`date +'%y%m%d'`"
|
||||
ARC_VERSION="${{ inputs.version }}"
|
||||
ARC_BRANCH="evo"
|
||||
echo "${ARC_BUILD}" > "files/p1/ARC-BUILD"
|
||||
ARC_BRANCH="next"
|
||||
echo "${ARC_BUILD}" >files/p1/ARC-BUILD
|
||||
echo "${ARC_VERSION}" >files/p1/ARC-VERSION
|
||||
echo "${ARC_BRANCH}" >files/p1/ARC-BRANCH
|
||||
echo "ARC_BUILD=${ARC_BUILD}" >> $GITHUB_ENV
|
||||
echo "${ARC_VERSION}" > "files/p1/ARC-VERSION"
|
||||
echo "ARC_VERSION=${ARC_VERSION}" >> $GITHUB_ENV
|
||||
echo "${ARC_BRANCH}" > "files/p1/ARC-BRANCH"
|
||||
echo "ARC_BRANCH=${ARC_BRANCH}" >> $GITHUB_ENV
|
||||
|
||||
echo "Create Arc Image"
|
||||
@@ -131,11 +138,12 @@ jobs:
|
||||
sudo mount ${LOOPX}p1 "/tmp/p1"
|
||||
sudo mount ${LOOPX}p3 "/tmp/p3"
|
||||
|
||||
[ ! -f "br/bzImage-arc" ] || [ ! -f "br/initrd-arc" ] && return 1
|
||||
[ ! -f "brx/bzImage-arc" ] || [ ! -f "brx/initrd-arc" ] && return 1
|
||||
|
||||
echo "Repack initrd"
|
||||
cp -f "br/bzImage-arc" "files/p3/bzImage-arc"
|
||||
repackInitrd "br/initrd-arc" "files/initrd" "files/p3/initrd-arc"
|
||||
cp -f "brx/bzImage-arc" "files/p3/bzImage-arc"
|
||||
#cp -f "brx/initrd-arc" "files/p3/initrd-arc"
|
||||
repackInitrd "brx/initrd-arc" "files/initrd" "files/p3/initrd-arc"
|
||||
|
||||
echo "Copying files"
|
||||
sudo cp -rf "files/p1/"* "/tmp/p1"
|
||||
@@ -151,27 +159,101 @@ jobs:
|
||||
sudo losetup --detach ${LOOPX}
|
||||
|
||||
echo "Image Converter"
|
||||
qemu-img convert -p -f raw -O vmdk ${IMAGE_FILE} arc-dyn.vmdk
|
||||
qemu-img convert -p -f raw -o subformat=monolithicFlat -O vmdk ${IMAGE_FILE} arc.vmdk
|
||||
|
||||
echo "Create Arc vhd"
|
||||
createvmc "arc.vmc"
|
||||
qemu-img convert -p -f raw -O vpc ${IMAGE_FILE} arc.vhd
|
||||
qemu-img convert ${IMAGE_FILE} -O vmdk -o adapter_type=lsilogic arc-dyn.vmdk
|
||||
qemu-img convert ${IMAGE_FILE} -O vmdk -o adapter_type=lsilogic,subformat=monolithicFlat arc.vmdk
|
||||
qemu-img convert ${IMAGE_FILE} -O vhdx -o subformat=dynamic arc.vhdx
|
||||
|
||||
echo "Create Arc ova"
|
||||
convertova "${IMAGE_FILE}" "arc.ova"
|
||||
|
||||
# Zip image and generate checksum
|
||||
- name: Pack Image
|
||||
- name: Pack Next Image
|
||||
if: ${{ inputs.next == true }}
|
||||
run: |
|
||||
if [ -n "${{ env.ARC_VERSION }}" ]; then
|
||||
zip -9 "arc-${{ env.ARC_VERSION }}-${{ env.ARC_BRANCH }}.img.zip" arc.img
|
||||
zip -9 "arc-${{ env.ARC_VERSION }}-${{ env.ARC_BRANCH }}.vmdk-dyn.zip" arc-dyn.vmdk
|
||||
zip -9 "arc-${{ env.ARC_VERSION }}-${{ env.ARC_BRANCH }}.vmdk-flat.zip" arc.vmdk arc-flat.vmdk
|
||||
zip -9 "arc-${{ env.ARC_VERSION }}-${{ env.ARC_BRANCH }}.vhd.zip" arc.vhd arc.vmc
|
||||
zip -9 "arc-${{ env.ARC_VERSION }}-${{ env.ARC_BRANCH }}.vhdx.zip" arc.vhdx
|
||||
zip -9 "arc-${{ env.ARC_VERSION }}-${{ env.ARC_BRANCH }}.ova.zip" arc.ova
|
||||
(cd files && zip -r ../update-${{ env.ARC_VERSION }}-${{ env.ARC_BRANCH }}.zip ./p1 ./p3)
|
||||
fi
|
||||
|
||||
# Cleanup
|
||||
- name: Cleanup
|
||||
run: |
|
||||
rm -rf "arc.img" "arc.ova" "arc.vmdk" "arc-dyn.vmdk" "arc.vhdx" "arc-flat.vmdk"
|
||||
|
||||
# Build incremental
|
||||
- name: Build Stable Image
|
||||
if: ${{ inputs.stable == true }}
|
||||
run: |
|
||||
. scripts/func.sh
|
||||
|
||||
# Modify Source File
|
||||
ARC_BUILD="`date +'%y%m%d'`"
|
||||
ARC_VERSION="${{ inputs.version }}"
|
||||
ARC_BRANCH="stable"
|
||||
echo "${ARC_BUILD}" >files/p1/ARC-BUILD
|
||||
echo "${ARC_VERSION}" >files/p1/ARC-VERSION
|
||||
echo "${ARC_BRANCH}" >files/p1/ARC-BRANCH
|
||||
echo "ARC_BUILD=${ARC_BUILD}" >> $GITHUB_ENV
|
||||
echo "ARC_VERSION=${ARC_VERSION}" >> $GITHUB_ENV
|
||||
echo "ARC_BRANCH=${ARC_BRANCH}" >> $GITHUB_ENV
|
||||
|
||||
echo "Create Arc Image"
|
||||
IMAGE_FILE="arc.img"
|
||||
gzip -dc "files/initrd/opt/arc/grub.img.gz" >"${IMAGE_FILE}"
|
||||
fdisk -l "${IMAGE_FILE}"
|
||||
|
||||
LOOPX=$(sudo losetup -f)
|
||||
sudo losetup -P "${LOOPX}" "${IMAGE_FILE}"
|
||||
|
||||
echo "Mounting Image File"
|
||||
mkdir -p "/tmp/p1"
|
||||
mkdir -p "/tmp/p3"
|
||||
sudo mount ${LOOPX}p1 "/tmp/p1"
|
||||
sudo mount ${LOOPX}p3 "/tmp/p3"
|
||||
|
||||
[ ! -f "brs/bzImage-arc" ] || [ ! -f "brs/initrd-arc" ] && return 1
|
||||
|
||||
echo "Repack initrd"
|
||||
cp -f "brs/bzImage-arc" "files/p3/bzImage-arc"
|
||||
#cp -f "brs/initrd-arc" "files/p3/initrd-arc"
|
||||
repackInitrd "brs/initrd-arc" "files/initrd" "files/p3/initrd-arc"
|
||||
|
||||
echo "Copying files"
|
||||
sudo cp -rf "files/p1/"* "/tmp/p1"
|
||||
sudo cp -rf "files/p3/"* "/tmp/p3"
|
||||
sudo sync
|
||||
|
||||
echo "Unmount image file"
|
||||
sudo umount "/tmp/p1"
|
||||
sudo umount "/tmp/p3"
|
||||
rmdir "/tmp/p1"
|
||||
rmdir "/tmp/p3"
|
||||
|
||||
sudo losetup --detach ${LOOPX}
|
||||
|
||||
echo "Image Converter"
|
||||
qemu-img convert ${IMAGE_FILE} -O vmdk -o adapter_type=lsilogic arc-dyn.vmdk
|
||||
qemu-img convert ${IMAGE_FILE} -O vmdk -o adapter_type=lsilogic,subformat=monolithicFlat arc.vmdk
|
||||
qemu-img convert ${IMAGE_FILE} -O vhdx -o subformat=dynamic arc.vhdx
|
||||
|
||||
echo "Create Arc ova"
|
||||
convertova "${IMAGE_FILE}" "arc.ova"
|
||||
|
||||
# Zip image and generate checksum
|
||||
- name: Pack Stable Image
|
||||
if: ${{ inputs.stable == true }}
|
||||
run: |
|
||||
if [ -n "${{ env.ARC_VERSION }}" ]; then
|
||||
zip -9 "arc-${{ env.ARC_VERSION }}-${{ env.ARC_BRANCH }}.img.zip" arc.img
|
||||
zip -9 "arc-${{ env.ARC_VERSION }}-${{ env.ARC_BRANCH }}.vmdk-dyn.zip" arc-dyn.vmdk
|
||||
zip -9 "arc-${{ env.ARC_VERSION }}-${{ env.ARC_BRANCH }}.vmdk-flat.zip" arc.vmdk arc-flat.vmdk
|
||||
zip -9 "arc-${{ env.ARC_VERSION }}-${{ env.ARC_BRANCH }}.vhdx.zip" arc.vhdx
|
||||
zip -9 "arc-${{ env.ARC_VERSION }}-${{ env.ARC_BRANCH }}.ova.zip" arc.ova
|
||||
(cd files && zip -r ../update-${{ env.ARC_VERSION }}-${{ env.ARC_BRANCH }}.zip ./p1 ./p3)
|
||||
sha256sum update-${{ env.ARC_VERSION }}-${{ env.ARC_BRANCH }}.zip >"update-${{ env.ARC_VERSION }}-${{ env.ARC_BRANCH }}.hash"
|
||||
fi
|
||||
|
||||
# Publish a release if is a tag
|
||||
@@ -188,9 +270,12 @@ jobs:
|
||||
- ${{ inputs.notice }}
|
||||
|
||||
### Information:
|
||||
- Full Changelog is available in my Discord
|
||||
- Discord Account for Arc Patch needed
|
||||
- Changelog is available in my Discord
|
||||
- Based on VisionZ Evolution Code Base
|
||||
|
||||
### Versions:
|
||||
- stable: Stable Image (Full Image, all dependencies are included, less hardware support)
|
||||
- next: Next Image (Full Image, all dependencies are included, more hardware support, new features to test)
|
||||
|
||||
### Dependencies:
|
||||
- Addons: ${{ env.ADDONTAG }}
|
||||
@@ -199,11 +284,11 @@ jobs:
|
||||
- Patches: ${{ env.PATCHTAG }}
|
||||
- Custom: ${{ env.CUSTOMTAG }}
|
||||
- LKMs: ${{ env.LKMTAG }}
|
||||
- Basesystem: ${{ env.BRTAG }}
|
||||
- Buildroot Stable: ${{ env.BRSTAG }}
|
||||
- Buildroot Next: ${{ env.BRXTAG }}
|
||||
|
||||
### Release
|
||||
- ${{ env.BUILD_TIME }}
|
||||
artifacts: |
|
||||
arc-*.zip
|
||||
update-*.zip
|
||||
update-*.hash
|
||||
|
||||
76
.github/workflows/custom.yml
vendored
76
.github/workflows/custom.yml
vendored
@@ -161,41 +161,64 @@ jobs:
|
||||
|
||||
cp -f "${IMAGE_FILE}" "arc.img"
|
||||
|
||||
# Zip image and generate checksum
|
||||
- name: Convert & Pack
|
||||
run: |
|
||||
rm -rf arc-*.zip 2>/dev/null
|
||||
if [ "${{ env.FORMAT }}" = "img" ]; then
|
||||
zip -9 "arc-${{ env.MODEL }}-${{ env.VERSION }}.img.zip" arc.img
|
||||
elif [ "${{ env.FORMAT }}" = "dyn" ]; then
|
||||
if [ "${{ env.FORMAT }}" = "dyn" ]; then
|
||||
echo "Image Converter -> dyn"
|
||||
qemu-img convert arc.img -O vmdk -o adapter_type=lsilogic,compat6 arc-dyn.vmdk
|
||||
zip -9 "arc-${{ env.MODEL }}-${{ env.VERSION }}.vmdk-dyn.zip" arc-dyn.vmdk
|
||||
elif [ "${{ env.FORMAT }}" = "flat" ]; then
|
||||
echo "Image Converter -> flat"
|
||||
qemu-img convert arc.img -O vmdk -o adapter_type=lsilogic,subformat=monolithicFlat,compat6 arc.vmdk
|
||||
zip -9 "arc-${{ env.MODEL }}-${{ env.VERSION }}.vmdk-flat.zip" arc.vmdk arc-flat.vmdk
|
||||
elif [ "${{ env.FORMAT }}" = "vhdx" ]; then
|
||||
echo "Image Converter -> vhdx"
|
||||
qemu-img convert arc.img -O vhdx -o subformat=dynamic arc.vhdx
|
||||
zip -9 "arc-${{ env.MODEL }}-${{ env.VERSION }}.vhdx.zip" arc.vhdx
|
||||
elif [ "${{ env.FORMAT }}" = "ova" ]; then
|
||||
echo "Image Converter -> ova"
|
||||
convertova "arc.img" "arc.ova"
|
||||
fi
|
||||
|
||||
# Zip image and generate checksum
|
||||
- name: Pack
|
||||
run: |
|
||||
if [ "${{ env.FORMAT }}" = "img" ]; then
|
||||
zip -9 "arc-${{ env.MODEL }}-${{ env.VERSION }}.img.zip" arc.img
|
||||
UPLOAD="$(curl -k -F "file=@arc-${{ env.MODEL }}-${{ env.VERSION }}.img.zip" "https://file.io")"
|
||||
if ! echo "${UPLOAD}" | grep -oP '"link":\s*"\K[^"]+'; then
|
||||
echo "Upload failed"
|
||||
exit 1
|
||||
fi
|
||||
elif [ "${{ env.FORMAT }}" = "dyn" ]; then
|
||||
zip -9 "arc-${{ env.MODEL }}-${{ env.VERSION }}.vmdk-dyn.zip" arc-dyn.vmdk
|
||||
UPLOAD="$(curl -k -F "file=@arc-${{ env.MODEL }}-${{ env.VERSION }}.vmdk-dyn.zip" "https://file.io")"
|
||||
if ! echo "${UPLOAD}" | grep -oP '"link":\s*"\K[^"]+'; then
|
||||
echo "Upload failed"
|
||||
exit 1
|
||||
fi
|
||||
elif [ "${{ env.FORMAT }}" = "flat" ]; then
|
||||
zip -9 "arc-${{ env.MODEL }}-${{ env.VERSION }}.vmdk-flat.zip" arc.vmdk arc-flat.vmdk
|
||||
UPLOAD="$(curl -k -F "file=@arc-${{ env.MODEL }}-${{ env.VERSION }}.vmdk-flat.zip" "https://file.io")"
|
||||
if ! echo "${UPLOAD}" | grep -oP '"link":\s*"\K[^"]+'; then
|
||||
echo "Upload failed"
|
||||
exit 1
|
||||
fi
|
||||
elif [ "${{ env.FORMAT }}" = "vhdx" ]; then
|
||||
zip -9 "arc-${{ env.MODEL }}-${{ env.VERSION }}.vhdx.zip" arc.vhdx
|
||||
UPLOAD="$(curl -k -F "file=@arc-${{ env.MODEL }}-${{ env.VERSION }}.vhdx.zip" "https://file.io")"
|
||||
if ! echo "${UPLOAD}" | grep -oP '"link":\s*"\K[^"]+'; then
|
||||
echo "Upload failed"
|
||||
exit 1
|
||||
fi
|
||||
elif [ "${{ env.FORMAT }}" = "ova" ]; then
|
||||
zip -9 "arc-${{ env.MODEL }}-${{ env.VERSION }}.ova.zip" arc.ova
|
||||
UPLOAD="$(curl -k -F "file=@arc-${{ env.MODEL }}-${{ env.VERSION }}.ova.zip" "https://file.io")"
|
||||
if ! echo "${UPLOAD}" | grep -oP '"link":\s*"\K[^"]+'; then
|
||||
echo "Upload failed"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
EMAIL=$(curl -s -H "Authorization: token ${{ secrets.ACTION }}" "https://api.github.com/users/${{ github.event.issue.user.login }}" | jq -r '.email')
|
||||
FIOURL="$(echo "${UPLOAD}" | grep -oP '"link":\s*"\K[^"]+')"
|
||||
echo "EMAIL=${EMAIL}" >> $GITHUB_ENV
|
||||
|
||||
# Upload artifact
|
||||
- name: Upload to Artifacts
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: arc-${{ env.MODEL }}-${{ env.VERSION }}-${{ github.run_id }}
|
||||
path: |
|
||||
arc-*.zip
|
||||
retention-days: 1
|
||||
echo "FIOURL=${FIOURL}" >> $GITHUB_ENV
|
||||
|
||||
- name: Send mail
|
||||
if: success() && env.EMAIL != 'null'
|
||||
@@ -209,12 +232,7 @@ jobs:
|
||||
to: ${{ env.EMAIL }}
|
||||
from: ${{ secrets.MAIL_USERNAME }}
|
||||
body: |
|
||||
Hi @${{ github.event.issue.user.login }}.
|
||||
arc-${{ env.MODEL }}-${{ env.VERSION }} is ready to download:
|
||||
> ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
|
||||
|
||||
If this isn't working, do not use customized Versions!
|
||||
----
|
||||
${{ env.FIOURL }}
|
||||
|
||||
- name: Update Comment Success
|
||||
if: success()
|
||||
@@ -226,10 +244,10 @@ jobs:
|
||||
update-mode: replace
|
||||
body: |
|
||||
Hi @${{ github.event.issue.user.login }}.
|
||||
arc-${{ env.MODEL }}-${{ env.VERSION }} is ready to download:
|
||||
arc-${{ env.MODEL }}-${{ env.VERSION }} is ready to download: ${{ env.FIOURL }}
|
||||
> ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
|
||||
|
||||
If this isn't working, do not use customized Versions!
|
||||
If this will not work, do not use customized Versions!
|
||||
----
|
||||
|
||||
- name: Update Comment Fail
|
||||
@@ -242,8 +260,10 @@ jobs:
|
||||
update-mode: replace
|
||||
body: |
|
||||
Hi @${{ github.event.issue.user.login }}.
|
||||
arc-${{ env.MODEL }}-${{ env.PRODUCTVER }}-${{ env.VERSION }} failed to build and package, please try again later.
|
||||
arc-${{ env.MODEL }}-${{ env.PRODUCTVER }}-${{ env.VERSION }} failed to build and package, please try again.
|
||||
> ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
|
||||
|
||||
If this will not work, do not use customized Versions!
|
||||
----
|
||||
|
||||
- name: Close Issues
|
||||
|
||||
2
.github/workflows/data.yml
vendored
2
.github/workflows/data.yml
vendored
@@ -43,7 +43,7 @@ jobs:
|
||||
|
||||
TAG=""
|
||||
if [ "${PRERELEASE}" = "true" ]; then
|
||||
TAG="$(curl -skL --connect-timeout 10 "${REPO}/tags" | grep /refs/tags/.*\.zip | sed -E 's/.*\/refs\/tags\/(.*)\.zip.*$/\1/' | sort -rV | head -1)"
|
||||
TAG="$(curl -skL --connect-timeout 10 "${REPO}/tags" | grep /refs/tags/.*\.zip | sed -r 's/.*\/refs\/tags\/(.*)\.zip.*$/\1/' | sort -rV | head -1)"
|
||||
else
|
||||
LATESTURL="$(curl -skL --connect-timeout 10 -w %{url_effective} -o /dev/null "${REPO}/releases/latest")"
|
||||
TAG="${LATESTURL##*/}"
|
||||
|
||||
13
.github/workflows/grub.yml
vendored
13
.github/workflows/grub.yml
vendored
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (C) 2025 AuxXxilium <https://github.com/AuxXxilium>
|
||||
# Copyright (C) 2023 AuxXxilium <https://github.com/AuxXxilium>
|
||||
#
|
||||
# This is free software, licensed under the MIT License.
|
||||
# See /LICENSE for more information.
|
||||
@@ -28,19 +28,20 @@ jobs:
|
||||
sudo timedatectl set-timezone "Europe/Berlin"
|
||||
|
||||
sudo apt update
|
||||
sudo apt install -y autoconf automake autopoint build-essential pkg-config bison flex gettext gawk libtool dosfstools e2fsprogs
|
||||
sudo apt install -y libfreetype6-dev unifont fonts-dejavu libfuse-dev libzfslinux-dev liblzma-dev libdevmapper-dev
|
||||
sudo apt install -y autoconf automake autopoint gettext build-essential bison flex libtool dosfstools e2fsprogs
|
||||
sudo apt install -y libfreetype6-dev unifont fonts-dejavu libfuse-dev liblzma-dev libzfslinux-dev
|
||||
|
||||
- name: Make Grub
|
||||
run: |
|
||||
rm -f "files/initrd/opt/arc/grub.img.gz"
|
||||
. scripts/grub.sh "grub-2.12" "i386-pc i386-efi x86_64-efi" "ARC"
|
||||
. scripts/grub.sh "grub-2.12" "i386-pc i386-efi x86_64-efi"
|
||||
|
||||
- name: Check and Push
|
||||
if: success() && inputs.push == true
|
||||
run: |
|
||||
if [ -f "grub.img.gz" ]; then
|
||||
mv -f "grub.img.gz" "files/initrd/opt/arc/grub.img.gz"
|
||||
echo "Copy img ..."
|
||||
mv -f grub.img.gz files/initrd/opt/arc/grub.img.gz
|
||||
|
||||
echo "Git push ..."
|
||||
git pull
|
||||
status=$(git status -s | grep -E 'grub.img.gz' | awk '{printf " %s", $2}')
|
||||
|
||||
@@ -3,11 +3,15 @@
|
||||
version: "3"
|
||||
|
||||
tasks:
|
||||
build-evo:
|
||||
build-img-n:
|
||||
cmds:
|
||||
- git reset --hard
|
||||
- git pull
|
||||
- ./img-gen.sh evo
|
||||
- ./img-gen-n.sh
|
||||
|
||||
build-img-s:
|
||||
cmds:
|
||||
- git pull
|
||||
- ./img-gen-s.sh
|
||||
|
||||
compile-kpatch:
|
||||
dir: kpatch
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -3,31 +3,35 @@
|
||||
set -e
|
||||
[[ -z "${ARC_PATH}" || ! -d "${ARC_PATH}/include" ]] && ARC_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)"
|
||||
|
||||
. "${ARC_PATH}/include/functions.sh"
|
||||
|
||||
arc_mode || die "No bootmode found!"
|
||||
. ${ARC_PATH}/include/functions.sh
|
||||
|
||||
# Clear logs for dbgutils addons
|
||||
rm -rf "${PART1_PATH}/logs" >/dev/null 2>&1 || true
|
||||
|
||||
BUILDDONE="$(readConfigKey "arc.builddone" "${USER_CONFIG_FILE}")"
|
||||
[ "${BUILDDONE}" == "false" ] && die "Loader build not completed!"
|
||||
ARC_BRANCH="$(readConfigKey "arc.branch" "${USER_CONFIG_FILE}")"
|
||||
|
||||
# Get Loader Disk Bus
|
||||
[ -z "${LOADER_DISK}" ] && die "Loader Disk not found!"
|
||||
BUS=$(getBus "${LOADER_DISK}")
|
||||
EFI=$([ -d /sys/firmware/efi ] && echo 1 || echo 0)
|
||||
# Check if machine has EFI
|
||||
[ -d /sys/firmware/efi ] && EFI=1 || EFI=0
|
||||
|
||||
# Print Title centralized
|
||||
clear
|
||||
COLUMNS=${COLUMNS:-50}
|
||||
BANNER="$(figlet -c -w "$(((${COLUMNS})))" "Arc Loader")"
|
||||
TITLE="Version:"
|
||||
TITLE+=" ${ARC_VERSION} (${ARC_BUILD}) | Branch: ${ARC_BRANCH}"
|
||||
TITLE+=" ${ARC_VERSION} (${ARC_BUILD})"
|
||||
[ -n "${ARC_BRANCH}" ] && TITLE+=" | Branch: ${ARC_BRANCH}"
|
||||
printf "\033[1;30m%*s\n" ${COLUMNS} ""
|
||||
printf "\033[1;30m%*s\033[A\n" ${COLUMNS} ""
|
||||
printf "\033[1;34m%*s\033[0m\n" ${COLUMNS} "${BANNER}"
|
||||
printf "\033[1;34m%*s\033[0m\n" $(((${#TITLE} + ${COLUMNS}) / 2)) "${TITLE}"
|
||||
TITLE="Boot:"
|
||||
[ ${EFI} -eq 1 ] && TITLE+=" [UEFI]" || TITLE+=" [BIOS]"
|
||||
TITLE+=" | Device: [${BUS}] | Mode: [${ARCMODE}]"
|
||||
TITLE+=" [${BUS}]"
|
||||
printf "\033[1;34m%*s\033[0m\n" $(((${#TITLE} + ${COLUMNS}) / 2)) "${TITLE}"
|
||||
# Check if DSM zImage/Ramdisk is changed, patch it if necessary, update Files if necessary
|
||||
ZIMAGE_HASH="$(readConfigKey "zimage-hash" "${USER_CONFIG_FILE}")"
|
||||
@@ -48,79 +52,43 @@ PRODUCTVER="$(readConfigKey "productver" "${USER_CONFIG_FILE}")"
|
||||
BUILDNUM="$(readConfigKey "buildnum" "${USER_CONFIG_FILE}")"
|
||||
SMALLNUM="$(readConfigKey "smallnum" "${USER_CONFIG_FILE}")"
|
||||
LKM="$(readConfigKey "lkm" "${USER_CONFIG_FILE}")"
|
||||
KERNEL="$(readConfigKey "kernel" "${USER_CONFIG_FILE}")"
|
||||
KVER="$(readConfigKey "platforms.${PLATFORM}.productvers.\"${PRODUCTVER}\".kver" "${P_FILE}")"
|
||||
CPU="$(echo $(cat /proc/cpuinfo 2>/dev/null | grep 'model name' | uniq | awk -F':' '{print $2}'))"
|
||||
RAMTOTAL="$(awk '/MemTotal:/ {printf "%.0f\n", $2 / 1024 / 1024 + 0.5}' /proc/meminfo 2>/dev/null)"
|
||||
VENDOR="$(dmesg 2>/dev/null | grep -i "DMI:" | head -1 | sed 's/\[.*\] DMI: //i')"
|
||||
DSMINFO="$(readConfigKey "bootscreen.dsminfo" "${USER_CONFIG_FILE}")"
|
||||
SYSTEMINFO="$(readConfigKey "bootscreen.systeminfo" "${USER_CONFIG_FILE}")"
|
||||
DISKINFO="$(readConfigKey "bootscreen.diskinfo" "${USER_CONFIG_FILE}")"
|
||||
HWIDINFO="$(readConfigKey "bootscreen.hwidinfo" "${USER_CONFIG_FILE}")"
|
||||
GOVERNOR="$(readConfigKey "governor" "${USER_CONFIG_FILE}")"
|
||||
USBMOUNT="$(readConfigKey "usbmount" "${USER_CONFIG_FILE}")"
|
||||
BUILDDONE="$(readConfigKey "arc.builddone" "${USER_CONFIG_FILE}")"
|
||||
DSMINFO="$(readConfigKey "boot.dsminfo" "${USER_CONFIG_FILE}")"
|
||||
SYSTEMINFO="$(readConfigKey "boot.systeminfo" "${USER_CONFIG_FILE}")"
|
||||
DISKINFO="$(readConfigKey "boot.diskinfo" "${USER_CONFIG_FILE}")"
|
||||
|
||||
# Build Sanity Check
|
||||
[ "${BUILDDONE}" = "false" ] && die "Loader build not completed!"
|
||||
[[ -z "${MODELID}" || "${MODELID}" != "${MODEL}" ]] && die "Loader build not completed! Model mismatch!"
|
||||
# HardwareID Check
|
||||
if [ "${ARCPATCH}" = "true" ]; then
|
||||
HARDWAREID="$(readConfigKey "arc.hardwareid" "${USER_CONFIG_FILE}")"
|
||||
HWID="$(genHWID)"
|
||||
if [ "${HARDWAREID}" != "${HWID}" ]; then
|
||||
echo -e "\033[1;31m*** HardwareID does not match! - Loader can't boot to DSM! You need to reconfigure your Loader - Rebooting to Config Mode! ***\033[0m"
|
||||
writeConfigKey "arc.patch" "false" "${USER_CONFIG_FILE}"
|
||||
writeConfigKey "arc.hardwareid" "" "${USER_CONFIG_FILE}"
|
||||
writeConfigKey "arc.userid" "" "${USER_CONFIG_FILE}"
|
||||
sleep 5
|
||||
rebootTo "config"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "${DSMINFO}" = "true" ]; then
|
||||
if [ "${DSMINFO}" == "true" ]; then
|
||||
echo -e "\033[1;37mDSM:\033[0m"
|
||||
echo -e "Model: \033[1;37m${MODELID:-${MODEL}}\033[0m"
|
||||
echo -e "Platform: \033[1;37m${PLATFORM}\033[0m"
|
||||
echo -e "Version: \033[1;37m${PRODUCTVER} (${BUILDNUM}$([ ${SMALLNUM:-0} -ne 0 ] && echo "u${SMALLNUM}"))\033[0m"
|
||||
echo -e "Kernel: \033[1;37m${KVER} (${KERNEL})\033[0m"
|
||||
echo -e "LKM: \033[1;37m${LKM}\033[0m"
|
||||
echo
|
||||
fi
|
||||
if [ "${SYSTEMINFO}" = "true" ]; then
|
||||
if [ "${SYSTEMINFO}" == "true" ]; then
|
||||
echo -e "\033[1;37mSystem:\033[0m"
|
||||
echo -e "Vendor: \033[1;37m${VENDOR}\033[0m"
|
||||
echo -e "CPU: \033[1;37m${CPU}\033[0m"
|
||||
echo -e "Memory: \033[1;37m${RAMTOTAL}GB\033[0m"
|
||||
echo -e "Governor: \033[1;37m${GOVERNOR}\033[0m"
|
||||
[ "${USBMOUNT}" = "true" ] && echo -e "USB Mount: \033[1;37m${USBMOUNT}\033[0m"
|
||||
echo
|
||||
fi
|
||||
if [ "${DISKINFO}" = "true" ]; then
|
||||
if [ "${DISKINFO}" == "true" ]; then
|
||||
echo -e "\033[1;37mDisks:\033[0m"
|
||||
echo -e "Disks: \033[1;37m$(lsblk -dpno NAME | grep -v "${LOADER_DISK}" | wc -l)\033[0m"
|
||||
fi
|
||||
if [ "${HWIDINFO}" = "true" ]; then
|
||||
echo -e "\033[1;37mHardwareID:\033[0m"
|
||||
echo -e "HWID: \033[1;37m$(genHWID)\033[0m"
|
||||
echo
|
||||
fi
|
||||
|
||||
if ! readConfigMap "addons" "${USER_CONFIG_FILE}" | grep -q nvmesystem; then
|
||||
HASATA=0
|
||||
for D in $(lsblk -dpno NAME); do
|
||||
[ "${D}" = "${LOADER_DISK}" ] && continue
|
||||
[ "${D}" == "${LOADER_DISK}" ] && continue
|
||||
if echo "sata sas scsi" | grep -qw "$(getBus "${D}")"; then
|
||||
HASATA=1
|
||||
break
|
||||
fi
|
||||
done
|
||||
[ ${HASATA} -eq 0 ] && echo -e "\033[1;31m*** Note: Please insert at least one Sata/SAS/SCSI Disk for System installation, except the Bootloader Disk. ***\033[0m"
|
||||
fi
|
||||
|
||||
if checkBIOS_VT_d && [ $(echo "${KVER:-4}" | cut -d'.' -f1) -lt 5 ]; then
|
||||
echo -e "\033[1;31m*** Notice: Disable Intel(VT-d)/AMD(AMD-V) in BIOS/UEFI settings if you encounter a boot failure. ***\033[0m"
|
||||
echo
|
||||
[ ${HASATA} -eq 0 ] && echo -e "\033[1;31m*** Please insert at least one Sata/SAS/SCSI Disk for System installation, except for the Bootloader Disk. ***\033[0m"
|
||||
fi
|
||||
|
||||
# Read necessary variables
|
||||
@@ -137,37 +105,23 @@ ARCPATCH="$(readConfigKey "arc.patch" "${USER_CONFIG_FILE}")"
|
||||
declare -A CMDLINE
|
||||
|
||||
# Automated Cmdline
|
||||
CMDLINE["syno_hw_version"]="${MODELID}"
|
||||
CMDLINE["vid"]="${VID:-"0x46f4"}" # Sanity check
|
||||
CMDLINE["pid"]="${PID:-"0x0001"}" # Sanity check
|
||||
CMDLINE["sn"]="${SN}"
|
||||
|
||||
# NIC Cmdline
|
||||
ETHX=$(ls /sys/class/net/ 2>/dev/null | grep eth)
|
||||
ETHM=$(readConfigKey "${MODEL}.ports" "${S_FILE}" 2>/dev/null)
|
||||
ETHN=$(echo "${ETHX}" | wc -w)
|
||||
ETHM=${ETHM:-${ETHN}}
|
||||
NIC=0
|
||||
for N in ${ETHX}; do
|
||||
MAC=$(readConfigKey "${N}" "${USER_CONFIG_FILE}" 2>/dev/null)
|
||||
MAC=${MAC:-$(cat /sys/class/net/${N}/address 2>/dev/null | tr '[:upper:]' '[:lower:]')}
|
||||
CMDLINE["mac$((++NIC))"]="${MAC}"
|
||||
[ ${NIC} -ge ${ETHM} ] && break
|
||||
done
|
||||
CMDLINE["netif_num"]="${NIC}"
|
||||
CMDLINE['syno_hw_version']="${MODELID:-${MODEL}}"
|
||||
CMDLINE['vid']="${VID:-"0x46f4"}" # Sanity check
|
||||
CMDLINE['pid']="${PID:-"0x0001"}" # Sanity check
|
||||
CMDLINE['sn']="${SN}"
|
||||
|
||||
# Boot Cmdline
|
||||
if grep -q "force_junior" /proc/cmdline; then
|
||||
CMDLINE["force_junior"]=""
|
||||
CMDLINE['force_junior']=""
|
||||
fi
|
||||
if grep -q "recovery" /proc/cmdline; then
|
||||
CMDLINE["force_junior"]=""
|
||||
CMDLINE["recovery"]=""
|
||||
CMDLINE['force_junior']=""
|
||||
CMDLINE['recovery']=""
|
||||
fi
|
||||
if [ ${EFI} -eq 1 ]; then
|
||||
CMDLINE["withefi"]=""
|
||||
CMDLINE['withefi']=""
|
||||
else
|
||||
CMDLINE["noefi"]=""
|
||||
CMDLINE['noefi']=""
|
||||
fi
|
||||
|
||||
# DSM Cmdline
|
||||
@@ -185,8 +139,7 @@ if [ $(echo "${KVER:-4}" | cut -d'.' -f1) -lt 5 ]; then
|
||||
else
|
||||
CMDLINE["split_lock_detect"]="off"
|
||||
fi
|
||||
|
||||
if [ "${DT}" = "true" ]; then
|
||||
if [ "${DT}" == "true" ]; then
|
||||
CMDLINE["syno_ttyS0"]="serial,0x3f8"
|
||||
CMDLINE["syno_ttyS1"]="serial,0x2f8"
|
||||
else
|
||||
@@ -194,67 +147,60 @@ else
|
||||
CMDLINE["syno_hdd_detect"]="0"
|
||||
CMDLINE["syno_hdd_powerup_seq"]="0"
|
||||
fi
|
||||
|
||||
CMDLINE["HddHotplug"]="1"
|
||||
CMDLINE["vender_format_version"]="2"
|
||||
CMDLINE['skip_vender_mac_interfaces']="0,1,2,3,4,5,6,7"
|
||||
|
||||
CMDLINE['earlyprintk']=""
|
||||
CMDLINE['earlycon']="uart8250,io,0x3f8,115200n8"
|
||||
CMDLINE['console']="ttyS0,115200n8"
|
||||
CMDLINE['consoleblank']="600"
|
||||
# CMDLINE['no_console_suspend']="1"
|
||||
CMDLINE['root']="/dev/md0"
|
||||
CMDLINE['rootwait']=""
|
||||
CMDLINE['loglevel']="15"
|
||||
CMDLINE['log_buf_len']="32M"
|
||||
CMDLINE['rootwait']=""
|
||||
CMDLINE['panic']="${KERNELPANIC:-0}"
|
||||
# CMDLINE['intremap']="off" # workaround for mlx5_core througput issues from linux mailing list (need more testing)
|
||||
# CMDLINE['amd_iommu_intr']="legacy" # workaround for mlx5_core througput issues from linux mailing list (need more testing)
|
||||
CMDLINE['pcie_aspm']="off"
|
||||
# CMDLINE['intel_pstate']="disable"
|
||||
# CMDLINE['amd_pstate']="disable"
|
||||
# CMDLINE['nomodeset']=""
|
||||
CMDLINE['modprobe.blacklist']="${MODBLACKLIST}"
|
||||
#[ $(cat /proc/cpuinfo | grep Intel | wc -l) -gt 0 ] && CMDLINE["intel_pstate"]="disable"
|
||||
|
||||
if [ "${USBMOUNT}" = "true" ]; then
|
||||
CMDLINE['usbinternal']=""
|
||||
fi
|
||||
|
||||
if [ -n "${GOVERNOR}" ]; then
|
||||
CMDLINE['governor']="${GOVERNOR}"
|
||||
fi
|
||||
|
||||
if echo "apollolake geminilake purley" | grep -wq "${PLATFORM}"; then
|
||||
CMDLINE["nox2apic"]=""
|
||||
fi
|
||||
|
||||
# Disabled for now
|
||||
# if [ -n "$(ls /dev/mmcblk* 2>/dev/null)" ] && [ "${BUS}" != "mmc" ] && [ "${EMMCBOOT}" != "true" ]; then
|
||||
# if ! echo "${CMDLINE["modprobe.blacklist"]}" | grep -q "sdhci"; then
|
||||
# [ ! "${CMDLINE["modprobe.blacklist"]}" = "" ] && CMDLINE["modprobe.blacklist"]+=","
|
||||
# CMDLINE["modprobe.blacklist"]+="sdhci,sdhci_pci,sdhci_acpi"
|
||||
#if [ -n "$(ls /dev/mmcblk* 2>/dev/null)" ] && [ "${BUS}" != "mmc" ] && [ "${EMMCBOOT}" != "true" ]; then
|
||||
# if ! echo "${CMDLINE['modprobe.blacklist']}" | grep -q "sdhci"; then
|
||||
# [ ! "${CMDLINE['modprobe.blacklist']}" == "" ] && CMDLINE['modprobe.blacklist']+=","
|
||||
# CMDLINE['modprobe.blacklist']+="sdhci,sdhci_pci,sdhci_acpi"
|
||||
# fi
|
||||
# fi
|
||||
if [ "${DT}" = "true" ] && ! echo "epyc7002 purley broadwellnkv2" | grep -wq "${PLATFORM}"; then
|
||||
if [ "${DT}" == "true" ] && ! echo "epyc7002 purley broadwellnkv2" | grep -wq "${PLATFORM}"; then
|
||||
if ! echo "${CMDLINE['modprobe.blacklist']}" | grep -q "mpt3sas"; then
|
||||
[ ! "${CMDLINE['modprobe.blacklist']}" = "" ] && CMDLINE['modprobe.blacklist']+=","
|
||||
[ ! "${CMDLINE['modprobe.blacklist']}" == "" ] && CMDLINE['modprobe.blacklist']+=","
|
||||
CMDLINE['modprobe.blacklist']+="mpt3sas"
|
||||
fi
|
||||
#else
|
||||
# CMDLINE['scsi_mod.scan']="sync" # TODO: redpill panic of vmware scsi? (add to cmdline)
|
||||
fi
|
||||
|
||||
# CMDLINE['kvm.ignore_msrs']="1"
|
||||
# CMDLINE['kvm.report_ignored_msrs']="0"
|
||||
|
||||
if echo "apollolake geminilake" | grep -wq "${PLATFORM}"; then
|
||||
CMDLINE["intel_iommu"]="igfx_off"
|
||||
fi
|
||||
|
||||
if echo "purley broadwellnkv2" | grep -wq "${PLATFORM}"; then
|
||||
CMDLINE["SASmodel"]="1"
|
||||
fi
|
||||
|
||||
# Cmdline NIC Settings
|
||||
ETHX="$(ls /sys/class/net 2>/dev/null | grep eth)"
|
||||
ETHM="$(readConfigKey "${MODEL}.ports" "${S_FILE}" 2>/dev/null)"
|
||||
ETHN="$(echo ${ETHX} | wc -w)"
|
||||
[ -z "${ETHM}" ] && ETHM="${ETHN}"
|
||||
NIC=0
|
||||
for ETH in ${ETHX}; do
|
||||
MAC="$(readConfigKey "${ETH}" "${USER_CONFIG_FILE}")"
|
||||
[ -z "${MAC}" ] && MAC="$(cat /sys/class/net/${ETH}/address 2>/dev/null | tr '[:lower:]' '[:upper:]')"
|
||||
NIC=$((${NIC} + 1))
|
||||
[ ${NIC} -le ${ETHM} ] && CMDLINE["mac${NIC}"]="${MAC}"
|
||||
[ ${NIC} -ge ${ETHM} ] && break
|
||||
done
|
||||
CMDLINE['netif_num']="${NIC}"
|
||||
|
||||
# Read user network settings
|
||||
while IFS=': ' read -r KEY VALUE; do
|
||||
[ -n "${KEY}" ] && CMDLINE["network.${KEY}"]="${VALUE}"
|
||||
@@ -267,7 +213,7 @@ done < <(readConfigMap "cmdline" "${USER_CONFIG_FILE}")
|
||||
|
||||
# Prepare command line
|
||||
CMDLINE_LINE=""
|
||||
for KEY in "${!CMDLINE[@]}"; do
|
||||
for KEY in ${!CMDLINE[@]}; do
|
||||
VALUE="${CMDLINE[${KEY}]}"
|
||||
CMDLINE_LINE+=" ${KEY}"
|
||||
[ -n "${VALUE}" ] && CMDLINE_LINE+="=${VALUE}"
|
||||
@@ -275,71 +221,112 @@ done
|
||||
CMDLINE_LINE=$(echo "${CMDLINE_LINE}" | sed 's/^ //') # Remove leading space
|
||||
echo "${CMDLINE_LINE}" >"${PART1_PATH}/cmdline.yml"
|
||||
|
||||
function _bootwait() {
|
||||
# Exec Bootwait to check SSH/Web connection
|
||||
BOOTWAIT=5
|
||||
busybox w 2>/dev/null | awk '{print $1" "$2" "$4" "$5" "$6}' >WB
|
||||
MSG=""
|
||||
while test ${BOOTWAIT} -ge 0; do
|
||||
MSG="\033[1;33mAccess SSH/Web will interrupt boot...\033[0m"
|
||||
echo -en "\r${MSG}"
|
||||
busybox w 2>/dev/null | awk '{print $1" "$2" "$4" "$5" "$6}' >WC
|
||||
if ! diff WB WC >/dev/null 2>&1; then
|
||||
echo -en "\r\033[1;33mAccess SSH/Web detected and boot is interrupted.\033[0m\n"
|
||||
rm -f WB WC
|
||||
exit 0
|
||||
fi
|
||||
sleep 1
|
||||
BOOTWAIT=$((BOOTWAIT - 1))
|
||||
done
|
||||
rm -f WB WC
|
||||
echo -en "\r$(printf "%$((${#MSG} * 2))s" " ")\n"
|
||||
return 0
|
||||
}
|
||||
|
||||
# Boot
|
||||
DIRECTBOOT="$(readConfigKey "directboot" "${USER_CONFIG_FILE}")"
|
||||
if [ "${DIRECTBOOT}" = "true" ]; then
|
||||
if [ "${DIRECTBOOT}" == "true" ]; then
|
||||
CMDLINE_DIRECT=$(echo ${CMDLINE_LINE} | sed 's/>/\\\\>/g') # Escape special chars
|
||||
grub-editenv ${USER_GRUBENVFILE} set dsm_cmdline="${CMDLINE_DIRECT}"
|
||||
grub-editenv ${USER_GRUBENVFILE} set next_entry="direct"
|
||||
_bootwait || true
|
||||
echo -e "\033[1;34mReboot with Directboot\033[0m"
|
||||
reboot
|
||||
exec reboot
|
||||
exit 0
|
||||
elif [ "${DIRECTBOOT}" = "false" ]; then
|
||||
elif [ "${DIRECTBOOT}" == "false" ]; then
|
||||
grub-editenv ${USER_GRUBENVFILE} unset dsm_cmdline
|
||||
grub-editenv ${USER_GRUBENVFILE} unset next_entry
|
||||
KERNELLOAD="$(readConfigKey "kernelload" "${USER_CONFIG_FILE}")"
|
||||
BOOTIPWAIT="$(readConfigKey "bootipwait" "${USER_CONFIG_FILE}")"
|
||||
[ -z "${BOOTIPWAIT}" ] && BOOTIPWAIT=30
|
||||
IPCON=""
|
||||
echo
|
||||
if [ "${ARCPATCH}" = "true" ]; then
|
||||
if [ "${ARCPATCH}" == "true" ]; then
|
||||
echo -e "\033[1;37mDetected ${ETHN} NIC\033[0m | \033[1;34mUsing ${NIC} NIC for Arc Patch:\033[0m"
|
||||
else
|
||||
echo -e "\033[1;37mDetected ${ETHN} NIC:\033[0m"
|
||||
fi
|
||||
echo
|
||||
|
||||
[ ! -f /var/run/dhcpcd/pid ] && /etc/init.d/S09dhcpcd restart >/dev/null 2>&1 || true
|
||||
[ ! -f /var/run/dhcpcd/pid ] && /etc/init.d/S41dhcpcd restart >/dev/null 2>&1 || true
|
||||
sleep 3
|
||||
checkNIC
|
||||
echo
|
||||
for ETH in ${ETHX}; do
|
||||
COUNT=0
|
||||
DRIVER=$(ls -ld /sys/class/net/${ETH}/device/driver 2>/dev/null | awk -F '/' '{print $NF}')
|
||||
while true; do
|
||||
if ethtool ${ETH} 2>/dev/null | grep 'Link detected' | grep -q 'no'; then
|
||||
echo -e "\r${DRIVER}: \033[1;37mNOT CONNECTED\033[0m"
|
||||
break
|
||||
fi
|
||||
COUNT=$((${COUNT} + 1))
|
||||
IP="$(getIP ${ETH})"
|
||||
if [ -n "${IP}" ]; then
|
||||
SPEED=$(ethtool ${ETH} 2>/dev/null | grep "Speed:" | awk '{print $2}')
|
||||
if [[ "${IP}" =~ ^169\.254\..* ]]; then
|
||||
echo -e "\r${DRIVER} (${SPEED}): \033[1;37mLINK LOCAL (No DHCP server found.)\033[0m"
|
||||
else
|
||||
echo -e "\r${DRIVER} (${SPEED}): \033[1;37m${IP}\033[0m"
|
||||
[ -z "${IPCON}" ] && IPCON="${IP}"
|
||||
fi
|
||||
break
|
||||
fi
|
||||
if ! ip link show ${ETH} 2>/dev/null | grep -q 'UP'; then
|
||||
echo -e "\r${DRIVER}: \033[1;37mDOWN\033[0m"
|
||||
break
|
||||
fi
|
||||
if [ ${COUNT} -ge ${BOOTIPWAIT} ]; then
|
||||
echo -e "\r${DRIVER}: \033[1;37mTIMEOUT\033[0m"
|
||||
break
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
done
|
||||
_bootwait || true
|
||||
|
||||
DSMLOGO="$(readConfigKey "bootscreen.dsmlogo" "${USER_CONFIG_FILE}")"
|
||||
if [ "${DSMLOGO}" = "true" ] && [ -c "/dev/fb0" ]; then
|
||||
DSMLOGO="$(readConfigKey "boot.dsmlogo" "${USER_CONFIG_FILE}")"
|
||||
if [ "${DSMLOGO}" == "true" ] && [ -c "/dev/fb0" ]; then
|
||||
[[ "${IPCON}" =~ ^169\.254\..* ]] && IPCON=""
|
||||
[ -n "${IPCON}" ] && URL="http://${IPCON}:5000" || URL="http://find.synology.com/"
|
||||
python3 ${ARC_PATH}/include/functions.py makeqr -d "${URL}" -l "6" -o "${TMP_PATH}/qrcode_boot.png"
|
||||
python ${ARC_PATH}/include/functions.py makeqr -d "${URL}" -l "6" -o "${TMP_PATH}/qrcode_boot.png"
|
||||
[ -f "${TMP_PATH}/qrcode_boot.png" ] && echo | fbv -acufi "${TMP_PATH}/qrcode_boot.png" >/dev/null 2>/dev/null || true
|
||||
fi
|
||||
|
||||
# Wait for boot interrupt
|
||||
# _bootwait || true
|
||||
|
||||
for T in $(busybox w 2>/dev/null | grep -v 'TTY' | awk '{print $2}'); do
|
||||
for T in $(w 2>/dev/null | grep -v 'TTY' | awk '{print $2}'); do
|
||||
if [ -w "/dev/${T}" ]; then
|
||||
[ -n "${IPCON}" ] && echo -e "Use \033[1;34mhttp://${IPCON}:5000\033[0m or try \033[1;34mhttp://find.synology.com/ \033[0mto find DSM and proceed.\n\n\033[1;37mThis interface will not be operational. Wait a few minutes - Network will be unreachable until DSM boot.\033[0m\n" >"/dev/${T}" 2>/dev/null \
|
||||
|| echo -e "Try \033[1;34mhttp://find.synology.com/ \033[0mto find DSM and proceed.\n\n\033[1;37mThis interface will not be operational. Wait a few minutes - Network will be unreachable until DSM boot.\nNo IP found - DSM will not work properly!\033[0m\n" >"/dev/${T}" 2>/dev/null
|
||||
[ -n "${IPCON}" ] && echo -e "Use \033[1;34mhttp://${IPCON}:5000\033[0m or try \033[1;34mhttp://find.synology.com/ \033[0mto find DSM and proceed.\n\n\033[1;37mThis interface will not be operational. Wait a few minutes.\033[0m\n" >"/dev/${T}" 2>/dev/null || echo -e "Try \033[1;34mhttp://find.synology.com/ \033[0mto find DSM and proceed.\n\n\033[1;37mThis interface will not be operational. Wait a few minutes.\nNo IP found.\033[0m\n" >"/dev/${T}" 2>/dev/null
|
||||
fi
|
||||
done
|
||||
|
||||
# # Unload all network interfaces
|
||||
# for D in $(realpath /sys/class/net/*/device/driver); do rmmod -f "$(basename ${D})" 2>/dev/null || true; done
|
||||
|
||||
# Unload all graphics drivers
|
||||
# for D in $(lsmod | grep -E '^(nouveau|amdgpu|radeon|i915)' | awk '{print $1}'); do rmmod -f "${D}" 2>/dev/null || true; done
|
||||
# for I in $(find /sys/devices -name uevent -exec bash -c 'cat {} 2>/dev/null | grep -Eq "PCI_CLASS=0?30[0|1|2]00" && dirname {}' \;); do
|
||||
# [ -e ${I}/reset ] && cat ${I}/vendor >/dev/null | grep -iq 0x10de && echo 1 >${I}/reset || true # Proc open nvidia driver when booting
|
||||
# done
|
||||
|
||||
echo -e "\033[1;37mLoading DSM Kernel...\033[0m"
|
||||
# Executes DSM kernel via KEXEC
|
||||
KEXECARGS="-a"
|
||||
if [ $(echo "${KVER:-4}" | cut -d'.' -f1) -lt 4 ] && [ ${EFI} -eq 1 ]; then
|
||||
echo -e "\033[1;33mWarning, running kexec with --noefi param, strange things will happen!!\033[0m"
|
||||
KEXECARGS+=" --noefi"
|
||||
fi
|
||||
kexec ${KEXECARGS} -l "${MOD_ZIMAGE_FILE}" --initrd "${MOD_RDGZ_FILE}" --command-line="${CMDLINE_LINE} kexecboot" >"${LOG_FILE}" 2>&1 || dieLog
|
||||
kexec ${KEXECARGS} -l "${MOD_ZIMAGE_FILE}" --initrd "${MOD_RDGZ_FILE}" --command-line="${CMDLINE_LINE}" >"${LOG_FILE}" 2>&1 || dieLog
|
||||
|
||||
echo -e "\033[1;37mBooting DSM...\033[0m"
|
||||
[ "${KERNELLOAD}" = "kexec" ] && kexec -e || poweroff
|
||||
exit 0
|
||||
# Boot to DSM
|
||||
[ "${KERNELLOAD}" == "kexec" ] && exec kexec -e || exec poweroff
|
||||
fi
|
||||
|
||||
exit 0
|
||||
@@ -1,16 +1,16 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
read_u8() {
|
||||
dd if="${1}" bs=1 skip="$((${2}))" count=1 2>/dev/null | od -An -tu1 | grep -Eo '[0-9]+'
|
||||
dd if=$1 bs=1 skip=$(($2)) count=1 2>/dev/null | od -An -tu1 | grep -Eo '[0-9]+'
|
||||
}
|
||||
read_u32() {
|
||||
dd if="${1}" bs=1 skip="$((${2}))" count=4 2>/dev/null | od -An -tu4 | grep -Eo '[0-9]+'
|
||||
dd if=$1 bs=1 skip=$(($2)) count=4 2>/dev/null | od -An -tu4 | grep -Eo '[0-9]+'
|
||||
}
|
||||
|
||||
set -x
|
||||
setup_size=$(read_u8 "${1}" 0x1f1)
|
||||
payload_offset=$(read_u32 "${1}" 0x248)
|
||||
payload_length=$(read_u32 "${1}" 0x24c)
|
||||
inner_pos=$(((setup_size + 1) * 512))
|
||||
setup_size=$(read_u8 $1 0x1f1)
|
||||
payload_offset=$(read_u32 $1 0x248)
|
||||
payload_length=$(read_u32 $1 0x24c)
|
||||
inner_pos=$((($setup_size + 1) * 512))
|
||||
|
||||
tail -c+$(($inner_pos + 1)) "${1}" | tail -c+$(($payload_offset + 1)) | head -c "${payload_length}" | head -c $(($payload_length - 4)) | unlzma >"${2}"
|
||||
tail -c+$(($inner_pos + 1)) $1 | tail -c+$(($payload_offset + 1)) | head -c $(($payload_length)) | head -c $(($payload_length - 4)) | unlzma >$2
|
||||
42
files/initrd/opt/arc/calc_run_size.sh
Executable file
42
files/initrd/opt/arc/calc_run_size.sh
Executable file
@@ -0,0 +1,42 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# Calculate the amount of space needed to run the kernel, including room for
|
||||
# the .bss and .brk sections.
|
||||
#
|
||||
# Usage:
|
||||
# objdump -h a.out | sh calc_run_size.sh
|
||||
|
||||
NUM='\([0-9a-fA-F]*[ \t]*\)'
|
||||
OUT=$(sed -n 's/^[ \t0-9]*.b[sr][sk][ \t]*'"${NUM}${NUM}${NUM}${NUM}"'.*/\1\4/p')
|
||||
if [ -z "$OUT" ]; then
|
||||
echo "Never found .bss or .brk file offset" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
OUT=$(echo ${OUT# })
|
||||
sizeA=$(printf "%d" 0x${OUT%% *})
|
||||
OUT=${OUT#* }
|
||||
offsetA=$(printf "%d" 0x${OUT%% *})
|
||||
OUT=${OUT#* }
|
||||
sizeB=$(printf "%d" 0x${OUT%% *})
|
||||
OUT=${OUT#* }
|
||||
offsetB=$(printf "%d" 0x${OUT%% *})
|
||||
|
||||
run_size=$((${offsetA} + ${sizeA} + ${sizeB}))
|
||||
|
||||
# BFD linker shows the same file offset in ELF.
|
||||
if [ "${offsetA}" -ne "${offsetB}" ]; then
|
||||
# Gold linker shows them as consecutive.
|
||||
endB=$((${offsetB} + ${sizeB}))
|
||||
if [ "$endB" != "$run_size" ]; then
|
||||
printf "sizeA: 0x%x\n" ${sizeA} >&2
|
||||
printf "offsetA: 0x%x\n" ${offsetA} >&2
|
||||
printf "sizeB: 0x%x\n" ${sizeB} >&2
|
||||
printf "offsetB: 0x%x\n" ${offsetB} >&2
|
||||
echo ".bss and .brk are non-contiguous" >&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
printf "%d\n" ${run_size}
|
||||
exit 0
|
||||
@@ -1,394 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
###############################################################################
|
||||
# Overlay Init Section
|
||||
[[ -z "${ARC_PATH}" || ! -d "${ARC_PATH}/include" ]] && ARC_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)"
|
||||
|
||||
. "${ARC_PATH}/include/functions.sh"
|
||||
. "${ARC_PATH}/arc-functions.sh"
|
||||
. "${ARC_PATH}/include/addons.sh"
|
||||
. "${ARC_PATH}/include/modules.sh"
|
||||
. "${ARC_PATH}/include/update.sh"
|
||||
|
||||
# Get Keymap and Timezone and check System
|
||||
onlineCheck
|
||||
KEYMAP="$(readConfigKey "keymap" "${USER_CONFIG_FILE}")"
|
||||
ARCOFFLINE="$(readConfigKey "arc.offline" "${USER_CONFIG_FILE}")"
|
||||
systemCheck
|
||||
readData
|
||||
|
||||
###############################################################################
|
||||
# Mounts backtitle dynamically
|
||||
function backtitle() {
|
||||
BACKTITLE="${ARC_TITLE}$([ -n "${NEWTAG}" ] && [ -n "${ARC_VERSION}" ] && [ ${ARC_VERSION//[!0-9]/} -lt ${NEWTAG//[!0-9]/} ] && echo " > ${NEWTAG}") | "
|
||||
BACKTITLE+="${MODEL:-(Model)} | "
|
||||
BACKTITLE+="${PRODUCTVER:-(Version)} | "
|
||||
BACKTITLE+="${IPCON:-(no IP)} | "
|
||||
BACKTITLE+="Patch: ${ARCPATCH} | "
|
||||
BACKTITLE+="Config: ${CONFDONE} | "
|
||||
BACKTITLE+="Build: ${BUILDDONE} | "
|
||||
BACKTITLE+="${MACHINE}(${BUS}) | "
|
||||
[ -n "${KEYMAP}" ] && BACKTITLE+="KB: ${KEYMAP}"
|
||||
[ "${ARCOFFLINE}" = "true" ] && BACKTITLE+=" | Offline"
|
||||
echo "${BACKTITLE}"
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# Advanced Menu
|
||||
function advancedMenu() {
|
||||
NEXT="a"
|
||||
while true; do
|
||||
rm -f "${TMP_PATH}/menu" "${TMP_PATH}/resp" >/dev/null 2>&1 || true
|
||||
write_menu "=" "\Z4===== System ====\Zn"
|
||||
|
||||
if [ "${CONFDONE}" = "true" ]; then
|
||||
if [ "${BOOTOPTS}" = "true" ]; then
|
||||
write_menu "6" "\Z1Hide Boot Options\Zn"
|
||||
write_menu_value "m" "Kernelload" "${KERNELLOAD}"
|
||||
write_menu_value "E" "eMMC Boot Support" "${EMMCBOOT}"
|
||||
if [ "${DIRECTBOOT}" = "false" ]; then
|
||||
write_menu_value "i" "Boot IP Waittime" "${BOOTIPWAIT}"
|
||||
fi
|
||||
write_menu_value "q" "Directboot" "${DIRECTBOOT}"
|
||||
write_menu_value "W" "RD Compression" "${RD_COMPRESSED}"
|
||||
write_menu_value "X" "Sata DOM" "${SATADOM}"
|
||||
write_menu_value "u" "LKM Version" "${LKM}"
|
||||
else
|
||||
write_menu "6" "\Z1Show Boot Options\Zn"
|
||||
fi
|
||||
|
||||
if [ "${DSMOPTS}" = "true" ]; then
|
||||
write_menu "7" "\Z1Hide DSM Options\Zn"
|
||||
write_menu "j" "Cmdline"
|
||||
write_menu "k" "Synoinfo"
|
||||
write_menu "N" "Add new User"
|
||||
write_menu "t" "Change User Password"
|
||||
write_menu "J" "Reset Network Config"
|
||||
write_menu "T" "Disable all scheduled Tasks"
|
||||
write_menu "M" "Mount DSM Storage Pool"
|
||||
write_menu "l" "Edit User Config"
|
||||
write_menu "s" "Allow Downgrade Version"
|
||||
else
|
||||
write_menu "7" "\Z1Show DSM Options\Zn"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "${LOADEROPTS}" = "true" ]; then
|
||||
write_menu "8" "\Z1Hide Loader Options\Zn"
|
||||
write_menu "D" "StaticIP for Loader/DSM"
|
||||
write_menu "f" "Bootscreen Options"
|
||||
write_menu "U" "Change Loader Password"
|
||||
write_menu "Z" "Change Loader Ports"
|
||||
write_menu "w" "Reset Loader to Defaults"
|
||||
write_menu "L" "Grep Logs from dbgutils"
|
||||
write_menu "B" "Grep DSM Config from Backup"
|
||||
write_menu "=" "\Z1== Edit with caution! ==\Zn"
|
||||
write_menu "C" "Clone Loader to another Disk"
|
||||
write_menu "n" "Grub Bootloader Config"
|
||||
write_menu "y" "Choose a Keymap for Loader"
|
||||
write_menu "F" "\Z1Formate Disks\Zn"
|
||||
else
|
||||
write_menu "8" "\Z1Show Loader Options\Zn"
|
||||
fi
|
||||
|
||||
dialog --clear --default-item ${NEXT} --backtitle "$(backtitle)" --title "Evo UI Advanced" --colors \
|
||||
--cancel-label "Back" \
|
||||
--menu "" 0 0 0 --file "${TMP_PATH}/menu" \
|
||||
2>"${TMP_PATH}/resp"
|
||||
RET=$?
|
||||
case ${RET} in
|
||||
0)
|
||||
resp=$(cat ${TMP_PATH}/resp)
|
||||
[ -z "${resp}" ] && return
|
||||
case ${resp} in
|
||||
# DSM Section
|
||||
7) [ "${DSMOPTS}" = "true" ] && DSMOPTS='false' || DSMOPTS='true'
|
||||
DSMOPTS="${DSMOPTS}"
|
||||
NEXT="7"
|
||||
;;
|
||||
j) cmdlineMenu; NEXT="j" ;;
|
||||
k) synoinfoMenu; NEXT="k" ;;
|
||||
l) editUserConfig; NEXT="l" ;;
|
||||
s) downgradeMenu; NEXT="s" ;;
|
||||
t) resetPassword; NEXT="t" ;;
|
||||
N) addNewDSMUser; NEXT="N" ;;
|
||||
J) resetDSMNetwork; NEXT="J" ;;
|
||||
M) mountDSM; NEXT="M" ;;
|
||||
T) disablescheduledTasks; NEXT="T" ;;
|
||||
B) getbackup; NEXT="B" ;;
|
||||
# Loader Section
|
||||
8) [ "${LOADEROPTS}" = "true" ] && LOADEROPTS='false' || LOADEROPTS='true'
|
||||
LOADEROPTS="${LOADEROPTS}"
|
||||
NEXT="8"
|
||||
;;
|
||||
D) staticIPMenu; NEXT="D" ;;
|
||||
f) bootScreen; NEXT="f" ;;
|
||||
Z) loaderPorts; NEXT="Z" ;;
|
||||
U) loaderPassword; NEXT="U" ;;
|
||||
L) greplogs; NEXT="L" ;;
|
||||
w) resetLoader; NEXT="w" ;;
|
||||
C) cloneLoader; NEXT="C" ;;
|
||||
n) editGrubCfg; NEXT="n" ;;
|
||||
y) keymapMenu; NEXT="y" ;;
|
||||
F) formatDisks; NEXT="F" ;;
|
||||
6) [ "${BOOTOPTS}" = "true" ] && BOOTOPTS='false' || BOOTOPTS='true'
|
||||
BOOTOPTS="${BOOTOPTS}"
|
||||
NEXT="6"
|
||||
;;
|
||||
m) [ "${KERNELLOAD}" = "kexec" ] && KERNELLOAD='power' || KERNELLOAD='kexec'
|
||||
writeConfigKey "kernelload" "${KERNELLOAD}" "${USER_CONFIG_FILE}"
|
||||
NEXT="m"
|
||||
;;
|
||||
E) [ "${EMMCBOOT}" = "true" ] && EMMCBOOT='false' || EMMCBOOT='true'
|
||||
if [ "${EMMCBOOT}" = "false" ]; then
|
||||
writeConfigKey "emmcboot" "false" "${USER_CONFIG_FILE}"
|
||||
deleteConfigKey "synoinfo.disk_swap" "${USER_CONFIG_FILE}"
|
||||
deleteConfigKey "synoinfo.supportraid" "${USER_CONFIG_FILE}"
|
||||
deleteConfigKey "synoinfo.support_emmc_boot" "${USER_CONFIG_FILE}"
|
||||
deleteConfigKey "synoinfo.support_install_only_dev" "${USER_CONFIG_FILE}"
|
||||
elif [ "${EMMCBOOT}" = "true" ]; then
|
||||
writeConfigKey "emmcboot" "true" "${USER_CONFIG_FILE}"
|
||||
writeConfigKey "synoinfo.disk_swap" "no" "${USER_CONFIG_FILE}"
|
||||
writeConfigKey "synoinfo.supportraid" "no" "${USER_CONFIG_FILE}"
|
||||
writeConfigKey "synoinfo.support_emmc_boot" "yes" "${USER_CONFIG_FILE}"
|
||||
writeConfigKey "synoinfo.support_install_only_dev" "yes" "${USER_CONFIG_FILE}"
|
||||
fi
|
||||
writeConfigKey "arc.builddone" "false" "${USER_CONFIG_FILE}"
|
||||
BUILDDONE="$(readConfigKey "arc.builddone" "${USER_CONFIG_FILE}")"
|
||||
NEXT="E"
|
||||
;;
|
||||
W) RD_COMPRESSED=$([ "${RD_COMPRESSED}" = "true" ] && echo 'false' || echo 'true')
|
||||
writeConfigKey "rd-compressed" "${RD_COMPRESSED}" "${USER_CONFIG_FILE}"
|
||||
writeConfigKey "arc.builddone" "false" "${USER_CONFIG_FILE}"
|
||||
BUILDDONE="$(readConfigKey "arc.builddone" "${USER_CONFIG_FILE}")"
|
||||
NEXT="W"
|
||||
;;
|
||||
X) satadomMenu; NEXT="X" ;;
|
||||
u) [ "${LKM}" = "prod" ] && LKM='dev' || LKM='prod'
|
||||
writeConfigKey "lkm" "${LKM}" "${USER_CONFIG_FILE}"
|
||||
writeConfigKey "arc.builddone" "false" "${USER_CONFIG_FILE}"
|
||||
BUILDDONE="$(readConfigKey "arc.builddone" "${USER_CONFIG_FILE}")"
|
||||
NEXT="u"
|
||||
;;
|
||||
i) bootipwaittime; NEXT="i" ;;
|
||||
q) [ "${DIRECTBOOT}" = "false" ] && DIRECTBOOT='true' || DIRECTBOOT='false'
|
||||
grub-editenv ${USER_GRUBENVFILE} create
|
||||
writeConfigKey "directboot" "${DIRECTBOOT}" "${USER_CONFIG_FILE}"
|
||||
NEXT="q"
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
*)
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done
|
||||
return
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
###############################################################################
|
||||
# Main loop
|
||||
if [ "${ARCMODE}" = "update" ]; then
|
||||
if [ "${ARCOFFLINE}" != "true" ]; then
|
||||
updateLoader
|
||||
else
|
||||
dialog --backtitle "$(backtitle)" --title "Arc Update" \
|
||||
--infobox "Update is not possible in Offline Mode!" 5 40
|
||||
sleep 3
|
||||
exec reboot
|
||||
fi
|
||||
elif [ "${ARCMODE}" = "automated" ]; then
|
||||
if [ "${BUILDDONE}" = "false" ] || [ "${MODEL}" != "${MODELID}" ]; then
|
||||
arcModel
|
||||
else
|
||||
make
|
||||
fi
|
||||
elif [ "${ARCMODE}" = "config" ]; then
|
||||
NEXT="1"
|
||||
while true; do
|
||||
rm -f "${TMP_PATH}/menu" "${TMP_PATH}/resp" >/dev/null 2>&1 || true
|
||||
write_menu "=" "\Z4===== Main =====\Zn"
|
||||
if [ -z "${USERID}" ] && [ "${ARCOFFLINE}" = "false" ]; then
|
||||
write_menu_value "0" "HardwareID" "${HARDWAREID}"
|
||||
fi
|
||||
|
||||
write_menu_value "1" "Model" "${MODEL}"
|
||||
|
||||
if [ "${CONFDONE}" = "true" ]; then
|
||||
write_menu_value "e" "Version" "${PRODUCTVER}"
|
||||
write_menu_value "=" "DT" "${DT}"
|
||||
write_menu_value "=" "Platform" "${PLATFORM}"
|
||||
|
||||
if [ -n "${USERID}" ] && [ "${ARCOFFLINE}" = "false" ]; then
|
||||
write_menu_value "p" "Arc Patch" "${ARCPATCH}"
|
||||
elif [ "${ARCOFFLINE}" = "false" ]; then
|
||||
write_menu "p" "Arc Patch: \Z4Register HardwareID first\Zn"
|
||||
else
|
||||
write_menu "p" "SN/Mac Options"
|
||||
fi
|
||||
|
||||
if [ "${PLATFORM}" = "epyc7002" ]; then
|
||||
CPUINFO="$(cat /proc/cpuinfo | wc -l)"
|
||||
if [ ${CPUINFO} -gt 24 ]; then
|
||||
write_menu "=" "Custom Kernel should be used for this CPU"
|
||||
fi
|
||||
write_menu_value "K" "Kernel" "${KERNEL}"
|
||||
fi
|
||||
|
||||
write_menu "b" "Addons"
|
||||
|
||||
for addon in "cpufreqscaling" "storagepanel" "sequentialio"; do
|
||||
if readConfigMap "addons" "${USER_CONFIG_FILE}" | grep -q "${addon}"; then
|
||||
case "${addon}" in
|
||||
"cpufreqscaling") write_menu_value "g" "Scaling Governor" "${GOVERNOR}" ;;
|
||||
"storagepanel") write_menu_value "P" "StoragePanel" "${STORAGEPANEL:-auto}" ;;
|
||||
"sequentialio") write_menu_value "Q" "SequentialIO" "${SEQUENTIALIO}" ;;
|
||||
esac
|
||||
fi
|
||||
done
|
||||
|
||||
write_menu "d" "Modules"
|
||||
write_menu_value "O" "Official Driver Priority" "${ODP}"
|
||||
|
||||
if [ "${DT}" = "false" ] && [ ${SATACONTROLLER} -gt 0 ]; then
|
||||
write_menu_value "S" "PortMap" "${REMAP}"
|
||||
write_menu_value "=" "Mapping" "${PORTMAP}"
|
||||
fi
|
||||
|
||||
if [ "${DT}" = "true" ]; then
|
||||
write_menu_value "H" "Hotplug/SortDrives" "${HDDSORT}"
|
||||
else
|
||||
write_menu_value "h" "USB as Internal" "${USBMOUNT}"
|
||||
fi
|
||||
fi
|
||||
|
||||
write_menu_value "c" "Offline Mode" "${ARCOFFLINE}"
|
||||
write_menu "9" "Advanced Options"
|
||||
write_menu "=" "\Z4===== Diag =====\Zn"
|
||||
write_menu "a" "Sysinfo"
|
||||
write_menu "A" "Networkdiag"
|
||||
write_menu "=" "\Z4===== Misc =====\Zn"
|
||||
write_menu "x" "Backup/Restore/Recovery"
|
||||
[ "${ARCOFFLINE}" = "false" ] && write_menu "z" "Update Menu"
|
||||
write_menu "I" "Power/Service Menu"
|
||||
write_menu "V" "Credits"
|
||||
|
||||
if [ "${CONFDONE}" = "false" ]; then
|
||||
EXTRA_LABEL="Config"
|
||||
elif [ "${CONFDONE}" = "true" ]; then
|
||||
EXTRA_LABEL="Build"
|
||||
elif [ "${BUILDDONE}" = "true" ]; then
|
||||
EXTRA_LABEL="Boot"
|
||||
fi
|
||||
if [ "$TERM" != "xterm-256color" ]; then
|
||||
WEBCONFIG="Webconfig: http://${IPCON}${HTTPPORT:+:$HTTPPORT}"
|
||||
else
|
||||
WEBCONFIG=""
|
||||
fi
|
||||
dialog --clear --default-item ${NEXT} --backtitle "$(backtitle)" --title "Evo UI" --colors \
|
||||
--cancel-label "Classic" --help-button --help-label "Exit" \
|
||||
--extra-button --extra-label "${EXTRA_LABEL}" \
|
||||
--menu "${WEBCONFIG}" 0 0 0 --file "${TMP_PATH}/menu" \
|
||||
2>"${TMP_PATH}/resp"
|
||||
RET=$?
|
||||
case ${RET} in
|
||||
0)
|
||||
resp=$(cat ${TMP_PATH}/resp)
|
||||
[ -z "${resp}" ] && return
|
||||
case ${resp} in
|
||||
0) genHardwareID; NEXT="0" ;;
|
||||
1) arcModel; NEXT="2" ;;
|
||||
b) addonMenu; NEXT="b" ;;
|
||||
d) modulesMenu; NEXT="d" ;;
|
||||
e) ONLYVERSION="true" && arcVersion; NEXT="e" ;;
|
||||
p) ONLYPATCH="true" && checkHardwareID && arcPatch; NEXT="p" ;;
|
||||
S) storageMenu; NEXT="S" ;;
|
||||
g) governorMenu; NEXT="g" ;;
|
||||
P) storagepanelMenu; NEXT="P" ;;
|
||||
Q) sequentialIOMenu; NEXT="Q" ;;
|
||||
K) KERNEL=$([ "${KERNEL}" = "official" ] && echo 'custom' || echo 'official')
|
||||
writeConfigKey "kernel" "${KERNEL}" "${USER_CONFIG_FILE}"
|
||||
dialog --backtitle "$(backtitle)" --title "Kernel" \
|
||||
--infobox "Switching Kernel to ${KERNEL}! Stay patient..." 4 50
|
||||
if [ "${ODP}" = "true" ]; then
|
||||
ODP="false"
|
||||
writeConfigKey "odp" "${ODP}" "${USER_CONFIG_FILE}"
|
||||
fi
|
||||
PLATFORM="$(readConfigKey "platform" "${USER_CONFIG_FILE}")"
|
||||
PRODUCTVER="$(readConfigKey "productver" "${USER_CONFIG_FILE}")"
|
||||
KVER="$(readConfigKey "platforms.${PLATFORM}.productvers.\"${PRODUCTVER}\".kver" "${P_FILE}")"
|
||||
[ "${PLATFORM}" = "epyc7002" ] && KVERP="${PRODUCTVER}-${KVER}" || KVERP="${KVER}"
|
||||
if [ -n "${PLATFORM}" ] && [ -n "${KVERP}" ]; then
|
||||
writeConfigKey "modules" "{}" "${USER_CONFIG_FILE}"
|
||||
mergeConfigModules "$(getAllModules "${PLATFORM}" "${KVERP}" | awk '{print $1}')" "${USER_CONFIG_FILE}"
|
||||
fi
|
||||
writeConfigKey "arc.builddone" "false" "${USER_CONFIG_FILE}"
|
||||
BUILDDONE="$(readConfigKey "arc.builddone" "${USER_CONFIG_FILE}")"
|
||||
NEXT="K"
|
||||
;;
|
||||
H) [ "${HDDSORT}" = "true" ] && HDDSORT='false' || HDDSORT='true'
|
||||
writeConfigKey "hddsort" "${HDDSORT}" "${USER_CONFIG_FILE}"
|
||||
writeConfigKey "arc.builddone" "false" "${USER_CONFIG_FILE}"
|
||||
BUILDDONE="$(readConfigKey "arc.builddone" "${USER_CONFIG_FILE}")"
|
||||
NEXT="H"
|
||||
;;
|
||||
h) [ "${USBMOUNT}" = "true" ] && USBMOUNT='false' || USBMOUNT='true'
|
||||
writeConfigKey "usbmount" "${USBMOUNT}" "${USER_CONFIG_FILE}"
|
||||
writeConfigKey "arc.builddone" "false" "${USER_CONFIG_FILE}"
|
||||
BUILDDONE="$(readConfigKey "arc.builddone" "${USER_CONFIG_FILE}")"
|
||||
NEXT="h"
|
||||
;;
|
||||
O) [ "${ODP}" = "false" ] && ODP='true' || ODP='false'
|
||||
writeConfigKey "odp" "${ODP}" "${USER_CONFIG_FILE}"
|
||||
writeConfigKey "arc.builddone" "false" "${USER_CONFIG_FILE}"
|
||||
BUILDDONE="$(readConfigKey "arc.builddone" "${USER_CONFIG_FILE}")"
|
||||
NEXT="O"
|
||||
;;
|
||||
c) ARCOFFLINE=$([ "${ARCOFFLINE}" = "true" ] && echo 'false' || echo 'true')
|
||||
writeConfigKey "arc.offline" "${ARCOFFLINE}" "${USER_CONFIG_FILE}"
|
||||
[ "${ARCOFFLINE}" = "false" ] && exec arc.sh
|
||||
NEXT="c"
|
||||
;;
|
||||
# Diag Section
|
||||
a) sysinfo; NEXT="a" ;;
|
||||
A) networkdiag; NEXT="A" ;;
|
||||
# Misc Settings
|
||||
x) backupMenu; NEXT="x" ;;
|
||||
z) updateMenu; NEXT="z" ;;
|
||||
I) rebootMenu; NEXT="I" ;;
|
||||
V) credits; NEXT="V" ;;
|
||||
9) advancedMenu; NEXT="9" ;;
|
||||
esac
|
||||
;;
|
||||
1)
|
||||
exec arc.sh
|
||||
;;
|
||||
3)
|
||||
if [ "${CONFDONE}" = "false" ]; then
|
||||
arcModel
|
||||
elif [ "${CONFDONE}" = "true" ]; then
|
||||
arcSummary
|
||||
elif [ "${BUILDDONE}" = "true" ]; then
|
||||
boot
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done
|
||||
else
|
||||
echo "Unknown Mode: ${ARCMODE} - Exiting..."
|
||||
fi
|
||||
|
||||
# Inform user
|
||||
echo -e "Call \033[1;34marc.sh\033[0m to configure Loader"
|
||||
echo
|
||||
echo -e "Web Config: \033[1;34mhttp://${IPCON}${HTTPPORT:+:$HTTPPORT}\033[0m"
|
||||
echo
|
||||
echo -e "SSH Access:"
|
||||
echo -e "IP: \033[1;34m${IPCON}\033[0m"
|
||||
echo -e "User: \033[1;34mroot\033[0m"
|
||||
echo -e "Password: \033[1;34marc\033[0m"
|
||||
echo
|
||||
@@ -10,34 +10,38 @@
|
||||
#
|
||||
# ----------------------------------------------------------------------
|
||||
|
||||
check_vmlinux() {
|
||||
# Use readelf to check if it's a valid ELF
|
||||
# TODO: find a better to way to check that it's really vmlinux
|
||||
# and not just an elf
|
||||
readelf -h $1 >/dev/null 2>&1 || return 1
|
||||
check_vmlinux()
|
||||
{
|
||||
# Use readelf to check if it's a valid ELF
|
||||
# TODO: find a better to way to check that it's really vmlinux
|
||||
# and not just an elf
|
||||
readelf -h $1 > /dev/null 2>&1 || return 1
|
||||
|
||||
cat $1
|
||||
exit 0
|
||||
cat $1
|
||||
exit 0
|
||||
}
|
||||
|
||||
try_decompress() {
|
||||
# The obscure use of the "tr" filter is to work around older versions of
|
||||
# "grep" that report the byte offset of the line instead of the pattern.
|
||||
try_decompress()
|
||||
{
|
||||
# The obscure use of the "tr" filter is to work around older versions of
|
||||
# "grep" that report the byte offset of the line instead of the pattern.
|
||||
|
||||
# Try to find the header ($1) and decompress from here
|
||||
for pos in $(tr "$1\n$2" "\n$2=" <"$img" | grep -abo "^$2"); do
|
||||
pos=${pos%%:*}
|
||||
tail -c+$pos "$img" | $3 >$tmp 2>/dev/null
|
||||
check_vmlinux $tmp
|
||||
done
|
||||
# Try to find the header ($1) and decompress from here
|
||||
for pos in `tr "$1\n$2" "\n$2=" < "$img" | grep -abo "^$2"`
|
||||
do
|
||||
pos=${pos%%:*}
|
||||
tail -c+$pos "$img" | $3 > $tmp 2> /dev/null
|
||||
check_vmlinux $tmp
|
||||
done
|
||||
}
|
||||
|
||||
# Check invocation:
|
||||
me=${0##*/}
|
||||
img=$1
|
||||
if [ $# -ne 1 ] || [ ! -s "$img" ]; then
|
||||
echo "Usage: $me <kernel-image>" >&2
|
||||
exit 2
|
||||
if [ $# -ne 1 -o ! -s "$img" ]
|
||||
then
|
||||
echo "Usage: $me <kernel-image>" >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
# Prepare temp files:
|
||||
@@ -57,4 +61,4 @@ try_decompress '(\265/\375' xxx unzstd
|
||||
check_vmlinux $img
|
||||
|
||||
# Bail out:
|
||||
echo "$me: Cannot find vmlinux." >&2
|
||||
echo "$me: Cannot find vmlinux." >&2
|
||||
|
||||
Binary file not shown.
@@ -8,32 +8,26 @@ function availableAddons() {
|
||||
fi
|
||||
local ARCOFFLINE="$(readConfigKey "arc.offline" "${USER_CONFIG_FILE}")"
|
||||
local ARCCONF="$(readConfigKey "${MODEL}.serial" "${S_FILE}")"
|
||||
local PAT_URL="$(readConfigKey "paturl" "${USER_CONFIG_FILE}")"
|
||||
for D in $(find "${ADDONS_PATH}" -maxdepth 1 -type d 2>/dev/null | sort); do
|
||||
[ ! -f "${D}/manifest.yml" ] && continue
|
||||
local ADDON=$(basename "${D}")
|
||||
local ADDON=$(basename ${D})
|
||||
local AVAILABLE="$(readConfigKey "${1}" "${D}/manifest.yml")"
|
||||
[ "${AVAILABLE}" = false ] && continue
|
||||
local SYSTEM=$(readConfigKey "system" "${D}/manifest.yml")
|
||||
[ "${SYSTEM}" = true ] && continue
|
||||
if [[ "${ARCOFFLINE}" = "true" || -z "${ARCCONF}" ]] && [[ "${ADDON}" = "amepatch" || "${ADDON}" = "arcdns" ]]; then
|
||||
if [[ "${ARCOFFLINE}" == "true" || -z "${ARCCONF}" ]] && [[ "${ADDON}" == "amepatch" || "${ADDON}" == "arcdns" ]]; then
|
||||
continue
|
||||
fi
|
||||
if [ "${MACHINE}" != "Native" ] && [ "${ADDON}" = "cpufreqscaling" ]; then
|
||||
if [ "${MACHINE}" != "Native" ] && [ "${ADDON}" == "cpufreqscaling" ]; then
|
||||
continue
|
||||
fi
|
||||
if echo "${PAT_URL}" 2>/dev/null | grep -vq "7.2.2"; then
|
||||
if [ "${ADDON}" = "allowdowngrade" ]; then
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
local DESC="$(readConfigKey "description" "${D}/manifest.yml")"
|
||||
local BETA="$(readConfigKey "beta" "${D}/manifest.yml")"
|
||||
local TARGET="$(readConfigKey "target" "${D}/manifest.yml")"
|
||||
[ "${BETA}" = true ] && BETA="(Beta) " || BETA=""
|
||||
if [ "${TARGET}" = "app" ]; then
|
||||
if [ "${TARGET}" == "app" ]; then
|
||||
[ "${AVAILABLE}" = true ] && echo -e "${ADDON}\t\Z4${BETA}${DESC}\Zn"
|
||||
elif [ "${TARGET}" = "system" ]; then
|
||||
elif [ "${TARGET}" == "system" ]; then
|
||||
[ "${AVAILABLE}" = true ] && echo -e "${ADDON}\t\Z1${BETA}${DESC}\Zn"
|
||||
else
|
||||
[ "${AVAILABLE}" = true ] && echo -e "${ADDON}\t${BETA}${DESC}"
|
||||
@@ -113,19 +107,3 @@ function updateAddon() {
|
||||
rm -f "${F}"
|
||||
done
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# Read Addon Key
|
||||
# 1 - Addon
|
||||
# 2 - key
|
||||
function readAddonKey() {
|
||||
if [ -z "${1}" ] || [ -z "${2}" ]; then
|
||||
echo ""
|
||||
return 1
|
||||
fi
|
||||
if [ ! -f "${ADDONS_PATH}/${1}/manifest.yml" ]; then
|
||||
echo ""
|
||||
return 1
|
||||
fi
|
||||
readConfigKey "${2}" "${ADDONS_PATH}/${1}/manifest.yml"
|
||||
}
|
||||
1
files/initrd/opt/arc/include/compat.sh
Executable file
1
files/initrd/opt/arc/include/compat.sh
Executable file
@@ -0,0 +1 @@
|
||||
###############################################################################
|
||||
@@ -23,21 +23,7 @@ function writeConfigKey() {
|
||||
# Return Value
|
||||
function readConfigKey() {
|
||||
RESULT=$(yq eval '.'${1}' | explode(.)' "${2}" 2>/dev/null)
|
||||
[ "${RESULT}" = "null" ] && echo "" || echo "${RESULT}"
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# Write to yaml config file
|
||||
# 1 - Modules
|
||||
# 2 - Path of yaml config file
|
||||
function mergeConfigModules() {
|
||||
local MS="ARCMOD\n${1// /\\n}"
|
||||
local L="$(echo -en "${MS}" | awk '{print "modules."$1":"}')"
|
||||
local xmlfile=$(mktemp)
|
||||
echo -en "${L}" | yq -p p -o=yaml >"${xmlfile}"
|
||||
deleteConfigKey "modules.\"ARCMOD\"" "${xmlfile}"
|
||||
yq eval-all --inplace 'select(fileIndex == 0) * select(fileIndex == 1)' "${2}" "${xmlfile}" 2>/dev/null
|
||||
rm -f "${xmlfile}"
|
||||
[ "${RESULT}" == "null" ] && echo "" || echo "${RESULT}"
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
|
||||
@@ -4,21 +4,19 @@ PART2_PATH="/mnt/p2"
|
||||
PART3_PATH="/mnt/p3"
|
||||
TMP_PATH="/tmp"
|
||||
|
||||
[ -f "${PART3_PATH}/automated" ] && rm -f "${PART3_PATH}/automated" >/dev/null 2>&1 || true
|
||||
[ -f "${PART1_PATH}/ARC-BRANCH" ] && ARC_BRANCH="$(cat "${PART1_PATH}/ARC-BRANCH")" || ARC_BRANCH="null"
|
||||
[ -f "${PART1_PATH}/ARC-VERSION" ] && ARC_VERSION="$(cat "${PART1_PATH}/ARC-VERSION")" || ARC_VERSION="null"
|
||||
[ -f "${PART1_PATH}/ARC-BUILD" ] && ARC_BUILD="$(cat "${PART1_PATH}/ARC-BUILD")" || ARC_BUILD="null"
|
||||
[ -f "${PART1_PATH}/ARC-BRANCH" ] && ARC_BRANCH=$(cat "${PART1_PATH}/ARC-BRANCH") || ARC_BRANCH="null"
|
||||
[ -f "${PART1_PATH}/ARC-VERSION" ] && ARC_VERSION=$(cat "${PART1_PATH}/ARC-VERSION") || ARC_VERSION="null"
|
||||
[ -f "${PART1_PATH}/ARC-BUILD" ] && ARC_BUILD=$(cat "${PART1_PATH}/ARC-BUILD") || ARC_BUILD="null"
|
||||
ARC_TITLE="Arc ${ARC_VERSION}"
|
||||
|
||||
RAMDISK_PATH="${TMP_PATH}/ramdisk"
|
||||
LOG_FILE="${TMP_PATH}/log.txt"
|
||||
TMP_UP_PATH="${TMP_PATH}/upload"
|
||||
|
||||
GRUB_PATH="${PART1_PATH}/boot/grub"
|
||||
USER_GRUB_CONFIG="${GRUB_PATH}/grub.cfg"
|
||||
USER_GRUBENVFILE="${GRUB_PATH}/grubenv"
|
||||
USER_GRUB_CONFIG="${PART1_PATH}/boot/grub/grub.cfg"
|
||||
USER_GRUBENVFILE="${PART1_PATH}/boot/grub/grubenv"
|
||||
USER_CONFIG_FILE="${PART1_PATH}/user-config.yml"
|
||||
HW_KEY="${PART2_PATH}/machine.key"
|
||||
GRUB_PATH="${PART1_PATH}/boot/grub"
|
||||
|
||||
ORI_ZIMAGE_FILE="${PART2_PATH}/zImage"
|
||||
ORI_RDGZ_FILE="${PART2_PATH}/rd.gz"
|
||||
@@ -45,7 +43,7 @@ EXTRACTOR_PATH="${PART3_PATH}/extractor"
|
||||
EXTRACTOR_BIN="syno_extract_system_patch"
|
||||
|
||||
HTTPPORT=$(grep -i '^HTTP_PORT=' /etc/arc.conf 2>/dev/null | cut -d'=' -f2)
|
||||
[ -z "${HTTPPORT}" ] && HTTPPORT="" || true
|
||||
[ -z "${HTTPPORT}" ] && HTTPPORT=7080 || true
|
||||
DUFSPORT=$(grep -i '^DUFS_PORT=' /etc/arc.conf 2>/dev/null | cut -d'=' -f2)
|
||||
[ -z "${DUFSPORT}" ] && DUFSPORT=7304 || true
|
||||
TTYDPORT=$(grep -i '^TTYD_PORT=' /etc/arc.conf 2>/dev/null | cut -d'=' -f2)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# Copyright (C) 2025 AuxXxilium <https://github.com/AuxXxilium> and Ing <https://github.com/wjz304>
|
||||
# Copyright (C) 2023 AuxXxilium <https://github.com/AuxXxilium> and Ing <https://github.com/wjz304>
|
||||
#
|
||||
# This is free software, licensed under the MIT License.
|
||||
# See /LICENSE for more information.
|
||||
|
||||
@@ -1,18 +1,17 @@
|
||||
[[ -z "${ARC_PATH}" || ! -d "${ARC_PATH}/include" ]] && ARC_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")/../" 2>/dev/null && pwd)"
|
||||
|
||||
. "${ARC_PATH}/include/consts.sh"
|
||||
. "${ARC_PATH}/include/configFile.sh"
|
||||
. "${ARC_PATH}/include/addons.sh"
|
||||
. "${ARC_PATH}/include/modules.sh"
|
||||
. ${ARC_PATH}/include/consts.sh
|
||||
. ${ARC_PATH}/include/configFile.sh
|
||||
. ${ARC_PATH}/include/addons.sh
|
||||
|
||||
###############################################################################
|
||||
# Check loader disk
|
||||
function checkBootLoader() {
|
||||
while read KNAME RO; do
|
||||
[ -z "${KNAME}" ] && continue
|
||||
[ "${RO}" = "0" ] && continue
|
||||
[ "${RO}" == "0" ] && continue
|
||||
hdparm -r0 "${KNAME}" >/dev/null 2>&1 || true
|
||||
done < <(lsblk -pno KNAME,RO 2>/dev/null)
|
||||
done <<<$(lsblk -pno KNAME,RO 2>/dev/null)
|
||||
[ ! -w "${PART1_PATH}" ] && return 1
|
||||
[ ! -w "${PART2_PATH}" ] && return 1
|
||||
[ ! -w "${PART3_PATH}" ] && return 1
|
||||
@@ -23,61 +22,6 @@ function checkBootLoader() {
|
||||
return 0
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# Check boot mode
|
||||
function arc_mode() {
|
||||
if grep -q 'automated_arc' /proc/cmdline; then
|
||||
ARCMODE="automated"
|
||||
elif grep -q 'update_arc' /proc/cmdline; then
|
||||
ARCMODE="update"
|
||||
elif grep -q 'force_arc' /proc/cmdline; then
|
||||
ARCMODE="config"
|
||||
else
|
||||
ARCMODE="dsm"
|
||||
fi
|
||||
[ "$(readConfigKey "${MODEL:-SA6400}.serial" "${S_FILE}")" ] && ARCCONF="true" || true
|
||||
}
|
||||
|
||||
|
||||
###############################################################################
|
||||
# Check for NIC and IP
|
||||
function checkNIC() {
|
||||
# Get Amount of NIC
|
||||
ETHX=$(ls /sys/class/net/ 2>/dev/null | grep eth)
|
||||
for N in ${ETHX}; do
|
||||
COUNT=0
|
||||
DRIVER=$(basename "$(readlink -f /sys/class/net/${N}/device/driver 2>/dev/null)")
|
||||
while true; do
|
||||
CARRIER=$(cat /sys/class/net/${N}/carrier 2>/dev/null)
|
||||
if [ "${CARRIER}" = "0" ]; then
|
||||
echo -e "\r${DRIVER}: \033[1;37mNOT CONNECTED\033[0m"
|
||||
break
|
||||
fi
|
||||
COUNT=$((COUNT + 1))
|
||||
IP=$(getIP "${N}")
|
||||
if [ -n "${IP}" ]; then
|
||||
SPEED=$(ethtool ${N} 2>/dev/null | awk '/Speed:/ {print $2}')
|
||||
if [[ "${IP}" =~ ^169\.254\..* ]]; then
|
||||
echo -e "\r${DRIVER} (${SPEED}): \033[1;37mLINK LOCAL (No DHCP server found.)\033[0m"
|
||||
else
|
||||
echo -e "\r${DRIVER} (${SPEED}): \033[1;37m${IP}\033[0m"
|
||||
[ -z "${IPCON}" ] && IPCON="${IP}"
|
||||
fi
|
||||
break
|
||||
fi
|
||||
if [ -z "${CARRIER}" ]; then
|
||||
echo -e "\r${DRIVER}: \033[1;37mDOWN\033[0m"
|
||||
break
|
||||
fi
|
||||
if [ ${COUNT} -ge ${BOOTIPWAIT} ]; then
|
||||
echo -e "\r${DRIVER}: \033[1;37mTIMEOUT\033[0m"
|
||||
break
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
done
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# Just show error message and dies
|
||||
function die() {
|
||||
@@ -105,7 +49,7 @@ function arrayExistItem() {
|
||||
ITEM="${1}"
|
||||
shift
|
||||
for i in "$@"; do
|
||||
[ "${i}" = "${ITEM}" ] || continue
|
||||
[ "${i}" == "${ITEM}" ] || continue
|
||||
EXISTS=0
|
||||
break
|
||||
done
|
||||
@@ -124,12 +68,6 @@ function randomhex() {
|
||||
printf "&02X" "$((${RANDOM} % 255 + 1))"
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# Generate a random digit (0-9A-Z)
|
||||
function genRandomDigit() {
|
||||
echo {0..9} | tr ' ' '\n' | sort -R | head -1
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# Generate a random letter
|
||||
function genRandomLetter() {
|
||||
@@ -154,7 +92,7 @@ function genRandomValue() {
|
||||
function generateSerial() {
|
||||
PREFIX="$(readConfigArray "${1}.prefix" "${S_FILE}" 2>/dev/null | sort -R | tail -1)"
|
||||
MIDDLE="$(readConfigArray "${1}.middle" "${S_FILE}" 2>/dev/null | sort -R | tail -1)"
|
||||
if [ "${2}" = "true" ]; then
|
||||
if [ "${2}" == "true" ]; then
|
||||
SUFFIX="arc"
|
||||
else
|
||||
SUFFIX="$(readConfigKey "${1}.suffix" "${S_FILE}" 2>/dev/null)"
|
||||
@@ -186,7 +124,7 @@ function generateSerial() {
|
||||
# Returns serial number
|
||||
function generateMacAddress() {
|
||||
MACPRE="$(readConfigKey "${1}.macpre" "${S_FILE}")"
|
||||
if [ "${3}" = "true" ]; then
|
||||
if [ "${3}" == "true" ]; then
|
||||
MACSUF="$(readConfigKey "${1}.mac" "${S_FILE}" 2>/dev/null)"
|
||||
else
|
||||
MACSUF="$(printf '%02x%02x%02x' $((${RANDOM} % 256)) $((${RANDOM} % 256)) $((${RANDOM} % 256)))"
|
||||
@@ -198,19 +136,11 @@ function generateMacAddress() {
|
||||
[ ${I} -lt ${NUM} ] && MACS+=" "
|
||||
done
|
||||
|
||||
MACS="$(echo "${MACS}" | tr '[:upper:]' '[:lower:]')"
|
||||
MACS="$(echo "${MACS}" | tr '[:lower:]' '[:upper:]')"
|
||||
echo "${MACS}"
|
||||
return 0
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
function generate_and_write_serial() {
|
||||
local use_patch=$1
|
||||
SN="$(generateSerial "${MODEL}" "${use_patch}")"
|
||||
writeConfigKey "arc.patch" "${use_patch}" "${USER_CONFIG_FILE}"
|
||||
writeConfigKey "sn" "${SN}" "${USER_CONFIG_FILE}"
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# Validate a serial number for a model
|
||||
# 1 - Model
|
||||
@@ -258,7 +188,7 @@ function arrayExistItem() {
|
||||
ITEM="${1}"
|
||||
shift
|
||||
for i in "$@"; do
|
||||
[ "${i}" = "${ITEM}" ] || continue
|
||||
[ "${i}" == "${ITEM}" ] || continue
|
||||
EXISTS=0
|
||||
break
|
||||
done
|
||||
@@ -299,21 +229,22 @@ function _set_conf_kv() {
|
||||
# sort netif busid
|
||||
function _sort_netif() {
|
||||
local ETHLIST=""
|
||||
local ETHX=$(ls /sys/class/net/ 2>/dev/null | grep eth) || true
|
||||
for N in ${ETHX}; do
|
||||
local MAC="$(cat /sys/class/net/${N}/address 2>/dev/null | sed 's/://g; s/.*/\L&/')"
|
||||
local BUS="$(ethtool -i ${N} 2>/dev/null | grep bus-info | cut -d' ' -f2)"
|
||||
ETHLIST="${ETHLIST}${BUS} ${MAC} ${N}\n"
|
||||
local ETHX="$(ls /sys/class/net/ 2>/dev/null | grep eth)" # real network cards list
|
||||
for ETH in ${ETHX}; do
|
||||
local MAC="$(cat /sys/class/net/${ETH}/address 2>/dev/null | sed 's/://g; s/.*/\L&/')"
|
||||
local BUS="$(ethtool -i ${ETH} 2>/dev/null | grep bus-info | cut -d' ' -f2)"
|
||||
ETHLIST="${ETHLIST}${BUS} ${MAC} ${ETH}\n"
|
||||
done
|
||||
local ETHLISTTMPB="$(echo -e "${ETHLIST}" | sort)"
|
||||
local ETHLIST="$(echo -e "${ETHLISTTMPB}" | grep -v '^$')"
|
||||
local ETHSEQ="$(echo -e "${ETHLIST}" | awk '{print $3}' | sed 's/eth//g')"
|
||||
local ETHNUM="$(echo -e "${ETHLIST}" | wc -l)"
|
||||
|
||||
# echo "${ETHSEQ}" >"/tmp/ethseq"
|
||||
# sort
|
||||
if [ ! "${ETHSEQ}" = "$(seq 0 $((${ETHNUM:0} - 1)))" ]; then
|
||||
/etc/init.d/S09dhcpcd stop >/dev/null 2>&1
|
||||
/etc/init.d/S07network stop >/dev/null 2>&1
|
||||
/etc/init.d/S41dhcpcd stop >/dev/null 2>&1
|
||||
/etc/init.d/S40network stop >/dev/null 2>&1
|
||||
for i in $(seq 0 $((${ETHNUM:0} - 1))); do
|
||||
ip link set dev eth${i} name tmp${i}
|
||||
done
|
||||
@@ -322,8 +253,8 @@ function _sort_netif() {
|
||||
ip link set dev tmp${i} name eth${I}
|
||||
I=$((${I} + 1))
|
||||
done
|
||||
/etc/init.d/S07network start >/dev/null 2>&1
|
||||
/etc/init.d/S09dhcpcd start >/dev/null 2>&1
|
||||
/etc/init.d/S40network start >/dev/null 2>&1
|
||||
/etc/init.d/S41dhcpcd start >/dev/null 2>&1
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
@@ -347,7 +278,7 @@ function getBus() {
|
||||
# 1 - ethN
|
||||
function getIP() {
|
||||
local IP=""
|
||||
MACR="$(cat /sys/class/net/${1}/address 2>/dev/null | sed 's/://g')"
|
||||
MACR="$(cat /sys/class/net/${1}/address 2>/dev/null | sed 's/://g' | tr '[:lower:]' '[:upper:]')"
|
||||
IPR="$(readConfigKey "network.${MACR}" "${USER_CONFIG_FILE}")"
|
||||
if [ -n "${IPR}" ]; then
|
||||
IFS='/' read -r -a IPRA <<<"${IPR}"
|
||||
@@ -445,40 +376,14 @@ function delCmdline() {
|
||||
setCmdline "${1}" "${CMDLINE}"
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# check CPU Intel(VT-d)/AMD(AMD-Vi)
|
||||
function checkCPU_VT_d() {
|
||||
lsmod | grep -q msr || modprobe msr 2>/dev/null
|
||||
if grep -q "GenuineIntel" /proc/cpuinfo 2>/dev/null; then
|
||||
local VT_D_ENABLED=$(rdmsr 0x3a 2>/dev/null)
|
||||
[ "$((${VT_D_ENABLED:-0x0} & 0x5))" -eq $((0x5)) ] && return 0
|
||||
elif grep -q "AuthenticAMD" /proc/cpuinfo 2>/dev/null; then
|
||||
local IOMMU_ENABLED=$(rdmsr 0xC0010114 2>/dev/null)
|
||||
[ "$((${IOMMU_ENABLED:-0x0} & 0x1))" -eq $((0x1)) ] && return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# check BIOS Intel(VT-d)/AMD(AMD-Vi)
|
||||
function checkBIOS_VT_d() {
|
||||
if grep -q "GenuineIntel" /proc/cpuinfo 2>/dev/null; then
|
||||
dmesg 2>/dev/null | grep -iq "DMAR-IR.*DRHD base" && return 0
|
||||
elif grep -q "AuthenticAMD" /proc/cpuinfo 2>/dev/null; then
|
||||
dmesg 2>/dev/null | grep -iq "AMD-Vi.*enabled" && return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# Rebooting
|
||||
# (based on pocopico's TCRP code)
|
||||
function rebootTo() {
|
||||
local MODES="config recovery junior automated update uefi memtest"
|
||||
local MODES="config recovery junior automated update bios memtest"
|
||||
[ -z "${1}" ] && exit 1
|
||||
if ! echo "${MODES}" | grep -wq "${1}"; then exit 1; fi
|
||||
[ "${1}" = "automated" ] && echo "arc-${MODEL}-${PRODUCTVER}-${ARC_VERSION}" >"${PART3_PATH}/automated"
|
||||
if ! echo "${MODES}" | grep -qw "${1}"; then exit 1; fi
|
||||
[ "${1}" == "automated" ] && echo "arc-${MODEL}-${PRODUCTVER}-${ARC_VERSION}" >"${PART3_PATH}/automated"
|
||||
[ ! -f "${USER_GRUBENVFILE}" ] && grub-editenv ${USER_GRUBENVFILE} create
|
||||
# echo -e "Rebooting to ${1} mode..."
|
||||
grub-editenv ${USER_GRUBENVFILE} set next_entry="${1}"
|
||||
@@ -533,7 +438,7 @@ function extractDSMFiles() {
|
||||
echo -e "Could not determine if pat file is encrypted or not, maybe corrupted, try again!"
|
||||
;;
|
||||
esac
|
||||
if [ "${isencrypted}" = "yes" ]; then
|
||||
if [ "${isencrypted}" == "yes" ]; then
|
||||
# Uses the extractor to untar PAT file
|
||||
LD_LIBRARY_PATH="${EXTRACTOR_PATH}" "${EXTRACTOR_PATH}/${EXTRACTOR_BIN}" "${PAT_PATH}" "${EXT_PATH}" >"${LOG_FILE}" 2>&1
|
||||
else
|
||||
@@ -561,7 +466,7 @@ function livepatch() {
|
||||
echo -e " - failed!"
|
||||
PVALID="false"
|
||||
fi
|
||||
if [ "${PVALID}" = "true" ]; then
|
||||
if [ "${PVALID}" == "true" ]; then
|
||||
# Patch Ramdisk
|
||||
echo -n "Patching Ramdisk"
|
||||
if ${ARC_PATH}/ramdisk-patch.sh; then
|
||||
@@ -572,12 +477,12 @@ function livepatch() {
|
||||
PVALID="false"
|
||||
fi
|
||||
fi
|
||||
if [ "${PVALID}" = "false" ]; then
|
||||
if [ "${PVALID}" == "false" ]; then
|
||||
echo
|
||||
echo -e "Patching DSM Files failed! Please stay patient for Update."
|
||||
sleep 5
|
||||
exit 1
|
||||
elif [ "${PVALID}" = "true" ]; then
|
||||
elif [ "${PVALID}" == "true" ]; then
|
||||
ZIMAGE_HASH="$(sha256sum "${ORI_ZIMAGE_FILE}" | awk '{print $1}')"
|
||||
writeConfigKey "zimage-hash" "${ZIMAGE_HASH}" "${USER_CONFIG_FILE}"
|
||||
RAMDISK_HASH="$(sha256sum "${ORI_RDGZ_FILE}" | awk '{print $1}')"
|
||||
@@ -589,39 +494,32 @@ function livepatch() {
|
||||
###############################################################################
|
||||
# Check NTP and Keyboard Layout
|
||||
function onlineCheck() {
|
||||
LAYOUT="$(readConfigKey "layout" "${USER_CONFIG_FILE}")"
|
||||
KEYMAP="$(readConfigKey "keymap" "${USER_CONFIG_FILE}")"
|
||||
REGION="$(curl -m 10 -v "http://ip-api.com/line?fields=timezone" 2>/dev/null | tr -d '\n' | cut -d '/' -f1)"
|
||||
TIMEZONE="$(curl -m 10 -v "http://ip-api.com/line?fields=timezone" 2>/dev/null | tr -d '\n' | cut -d '/' -f2)"
|
||||
KEYMAP="$(curl -m 10 -v "http://ip-api.com/line?fields=countryCode" 2>/dev/null | tr '[:upper:]' '[:lower:]')"
|
||||
if [ "${KEYMAP}" = "ua" ]; then
|
||||
rm -rf "${PART3_PATH}" && exec poweroff
|
||||
fi
|
||||
[ -z "${KEYMAP}" ] && KEYMAP="$(readConfigKey "keymap" "${USER_CONFIG_FILE}")"
|
||||
[ -z "${KEYMAP}" ] && KEYMAP="$(curl -m 10 -v "http://ip-api.com/line?fields=countryCode" 2>/dev/null | tr '[:upper:]' '[:lower:]')"
|
||||
if [ -n "${REGION}" ] && [ -n "${TIMEZONE}" ]; then
|
||||
writeConfigKey "arc.offline" "false" "${USER_CONFIG_FILE}"
|
||||
[ $(echo "${ARC_VERSION}" | grep "dev" | wc -l) -eq 0 ] && NEWTAG="$(curl -m 10 -skL "https://api.github.com/repos/AuxXxilium/arc/releases" | jq -r ".[].tag_name" | grep -v "dev" | sort -rV | head -1)"
|
||||
[ $(echo "${ARC_VERSION}" | grep "dev" | wc -l) -gt 0 ] && NEWTAG="$(curl -m 10 -skL "https://api.github.com/repos/AuxXxilium/arc/releases" | jq -r ".[].tag_name" | grep "dev" | sort -rV | head -1)"
|
||||
writeConfigKey "time.region" "${REGION}" "${USER_CONFIG_FILE}"
|
||||
writeConfigKey "time.timezone" "${TIMEZONE}" "${USER_CONFIG_FILE}"
|
||||
updateOffline
|
||||
else
|
||||
REGION="$(readConfigKey "time.region" "${USER_CONFIG_FILE}")"
|
||||
TIMEZONE="$(readConfigKey "time.timezone" "${USER_CONFIG_FILE}")"
|
||||
writeConfigKey "arc.offline" "true" "${USER_CONFIG_FILE}"
|
||||
fi
|
||||
[ -n "${TIMEZONE}" ] && [ -n "${REGION}" ] && ln -sf "/usr/share/zoneinfo/${REGION}/${TIMEZONE}" /etc/localtime
|
||||
LAYOUT="$(readConfigKey "layout" "${USER_CONFIG_FILE}")"
|
||||
if [ -z "${LAYOUT}" ]; then
|
||||
[ -n "${KEYMAP}" ] && KEYMAP="$(echo ${KEYMAP} | tr '[:upper:]' '[:lower:]' | tr -d '[:space:]' | tr -d '[:punct:]' | tr -d '[:digit:]')"
|
||||
if loadkeys "${KEYMAP:-us}" 2>/dev/null; then
|
||||
writeConfigKey "keymap" "${KEYMAP}" "${USER_CONFIG_FILE}"
|
||||
else
|
||||
KEYMAP="us"
|
||||
loadkeys "${KEYMAP}" 2>/dev/null
|
||||
writeConfigKey "keymap" "${KEYMAP}" "${USER_CONFIG_FILE}"
|
||||
fi
|
||||
[ -n "${KEYMAP}" ] && writeConfigKey "keymap" "${KEYMAP}" "${USER_CONFIG_FILE}"
|
||||
[ -z "${KEYMAP}" ] && KEYMAP="us"
|
||||
loadkeys ${KEYMAP}
|
||||
fi
|
||||
NEWTAG="$(curl -m 10 -skL "https://api.github.com/repos/AuxXxilium/arc/releases" | jq -r ".[].tag_name" | grep -v "dev" | sort -rV | head -1)"
|
||||
if [ -n "${NEWTAG}" ]; then
|
||||
writeConfigKey "arc.offline" "false" "${USER_CONFIG_FILE}"
|
||||
updateOffline
|
||||
checkHardwareID
|
||||
else
|
||||
writeConfigKey "arc.offline" "true" "${USER_CONFIG_FILE}"
|
||||
if [ "${KEYMAP}" == "ua" ]; then
|
||||
poweroff
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -646,166 +544,27 @@ function systemCheck () {
|
||||
else
|
||||
AESSYS="true"
|
||||
fi
|
||||
# Check for CPU Frequency Scaling
|
||||
CPUFREQUENCIES=$(ls -l /sys/devices/system/cpu/cpufreq/*/* 2>/dev/null | wc -l)
|
||||
if [ ${CPUFREQUENCIES} -gt 0 ]; then
|
||||
CPUFREQ="true"
|
||||
# Check for ACPI Support
|
||||
if ! grep -q "^flags.*acpi.*" /proc/cpuinfo; then
|
||||
ACPISYS="false"
|
||||
else
|
||||
ACPISYS="true"
|
||||
fi
|
||||
# Check for CPU Frequency Scaling
|
||||
CPUFREQUENCIES=$(ls -ltr /sys/devices/system/cpu/cpufreq/* 2>/dev/null | wc -l)
|
||||
if [ ${CPUFREQUENCIES} -gt 1 ] && [ "${ACPISYS}" == "true" ]; then
|
||||
CPUFREQ="true"
|
||||
else
|
||||
CPUFREQ="false"
|
||||
ACPISYS="false"
|
||||
fi
|
||||
# Check for Arc Patch
|
||||
arc_mode
|
||||
ARCCONF="$(readConfigKey "${MODEL:-SA6400}.serial" "${S_FILE}")"
|
||||
[ -z "${ARCCONF}" ] && writeConfigKey "arc.patch" "false" "${USER_CONFIG_FILE}"
|
||||
getnetinfo
|
||||
getdiskinfo
|
||||
getmap
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# Generate HardwareID
|
||||
function genHWID () {
|
||||
HWID="$(echo $(dmidecode -t 4 | grep ID | sed 's/.*ID://;s/ //g' | head -1) $(ifconfig | grep eth | awk '{print $NF}' | sed 's/://g' | sort | head -1) | sha256sum | awk '{print $1}' | cut -c1-16)" 2>/dev/null
|
||||
HWID="$(echo $(dmidecode -t 4 | grep ID | sed 's/.*ID://;s/ //g' | head -1) $(ifconfig | grep eth0 | awk '{print $NF}' | sed 's/://g') | sha256sum | awk '{print $1}' | cut -c1-16)" 2>/dev/null
|
||||
echo "${HWID}"
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# Check if port is valid
|
||||
function check_port() {
|
||||
if [ -z "${1}" ]; then
|
||||
return 0
|
||||
else
|
||||
if [[ "${1}" =~ ^[0-9]+$ ]] && [ "${1}" -ge 0 ] && [ "${1}" -le 65535 ]; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# Unmount disks
|
||||
function __umountNewBlDisk() {
|
||||
umount "${TMP_PATH}/sdX1" 2>/dev/null
|
||||
umount "${TMP_PATH}/sdX2" 2>/dev/null
|
||||
umount "${TMP_PATH}/sdX3" 2>/dev/null
|
||||
}
|
||||
|
||||
function __umountDSMRootDisk() {
|
||||
umount "${TMP_PATH}/mdX"
|
||||
rm -rf "${TMP_PATH}/mdX"
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# bootwait SSH/Web
|
||||
function _bootwait() {
|
||||
BOOTWAIT="$(readConfigKey "bootwait" "${USER_CONFIG_FILE}")"
|
||||
[ -z "${BOOTWAIT}" ] && BOOTWAIT=10
|
||||
busybox w 2>/dev/null | awk '{print $1" "$2" "$4" "$5" "$6}' >WB
|
||||
MSG=""
|
||||
while [ ${BOOTWAIT} -gt 0 ]; do
|
||||
sleep 1
|
||||
BOOTWAIT=$((BOOTWAIT - 1))
|
||||
MSG="\033[1;33mAccess to SSH/Web will interrupt boot...\033[0m"
|
||||
echo -en "\r${MSG}"
|
||||
busybox w 2>/dev/null | awk '{print $1" "$2" "$4" "$5" "$6}' >WC
|
||||
if ! diff WB WC >/dev/null 2>&1; then
|
||||
echo -en "\r\033[1;33mAccess to SSH/Web detected and boot is interrupted.\033[0m\n"
|
||||
rm -f WB WC
|
||||
return 1
|
||||
fi
|
||||
done
|
||||
rm -f WB WC
|
||||
echo -en "\r$(printf "%$((${#MSG} * 2))s" " ")\n"
|
||||
return 0
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# check and fix the DSM root partition
|
||||
# 1 - DSM root path
|
||||
function fixDSMRootPart() {
|
||||
if mdadm --detail "${1}" 2>/dev/null | grep -i "State" | grep -iEq "active|FAILED|Not Started"; then
|
||||
mdadm --stop "${1}" >/dev/null 2>&1
|
||||
mdadm --assemble --scan >/dev/null 2>&1
|
||||
fsck "${1}" >/dev/null 2>&1
|
||||
fi
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# Read Data
|
||||
function readData() {
|
||||
# Get DSM Data from Config
|
||||
MODEL="$(readConfigKey "model" "${USER_CONFIG_FILE}")"
|
||||
MODELID="$(readConfigKey "modelid" "${USER_CONFIG_FILE}")"
|
||||
LKM="$(readConfigKey "lkm" "${USER_CONFIG_FILE}")"
|
||||
if [ -n "${MODEL}" ]; then
|
||||
DT="$(readConfigKey "platforms.${PLATFORM}.dt" "${P_FILE}")"
|
||||
PRODUCTVER="$(readConfigKey "productver" "${USER_CONFIG_FILE}")"
|
||||
PLATFORM="$(readConfigKey "platform" "${USER_CONFIG_FILE}")"
|
||||
fi
|
||||
|
||||
# Get Arc Data from Config
|
||||
ARCPATCH="$(readConfigKey "arc.patch" "${USER_CONFIG_FILE}")"
|
||||
HARDWAREID="$(genHWID)"
|
||||
USERID="$(readConfigKey "arc.userid" "${USER_CONFIG_FILE}")"
|
||||
EXTERNALCONTROLLER="$(readConfigKey "device.externalcontroller" "${USER_CONFIG_FILE}")"
|
||||
SATACONTROLLER="$(readConfigKey "device.satacontroller" "${USER_CONFIG_FILE}")"
|
||||
SCSICONTROLLER="$(readConfigKey "device.scsicontroller" "${USER_CONFIG_FILE}")"
|
||||
RAIDCONTROLLER="$(readConfigKey "device.raidcontroller" "${USER_CONFIG_FILE}")"
|
||||
SASCONTROLLER="$(readConfigKey "device.sascontroller" "${USER_CONFIG_FILE}")"
|
||||
|
||||
# Advanced Config
|
||||
BOOTIPWAIT="$(readConfigKey "bootipwait" "${USER_CONFIG_FILE}")"
|
||||
DIRECTBOOT="$(readConfigKey "directboot" "${USER_CONFIG_FILE}")"
|
||||
EMMCBOOT="$(readConfigKey "emmcboot" "${USER_CONFIG_FILE}")"
|
||||
HDDSORT="$(readConfigKey "hddsort" "${USER_CONFIG_FILE}")"
|
||||
USBMOUNT="$(readConfigKey "usbmount" "${USER_CONFIG_FILE}")"
|
||||
KERNEL="$(readConfigKey "kernel" "${USER_CONFIG_FILE}")"
|
||||
KERNELLOAD="$(readConfigKey "kernelload" "${USER_CONFIG_FILE}")"
|
||||
KERNELPANIC="$(readConfigKey "kernelpanic" "${USER_CONFIG_FILE}")"
|
||||
GOVERNOR="$(readConfigKey "governor" "${USER_CONFIG_FILE}")"
|
||||
STORAGEPANEL="$(readConfigKey "addons.storagepanel" "${USER_CONFIG_FILE}")"
|
||||
SEQUENTIALIO="$(readConfigKey "addons.sequentialio" "${USER_CONFIG_FILE}")"
|
||||
ODP="$(readConfigKey "odp" "${USER_CONFIG_FILE}")"
|
||||
RD_COMPRESSED="$(readConfigKey "rd-compressed" "${USER_CONFIG_FILE}")"
|
||||
SATADOM="$(readConfigKey "satadom" "${USER_CONFIG_FILE}")"
|
||||
REMAP="$(readConfigKey "arc.remap" "${USER_CONFIG_FILE}")"
|
||||
if [ "${REMAP}" = "acports" ] || [ "${REMAP}" = "maxports" ]; then
|
||||
PORTMAP="$(readConfigKey "cmdline.SataPortMap" "${USER_CONFIG_FILE}")"
|
||||
DISKMAP="$(readConfigKey "cmdline.DiskIdxMap" "${USER_CONFIG_FILE}")"
|
||||
elif [ "${REMAP}" = "remap" ]; then
|
||||
PORTMAP="$(readConfigKey "cmdline.sata_remap" "${USER_CONFIG_FILE}")"
|
||||
elif [ "${REMAP}" = "ahci" ]; then
|
||||
PORTMAP="$(readConfigKey "cmdline.ahci_remap" "${USER_CONFIG_FILE}")"
|
||||
elif [ "${REMAP}" = "user" ]; then
|
||||
PORTMAP="user"
|
||||
fi
|
||||
if [[ "${REMAP}" = "acports" || "${REMAP}" = "maxports" ]]; then
|
||||
SPORTMAP="SataPortMap: ${PORTMAP} | ${DISKMAP}"
|
||||
elif [ "${REMAP}" = "remap" ]; then
|
||||
SPORTMAP="SataRemap: ${PORTMAP}"
|
||||
elif [ "${REMAP}" = "ahci" ]; then
|
||||
SPORTMAP="AHCIRemap: ${PORTMAP}"
|
||||
elif [ "${REMAP}" = "user" ]; then
|
||||
SPORTMAP=""
|
||||
[ -n "${PORTMAP}" ] && SPORTMAP+="SataPortMap: ${PORTMAP}"
|
||||
[ -n "${DISKMAP}" ] && SPORTMAP+="DiskIdxMap: ${DISKMAP}"
|
||||
[ -n "${PORTREMAP}" ] && SPORTMAP+="SataRemap: ${PORTREMAP}"
|
||||
[ -n "${AHCIPORTREMAP}" ] && SPORTMAP+="AHCIRemap: ${AHCIPORTREMAP}"
|
||||
fi
|
||||
|
||||
# Get Config/Build Status
|
||||
CONFDONE="$(readConfigKey "arc.confdone" "${USER_CONFIG_FILE}")"
|
||||
BUILDDONE="$(readConfigKey "arc.builddone" "${USER_CONFIG_FILE}")"
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# Menu functions
|
||||
function write_menu() {
|
||||
echo "$1 \"$2\" " >>"${TMP_PATH}/menu"
|
||||
}
|
||||
|
||||
function write_menu_value() {
|
||||
echo "$1 \"$2: \Z4${3:-none}\Zn\" " >>"${TMP_PATH}/menu"
|
||||
}
|
||||
@@ -1,390 +0,0 @@
|
||||
# INTEL_I810_IDS
|
||||
80867121
|
||||
80867123
|
||||
80867125
|
||||
# INTEL_I815_IDS
|
||||
80861132
|
||||
# INTEL_I830_IDS
|
||||
80863577
|
||||
# INTEL_I845G_IDS
|
||||
80862562
|
||||
# INTEL_I85X_IDS
|
||||
80863582
|
||||
8086358e
|
||||
# INTEL_I865G_IDS
|
||||
80862572
|
||||
# INTEL_I915G_IDS
|
||||
80862582
|
||||
8086258a
|
||||
# INTEL_I915GM_IDS
|
||||
80862592
|
||||
# INTEL_I945G_IDS
|
||||
80862772
|
||||
# INTEL_I945GM_IDS
|
||||
808627a2
|
||||
808627ae
|
||||
# INTEL_I965G_IDS
|
||||
80862972
|
||||
80862982
|
||||
80862992
|
||||
808629a2
|
||||
# INTEL_G33_IDS
|
||||
808629b2
|
||||
808629c2
|
||||
808629d2
|
||||
# INTEL_I965GM_IDS
|
||||
80862a02
|
||||
80862a12
|
||||
# INTEL_GM45_IDS
|
||||
80862a42
|
||||
# INTEL_G45_IDS
|
||||
80862e02
|
||||
80862e12
|
||||
80862e22
|
||||
80862e32
|
||||
80862e42
|
||||
80862e92
|
||||
# INTEL_PINEVIEW_G_IDS
|
||||
8086a001
|
||||
# INTEL_PINEVIEW_M_IDS
|
||||
8086a011
|
||||
# INTEL_IRONLAKE_D_IDS
|
||||
80860042
|
||||
# INTEL_IRONLAKE_M_IDS
|
||||
80860046
|
||||
# INTEL_SNB_D_GT1_IDS
|
||||
80860102
|
||||
8086010A
|
||||
# INTEL_SNB_D_GT2_IDS
|
||||
80860112
|
||||
80860122
|
||||
# INTEL_SNB_M_GT1_IDS
|
||||
80860106
|
||||
# INTEL_SNB_M_GT2_IDS
|
||||
80860116
|
||||
80860126
|
||||
# INTEL_IVB_M_GT1_IDS
|
||||
80860156
|
||||
# INTEL_IVB_M_GT2_IDS
|
||||
80860166
|
||||
# INTEL_IVB_D_GT1_IDS
|
||||
80860152
|
||||
8086015a
|
||||
# INTEL_IVB_D_GT2_IDS
|
||||
80860162
|
||||
8086016a
|
||||
# INTEL_HSW_ULT_GT1_IDS
|
||||
80860A02
|
||||
80860A06
|
||||
80860A0A
|
||||
80860A0B
|
||||
# INTEL_HSW_ULX_GT1_IDS
|
||||
80860A0E
|
||||
# INTEL_HSW_GT1_IDS
|
||||
80860402
|
||||
80860406
|
||||
8086040A
|
||||
8086040B
|
||||
8086040E
|
||||
80860C02
|
||||
80860C06
|
||||
80860C0A
|
||||
80860C0B
|
||||
80860C0E
|
||||
80860D02
|
||||
80860D06
|
||||
80860D0A
|
||||
80860D0B
|
||||
80860D0E
|
||||
# INTEL_HSW_ULT_GT2_IDS
|
||||
80860A12
|
||||
80860A16
|
||||
80860A1A
|
||||
80860A1B
|
||||
# INTEL_HSW_ULX_GT2_IDS
|
||||
80860A1E
|
||||
# INTEL_HSW_GT2_IDS
|
||||
80860412
|
||||
80860416
|
||||
8086041A
|
||||
8086041B
|
||||
8086041E
|
||||
80860C12
|
||||
80860C16
|
||||
80860C1A
|
||||
80860C1B
|
||||
80860C1E
|
||||
80860D12
|
||||
80860D16
|
||||
80860D1A
|
||||
80860D1B
|
||||
80860D1E
|
||||
# INTEL_HSW_ULT_GT3_IDS
|
||||
80860A22
|
||||
80860A26
|
||||
80860A2A
|
||||
80860A2B
|
||||
80860A2E
|
||||
# INTEL_HSW_GT3_IDS
|
||||
80860422
|
||||
80860426
|
||||
8086042A
|
||||
8086042B
|
||||
8086042E
|
||||
80860C22
|
||||
80860C26
|
||||
80860C2A
|
||||
80860C2B
|
||||
80860C2E
|
||||
80860D22
|
||||
80860D26
|
||||
80860D2A
|
||||
80860D2B
|
||||
80860D2E
|
||||
# INTEL_VLV_IDS
|
||||
80860f30
|
||||
80860f31
|
||||
80860f32
|
||||
80860f33
|
||||
# INTEL_BDW_ULT_GT1_IDS
|
||||
80861606
|
||||
8086160B
|
||||
# INTEL_BDW_ULX_GT1_IDS
|
||||
8086160E
|
||||
# INTEL_BDW_GT1_IDS
|
||||
80861602
|
||||
8086160A
|
||||
8086160D
|
||||
# INTEL_BDW_ULT_GT2_IDS
|
||||
80861616
|
||||
8086161B
|
||||
# INTEL_BDW_ULX_GT2_IDS
|
||||
8086161E
|
||||
# INTEL_BDW_GT2_IDS
|
||||
80861612
|
||||
8086161A
|
||||
8086161D
|
||||
# INTEL_BDW_ULT_GT3_IDS
|
||||
80861626
|
||||
8086162B
|
||||
# INTEL_BDW_ULX_GT3_IDS
|
||||
8086162E
|
||||
# INTEL_BDW_GT3_IDS
|
||||
80861622
|
||||
8086162A
|
||||
8086162D
|
||||
# INTEL_BDW_ULT_RSVD_IDS
|
||||
80861636
|
||||
8086163B
|
||||
# INTEL_BDW_ULX_RSVD_IDS
|
||||
8086163E
|
||||
# INTEL_BDW_RSVD_IDS
|
||||
80861632
|
||||
8086163A
|
||||
8086163D
|
||||
# INTEL_CHV_IDS
|
||||
808622b0
|
||||
808622b1
|
||||
808622b2
|
||||
808622b3
|
||||
# INTEL_SKL_ULT_GT1_IDS
|
||||
80861906
|
||||
80861913~
|
||||
# INTEL_SKL_ULX_GT1_IDS
|
||||
8086190E
|
||||
80861915~
|
||||
# INTEL_SKL_GT1_IDS
|
||||
80861902
|
||||
8086190A
|
||||
8086190B
|
||||
80861917~
|
||||
# INTEL_SKL_ULT_GT2_IDS
|
||||
80861916
|
||||
80861921
|
||||
# INTEL_SKL_ULX_GT2_IDS
|
||||
8086191E
|
||||
# INTEL_SKL_GT2_IDS
|
||||
80861912
|
||||
8086191A
|
||||
8086191B
|
||||
8086191D
|
||||
# INTEL_SKL_ULT_GT3_IDS
|
||||
80861923
|
||||
80861926
|
||||
80861927
|
||||
# INTEL_SKL_GT3_IDS
|
||||
8086192A
|
||||
8086192B
|
||||
8086192D
|
||||
# INTEL_SKL_GT4_IDS
|
||||
80861932
|
||||
8086193A
|
||||
8086193B
|
||||
8086193D
|
||||
# INTEL_BXT_IDS
|
||||
80860A84
|
||||
80861A84
|
||||
80861A85
|
||||
80865A84
|
||||
80865A85
|
||||
# INTEL_GLK_IDS
|
||||
80863184
|
||||
80863185
|
||||
# INTEL_KBL_ULT_GT1_IDS
|
||||
80865906
|
||||
80865913
|
||||
# INTEL_KBL_ULX_GT1_IDS
|
||||
8086590E
|
||||
80865915
|
||||
# INTEL_KBL_GT1_IDS
|
||||
80865902
|
||||
80865908
|
||||
8086590A
|
||||
8086590B
|
||||
# INTEL_KBL_ULT_GT2_IDS
|
||||
80865916
|
||||
80865921
|
||||
# INTEL_KBL_ULX_GT2_IDS
|
||||
8086591E
|
||||
# INTEL_KBL_GT2_IDS
|
||||
80865912
|
||||
80865917
|
||||
8086591A
|
||||
8086591B
|
||||
8086591D
|
||||
# INTEL_KBL_ULT_GT3_IDS
|
||||
80865926
|
||||
# INTEL_KBL_GT3_IDS
|
||||
80865923
|
||||
80865927
|
||||
# INTEL_KBL_GT4_IDS
|
||||
8086593B
|
||||
# INTEL_AML_KBL_GT2_IDS
|
||||
8086591C
|
||||
808687C0
|
||||
# INTEL_AML_CFL_GT2_IDS
|
||||
808687CA
|
||||
# INTEL_CML_GT1_IDS
|
||||
80869BA2
|
||||
80869BA4
|
||||
80869BA5
|
||||
80869BA8
|
||||
# INTEL_CML_U_GT1_IDS
|
||||
80869B21
|
||||
80869BAA
|
||||
80869BAC
|
||||
# INTEL_CML_GT2_IDS
|
||||
80869BC2
|
||||
80869BC4
|
||||
80869BC5
|
||||
80869BC6
|
||||
80869BC8
|
||||
80869BE6
|
||||
80869BF6
|
||||
# INTEL_CML_U_GT2_IDS
|
||||
80869B41
|
||||
80869BCA
|
||||
80869BCC
|
||||
# INTEL_CFL_S_GT1_IDS
|
||||
80863E90
|
||||
80863E93
|
||||
80863E99
|
||||
# INTEL_CFL_S_GT2_IDS
|
||||
80863E91
|
||||
80863E92
|
||||
80863E96
|
||||
80863E98
|
||||
80863E9A
|
||||
# INTEL_CFL_H_GT1_IDS
|
||||
80863E9C
|
||||
# INTEL_CFL_H_GT2_IDS
|
||||
80863E94
|
||||
80863E9B
|
||||
# INTEL_CFL_U_GT2_IDS
|
||||
80863EA9
|
||||
# INTEL_CFL_U_GT3_IDS
|
||||
80863EA5
|
||||
80863EA6
|
||||
80863EA7
|
||||
80863EA8
|
||||
# INTEL_WHL_U_GT1_IDS
|
||||
80863EA1
|
||||
80863EA4
|
||||
# INTEL_WHL_U_GT2_IDS
|
||||
80863EA0
|
||||
80863EA3
|
||||
# INTEL_WHL_U_GT3_IDS
|
||||
80863EA2
|
||||
# INTEL_CNL_PORT_F_IDS
|
||||
80865A44
|
||||
80865A4C
|
||||
80865A54
|
||||
80865A5C
|
||||
# INTEL_CNL_IDS
|
||||
80865A40
|
||||
80865A41
|
||||
80865A42
|
||||
80865A49
|
||||
80865A4A
|
||||
80865A50
|
||||
80865A51
|
||||
80865A52
|
||||
80865A59
|
||||
80865A5A
|
||||
# INTEL_ICL_PORT_F_IDS
|
||||
80868A50
|
||||
80868A52
|
||||
80868A53
|
||||
80868A54
|
||||
80868A56
|
||||
80868A57
|
||||
80868A58
|
||||
80868A59
|
||||
80868A5A
|
||||
80868A5B
|
||||
80868A5C
|
||||
80868A70
|
||||
80868A71
|
||||
# INTEL_ICL_11_IDS
|
||||
80868A51
|
||||
80868A5D
|
||||
# INTEL_EHL_IDS
|
||||
80864500~
|
||||
80864541
|
||||
80864551
|
||||
80864555
|
||||
80864557
|
||||
80864570~
|
||||
80864571
|
||||
# INTEL_JSL_IDS
|
||||
80864E51
|
||||
80864E55
|
||||
80864E57
|
||||
80864E61
|
||||
80864E71
|
||||
# INTEL_TGL_12_GT1_IDS
|
||||
80869A60
|
||||
80869A68
|
||||
80869A70
|
||||
# INTEL_TGL_12_GT2_IDS
|
||||
80869A40
|
||||
80869A49
|
||||
80869A59
|
||||
80869A78
|
||||
80869AC0
|
||||
80869AC9
|
||||
80869AD9
|
||||
80869AF8
|
||||
# INTEL_RKL_IDS
|
||||
80864C80
|
||||
80864C8A
|
||||
80864C8B
|
||||
80864C8C
|
||||
80864C90
|
||||
80864C9A
|
||||
# INTEL_DG1_IDS
|
||||
80864905
|
||||
80864906~
|
||||
80864907~
|
||||
80864908~
|
||||
80864909~
|
||||
@@ -7,25 +7,13 @@
|
||||
# eg: N i915.ko
|
||||
|
||||
# kvm
|
||||
F irqbypass.ko
|
||||
F kvm-intel.ko
|
||||
F kvm-amd.ko
|
||||
F kvm.ko
|
||||
N irqbypass.ko
|
||||
N kvm-intel.ko
|
||||
N kvm-amd.ko
|
||||
N kvm.ko
|
||||
|
||||
# acpi
|
||||
N acpi_call.ko
|
||||
N acpi-cpufreq.ko
|
||||
N processor.ko
|
||||
N button.ko
|
||||
|
||||
# cpufreq
|
||||
N cpufreq_governor.ko
|
||||
N cpufreq_ondemand.ko
|
||||
N cpufreq_conservative.ko
|
||||
N cpufreq_performance.ko
|
||||
N cpufreq_powersave.ko
|
||||
N cpufreq_userspace.ko
|
||||
N cpufreq_stats.ko
|
||||
|
||||
# misc
|
||||
N check_signature.ko
|
||||
@@ -46,6 +34,14 @@ N cdc_ether.ko
|
||||
N rndis_host.ko
|
||||
N r8152.ko
|
||||
|
||||
# iwlwifi
|
||||
N libarc4.ko
|
||||
N cfg80211.ko
|
||||
N mac80211.ko
|
||||
N iwlwifi.ko
|
||||
N iwlmvm.ko
|
||||
N iwldvm.ko
|
||||
|
||||
## i915
|
||||
#N dmabuf.ko
|
||||
#N drm.ko
|
||||
|
||||
@@ -1,37 +1,3 @@
|
||||
###############################################################################
|
||||
# Unpack modules from a tgz file
|
||||
# 1 - Platform
|
||||
# 2 - Kernel Version
|
||||
function unpackModules() {
|
||||
local PLATFORM=${1}
|
||||
local KVER=${2}
|
||||
local KERNEL="$(readConfigKey "kernel" "${USER_CONFIG_FILE}")"
|
||||
|
||||
rm -rf "${TMP_PATH}/modules"
|
||||
mkdir -p "${TMP_PATH}/modules"
|
||||
if [ "${KERNEL}" = "custom" ]; then
|
||||
tar -zxf "${CUSTOM_PATH}/modules-${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules"
|
||||
else
|
||||
tar -zxf "${MODULES_PATH}/${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules"
|
||||
fi
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# Packag modules to a tgz file
|
||||
# 1 - Platform
|
||||
# 2 - Kernel Version
|
||||
function packModules() {
|
||||
local PLATFORM=${1}
|
||||
local KVER=${2}
|
||||
local KERNEL="$(readConfigKey "kernel" "${USER_CONFIG_FILE}")"
|
||||
|
||||
if [ "${KERNEL}" = "custom" ]; then
|
||||
tar -zcf "${CUSTOM_PATH}/modules-${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" .
|
||||
else
|
||||
tar -zcf "${MODULES_PATH}/${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" .
|
||||
fi
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# Return list of all modules available
|
||||
# 1 - Platform
|
||||
@@ -44,14 +10,20 @@ function getAllModules() {
|
||||
echo ""
|
||||
return 1
|
||||
fi
|
||||
|
||||
unpackModules "${PLATFORM}" "${KVER}"
|
||||
|
||||
# Unzip modules for temporary folder
|
||||
rm -rf "${TMP_PATH}/modules"
|
||||
mkdir -p "${TMP_PATH}/modules"
|
||||
local KERNEL="$(readConfigKey "kernel" "${USER_CONFIG_FILE}")"
|
||||
if [ "${KERNEL}" == "custom" ]; then
|
||||
tar -zxf "${CUSTOM_PATH}/modules-${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules"
|
||||
else
|
||||
tar -zxf "${MODULES_PATH}/${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules"
|
||||
fi
|
||||
# Get list of all modules
|
||||
for F in $(ls ${TMP_PATH}/modules/*.ko 2>/dev/null); do
|
||||
local X=$(basename "${F}")
|
||||
local X=$(basename ${F})
|
||||
local M=${X:0:-3}
|
||||
local DESC=$(modinfo "${F}" | awk -F':' '/description:/{ print $2}' | awk '{sub(/^[ ]+/,""); print}')
|
||||
local DESC=$(modinfo ${F} | awk -F':' '/description:/{ print $2}' | awk '{sub(/^[ ]+/,""); print}')
|
||||
[ -z "${DESC}" ] && DESC="${X}"
|
||||
echo "${M} \"${DESC}\""
|
||||
done
|
||||
@@ -73,13 +45,23 @@ function installModules() {
|
||||
echo "ERROR: installModules: Platform or Kernel Version not defined" >"${LOG_FILE}"
|
||||
return 1
|
||||
fi
|
||||
|
||||
unpackModules "${PLATFORM}" "${KVER}"
|
||||
# Unzip modules for temporary folder
|
||||
rm -rf "${TMP_PATH}/modules"
|
||||
mkdir -p "${TMP_PATH}/modules"
|
||||
local KERNEL="$(readConfigKey "kernel" "${USER_CONFIG_FILE}")"
|
||||
if [ "${KERNEL}" == "custom" ]; then
|
||||
tar -zxf "${CUSTOM_PATH}/modules-${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" 2>"${LOG_FILE}"
|
||||
else
|
||||
tar -zxf "${MODULES_PATH}/${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" 2>"${LOG_FILE}"
|
||||
fi
|
||||
if [ $? -ne 0 ]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
local ODP="$(readConfigKey "odp" "${USER_CONFIG_FILE}")"
|
||||
for F in $(ls "${TMP_PATH}/modules/"*.ko 2>/dev/null); do
|
||||
local M=$(basename "${F}")
|
||||
[ "${ODP}" = "true" ] && [ -f "${RAMDISK_PATH}/usr/lib/modules/${M}" ] && continue
|
||||
local M=$(basename ${F})
|
||||
[ "${ODP}" == "true" -a -f "${RAMDISK_PATH}/usr/lib/modules/${M}" ] && continue
|
||||
if echo "${MLIST}" | grep -wq "${M:0:-3}"; then
|
||||
cp -f "${F}" "${RAMDISK_PATH}/usr/lib/modules/${M}" 2>"${LOG_FILE}"
|
||||
else
|
||||
@@ -87,7 +69,7 @@ function installModules() {
|
||||
fi
|
||||
done
|
||||
mkdir -p "${RAMDISK_PATH}/usr/lib/firmware"
|
||||
if [ "${KERNEL}" = "custom" ]; then
|
||||
if [ "${KERNEL}" == "custom" ]; then
|
||||
tar -zxf "${CUSTOM_PATH}/firmware.tgz" -C "${RAMDISK_PATH}/usr/lib/firmware" 2>"${LOG_FILE}"
|
||||
else
|
||||
tar -zxf "${MODULES_PATH}/firmware.tgz" -C "${RAMDISK_PATH}/usr/lib/firmware" 2>"${LOG_FILE}"
|
||||
@@ -115,12 +97,21 @@ function addToModules() {
|
||||
echo ""
|
||||
return 1
|
||||
fi
|
||||
|
||||
unpackModules "${PLATFORM}" "${KVER}"
|
||||
|
||||
cp -f "${KOFILE}" "${TMP_PATH}/modules"
|
||||
|
||||
packModules "${PLATFORM}" "${KVER}"
|
||||
# Unzip modules for temporary folder
|
||||
rm -rf "${TMP_PATH}/modules"
|
||||
mkdir -p "${TMP_PATH}/modules"
|
||||
local KERNEL="$(readConfigKey "kernel" "${USER_CONFIG_FILE}")"
|
||||
if [ "${KERNEL}" == "custom" ]; then
|
||||
tar -zxf "${CUSTOM_PATH}/modules-${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules"
|
||||
else
|
||||
tar -zxf "${MODULES_PATH}/${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules"
|
||||
fi
|
||||
cp -f ${KOFILE} ${TMP_PATH}/modules
|
||||
if [ "${KERNEL}" == "custom" ]; then
|
||||
tar -zcf "${CUSTOM_PATH}/modules-${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" .
|
||||
else
|
||||
tar -zcf "${MODULES_PATH}/${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" .
|
||||
fi
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
@@ -137,12 +128,21 @@ function delToModules() {
|
||||
echo ""
|
||||
return 1
|
||||
fi
|
||||
|
||||
unpackModules "${PLATFORM}" "${KVER}"
|
||||
|
||||
rm -f "${TMP_PATH}/modules/${KONAME}"
|
||||
|
||||
packModules "${PLATFORM}" "${KVER}"
|
||||
# Unzip modules for temporary folder
|
||||
rm -rf "${TMP_PATH}/modules"
|
||||
mkdir -p "${TMP_PATH}/modules"
|
||||
local KERNEL="$(readConfigKey "kernel" "${USER_CONFIG_FILE}")"
|
||||
if [ "${KERNEL}" == "custom" ]; then
|
||||
tar -zxf "${CUSTOM_PATH}/modules-${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules"
|
||||
else
|
||||
tar -zxf "${MODULES_PATH}/${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules"
|
||||
fi
|
||||
rm -f ${TMP_PATH}/modules/${KONAME}
|
||||
if [ "${KERNEL}" == "custom" ]; then
|
||||
tar -zcf "${CUSTOM_PATH}/modules-${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" .
|
||||
else
|
||||
tar -zcf "${MODULES_PATH}/${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules" .
|
||||
fi
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
@@ -170,10 +170,16 @@ function getdepends() {
|
||||
echo ""
|
||||
return 1
|
||||
fi
|
||||
|
||||
unpackModules "${PLATFORM}" "${KVER}"
|
||||
|
||||
local DPS=($(_getdepends "${KONAME}" | tr ' ' '\n' | sort -u))
|
||||
# Unzip modules for temporary folder
|
||||
rm -rf "${TMP_PATH}/modules"
|
||||
mkdir -p "${TMP_PATH}/modules"
|
||||
local KERNEL="$(readConfigKey "kernel" "${USER_CONFIG_FILE}")"
|
||||
if [ "${KERNEL}" == "custom" ]; then
|
||||
tar -zxf "${CUSTOM_PATH}/modules-${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules"
|
||||
else
|
||||
tar -zxf "${MODULES_PATH}/${PLATFORM}-${KVER}.tgz" -C "${TMP_PATH}/modules"
|
||||
fi
|
||||
local DPS=($(_getdepends ${KONAME} | tr ' ' '\n' | sort -u))
|
||||
echo ${DPS[@]}
|
||||
rm -rf "${TMP_PATH}/modules"
|
||||
}
|
||||
51
files/initrd/opt/arc/include/network.sh
Executable file
51
files/initrd/opt/arc/include/network.sh
Executable file
@@ -0,0 +1,51 @@
|
||||
# Get Network Config for Loader
|
||||
function getnet() {
|
||||
ETHX="$(ls /sys/class/net 2>/dev/null | grep eth)"
|
||||
MODEL="$(readConfigKey "model" "${USER_CONFIG_FILE}")"
|
||||
ARCPATCH="$(readConfigKey "arc.patch" "${USER_CONFIG_FILE}")"
|
||||
NICPORTS="$(readConfigKey "${MODEL}.ports" "${S_FILE}" 2>/dev/null)"
|
||||
if [ "${ARCPATCH}" == "true" ]; then
|
||||
ETHN="$(echo ${ETHX} | wc -w)"
|
||||
MACS=($(generateMacAddress "${MODEL}" "${ETHN}" "true"))
|
||||
for I in $(seq 1 ${ETHN}); do
|
||||
eval MAC${I}="${MACS[$((${I} - 1))]}"
|
||||
writeConfigKey "eth$((${I} - 1))" "${MACS[$((${I} - 1))]}" "${USER_CONFIG_FILE}"
|
||||
done
|
||||
elif [ "${ARCPATCH}" == "false" ]; then
|
||||
ETHN="$(echo ${ETHX} | wc -w)"
|
||||
MACS=($(generateMacAddress "${MODEL}" "${ETHN}" "false"))
|
||||
for I in $(seq 1 ${ETHN}); do
|
||||
eval MAC${I}="${MACS[$((${I} - 1))]}"
|
||||
writeConfigKey "eth$((${I} - 1))" "${MACS[$((${I} - 1))]}" "${USER_CONFIG_FILE}"
|
||||
done
|
||||
elif [ "${ARCPATCH}" == "user" ]; then
|
||||
# User Mac
|
||||
for ETH in ${ETHX}; do
|
||||
while true; do
|
||||
MAC="$(cat /sys/class/net/${ETH}/address | sed 's/://g' | tr '[:lower:]' '[:upper:]')"
|
||||
dialog --backtitle "$(backtitle)" --title "Mac Setting" \
|
||||
--inputbox "Type a custom MAC for ${ETH} (Eq. 001132abc123)." 7 50 "${MAC}"\
|
||||
2>"${TMP_PATH}/resp"
|
||||
[ $? -ne 0 ] && break
|
||||
MAC=$(cat "${TMP_PATH}/resp")
|
||||
[ -z "${MAC}" ] && MAC="$(readConfigKey "${ETH}" "${USER_CONFIG_FILE}")"
|
||||
[ -z "${MAC}" ] && MAC="$(cat /sys/class/net/${ETH}/address 2>/dev/null | sed 's/://g' | tr '[:lower:]' '[:upper:]')"
|
||||
MAC="$(echo "${MAC}" | tr '[:lower:]' '[:upper:]')"
|
||||
if [ ${#MAC} -eq 12 ]; then
|
||||
writeConfigKey "${ETH}" "${MAC}" "${USER_CONFIG_FILE}"
|
||||
break
|
||||
else
|
||||
dialog --backtitle "$(backtitle)" --title "Mac Setting" --msgbox "Invalid MAC - Try again!" 5 50
|
||||
fi
|
||||
done
|
||||
done
|
||||
fi
|
||||
}
|
||||
|
||||
# Get Amount of NIC
|
||||
ETHX="$(ls /sys/class/net 2>/dev/null | grep eth)"
|
||||
# Get actual IP
|
||||
for ETH in ${ETHX}; do
|
||||
IPCON=$(getIP ${ETH})
|
||||
[ -n "${IPCON}" ] && break
|
||||
done
|
||||
254
files/initrd/opt/arc/include/storage.sh
Executable file
254
files/initrd/opt/arc/include/storage.sh
Executable file
@@ -0,0 +1,254 @@
|
||||
# Get PortMap for Loader
|
||||
function getmap() {
|
||||
# Sata Disks
|
||||
SATADRIVES=0
|
||||
# Clean old files
|
||||
[ -f "${TMP_PATH}/drivesmax" ] && rm -f "${TMP_PATH}/drivesmax"
|
||||
touch "${TMP_PATH}/drivesmax"
|
||||
[ -f "${TMP_PATH}/drivescon" ] && rm -f "${TMP_PATH}/drivescon"
|
||||
touch "${TMP_PATH}/drivescon"
|
||||
[ -f "${TMP_PATH}/ports" ] && rm -f "${TMP_PATH}/ports"
|
||||
touch "${TMP_PATH}/ports"
|
||||
[ -f "${TMP_PATH}/remap" ] && rm -f "${TMP_PATH}/remap"
|
||||
touch "${TMP_PATH}/remap"
|
||||
if [ $(lspci -d ::106 | wc -l) -gt 0 ]; then
|
||||
let DISKIDXMAPIDX=0
|
||||
DISKIDXMAP=""
|
||||
let DISKIDXMAPIDXMAX=0
|
||||
DISKIDXMAPMAX=""
|
||||
for PCI in $(lspci -d ::106 | awk '{print $1}'); do
|
||||
NUMPORTS=0
|
||||
CONPORTS=0
|
||||
unset HOSTPORTS
|
||||
declare -A HOSTPORTS
|
||||
while read -r LINE; do
|
||||
ATAPORT="$(echo ${LINE} | grep -o 'ata[0-9]*')"
|
||||
PORT=$(echo ${ATAPORT} | sed 's/ata//')
|
||||
HOSTPORTS[${PORT}]=$(echo ${LINE} | grep -o 'host[0-9]*$')
|
||||
done < <(ls -l /sys/class/scsi_host | grep -F "${PCI}")
|
||||
while read -r PORT; do
|
||||
ls -l /sys/block | grep -F -q "${PCI}/ata${PORT}" && ATTACH=1 || ATTACH=0
|
||||
PCMD=$(cat /sys/class/scsi_host/${HOSTPORTS[${PORT}]}/ahci_port_cmd)
|
||||
[ ${PCMD} = 0 ] && DUMMY=1 || DUMMY=0
|
||||
[ ${ATTACH} = 1 ] && CONPORTS="$((${CONPORTS} + 1))" && echo "$((${PORT} - 1))" >>"${TMP_PATH}/ports"
|
||||
[ ${DUMMY} = 1 ] # Do nothing for now
|
||||
NUMPORTS=$((${NUMPORTS} + 1))
|
||||
done < <(echo ${!HOSTPORTS[@]} | tr ' ' '\n' | sort -n)
|
||||
[ ${NUMPORTS} -gt 8 ] && NUMPORTS=8
|
||||
[ ${CONPORTS} -gt 8 ] && CONPORTS=8
|
||||
echo -n "${NUMPORTS}" >>"${TMP_PATH}/drivesmax"
|
||||
echo -n "${CONPORTS}" >>"${TMP_PATH}/drivescon"
|
||||
DISKIDXMAP=$DISKIDXMAP$(printf "%02x" $DISKIDXMAPIDX)
|
||||
let DISKIDXMAPIDX=$DISKIDXMAPIDX+$CONPORTS
|
||||
DISKIDXMAPMAX=$DISKIDXMAPMAX$(printf "%02x" $DISKIDXMAPIDXMAX)
|
||||
let DISKIDXMAPIDXMAX=$DISKIDXMAPIDXMAX+$NUMPORTS
|
||||
SATADRIVES=$((${SATADRIVES} + ${CONPORTS}))
|
||||
done
|
||||
fi
|
||||
# SAS Disks
|
||||
SASDRIVES=0
|
||||
if [ $(lspci -d ::107 | wc -l) -gt 0 ]; then
|
||||
for PCI in $(lspci -d ::107 | awk '{print $1}'); do
|
||||
NAME=$(lspci -s "${PCI}" | sed "s/\ .*://")
|
||||
PORT=$(ls -l /sys/class/scsi_host | grep "${PCI}" | awk -F'/' '{print $NF}' | sed 's/host//' | sort -n 2>/dev/null)
|
||||
PORTNUM=$(lsscsi -b | grep -v - | grep "\[${PORT}:" | wc -l)
|
||||
SASDRIVES=$((${SASDRIVES} + ${PORTNUM}))
|
||||
done
|
||||
fi
|
||||
# SCSI Disks
|
||||
SCSIDRIVES=0
|
||||
if [ $(lspci -d ::100 | wc -l) -gt 0 ]; then
|
||||
for PCI in $(lspci -d ::100 | awk '{print $1}'); do
|
||||
NAME=$(lspci -s "${PCI}" | sed "s/\ .*://")
|
||||
PORT=$(ls -l /sys/class/scsi_host | grep "${PCI}" | awk -F'/' '{print $NF}' | sed 's/host//' | sort - 2>/dev/null)
|
||||
PORTNUM=$(lsscsi -b | grep -v - | grep "\[${PORT}:" | wc -l)
|
||||
SCSIDRIVES=$((${SCSIDRIVES} + ${PORTNUM}))
|
||||
done
|
||||
fi
|
||||
# Raid Disks
|
||||
RAIDDRIVES=0
|
||||
if [ $(lspci -d ::104 | wc -l) -gt 0 ]; then
|
||||
for PCI in $(lspci -d ::104 | awk '{print $1}'); do
|
||||
NAME=$(lspci -s "${PCI}" | sed "s/\ .*://")
|
||||
PORT=$(ls -l /sys/class/scsi_host | grep "${PCI}" | awk -F'/' '{print $NF}' | sed 's/host//' | sort -n 2>/dev/null)
|
||||
PORTNUM=$(lsscsi -b | grep -v - | grep "\[${PORT}:" | wc -l)
|
||||
RAIDDRIVES=$((${RAIDDRIVES} + ${PORTNUM}))
|
||||
done
|
||||
fi
|
||||
# USB Disks
|
||||
USBDRIVES=0
|
||||
if [[ -d "/sys/class/scsi_host" && $(ls -l /sys/class/scsi_host | grep usb | wc -l) -gt 0 ]]; then
|
||||
for PCI in $(lspci -d ::c03 | awk '{print $1}'); do
|
||||
NAME=$(lspci -s "${PCI}" | sed "s/\ .*://")
|
||||
PORT=$(ls -l /sys/class/scsi_host | grep "${PCI}" | awk -F'/' '{print $NF}' | sed 's/host//' | sort -n 2>/dev/null)
|
||||
PORTNUM=$(lsscsi -b | grep -v - | grep "\[${PORT}:" | wc -l)
|
||||
[ ${PORTNUM} -eq 0 ] && continue
|
||||
USBDRIVES=$((${USBDRIVES} + ${PORTNUM}))
|
||||
done
|
||||
fi
|
||||
# MMC Disks
|
||||
MMCDRIVES=0
|
||||
if [[ -d "/sys/class/mmc_host" && $(ls -l /sys/class/mmc_host | grep mmc_host | wc -l) -gt 0 ]]; then
|
||||
for PCI in $(lspci -d ::805 | awk '{print $1}'); do
|
||||
NAME=$(lspci -s "${PCI}" | sed "s/\ .*://")
|
||||
PORTNUM=$(ls -l /sys/block/mmc* | grep "${PCI}" | wc -l 2>/dev/null)
|
||||
[ ${PORTNUM} -eq 0 ] && continue
|
||||
MMCDRIVES=$((${MMCDRIVES} + ${PORTNUM}))
|
||||
done
|
||||
fi
|
||||
# NVMe Disks
|
||||
NVMEDRIVES=0
|
||||
if [ $(lspci -d ::108 | wc -l) -gt 0 ]; then
|
||||
for PCI in $(lspci -d ::108 | awk '{print $1}'); do
|
||||
NAME=$(lspci -s "${PCI}" | sed "s/\ .*://")
|
||||
PORT=$(ls -l /sys/class/nvme | grep "${PCI}" | awk -F'/' '{print $NF}' | sed 's/nvme//' | sort -n 2>/dev/null)
|
||||
PORTNUM=$(lsscsi -b | grep -v - | grep "\[N:${PORT}:" | wc -l)
|
||||
NVMEDRIVES=$((${NVMEDRIVES} + ${PORTNUM}))
|
||||
done
|
||||
fi
|
||||
# Disk Count for MaxDisks
|
||||
DRIVES=$((${SATADRIVES} + ${SASDRIVES} + ${SCSIDRIVES} + ${RAIDDRIVES} + ${USBDRIVES} + ${MMCDRIVES} + ${NVMEDRIVES}))
|
||||
HARDDRIVES=$((${SATADRIVES} + ${SASDRIVES} + ${SCSIDRIVES} + ${RAIDDRIVES} + ${NVMEDRIVES}))
|
||||
writeConfigKey "device.satadrives" "${SATADRIVES}" "${USER_CONFIG_FILE}"
|
||||
writeConfigKey "device.sasdrives" "${SASDRIVES}" "${USER_CONFIG_FILE}"
|
||||
writeConfigKey "device.scsidrives" "${SCSIDRIVES}" "${USER_CONFIG_FILE}"
|
||||
writeConfigKey "device.raiddrives" "${RAIDDRIVES}" "${USER_CONFIG_FILE}"
|
||||
writeConfigKey "device.usbdrives" "${USBDRIVES}" "${USER_CONFIG_FILE}"
|
||||
writeConfigKey "device.mmcdrives" "${MMCDRIVES}" "${USER_CONFIG_FILE}"
|
||||
writeConfigKey "device.nvmedrives" "${NVMEDRIVES}" "${USER_CONFIG_FILE}"
|
||||
writeConfigKey "device.drives" "${DRIVES}" "${USER_CONFIG_FILE}"
|
||||
writeConfigKey "device.harddrives" "${HARDDRIVES}" "${USER_CONFIG_FILE}"
|
||||
# Check for Sata Boot
|
||||
if [ $(lspci -d ::106 | wc -l) -gt 0 ]; then
|
||||
LASTDRIVE=0
|
||||
while read -r D; do
|
||||
if [ "${BUS}" == "sata" ] && [ "${MACHINE}" != "Native" ] && [ ${D} -eq 0 ]; then
|
||||
MAXDISKS=${DRIVES}
|
||||
echo -n "${D}>${MAXDISKS}:">>"${TMP_PATH}/remap"
|
||||
elif [ ${D} != ${LASTDRIVE} ]; then
|
||||
echo -n "${D}>${LASTDRIVE}:">>"${TMP_PATH}/remap"
|
||||
LASTDRIVE=$((${LASTDRIVE} + 1))
|
||||
elif [ ${D} == ${LASTDRIVE} ]; then
|
||||
LASTDRIVE=$((${D} + 1))
|
||||
fi
|
||||
done < <(cat "${TMP_PATH}/ports")
|
||||
fi
|
||||
}
|
||||
|
||||
function getmapSelection() {
|
||||
# Compute PortMap Options
|
||||
SATAPORTMAPMAX="$(awk '{print $1}' "${TMP_PATH}/drivesmax")"
|
||||
SATAPORTMAP="$(awk '{print $1}' "${TMP_PATH}/drivescon")"
|
||||
SATAREMAP="$(awk '{print $1}' "${TMP_PATH}/remap" | sed 's/.$//')"
|
||||
EXTERNALCONTROLLER="$(readConfigKey "device.externalcontroller" "${USER_CONFIG_FILE}")"
|
||||
ARCMODE="$(readConfigKey "arc.mode" "${USER_CONFIG_FILE}")"
|
||||
if [ "${ARCMODE}" == "config" ]; then
|
||||
# Show recommended Option to user
|
||||
if [ -n "${SATAREMAP}" ] && [ "${EXTERNALCONTROLLER}" == "true" ] && [ "${MACHINE}" == "Native" ]; then
|
||||
REMAP2="*"
|
||||
elif [ -n "${SATAREMAP}" ] && [ "${EXTERNALCONTROLLER}" == "false" ]; then
|
||||
REMAP3="*"
|
||||
else
|
||||
REMAP1="*"
|
||||
fi
|
||||
# Ask for Portmap
|
||||
if [ "${STEP}" == "storagemap" ]; then
|
||||
dialog --backtitle "$(backtitlep)" --title "Sata Portmap" \
|
||||
--menu "Choose a Portmap for Sata!?\n* Recommended Option" 8 60 0 \
|
||||
1 "DiskIdxMap: Active Ports ${REMAP1}" \
|
||||
2 "DiskIdxMap: Max Ports ${REMAP2}" \
|
||||
3 "SataRemap: Remove empty Ports ${REMAP3}" \
|
||||
4 "AhciRemap: Remove empty Ports (new) ${REMAP4}" \
|
||||
5 "Set my own Portmap in Config" \
|
||||
2>"${TMP_PATH}/resp"
|
||||
[ $? -ne 0 ] && return 1
|
||||
resp=$(cat "${TMP_PATH}/resp")
|
||||
[ -z "${resp}" ] && return 1
|
||||
else
|
||||
dialog --backtitle "$(backtitle)" --title "Sata Portmap" \
|
||||
--menu "Choose a Portmap for Sata!?\n* Recommended Option" 8 60 0 \
|
||||
1 "DiskIdxMap: Active Ports ${REMAP1}" \
|
||||
2 "DiskIdxMap: Max Ports ${REMAP2}" \
|
||||
3 "SataRemap: Remove empty Ports ${REMAP3}" \
|
||||
4 "AhciRemap: Remove empty Ports (new) ${REMAP4}" \
|
||||
5 "Set my own Portmap in Config" \
|
||||
2>"${TMP_PATH}/resp"
|
||||
[ $? -ne 0 ] && return 1
|
||||
resp=$(cat "${TMP_PATH}/resp")
|
||||
[ -z "${resp}" ] && return 1
|
||||
fi
|
||||
if [ ${resp} -eq 1 ]; then
|
||||
writeConfigKey "arc.remap" "acports" "${USER_CONFIG_FILE}"
|
||||
elif [ ${resp} -eq 2 ]; then
|
||||
writeConfigKey "arc.remap" "maxports" "${USER_CONFIG_FILE}"
|
||||
elif [ ${resp} -eq 3 ]; then
|
||||
writeConfigKey "arc.remap" "remap" "${USER_CONFIG_FILE}"
|
||||
elif [ ${resp} -eq 4 ]; then
|
||||
writeConfigKey "arc.remap" "ahci" "${USER_CONFIG_FILE}"
|
||||
elif [ ${resp} -eq 5 ]; then
|
||||
writeConfigKey "arc.remap" "user" "${USER_CONFIG_FILE}"
|
||||
fi
|
||||
else
|
||||
# Show recommended Option to user
|
||||
if [ -n "${SATAREMAP}" ] && [ "${EXTERNALCONTROLLER}" == "true" ] && [ "${MACHINE}" == "Native" ]; then
|
||||
writeConfigKey "arc.remap" "maxports" "${USER_CONFIG_FILE}"
|
||||
elif [ -n "${SATAREMAP}" ] && [ "${EXTERNALCONTROLLER}" == "false" ]; then
|
||||
writeConfigKey "arc.remap" "remap" "${USER_CONFIG_FILE}"
|
||||
else
|
||||
writeConfigKey "arc.remap" "acports" "${USER_CONFIG_FILE}"
|
||||
fi
|
||||
fi
|
||||
# Check Remap for correct config
|
||||
REMAP="$(readConfigKey "arc.remap" "${USER_CONFIG_FILE}")"
|
||||
# Write Map to config and show Map to User
|
||||
if [ "${REMAP}" == "acports" ]; then
|
||||
writeConfigKey "cmdline.SataPortMap" "${SATAPORTMAP}" "${USER_CONFIG_FILE}"
|
||||
writeConfigKey "cmdline.DiskIdxMap" "${DISKIDXMAP}" "${USER_CONFIG_FILE}"
|
||||
deleteConfigKey "cmdline.sata_remap" "${USER_CONFIG_FILE}"
|
||||
deleteConfigKey "cmdline.ahci_remap" "${USER_CONFIG_FILE}"
|
||||
elif [ "${REMAP}" == "maxports" ]; then
|
||||
writeConfigKey "cmdline.SataPortMap" "${SATAPORTMAPMAX}" "${USER_CONFIG_FILE}"
|
||||
writeConfigKey "cmdline.DiskIdxMap" "${DISKIDXMAPMAX}" "${USER_CONFIG_FILE}"
|
||||
deleteConfigKey "cmdline.sata_remap" "${USER_CONFIG_FILE}"
|
||||
deleteConfigKey "cmdline.ahci_remap" "${USER_CONFIG_FILE}"
|
||||
elif [ "${REMAP}" == "remap" ]; then
|
||||
writeConfigKey "cmdline.sata_remap" "${SATAREMAP}" "${USER_CONFIG_FILE}"
|
||||
deleteConfigKey "cmdline.DiskIdxMap" "${USER_CONFIG_FILE}"
|
||||
deleteConfigKey "cmdline.SataPortMap" "${USER_CONFIG_FILE}"
|
||||
deleteConfigKey "cmdline.ahci_remap" "${USER_CONFIG_FILE}"
|
||||
elif [ "${REMAP}" == "ahci" ]; then
|
||||
writeConfigKey "cmdline.ahci_remap" "${SATAREMAP}" "${USER_CONFIG_FILE}"
|
||||
deleteConfigKey "cmdline.DiskIdxMap" "${USER_CONFIG_FILE}"
|
||||
deleteConfigKey "cmdline.SataPortMap" "${USER_CONFIG_FILE}"
|
||||
deleteConfigKey "cmdline.sata_remap" "${USER_CONFIG_FILE}"
|
||||
elif [ "${REMAP}" == "user" ]; then
|
||||
deleteConfigKey "cmdline.SataPortMap" "${USER_CONFIG_FILE}"
|
||||
deleteConfigKey "cmdline.DiskIdxMap" "${USER_CONFIG_FILE}"
|
||||
deleteConfigKey "cmdline.sata_remap" "${USER_CONFIG_FILE}"
|
||||
deleteConfigKey "cmdline.ahci_remap" "${USER_CONFIG_FILE}"
|
||||
fi
|
||||
}
|
||||
|
||||
# Check for Controller // 104=RAID // 106=SATA // 107=SAS // 100=SCSI // c03=USB
|
||||
SATACONTROLLER=$(lspci -d ::106 | wc -l)
|
||||
writeConfigKey "device.satacontroller" "${SATACONTROLLER}" "${USER_CONFIG_FILE}"
|
||||
if [ ${SATACONTROLLER} -gt 0 ]; then
|
||||
writeConfigKey "device.externalcontroller" "false" "${USER_CONFIG_FILE}"
|
||||
fi
|
||||
SASCONTROLLER=$(lspci -d ::107 | wc -l)
|
||||
writeConfigKey "device.sascontroller" "${SASCONTROLLER}" "${USER_CONFIG_FILE}"
|
||||
if [ ${SASCONTROLLER} -gt 0 ]; then
|
||||
writeConfigKey "device.externalcontroller" "true" "${USER_CONFIG_FILE}"
|
||||
fi
|
||||
SCSICONTROLLER=$(lspci -d ::100 | wc -l)
|
||||
writeConfigKey "device.scsicontroller" "${SCSICONTROLLER}" "${USER_CONFIG_FILE}"
|
||||
if [ ${SCSICONTROLLER} -gt 0 ]; then
|
||||
writeConfigKey "device.externalcontroller" "true" "${USER_CONFIG_FILE}"
|
||||
fi
|
||||
RAIDCONTROLLER=$(lspci -d ::104 | wc -l)
|
||||
writeConfigKey "device.raidcontroller" "${RAIDCONTROLLER}" "${USER_CONFIG_FILE}"
|
||||
if [ ${RAIDCONTROLLER} -gt 0 ]; then
|
||||
writeConfigKey "device.externalcontroller" "true" "${USER_CONFIG_FILE}"
|
||||
fi
|
||||
# Check Controller for Disks
|
||||
getmap
|
||||
@@ -2,71 +2,54 @@
|
||||
# Update Loader
|
||||
function updateLoader() {
|
||||
CONFDONE="$(readConfigKey "arc.confdone" "${USER_CONFIG_FILE}")"
|
||||
local ARC_BRANCH="$(readConfigKey "arc.branch" "${USER_CONFIG_FILE}")"
|
||||
local ARCMODE="$(readConfigKey "arc.mode" "${USER_CONFIG_FILE}")"
|
||||
local ARCCONF="$(readConfigKey "${MODEL:-SA6400}.serial" "${S_FILE}")"
|
||||
local TAG="${1}"
|
||||
[ -n "${ARCCONF}" ] && cp -f "${S_FILE}" "${TMP_PATH}/bak.yml"
|
||||
if [ "${TAG}" != "zip" ]; then
|
||||
if [ -z "${TAG}" ]; then
|
||||
idx=0
|
||||
while [ ${idx} -le 5 ]; do # Loop 5 times, if successful, break
|
||||
if [ "${ARC_BRANCH}" = "dev" ]; then
|
||||
TAG="$(curl -m 10 -skL "https://api.github.com/repos/AuxXxilium/arc/releases" | jq -r ".[].tag_name" | grep "dev" | sort -rV | head -1)"
|
||||
else
|
||||
TAG="$(curl -m 10 -skL "https://api.github.com/repos/AuxXxilium/arc/releases" | jq -r ".[].tag_name" | grep -v "dev" | sort -rV | head -1)"
|
||||
fi
|
||||
if [ -n "${TAG}" ]; then
|
||||
break
|
||||
fi
|
||||
sleep 3
|
||||
idx=$((${idx} + 1))
|
||||
done
|
||||
fi
|
||||
if [ -n "${TAG}" ]; then
|
||||
export URL="https://github.com/AuxXxilium/arc/releases/download/${TAG}/update-${TAG}-${ARC_BRANCH}.zip"
|
||||
export TAG="${TAG}"
|
||||
{
|
||||
{
|
||||
curl -kL "${URL}" -o ${TMP_PATH}/update.zip 2>&3 3>&-
|
||||
} 3>&1 >&4 4>&- |
|
||||
perl -C -lane '
|
||||
BEGIN {$header = "Downloading $ENV{URL}...\n\n"; $| = 1}
|
||||
$pcent = $F[0];
|
||||
$_ = join "", unpack("x3 a7 x4 a9 x8 a9 x7 a*") if length > 20;
|
||||
s/ /\xa0/g; # replacing space with nbsp as dialog squashes spaces
|
||||
if ($. <= 3) {
|
||||
$header .= "$_\n";
|
||||
$/ = "\r" if $. == 2
|
||||
} else {
|
||||
print "XXX\n$pcent\n$header$_\nXXX"
|
||||
}' 4>&- |
|
||||
dialog --gauge "Download Update: ${TAG}..." 14 72 4>&-
|
||||
} 4>&1
|
||||
fi
|
||||
if [ -f "${TMP_PATH}/update.zip" ] && [ $(ls -s "${TMP_PATH}/update.zip" | cut -d' ' -f1) -gt 300000 ]; then
|
||||
if [ "${TAG}" != "zip" ]; then
|
||||
HASHURL="https://github.com/AuxXxilium/arc/releases/download/${TAG}/update-${TAG}-${ARC_BRANCH}.hash"
|
||||
HASH="$(curl -skL "${HASHURL}" | awk '{print $1}')"
|
||||
if [ "${HASH}" != "$(sha256sum "${TMP_PATH}/update.zip" | awk '{print $1}')" ]; then
|
||||
dialog --backtitle "$(backtitle)" --title "Update Loader" --aspect 18 \
|
||||
--infobox "Update failed - Hash mismatch!\nTry again later." 0 0
|
||||
sleep 3
|
||||
exec reboot
|
||||
fi
|
||||
if [ -z "${TAG}" ]; then
|
||||
idx=0
|
||||
while [ ${idx} -le 5 ]; do # Loop 5 times, if successful, break
|
||||
if [ "${ARC_BRANCH}" == "dev" ]; then
|
||||
local TAG="$(curl -m 10 -skL "https://api.github.com/repos/AuxXxilium/arc/releases" | jq -r ".[].tag_name" | grep "dev" | sort -rV | head -1)"
|
||||
else
|
||||
local TAG="$(curl -m 10 -skL "https://api.github.com/repos/AuxXxilium/arc/releases" | jq -r ".[].tag_name" | grep -v "dev" | sort -rV | head -1)"
|
||||
fi
|
||||
rm -rf "/mnt/update"
|
||||
mkdir -p "${TMP_PATH}/update"
|
||||
if [ -n "${TAG}" ]; then
|
||||
break
|
||||
fi
|
||||
sleep 3
|
||||
idx=$((${idx} + 1))
|
||||
done
|
||||
fi
|
||||
if [ -n "${TAG}" ]; then
|
||||
export URL="https://github.com/AuxXxilium/arc/releases/download/${TAG}/update-${TAG}-${ARC_BRANCH}.zip"
|
||||
export TAG="${TAG}"
|
||||
{
|
||||
curl -kL "$URL" -o ${TMP_PATH}/update.zip 2>&1 |
|
||||
perl -C -lane '
|
||||
BEGIN {$header = "Downloading $ENV{TAG}...\n\n"; $| = 1}
|
||||
$pcent = $F[0];
|
||||
$_ = join "", unpack("x3 a7 x4 a9 x8 a9 x7 a*") if length > 20;
|
||||
s/ /\xa0/g;
|
||||
if ($. <= 3) {
|
||||
$header .= "$_\n";
|
||||
$/ = "\r" if $. == 2
|
||||
} else {
|
||||
print "XXX\n$pcent\n$header$_\nXXX"
|
||||
}' |
|
||||
dialog --backtitle "$(backtitle)" --title "Update Loader" \
|
||||
--gauge "Download Loader: $TAG ..." 14 72
|
||||
}
|
||||
if [ -f "${TMP_PATH}/update.zip" ] && [ $(ls -s "${TMP_PATH}/update.zip" | cut -d' ' -f1) -gt 300000 ]; then
|
||||
dialog --backtitle "$(backtitle)" --title "Update Loader" \
|
||||
--infobox "Updating Loader..." 3 50
|
||||
if unzip -oq "${TMP_PATH}/update.zip" -d "${TMP_PATH}/update"; then
|
||||
cp -rf "${TMP_PATH}/update"/* "/mnt"
|
||||
rm -rf "${TMP_PATH}/update"
|
||||
rm -f "${TMP_PATH}/update.zip"
|
||||
fi
|
||||
if [ "$(cat "${PART1_PATH}/ARC-VERSION")" = "${TAG}" ] || [ "${TAG}" = "zip" ]; then
|
||||
if unzip -oq "${TMP_PATH}/update.zip" -d "/mnt"; then
|
||||
dialog --backtitle "$(backtitle)" --title "Update Loader" \
|
||||
--infobox "Update Loader successful!" 3 50
|
||||
--infobox "Update successful!" 3 50
|
||||
sleep 2
|
||||
else
|
||||
if [ "${ARCMODE}" = "update" ]; then
|
||||
if [ "${ARCMODE}" == "update" ]; then
|
||||
dialog --backtitle "$(backtitle)" --title "Update Loader" --aspect 18 \
|
||||
--infobox "Update failed!\nTry again later." 0 0
|
||||
sleep 3
|
||||
@@ -76,7 +59,7 @@ function updateLoader() {
|
||||
fi
|
||||
fi
|
||||
else
|
||||
if [ "${ARCMODE}" = "update" ]; then
|
||||
if [ "${ARCMODE}" == "update" ]; then
|
||||
dialog --backtitle "$(backtitle)" --title "Update Loader" --aspect 18 \
|
||||
--infobox "Update failed!\nTry again later." 0 0
|
||||
sleep 3
|
||||
@@ -87,18 +70,18 @@ function updateLoader() {
|
||||
fi
|
||||
fi
|
||||
[ -n "${ARCCONF}" ] && cp -f "${TMP_PATH}/bak.yml" "${S_FILE}"
|
||||
if [ "${ARCMODE}" = "update" ] && [ "${CONFDONE}" = "true" ]; then
|
||||
if [ "${ARCMODE}" == "update" ] && [ "${CONFDONE}" == "true" ]; then
|
||||
dialog --backtitle "$(backtitle)" --title "Update Loader" --aspect 18 \
|
||||
--infobox "Update Loader successful! -> Reboot to automated Build Mode..." 3 60
|
||||
--infobox "Update successful! -> Reboot to automated Build Mode..." 3 60
|
||||
sleep 3
|
||||
writeConfigKey "arc.builddone" "false" "${USER_CONFIG_FILE}"
|
||||
rebootTo automated
|
||||
rebootTo "automated"
|
||||
else
|
||||
dialog --backtitle "$(backtitle)" --title "Update Loader" --aspect 18 \
|
||||
--infobox "Update Loader successful! -> Reboot to Config Mode..." 3 50
|
||||
--infobox "Update successful! -> Reboot to Config Mode..." 3 50
|
||||
sleep 3
|
||||
writeConfigKey "arc.builddone" "false" "${USER_CONFIG_FILE}"
|
||||
rebootTo config
|
||||
rebootTo "config"
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -119,22 +102,21 @@ function updateAddons() {
|
||||
export URL="https://github.com/AuxXxilium/arc-addons/releases/download/${TAG}/addons-${TAG}.zip"
|
||||
export TAG="${TAG}"
|
||||
{
|
||||
{
|
||||
curl -kL "${URL}" -o ${TMP_PATH}/addons.zip 2>&3 3>&-
|
||||
} 3>&1 >&4 4>&- |
|
||||
curl -kL "$URL" -o ${TMP_PATH}/addons.zip 2>&1 |
|
||||
perl -C -lane '
|
||||
BEGIN {$header = "Downloading $ENV{URL}...\n\n"; $| = 1}
|
||||
$pcent = $F[0];
|
||||
$_ = join "", unpack("x3 a7 x4 a9 x8 a9 x7 a*") if length > 20;
|
||||
s/ /\xa0/g; # replacing space with nbsp as dialog squashes spaces
|
||||
if ($. <= 3) {
|
||||
$header .= "$_\n";
|
||||
$/ = "\r" if $. == 2
|
||||
} else {
|
||||
print "XXX\n$pcent\n$header$_\nXXX"
|
||||
}' 4>&- |
|
||||
dialog --gauge "Download Addons: ${TAG}..." 14 72 4>&-
|
||||
} 4>&1
|
||||
BEGIN {$header = "Downloading $ENV{TAG}...\n\n"; $| = 1}
|
||||
$pcent = $F[0];
|
||||
$_ = join "", unpack("x3 a7 x4 a9 x8 a9 x7 a*") if length > 20;
|
||||
s/ /\xa0/g;
|
||||
if ($. <= 3) {
|
||||
$header .= "$_\n";
|
||||
$/ = "\r" if $. == 2
|
||||
} else {
|
||||
print "XXX\n$pcent\n$header$_\nXXX"
|
||||
}' |
|
||||
dialog --backtitle "$(backtitle)" --title "Update Addons" \
|
||||
--gauge "Download Addons: $TAG ..." 14 72
|
||||
}
|
||||
if [ -f "${TMP_PATH}/addons.zip" ]; then
|
||||
rm -rf "${ADDONS_PATH}"
|
||||
mkdir -p "${ADDONS_PATH}"
|
||||
@@ -150,7 +132,7 @@ function updateAddons() {
|
||||
rm -f "${F}"
|
||||
done
|
||||
dialog --backtitle "$(backtitle)" --title "Update Addons" \
|
||||
--infobox "Update Addons successful!" 3 50
|
||||
--infobox "Update successful!" 3 50
|
||||
sleep 2
|
||||
else
|
||||
return 1
|
||||
@@ -179,22 +161,21 @@ function updatePatches() {
|
||||
export URL="https://github.com/AuxXxilium/arc-patches/releases/download/${TAG}/patches-${TAG}.zip"
|
||||
export TAG="${TAG}"
|
||||
{
|
||||
{
|
||||
curl -kL "${URL}" -o ${TMP_PATH}/patches.zip 2>&3 3>&-
|
||||
} 3>&1 >&4 4>&- |
|
||||
curl -kL "$URL" -o ${TMP_PATH}/patches.zip 2>&1 |
|
||||
perl -C -lane '
|
||||
BEGIN {$header = "Downloading $ENV{URL}...\n\n"; $| = 1}
|
||||
BEGIN {$header = "Downloading $ENV{TAG}...\n\n"; $| = 1}
|
||||
$pcent = $F[0];
|
||||
$_ = join "", unpack("x3 a7 x4 a9 x8 a9 x7 a*") if length > 20;
|
||||
s/ /\xa0/g; # replacing space with nbsp as dialog squashes spaces
|
||||
s/ /\xa0/g;
|
||||
if ($. <= 3) {
|
||||
$header .= "$_\n";
|
||||
$/ = "\r" if $. == 2
|
||||
} else {
|
||||
print "XXX\n$pcent\n$header$_\nXXX"
|
||||
}' 4>&- |
|
||||
dialog --gauge "Download Patches: ${TAG}..." 14 72 4>&-
|
||||
} 4>&1
|
||||
}' |
|
||||
dialog --backtitle "$(backtitle)" --title "Update Patches" \
|
||||
--gauge "Download Patches: $TAG ..." 14 72
|
||||
}
|
||||
if [ -f "${TMP_PATH}/patches.zip" ]; then
|
||||
rm -rf "${PATCH_PATH}"
|
||||
mkdir -p "${PATCH_PATH}"
|
||||
@@ -203,7 +184,7 @@ function updatePatches() {
|
||||
if unzip -oq "${TMP_PATH}/patches.zip" -d "${PATCH_PATH}"; then
|
||||
rm -f "${TMP_PATH}/patches.zip"
|
||||
dialog --backtitle "$(backtitle)" --title "Update Patches" \
|
||||
--infobox "Update Patches successful!" 3 50
|
||||
--infobox "Update successful!" 3 50
|
||||
sleep 2
|
||||
else
|
||||
return 1
|
||||
@@ -232,22 +213,21 @@ function updateCustom() {
|
||||
export URL="https://github.com/AuxXxilium/arc-custom/releases/download/${TAG}/custom-${TAG}.zip"
|
||||
export TAG="${TAG}"
|
||||
{
|
||||
{
|
||||
curl -kL "${URL}" -o ${TMP_PATH}/custom.zip 2>&3 3>&-
|
||||
} 3>&1 >&4 4>&- |
|
||||
curl -kL "$URL" -o ${TMP_PATH}/custom.zip 2>&1 |
|
||||
perl -C -lane '
|
||||
BEGIN {$header = "Downloading $ENV{URL}...\n\n"; $| = 1}
|
||||
BEGIN {$header = "Downloading $ENV{TAG}...\n\n"; $| = 1}
|
||||
$pcent = $F[0];
|
||||
$_ = join "", unpack("x3 a7 x4 a9 x8 a9 x7 a*") if length > 20;
|
||||
s/ /\xa0/g; # replacing space with nbsp as dialog squashes spaces
|
||||
s/ /\xa0/g;
|
||||
if ($. <= 3) {
|
||||
$header .= "$_\n";
|
||||
$/ = "\r" if $. == 2
|
||||
} else {
|
||||
print "XXX\n$pcent\n$header$_\nXXX"
|
||||
}' 4>&- |
|
||||
dialog --gauge "Download Custom: ${TAG}..." 14 72 4>&-
|
||||
} 4>&1
|
||||
}' |
|
||||
dialog --backtitle "$(backtitle)" --title "Update Custom Kernel" \
|
||||
--gauge "Download Custom Kernel: $TAG ..." 14 72
|
||||
}
|
||||
if [ -f "${TMP_PATH}/custom.zip" ]; then
|
||||
rm -rf "${CUSTOM_PATH}"
|
||||
mkdir -p "${CUSTOM_PATH}"
|
||||
@@ -256,7 +236,7 @@ function updateCustom() {
|
||||
if unzip -oq "${TMP_PATH}/custom.zip" -d "${CUSTOM_PATH}"; then
|
||||
rm -f "${TMP_PATH}/custom.zip"
|
||||
dialog --backtitle "$(backtitle)" --title "Update Custom Kernel" \
|
||||
--infobox "Update Custom successful!" 3 50
|
||||
--infobox "Update successful!" 3 50
|
||||
sleep 2
|
||||
else
|
||||
return 1
|
||||
@@ -275,7 +255,7 @@ function updateModules() {
|
||||
local PRODUCTVER="$(readConfigKey "productver" "${USER_CONFIG_FILE}")"
|
||||
local PLATFORM="$(readConfigKey "platform" "${USER_CONFIG_FILE}")"
|
||||
local KVER="$(readConfigKey "platforms.${PLATFORM}.productvers.\"${PRODUCTVER}\".kver" "${P_FILE}")"
|
||||
[ "${PLATFORM}" = "epyc7002" ] && KVERP="${PRODUCTVER}-${KVER}" || KVERP="${KVER}"
|
||||
[ "${PLATFORM}" == "epyc7002" ] && KVERP="${PRODUCTVER}-${KVER}" || KVERP="${KVER}"
|
||||
idx=0
|
||||
while [ ${idx} -le 5 ]; do # Loop 5 times, if successful, break
|
||||
local TAG="$(curl -m 10 -skL "https://api.github.com/repos/AuxXxilium/arc-modules/releases" | jq -r ".[].tag_name" | sort -rV | head -1)"
|
||||
@@ -285,35 +265,34 @@ function updateModules() {
|
||||
sleep 3
|
||||
idx=$((${idx} + 1))
|
||||
done
|
||||
if [ -n "${TAG}" ] && [ "${MODULESVERSION}" != "${TAG}" ]; then
|
||||
if [ -n "${TAG}" ] && [[ "${MODULESVERSION}" != "${TAG}" || ! -f "${MODULES_PATH}/${PLATFORM}-${KVERP}.tgz" ]]; then
|
||||
rm -rf "${MODULES_PATH}"
|
||||
mkdir -p "${MODULES_PATH}"
|
||||
export URL="https://github.com/AuxXxilium/arc-modules/releases/download/${TAG}/modules-${TAG}.zip"
|
||||
export TAG="${TAG}"
|
||||
{
|
||||
{
|
||||
curl -kL "${URL}" -o ${TMP_PATH}/modules.zip 2>&3 3>&-
|
||||
} 3>&1 >&4 4>&- |
|
||||
curl -kL "$URL" -o ${TMP_PATH}/modules.zip 2>&1 |
|
||||
perl -C -lane '
|
||||
BEGIN {$header = "Downloading $ENV{URL}...\n\n"; $| = 1}
|
||||
BEGIN {$header = "Downloading $ENV{TAG}...\n\n"; $| = 1}
|
||||
$pcent = $F[0];
|
||||
$_ = join "", unpack("x3 a7 x4 a9 x8 a9 x7 a*") if length > 20;
|
||||
s/ /\xa0/g; # replacing space with nbsp as dialog squashes spaces
|
||||
s/ /\xa0/g;
|
||||
if ($. <= 3) {
|
||||
$header .= "$_\n";
|
||||
$/ = "\r" if $. == 2
|
||||
} else {
|
||||
print "XXX\n$pcent\n$header$_\nXXX"
|
||||
}' 4>&- |
|
||||
dialog --gauge "Download Modules: ${TAG}..." 14 72 4>&-
|
||||
} 4>&1
|
||||
}' |
|
||||
dialog --backtitle "$(backtitle)" --title "Update Modules" \
|
||||
--gauge "Download Modules: $TAG ..." 14 72
|
||||
}
|
||||
if [ -f "${TMP_PATH}/modules.zip" ]; then
|
||||
dialog --backtitle "$(backtitle)" --title "Update Modules" \
|
||||
--infobox "Updating Modules..." 3 50
|
||||
if unzip -oq "${TMP_PATH}/modules.zip" -d "${MODULES_PATH}"; then
|
||||
rm -f "${TMP_PATH}/modules.zip"
|
||||
dialog --backtitle "$(backtitle)" --title "Update Modules" \
|
||||
--infobox "Update Modules successful!" 3 50
|
||||
--infobox "Update successful!" 3 50
|
||||
sleep 2
|
||||
else
|
||||
return 1
|
||||
@@ -359,22 +338,21 @@ function updateConfigs() {
|
||||
export URL="https://github.com/AuxXxilium/arc-configs/releases/download/${TAG}/configs-${TAG}.zip"
|
||||
export TAG="${TAG}"
|
||||
{
|
||||
{
|
||||
curl -kL "${URL}" -o ${TMP_PATH}/configs.zip 2>&3 3>&-
|
||||
} 3>&1 >&4 4>&- |
|
||||
curl -kL "$URL" -o ${TMP_PATH}/configs.zip 2>&1 |
|
||||
perl -C -lane '
|
||||
BEGIN {$header = "Downloading $ENV{URL}...\n\n"; $| = 1}
|
||||
BEGIN {$header = "Downloading $ENV{TAG}...\n\n"; $| = 1}
|
||||
$pcent = $F[0];
|
||||
$_ = join "", unpack("x3 a7 x4 a9 x8 a9 x7 a*") if length > 20;
|
||||
s/ /\xa0/g; # replacing space with nbsp as dialog squashes spaces
|
||||
s/ /\xa0/g;
|
||||
if ($. <= 3) {
|
||||
$header .= "$_\n";
|
||||
$/ = "\r" if $. == 2
|
||||
} else {
|
||||
print "XXX\n$pcent\n$header$_\nXXX"
|
||||
}' 4>&- |
|
||||
dialog --gauge "Download Configs: ${TAG}..." 14 72 4>&-
|
||||
} 4>&1
|
||||
}' |
|
||||
dialog --backtitle "$(backtitle)" --title "Update Configs" \
|
||||
--gauge "Download Configs: $TAG ..." 14 72
|
||||
}
|
||||
if [ -f "${TMP_PATH}/configs.zip" ]; then
|
||||
mkdir -p "${MODEL_CONFIG_PATH}"
|
||||
dialog --backtitle "$(backtitle)" --title "Update Configs" \
|
||||
@@ -382,9 +360,9 @@ function updateConfigs() {
|
||||
if unzip -oq "${TMP_PATH}/configs.zip" -d "${MODEL_CONFIG_PATH}"; then
|
||||
rm -f "${TMP_PATH}/configs.zip"
|
||||
dialog --backtitle "$(backtitle)" --title "Update Configs" \
|
||||
--infobox "Update Configs successful!" 3 50
|
||||
--infobox "Update successful!" 3 50
|
||||
sleep 2
|
||||
[ -n "${USERID}" ] && checkHardwareID || true
|
||||
[ -z "${USERID}" ] && checkHardwareID || true
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
@@ -416,22 +394,21 @@ function updateLKMs() {
|
||||
export URL="https://github.com/AuxXxilium/arc-lkm/releases/download/${TAG}/rp-lkms.zip"
|
||||
export TAG="${TAG}"
|
||||
{
|
||||
{
|
||||
curl -kL "${URL}" -o ${TMP_PATH}/rp-lkms.zip 2>&3 3>&-
|
||||
} 3>&1 >&4 4>&- |
|
||||
curl -kL "$URL" -o ${TMP_PATH}/rp-lkms.zip 2>&1 |
|
||||
perl -C -lane '
|
||||
BEGIN {$header = "Downloading $ENV{URL}...\n\n"; $| = 1}
|
||||
BEGIN {$header = "Downloading $ENV{TAG}...\n\n"; $| = 1}
|
||||
$pcent = $F[0];
|
||||
$_ = join "", unpack("x3 a7 x4 a9 x8 a9 x7 a*") if length > 20;
|
||||
s/ /\xa0/g; # replacing space with nbsp as dialog squashes spaces
|
||||
s/ /\xa0/g;
|
||||
if ($. <= 3) {
|
||||
$header .= "$_\n";
|
||||
$/ = "\r" if $. == 2
|
||||
} else {
|
||||
print "XXX\n$pcent\n$header$_\nXXX"
|
||||
}' 4>&- |
|
||||
dialog --gauge "Download LKMs: ${TAG}..." 14 72 4>&-
|
||||
} 4>&1
|
||||
}' |
|
||||
dialog --backtitle "$(backtitle)" --title "Update LKMs" \
|
||||
--gauge "Download LKMs: $TAG ..." 14 72
|
||||
}
|
||||
if [ -f "${TMP_PATH}/rp-lkms.zip" ]; then
|
||||
rm -rf "${LKMS_PATH}"
|
||||
mkdir -p "${LKMS_PATH}"
|
||||
@@ -440,7 +417,7 @@ function updateLKMs() {
|
||||
if unzip -oq "${TMP_PATH}/rp-lkms.zip" -d "${LKMS_PATH}"; then
|
||||
rm -f "${TMP_PATH}/rp-lkms.zip"
|
||||
dialog --backtitle "$(backtitle)" --title "Update LKMs" \
|
||||
--infobox "Update LKMs successful!" 3 50
|
||||
--infobox "Update successful!" 3 50
|
||||
sleep 2
|
||||
else
|
||||
return 1
|
||||
@@ -457,14 +434,9 @@ function updateLKMs() {
|
||||
function updateOffline() {
|
||||
local ARCOFFLINE="$(readConfigKey "arc.offline" "${USER_CONFIG_FILE}")"
|
||||
if [ "${ARCOFFLINE}" != "true" ]; then
|
||||
[ -f "${MODEL_CONFIG_PATH}/data.yml" ] && cp -f "${MODEL_CONFIG_PATH}/data.yml" "${MODEL_CONFIG_PATH}/data.yml.bak" || true
|
||||
[ -f "${MODEL_CONFIG_PATH}/data.yml" ] && cp -f "${MODEL_CONFIG_PATH}/data.yml" "${MODEL_CONFIG_PATH}/data.yml.bak"
|
||||
curl -skL "https://raw.githubusercontent.com/AuxXxilium/arc-dsm/refs/heads/main/data.yml" -o "${MODEL_CONFIG_PATH}/data.yml"
|
||||
|
||||
# Check file size and restore backup if necessary
|
||||
local FILESIZE=$(stat -c%s "${MODEL_CONFIG_PATH}/data.yml")
|
||||
if [ "${FILESIZE}" -lt 3072 ]; then
|
||||
cp -f "${MODEL_CONFIG_PATH}/data.yml.bak" "${MODEL_CONFIG_PATH}/data.yml"
|
||||
fi
|
||||
[ ! -f "${MODEL_CONFIG_PATH}/data.yml" ] && cp -f "${MODEL_CONFIG_PATH}/data.yml.bak" "${MODEL_CONFIG_PATH}/data.yml"
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
@@ -472,24 +444,34 @@ function updateOffline() {
|
||||
###############################################################################
|
||||
# Loading Update Mode
|
||||
function dependenciesUpdate() {
|
||||
dialog --backtitle "$(backtitle)" --title "Update Dependencies" --aspect 18 \
|
||||
--infobox "Updating Dependencies..." 3 40
|
||||
sleep 2
|
||||
|
||||
BUILDDONE="$(readConfigKey "arc.builddone" "${USER_CONFIG_FILE}")"
|
||||
FAILED="false"
|
||||
for updateFunction in updateAddons updateModules updateCustom updatePatches updateLKMs updateOffline; do
|
||||
$updateFunction || FAILED="true"
|
||||
done
|
||||
|
||||
if [ "${FAILED}" = "true" ]; then
|
||||
dialog --backtitle "$(backtitle)" --title "Update Dependencies" --aspect 18 \
|
||||
--infobox "Updating Dependencies..." 0 0
|
||||
sleep 2
|
||||
updateAddons
|
||||
[ $? -ne 0 ] && FAILED="true"
|
||||
updateModules
|
||||
[ $? -ne 0 ] && FAILED="true"
|
||||
updateCustom
|
||||
[ $? -ne 0 ] && FAILED="true"
|
||||
updatePatches
|
||||
[ $? -ne 0 ] && FAILED="true"
|
||||
updateLKMs
|
||||
[ $? -ne 0 ] && FAILED="true"
|
||||
updateOffline
|
||||
[ $? -ne 0 ] && FAILED="true"
|
||||
if [ "${FAILED}" == "true" ]; then
|
||||
dialog --backtitle "$(backtitle)" --title "Update Dependencies" --aspect 18 \
|
||||
--infobox "Update Dependencies failed! Try again later." 3 40
|
||||
else
|
||||
--infobox "Update failed!\nTry again later." 0 0
|
||||
sleep 3
|
||||
elif [ "${FAILED}" == "false" ]; then
|
||||
dialog --backtitle "$(backtitle)" --title "Update Dependencies" --aspect 18 \
|
||||
--infobox "Update Dependencies successful!" 3 40
|
||||
--infobox "Update successful!" 0 0
|
||||
writeConfigKey "arc.builddone" "false" "${USER_CONFIG_FILE}"
|
||||
BUILDDONE="$(readConfigKey "arc.builddone" "${USER_CONFIG_FILE}")"
|
||||
sleep 3
|
||||
clear
|
||||
exec arc.sh
|
||||
fi
|
||||
sleep 3
|
||||
clear
|
||||
exec arc.sh
|
||||
}
|
||||
@@ -24,6 +24,6 @@ As external: yes
|
||||
Community Package required *
|
||||
|
||||
- NVMe
|
||||
Cache: yes
|
||||
Storage: no
|
||||
Cache: yes (sometimes addon required)
|
||||
Storage: Addon required
|
||||
System (NVMe only): no
|
||||
@@ -24,6 +24,6 @@ Unsupported
|
||||
Community Package required *
|
||||
|
||||
- NVMe
|
||||
Cache: yes
|
||||
Storage: no
|
||||
Cache: yes (sometimes addon required)
|
||||
Storage: Addon required
|
||||
System (NVMe only): no
|
||||
@@ -24,6 +24,6 @@ Unsupported
|
||||
Community Package required *
|
||||
|
||||
- NVMe
|
||||
Cache: yes
|
||||
Storage: no
|
||||
Cache: yes (sometimes addon required)
|
||||
Storage: Addon required
|
||||
System (NVMe only): no
|
||||
@@ -26,6 +26,6 @@ Partially natively supported
|
||||
Community Package required *
|
||||
|
||||
- NVMe
|
||||
Cache: yes
|
||||
Storage: no
|
||||
Cache: yes (sometimes addon required)
|
||||
Storage: Addon required
|
||||
System (NVMe only): no
|
||||
@@ -3,32 +3,30 @@
|
||||
set -e
|
||||
[[ -z "${ARC_PATH}" || ! -d "${ARC_PATH}/include" ]] && ARC_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)"
|
||||
|
||||
. "${ARC_PATH}/include/functions.sh"
|
||||
. ${ARC_PATH}/include/functions.sh
|
||||
|
||||
# Get Loader Disk Bus
|
||||
[ -z "${LOADER_DISK}" ] && die "Loader Disk not found!"
|
||||
checkBootLoader || die "The loader is corrupted, please rewrite it!"
|
||||
arc_mode || die "No bootmode found!"
|
||||
|
||||
[ -f "${HOME}/.initialized" ] && exec arc.sh || true
|
||||
[ -f "${USER_CONFIG_FILE}" ] && sed -i "s/'/\"/g" "${USER_CONFIG_FILE}" >/dev/null 2>&1 || true
|
||||
|
||||
BUS=$(getBus "${LOADER_DISK}")
|
||||
EFI=$([ -d /sys/firmware/efi ] && echo 1 || echo 0)
|
||||
|
||||
# Check if machine has EFI
|
||||
[ -d /sys/firmware/efi ] && EFI=1 || EFI=0
|
||||
|
||||
# Print Title centralized
|
||||
clear
|
||||
COLUMNS=${COLUMNS:-50}
|
||||
BANNER="$(figlet -c -w "$(((${COLUMNS})))" "Arc Loader")"
|
||||
TITLE="Version:"
|
||||
TITLE+=" ${ARC_VERSION} (${ARC_BUILD}) | Branch: ${ARC_BRANCH}"
|
||||
TITLE+=" ${ARC_VERSION} (${ARC_BUILD})"
|
||||
[ -n "${ARC_BRANCH}" ] && TITLE+=" | Branch: ${ARC_BRANCH}"
|
||||
printf "\033[1;30m%*s\n" ${COLUMNS} ""
|
||||
printf "\033[1;30m%*s\033[A\n" ${COLUMNS} ""
|
||||
printf "\033[1;34m%*s\033[0m\n" ${COLUMNS} "${BANNER}"
|
||||
printf "\033[1;34m%*s\033[0m\n" $(((${#TITLE} + ${COLUMNS}) / 2)) "${TITLE}"
|
||||
TITLE="Boot:"
|
||||
[ ${EFI} -eq 1 ] && TITLE+=" [UEFI]" || TITLE+=" [BIOS]"
|
||||
TITLE+=" | Device: [${BUS}] | Mode: [${ARCMODE}]"
|
||||
TITLE+=" [${BUS}]"
|
||||
printf "\033[1;34m%*s\033[0m\n" $(((${#TITLE} + ${COLUMNS}) / 2)) "${TITLE}"
|
||||
|
||||
# Check for Config File
|
||||
@@ -42,20 +40,15 @@ initConfigKey "arc.confdone" "false" "${USER_CONFIG_FILE}"
|
||||
initConfigKey "arc.dynamic" "false" "${USER_CONFIG_FILE}"
|
||||
initConfigKey "arc.offline" "false" "${USER_CONFIG_FILE}"
|
||||
initConfigKey "arc.patch" "false" "${USER_CONFIG_FILE}"
|
||||
initConfigKey "arc.hardwareid" "" "${USER_CONFIG_FILE}"
|
||||
initConfigKey "arc.userid" "" "${USER_CONFIG_FILE}"
|
||||
initConfigKey "arc.version" "${ARC_VERSION}" "${USER_CONFIG_FILE}"
|
||||
initConfigKey "bootscreen" "{}" "${USER_CONFIG_FILE}"
|
||||
initConfigKey "bootscreen.dsminfo" "true" "${USER_CONFIG_FILE}"
|
||||
initConfigKey "bootscreen.systeminfo" "true" "${USER_CONFIG_FILE}"
|
||||
initConfigKey "bootscreen.diskinfo" "false" "${USER_CONFIG_FILE}"
|
||||
initConfigKey "bootscreen.hwidinfo" "false" "${USER_CONFIG_FILE}"
|
||||
initConfigKey "bootscreen.dsmlogo" "true" "${USER_CONFIG_FILE}"
|
||||
initConfigKey "boot" "{}" "${USER_CONFIG_FILE}"
|
||||
initConfigKey "boot.dsminfo" "true" "${USER_CONFIG_FILE}"
|
||||
initConfigKey "boot.systeminfo" "true" "${USER_CONFIG_FILE}"
|
||||
initConfigKey "boot.dsmlogo" "true" "${USER_CONFIG_FILE}"
|
||||
initConfigKey "bootipwait" "30" "${USER_CONFIG_FILE}"
|
||||
initConfigKey "device" "{}" "${USER_CONFIG_FILE}"
|
||||
initConfigKey "directboot" "false" "${USER_CONFIG_FILE}"
|
||||
initConfigKey "emmcboot" "false" "${USER_CONFIG_FILE}"
|
||||
initConfigKey "governor" "performance" "${USER_CONFIG_FILE}"
|
||||
initConfigKey "hddsort" "false" "${USER_CONFIG_FILE}"
|
||||
initConfigKey "kernel" "official" "${USER_CONFIG_FILE}"
|
||||
initConfigKey "kernelload" "power" "${USER_CONFIG_FILE}"
|
||||
@@ -82,26 +75,36 @@ initConfigKey "rd-compressed" "false" "${USER_CONFIG_FILE}"
|
||||
initConfigKey "satadom" "2" "${USER_CONFIG_FILE}"
|
||||
initConfigKey "synoinfo" "{}" "${USER_CONFIG_FILE}"
|
||||
initConfigKey "time" "{}" "${USER_CONFIG_FILE}"
|
||||
initConfigKey "usbmount" "false" "${USER_CONFIG_FILE}"
|
||||
initConfigKey "usbmount" "auto" "${USER_CONFIG_FILE}"
|
||||
initConfigKey "zimage-hash" "" "${USER_CONFIG_FILE}"
|
||||
|
||||
if grep -q "automated_arc" /proc/cmdline; then
|
||||
writeConfigKey "arc.mode" "automated" "${USER_CONFIG_FILE}"
|
||||
elif grep -q "update_arc" /proc/cmdline; then
|
||||
writeConfigKey "arc.mode" "update" "${USER_CONFIG_FILE}"
|
||||
elif grep -q "force_arc" /proc/cmdline; then
|
||||
writeConfigKey "arc.mode" "config" "${USER_CONFIG_FILE}"
|
||||
else
|
||||
writeConfigKey "arc.mode" "dsm" "${USER_CONFIG_FILE}"
|
||||
fi
|
||||
[ -f "${PART3_PATH}/automated" ] && rm -f "${PART3_PATH}/automated" >/dev/null 2>&1 || true
|
||||
if [ -n "${ARC_BRANCH}" ]; then
|
||||
writeConfigKey "arc.branch" "${ARC_BRANCH}" "${USER_CONFIG_FILE}"
|
||||
fi
|
||||
# Sort network interfaces
|
||||
if arrayExistItem "sortnetif:" $(readConfigMap "addons" "${USER_CONFIG_FILE}"); then
|
||||
echo -e "Sorting NIC: \033[1;34mactive\033[0m"
|
||||
_sort_netif "$(readConfigKey "addons.sortnetif" "${USER_CONFIG_FILE}")"
|
||||
echo
|
||||
fi
|
||||
# Read/Write IP/Mac to config
|
||||
ETHX=$(ls /sys/class/net/ 2>/dev/null | grep eth)
|
||||
for N in ${ETHX}; do
|
||||
MACR="$(cat /sys/class/net/${N}/address 2>/dev/null | sed 's/://g' | tr '[:upper:]' '[:lower:]')"
|
||||
ETHX="$(ls /sys/class/net 2>/dev/null | grep eth)"
|
||||
for ETH in ${ETHX}; do
|
||||
MACR="$(cat /sys/class/net/${ETH}/address 2>/dev/null | sed 's/://g' | tr '[:lower:]' '[:upper:]')"
|
||||
IPR="$(readConfigKey "network.${MACR}" "${USER_CONFIG_FILE}")"
|
||||
if [ -n "${IPR}" ] && [ "1" = "$(cat /sys/class/net/${N}/carrier 2>/dev/null)" ]; then
|
||||
if [ -n "${IPR}" ]; then
|
||||
IFS='/' read -r -a IPRA <<<"${IPR}"
|
||||
ip addr flush dev "${N}"
|
||||
ip addr add "${IPRA[0]}/${IPRA[1]:-"255.255.255.0"}" dev "${N}"
|
||||
ip addr flush dev ${ETH}
|
||||
ip addr add ${IPRA[0]}/${IPRA[1]:-"255.255.255.0"} dev ${ETH}
|
||||
if [ -n "${IPRA[2]}" ]; then
|
||||
ip route add default via "${IPRA[2]}" dev "${N}"
|
||||
ip route add default via ${IPRA[2]} dev ${ETH}
|
||||
fi
|
||||
if [ -n "${IPRA[3]:-${IPRA[2]}}" ]; then
|
||||
sed -i "/nameserver ${IPRA[3]:-${IPRA[2]}}/d" /etc/resolv.conf
|
||||
@@ -109,11 +112,11 @@ for N in ${ETHX}; do
|
||||
fi
|
||||
sleep 1
|
||||
fi
|
||||
[ "${N::3}" = "eth" ] && ethtool -s "${N}" wol g 2>/dev/null || true
|
||||
# [ "${N::3}" = "eth" ] && ethtool -K ${N} rxhash off 2>/dev/null || true
|
||||
initConfigKey "${N}" "${MACR}" "${USER_CONFIG_FILE}"
|
||||
[ "${ETH::3}" == "eth" ] && ethtool -s ${ETH} wol g 2>/dev/null || true
|
||||
# [ "${ETH::3}" == "eth" ] && ethtool -K ${ETH} rxhash off 2>/dev/null || true
|
||||
initConfigKey "${ETH}" "${MACR}" "${USER_CONFIG_FILE}"
|
||||
done
|
||||
ETHN=$(echo ${ETHX} | wc -w)
|
||||
ETHN="$(echo ${ETHX} | wc -w)"
|
||||
writeConfigKey "device.nic" "${ETHN}" "${USER_CONFIG_FILE}"
|
||||
# No network devices
|
||||
echo
|
||||
@@ -124,9 +127,9 @@ VID="0x46f4"
|
||||
PID="0x0001"
|
||||
|
||||
BUSLIST="usb sata sas scsi nvme mmc ide virtio vmbus xen"
|
||||
if [ "${BUS}" = "usb" ]; then
|
||||
VID="0x$(udevadm info --query property --name "${LOADER_DISK}" 2>/dev/null | grep "ID_VENDOR_ID" | cut -d= -f2)"
|
||||
PID="0x$(udevadm info --query property --name "${LOADER_DISK}" 2>/dev/null | grep "ID_MODEL_ID" | cut -d= -f2)"
|
||||
if [ "${BUS}" == "usb" ]; then
|
||||
VID="0x$(udevadm info --query property --name "${LOADER_DISK}" | grep ID_VENDOR_ID | cut -d= -f2)"
|
||||
PID="0x$(udevadm info --query property --name "${LOADER_DISK}" | grep ID_MODEL_ID | cut -d= -f2)"
|
||||
elif ! echo "${BUSLIST}" | grep -wq "${BUS}"; then
|
||||
die "$(printf "The boot disk does not support the current %s, only %s are supported." "${BUS}" "${BUSLIST// /\/}")"
|
||||
fi
|
||||
@@ -142,15 +145,20 @@ writeConfigKey "pid" "${PID}" "${USER_CONFIG_FILE}"
|
||||
|
||||
# Decide if boot automatically
|
||||
BUILDDONE="$(readConfigKey "arc.builddone" "${USER_CONFIG_FILE}")"
|
||||
if [ "${ARCMODE}" = "config" ]; then
|
||||
ARCMODE="$(readConfigKey "arc.mode" "${USER_CONFIG_FILE}")"
|
||||
if [ "${ARCMODE}" == "config" ]; then
|
||||
echo -e "\033[1;34mStarting Config Mode...\033[0m"
|
||||
elif [ "${ARCMODE}" = "automated" ]; then
|
||||
elif [ "${ARCMODE}" == "automated" ]; then
|
||||
echo -e "\033[1;34mStarting automated Build Mode...\033[0m"
|
||||
elif [ "${ARCMODE}" = "update" ]; then
|
||||
elif [ "${ARCMODE}" == "update" ]; then
|
||||
echo -e "\033[1;34mStarting Update Mode...\033[0m"
|
||||
elif [ "${BUILDDONE}" = "true" ] && [ "${ARCMODE}" = "dsm" ]; then
|
||||
elif [ "${BUILDDONE}" == "true" ] && [ "${ARCMODE}" == "dsm" ]; then
|
||||
echo -e "\033[1;34mStarting DSM Mode...\033[0m"
|
||||
exec boot.sh && exit 0
|
||||
if [ -f "${ARC_PATH}/boot.sh" ]; then
|
||||
exec boot.sh && exit 0
|
||||
else
|
||||
echo -e "\033[1;31mError: Can't find Arc System Files...\033[0m"
|
||||
fi
|
||||
else
|
||||
echo -e "\033[1;34mStarting Config Mode...\033[0m"
|
||||
fi
|
||||
@@ -158,13 +166,42 @@ echo
|
||||
|
||||
BOOTIPWAIT="$(readConfigKey "bootipwait" "${USER_CONFIG_FILE}")"
|
||||
[ -z "${BOOTIPWAIT}" ] && BOOTIPWAIT=30
|
||||
echo
|
||||
echo -e "\033[1;37mDetected ${ETHN} NIC:\033[0m"
|
||||
IPCON=""
|
||||
echo
|
||||
[ ! -f /var/run/dhcpcd/pid ] && /etc/init.d/S09dhcpcd restart >/dev/null 2>&1 || true
|
||||
[ ! -f /var/run/dhcpcd/pid ] && /etc/init.d/S41dhcpcd restart >/dev/null 2>&1 || true
|
||||
sleep 3
|
||||
checkNIC
|
||||
for ETH in ${ETHX}; do
|
||||
COUNT=0
|
||||
DRIVER=$(ls -ld /sys/class/net/${ETH}/device/driver 2>/dev/null | awk -F '/' '{print $NF}')
|
||||
while true; do
|
||||
if ethtool ${ETH} 2>/dev/null | grep 'Link detected' | grep -q 'no'; then
|
||||
echo -e "\r${DRIVER}: \033[1;37mNOT CONNECTED\033[0m"
|
||||
break
|
||||
fi
|
||||
COUNT=$((${COUNT} + 1))
|
||||
IP="$(getIP ${ETH})"
|
||||
if [ -n "${IP}" ]; then
|
||||
SPEED=$(ethtool ${ETH} 2>/dev/null | grep "Speed:" | awk '{print $2}')
|
||||
if [[ "${IP}" =~ ^169\.254\..* ]]; then
|
||||
echo -e "\r${DRIVER} (${SPEED}): \033[1;37mLINK LOCAL (No DHCP server found.)\033[0m"
|
||||
else
|
||||
echo -e "\r${DRIVER} (${SPEED}): \033[1;37m${IP}\033[0m"
|
||||
[ -z "${IPCON}" ] && IPCON="${IP}"
|
||||
fi
|
||||
break
|
||||
fi
|
||||
if ! ip link show ${ETH} 2>/dev/null | grep -q 'UP'; then
|
||||
echo -e "\r${DRIVER}: \033[1;37mDOWN\033[0m"
|
||||
break
|
||||
fi
|
||||
if [ ${COUNT} -ge ${BOOTIPWAIT} ]; then
|
||||
echo -e "\r${DRIVER}: \033[1;37mTIMEOUT\033[0m"
|
||||
break
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
done
|
||||
echo
|
||||
|
||||
mkdir -p "${ADDONS_PATH}"
|
||||
@@ -175,19 +212,17 @@ mkdir -p "${MODULES_PATH}"
|
||||
mkdir -p "${PATCH_PATH}"
|
||||
mkdir -p "${USER_UP_PATH}"
|
||||
|
||||
# Tell webterminal that the loader is ready
|
||||
touch "${HOME}/.initialized"
|
||||
|
||||
# Load Arc Overlay
|
||||
echo -e "\033[1;34mLoading Arc Overlay...\033[0m"
|
||||
echo
|
||||
echo -e "Use \033[1;34mDisplay Output\033[0m or \033[1;34mhttp://${IPCON}${HTTPPORT:+:$HTTPPORT}\033[0m to configure Loader."
|
||||
echo -e "Use \033[1;34mDisplay Output\033[0m or \033[1;34mhttp://${IPCON}:${TTYDPORT}\033[0m to configure Loader."
|
||||
|
||||
# Check memory and load Arc
|
||||
RAM=$(awk '/MemTotal:/ {printf "%.0f", $2 / 1024}' /proc/meminfo 2>/dev/null)
|
||||
if [ ${RAM} -le 3500 ]; then
|
||||
echo -e "\033[1;31mYou have less than 4GB of RAM, if errors occur in loader creation, please increase the amount of RAM.\033[0m\n\033[1;31mUse arc.sh to proceed. Not recommended!\033[0m"
|
||||
else
|
||||
exec arc.sh
|
||||
arc.sh
|
||||
fi
|
||||
|
||||
exit 0
|
||||
Binary file not shown.
@@ -2,9 +2,9 @@
|
||||
|
||||
[[ -z "${ARC_PATH}" || ! -d "${ARC_PATH}/include" ]] && ARC_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)"
|
||||
|
||||
. "${ARC_PATH}/include/functions.sh"
|
||||
. "${ARC_PATH}/include/addons.sh"
|
||||
. "${ARC_PATH}/include/modules.sh"
|
||||
. ${ARC_PATH}/include/functions.sh
|
||||
. ${ARC_PATH}/include/addons.sh
|
||||
. ${ARC_PATH}/include/modules.sh
|
||||
|
||||
set -o pipefail # Get exit code from process piped
|
||||
|
||||
@@ -43,50 +43,46 @@ ARCBRANCH="$(readConfigKey "arc.branch" "${USER_CONFIG_FILE}")"
|
||||
PAT_URL="$(readConfigKey "paturl" "${USER_CONFIG_FILE}")"
|
||||
PAT_HASH="$(readConfigKey "pathash" "${USER_CONFIG_FILE}")"
|
||||
|
||||
[ "${PATURL:0:1}" == "#" ] && PATURL=""
|
||||
[ "${PATSUM:0:1}" == "#" ] && PATSUM=""
|
||||
|
||||
# Check if DSM Version changed
|
||||
. "${RAMDISK_PATH}/etc/VERSION"
|
||||
|
||||
if [[ -n "${BUILDNUM}" && ("${PRODUCTVER}" != "${majorversion}.${minorversion}" || "${BUILDNUM}" != "${buildnumber}" || "${SMALLNUM}" != "${smallfixnumber}") ]]; then
|
||||
OLDVER="${PRODUCTVER}(${BUILDNUM}$([[ ${SMALLNUM:-0} -ne 0 ]] && echo "u${SMALLNUM}"))"
|
||||
NEWVER="${majorversion}.${minorversion}(${buildnumber}$([[ ${smallfixnumber:-0} -ne 0 ]] && echo "u${smallfixnumber}"))"
|
||||
if [[ -n "${PRODUCTVER}" && -n "${BUILDNUM}" && -n "${SMALLNUM}" ]] &&
|
||||
([ "${PRODUCTVER}" != "${majorversion}.${minorversion}" ] || [ "${BUILDNUM}" != "${buildnumber}" ] || [ "${SMALLNUM}" != "${smallfixnumber}" ]); then
|
||||
OLDVER="${PRODUCTVER}(${BUILDNUM}$([ ${SMALLNUM:-0} -ne 0 ] && echo "u${SMALLNUM}"))"
|
||||
NEWVER="${majorversion}.${minorversion}(${buildnumber}$([ ${smallfixnumber:-0} -ne 0 ] && echo "u${smallfixnumber}"))"
|
||||
PAT_URL=""
|
||||
PAT_HASH=""
|
||||
echo "\nVersion changed from ${OLDVER} to ${NEWVER}"
|
||||
fi
|
||||
|
||||
# Re-read PAT_URL and PAT_HASH if they are empty or commented out
|
||||
if [[ -z "${PAT_URL}" || "${PAT_URL:0:1}" == "#" ]]; then
|
||||
PAT_URL="$(readConfigKey "${PLATFORM}.\"${MODEL}\".\"${majorversion}.${minorversion}\".url" "${D_FILE}")"
|
||||
fi
|
||||
if [[ -z "${PAT_HASH}" || "${PAT_HASH:0:1}" == "#" ]]; then
|
||||
PAT_HASH="$(readConfigKey "${PLATFORM}.\"${MODEL}\".\"${majorversion}.${minorversion}\".hash" "${D_FILE}")"
|
||||
fi
|
||||
|
||||
PRODUCTVER="${majorversion}.${minorversion}"
|
||||
BUILDNUM="${buildnumber}"
|
||||
SMALLNUM="${smallfixnumber}"
|
||||
|
||||
PRODUCTVER=${majorversion}.${minorversion}
|
||||
BUILDNUM=${buildnumber}
|
||||
SMALLNUM=${smallfixnumber}
|
||||
writeConfigKey "productver" "${PRODUCTVER}" "${USER_CONFIG_FILE}"
|
||||
writeConfigKey "buildnum" "${BUILDNUM}" "${USER_CONFIG_FILE}"
|
||||
writeConfigKey "smallnum" "${SMALLNUM}" "${USER_CONFIG_FILE}"
|
||||
|
||||
# Read model data
|
||||
KVER="$(readConfigKey "platforms.${PLATFORM}.productvers.\"${PRODUCTVER}\".kver" "${P_FILE}")"
|
||||
[ "${PLATFORM}" = "epyc7002" ] && KVERP="${PRODUCTVER}-${KVER}" || KVERP="${KVER}"
|
||||
|
||||
# Modify KVER for Epyc7002
|
||||
[ "${PLATFORM}" == "epyc7002" ] && KVERP="${PRODUCTVER}-${KVER}" || KVERP="${KVER}"
|
||||
|
||||
# Sanity check
|
||||
if [ -z "${PLATFORM}" ] || [ -z "${KVER}" ]; then
|
||||
echo "ERROR: Configuration for Model ${MODEL} and Version ${PRODUCTVER} not found." >"${LOG_FILE}"
|
||||
echo "ERROR: Configuration for model ${MODEL} and productversion ${PRODUCTVER} not found." >"${LOG_FILE}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Read synoinfo and addons from config
|
||||
declare -A SYNOINFO ADDONS MODULES
|
||||
declare -A SYNOINFO
|
||||
declare -A ADDONS
|
||||
declare -A MODULES
|
||||
|
||||
# Read synoinfo and addons from config
|
||||
while IFS=': ' read -r KEY VALUE; do
|
||||
[ -n "${KEY}" ] && SYNOINFO["${KEY}"]="${VALUE}"
|
||||
done < <(readConfigMap "synoinfo" "${USER_CONFIG_FILE}")
|
||||
|
||||
while IFS=': ' read -r KEY VALUE; do
|
||||
[ -n "${KEY}" ] && ADDONS["${KEY}"]="${VALUE}"
|
||||
done < <(readConfigMap "addons" "${USER_CONFIG_FILE}")
|
||||
@@ -97,41 +93,48 @@ while IFS=': ' read -r KEY VALUE; do
|
||||
done < <(readConfigMap "modules" "${USER_CONFIG_FILE}")
|
||||
|
||||
# Patches (diff -Naru OLDFILE NEWFILE > xxx.patch)
|
||||
PATCHES=(
|
||||
"ramdisk-etc-rc-*.patch"
|
||||
"ramdisk-init-script-*.patch"
|
||||
"ramdisk-post-init-script-*.patch"
|
||||
"ramdisk-disable-root-pwd-*.patch"
|
||||
"ramdisk-disable-disabled-ports-*.patch"
|
||||
)
|
||||
|
||||
for PATCH in "${PATCHES[@]}"; do
|
||||
echo "Patching with ${PATCH}" >>"${LOG_FILE}"
|
||||
for PF in ${PATCH_PATH}/${PATCH}; do
|
||||
[ -e "${PF}" ] || continue
|
||||
echo "Applying patch ${PF}" >>"${LOG_FILE}"
|
||||
if ! (cd "${RAMDISK_PATH}" && busybox patch -p1 -i "${PF}") >>"${LOG_FILE}" 2>&1; then
|
||||
echo "Failed to apply patch ${FILE}" >>"${LOG_FILE}"
|
||||
continue
|
||||
fi
|
||||
PATCHES=()
|
||||
PATCHES+=("ramdisk-etc-rc-*.patch")
|
||||
PATCHES+=("ramdisk-init-script-*.patch")
|
||||
PATCHES+=("ramdisk-post-init-script-*.patch")
|
||||
PATCHES+=("ramdisk-disable-root-pwd-*.patch")
|
||||
PATCHES+=("ramdisk-disable-disabled-ports-*.patch")
|
||||
for PE in ${PATCHES[@]}; do
|
||||
RET=1
|
||||
echo "Patching with ${PE}" >"${LOG_FILE}"
|
||||
for PF in $(ls ${PATCH_PATH}/${PE} 2>/dev/null); do
|
||||
echo "Patching with ${PF}" >>"${LOG_FILE}"
|
||||
(
|
||||
cd "${RAMDISK_PATH}"
|
||||
patch -p1 -i "${PF}" >>"${LOG_FILE}" 2>&1 # busybox patch and gun patch have different processing methods and parameters.
|
||||
)
|
||||
RET=$?
|
||||
[ ${RET} -eq 0 ] && break
|
||||
done
|
||||
[ ${RET} -ne 0 ] && exit 1
|
||||
done
|
||||
|
||||
# Add serial number to synoinfo.conf, to help to recovery a installed DSM
|
||||
echo "Set synoinfo SN" >"${LOG_FILE}"
|
||||
_set_conf_kv "SN" "${SN}" "${RAMDISK_PATH}/etc/synoinfo.conf" >>"${LOG_FILE}" 2>&1 || exit 1
|
||||
_set_conf_kv "SN" "${SN}" "${RAMDISK_PATH}/etc.defaults/synoinfo.conf" >>"${LOG_FILE}" 2>&1 || exit 1
|
||||
for KEY in ${!SYNOINFO[@]}; do
|
||||
echo "Set synoinfo ${KEY}" >>"${LOG_FILE}"
|
||||
_set_conf_kv "${KEY}" "${SYNOINFO[${KEY}]}" "${RAMDISK_PATH}/etc/synoinfo.conf" >>"${LOG_FILE}" 2>&1 || exit 1
|
||||
_set_conf_kv "${KEY}" "${SYNOINFO[${KEY}]}" "${RAMDISK_PATH}/etc.defaults/synoinfo.conf" >>"${LOG_FILE}" 2>&1 || exit 1
|
||||
done
|
||||
|
||||
# Patch /sbin/init.post
|
||||
grep -v -e '^[\t ]*#' -e '^$' "${PATCH_PATH}/config-manipulators.sh" >"${TMP_PATH}/rp.txt"
|
||||
sed -e "/@@@CONFIG-MANIPULATORS-TOOLS@@@/ {" -e "r ${TMP_PATH}/rp.txt" -e 'd' -e '}' -i "${RAMDISK_PATH}/sbin/init.post"
|
||||
rm -f "${TMP_PATH}/rp.txt"
|
||||
|
||||
# Generate synoinfo configurations
|
||||
{
|
||||
echo "_set_conf_kv 'SN' '${SN}' '/tmpRoot/etc/synoinfo.conf'"
|
||||
echo "_set_conf_kv 'SN' '${SN}' '/tmpRoot/etc.defaults/synoinfo.conf'"
|
||||
for KEY in "${!SYNOINFO[@]}"; do
|
||||
echo "_set_conf_kv '${KEY}' '${SYNOINFO[${KEY}]}' '/tmpRoot/etc/synoinfo.conf'"
|
||||
echo "_set_conf_kv '${KEY}' '${SYNOINFO[${KEY}]}' '/tmpRoot/etc.defaults/synoinfo.conf'"
|
||||
done
|
||||
} >"${TMP_PATH}/rp.txt"
|
||||
|
||||
touch "${TMP_PATH}/rp.txt"
|
||||
echo "_set_conf_kv 'SN' '${SN}' '/tmpRoot/etc/synoinfo.conf'" >>"${TMP_PATH}/rp.txt"
|
||||
echo "_set_conf_kv 'SN' '${SN}' '/tmpRoot/etc.defaults/synoinfo.conf'" >>"${TMP_PATH}/rp.txt"
|
||||
for KEY in ${!SYNOINFO[@]}; do
|
||||
echo "_set_conf_kv '${KEY}' '${SYNOINFO[${KEY}]}' '/tmpRoot/etc/synoinfo.conf'" >>"${TMP_PATH}/rp.txt"
|
||||
echo "_set_conf_kv '${KEY}' '${SYNOINFO[${KEY}]}' '/tmpRoot/etc.defaults/synoinfo.conf'" >>"${TMP_PATH}/rp.txt"
|
||||
done
|
||||
sed -e "/@@@CONFIG-GENERATED@@@/ {" -e "r ${TMP_PATH}/rp.txt" -e 'd' -e '}' -i "${RAMDISK_PATH}/sbin/init.post"
|
||||
rm -f "${TMP_PATH}/rp.txt"
|
||||
|
||||
@@ -146,30 +149,29 @@ gzip -dc "${LKMS_PATH}/rp-${PLATFORM}-${KVERP}-${LKM}.ko.gz" >"${RAMDISK_PATH}/u
|
||||
# Addons
|
||||
echo "Create addons.sh" >"${LOG_FILE}"
|
||||
mkdir -p "${RAMDISK_PATH}/addons"
|
||||
{
|
||||
echo "#!/bin/sh"
|
||||
echo 'echo "addons.sh called with params ${@}"'
|
||||
echo "export LOADERLABEL=\"ARC\""
|
||||
echo "export LOADERVERSION=\"${ARC_VERSION}\""
|
||||
echo "export LOADERBUILD=\"${ARC_BUILD}\""
|
||||
echo "export LOADERBRANCH=\"${ARCBRANCH}\""
|
||||
echo "export PLATFORM=\"${PLATFORM}\""
|
||||
echo "export MODEL=\"${MODEL}\""
|
||||
echo "export MODELID=\"${MODELID}\""
|
||||
echo "export PRODUCTVERL=\"${PRODUCTVERL}\""
|
||||
echo "export MLINK=\"${PAT_URL}\""
|
||||
echo "export MCHECKSUM=\"${PAT_HASH}\""
|
||||
echo "export LAYOUT=\"${LAYOUT:-qwerty}\""
|
||||
echo "export KEYMAP=\"${KEYMAP:-en}\""
|
||||
} >"${RAMDISK_PATH}/addons/addons.sh"
|
||||
echo "#!/bin/sh" >"${RAMDISK_PATH}/addons/addons.sh"
|
||||
echo 'echo "addons.sh called with params ${@}"' >>"${RAMDISK_PATH}/addons/addons.sh"
|
||||
echo "export LOADERLABEL=\"ARC\"" >>"${RAMDISK_PATH}/addons/addons.sh"
|
||||
echo "export LOADERVERSION=\"${ARC_VERSION}\"" >>"${RAMDISK_PATH}/addons/addons.sh"
|
||||
echo "export LOADERBUILD=\"${ARC_BUILD}\"" >>"${RAMDISK_PATH}/addons/addons.sh"
|
||||
echo "export LOADERBRANCH=\"${ARCBRANCH}\"" >>"${RAMDISK_PATH}/addons/addons.sh"
|
||||
echo "export PLATFORM=\"${PLATFORM}\"" >>"${RAMDISK_PATH}/addons/addons.sh"
|
||||
echo "export PRODUCTVER=\"${PRODUCTVER}\"" >>"${RAMDISK_PATH}/addons/addons.sh"
|
||||
echo "export MODEL=\"${MODEL}\"" >>"${RAMDISK_PATH}/addons/addons.sh"
|
||||
echo "export MODELID=\"${MODELID}\"" >>"${RAMDISK_PATH}/addons/addons.sh"
|
||||
echo "export MLINK=\"${PAT_URL}\"" >>"${RAMDISK_PATH}/addons/addons.sh"
|
||||
echo "export MCHECKSUM=\"${PAT_HASH}\"" >>"${RAMDISK_PATH}/addons/addons.sh"
|
||||
echo "export LAYOUT=\"${LAYOUT}\"" >>"${RAMDISK_PATH}/addons/addons.sh"
|
||||
echo "export KEYMAP=\"${KEYMAP}\"" >>"${RAMDISK_PATH}/addons/addons.sh"
|
||||
chmod +x "${RAMDISK_PATH}/addons/addons.sh"
|
||||
|
||||
# System Addons
|
||||
for ADDON in redpill revert misc eudev disks localrss notify wol mountloader; do
|
||||
for ADDON in "redpill" "revert" "misc" "eudev" "disks" "localrss" "notify" "wol" "mountloader"; do
|
||||
PARAMS=""
|
||||
if [ "${ADDON}" = "disks" ]; then
|
||||
if [ "${ADDON}" == "disks" ]; then
|
||||
HDDSORT="$(readConfigKey "hddsort" "${USER_CONFIG_FILE}")"
|
||||
PARAMS="${HDDSORT}"
|
||||
USBMOUNT="$(readConfigKey "usbmount" "${USER_CONFIG_FILE}")"
|
||||
PARAMS="${HDDSORT} ${USBMOUNT}"
|
||||
[ -f "${USER_UP_PATH}/${MODEL}.dts" ] && cp -f "${USER_UP_PATH}/${MODEL}.dts" "${RAMDISK_PATH}/addons/model.dts"
|
||||
fi
|
||||
installAddon "${ADDON}" "${PLATFORM}" || exit 1
|
||||
@@ -177,8 +179,8 @@ for ADDON in redpill revert misc eudev disks localrss notify wol mountloader; do
|
||||
done
|
||||
|
||||
# User Addons
|
||||
for ADDON in "${!ADDONS[@]}"; do
|
||||
PARAMS="${ADDONS[${ADDON}]}"
|
||||
for ADDON in ${!ADDONS[@]}; do
|
||||
PARAMS=${ADDONS[${ADDON}]}
|
||||
installAddon "${ADDON}" "${PLATFORM}" || echo "Addon ${ADDON} not found"
|
||||
echo "/addons/${ADDON}.sh \${1} ${PARAMS}" >>"${RAMDISK_PATH}/addons/addons.sh" 2>>"${LOG_FILE}" || exit 1
|
||||
done
|
||||
@@ -188,7 +190,7 @@ echo "inetd" >>"${RAMDISK_PATH}/addons/addons.sh"
|
||||
|
||||
echo "Modify files" >"${LOG_FILE}"
|
||||
# Remove function from scripts
|
||||
[ "2" = "${PRODUCTVER:2:1}" ] && sed -i 's/function //g' $(find "${RAMDISK_PATH}/addons/" -type f -name "*.sh")
|
||||
[ "2" == "${PRODUCTVER:0:1}" ] && sed -i 's/function //g' $(find "${RAMDISK_PATH}/addons/" -type f -name "*.sh")
|
||||
|
||||
# Build modules dependencies
|
||||
# ${ARC_PATH}/depmod -a -b ${RAMDISK_PATH} 2>/dev/null
|
||||
@@ -203,7 +205,7 @@ fi
|
||||
# backup current loader configs
|
||||
BACKUP_PATH="${RAMDISK_PATH}/usr/arc/backup"
|
||||
rm -rf "${BACKUP_PATH}"
|
||||
for F in "${USER_GRUB_CONFIG}" "${USER_CONFIG_FILE}" "${USER_UP_PATH}" "${HW_KEY}"; do
|
||||
for F in "${USER_GRUB_CONFIG}" "${USER_CONFIG_FILE}" "${USER_UP_PATH}"; do
|
||||
if [ -f "${F}" ]; then
|
||||
FD="$(dirname "${F}")"
|
||||
mkdir -p "${FD/\/mnt/${BACKUP_PATH}}"
|
||||
@@ -226,14 +228,14 @@ for N in $(seq 0 7); do
|
||||
done
|
||||
|
||||
# SA6400 patches
|
||||
if [ "${PLATFORM}" = "epyc7002" ]; then
|
||||
if [ "${PLATFORM}" == "epyc7002" ]; then
|
||||
echo -n " - Apply Epyc7002 Fixes"
|
||||
sed -i 's#/dev/console#/var/log/lrc#g' ${RAMDISK_PATH}/usr/bin/busybox
|
||||
sed -i '/^echo "START/a \\nmknod -m 0666 /dev/console c 1 3' ${RAMDISK_PATH}/linuxrc.syno
|
||||
fi
|
||||
|
||||
# Broadwellntbap patches
|
||||
if [ "${PLATFORM}" = "broadwellntbap" ]; then
|
||||
if [ "${PLATFORM}" == "broadwellntbap" ]; then
|
||||
echo -n " - Apply Broadwellntbap Fixes"
|
||||
sed -i 's/IsUCOrXA="yes"/XIsUCOrXA="yes"/g; s/IsUCOrXA=yes/XIsUCOrXA=yes/g' ${RAMDISK_PATH}/usr/syno/share/environments.sh
|
||||
fi
|
||||
@@ -245,7 +247,7 @@ for F in $(ls -1 ${USER_UP_PATH}/*.sh 2>/dev/null); do
|
||||
done
|
||||
|
||||
# Reassembly ramdisk
|
||||
if [ "${RD_COMPRESSED}" = "true" ]; then
|
||||
if [ "${RD_COMPRESSED}" == "true" ]; then
|
||||
(cd "${RAMDISK_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root | xz -9 --format=lzma >"${MOD_RDGZ_FILE}") >"${LOG_FILE}" 2>&1 || exit 1
|
||||
else
|
||||
(cd "${RAMDISK_PATH}" && find . 2>/dev/null | cpio -o -H newc -R root:root >"${MOD_RDGZ_FILE}") >"${LOG_FILE}" 2>&1 || exit 1
|
||||
|
||||
@@ -3,89 +3,72 @@
|
||||
|
||||
[[ -z "${ARC_PATH}" || ! -d "${ARC_PATH}/include" ]] && ARC_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)"
|
||||
|
||||
calculate_run_size() {
|
||||
NUM='\([0-9a-fA-F]*[ \t]*\)'
|
||||
OUT=$(sed -n 's/^[ \t0-9]*.b[sr][sk][ \t]*'"${NUM}${NUM}${NUM}${NUM}"'.*/0x\1 0x\4/p')
|
||||
. ${ARC_PATH}/include/functions.sh
|
||||
|
||||
if [ -z "${OUT}" ]; then
|
||||
echo "Never found .bss or .brk file offset" >&2
|
||||
return 1
|
||||
fi
|
||||
|
||||
read -r sizeA offsetA sizeB offsetB <<<$(echo ${OUT} | awk '{printf "%d %d %d %d", strtonum($1), strtonum($2), strtonum($3), strtonum($4)}')
|
||||
|
||||
runSize=$((offsetA + sizeA + sizeB))
|
||||
|
||||
# BFD linker shows the same file offset in ELF.
|
||||
if [ "${offsetA}" -ne "${offsetB}" ]; then
|
||||
# Gold linker shows them as consecutive.
|
||||
endSize=$((offsetB + sizeB))
|
||||
if [ "${endSize}" -ne "${runSize}" ]; then
|
||||
printf "sizeA: 0x%x\n" ${sizeA} >&2
|
||||
printf "offsetA: 0x%x\n" ${offsetA} >&2
|
||||
printf "sizeB: 0x%x\n" ${sizeB} >&2
|
||||
printf "offsetB: 0x%x\n" ${offsetB} >&2
|
||||
echo ".bss and .brk are non-contiguous" >&2
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
|
||||
printf "%d\n" ${runSize}
|
||||
return 0
|
||||
}
|
||||
PLATFORM="$(readConfigKey "platform" "${USER_CONFIG_FILE}")"
|
||||
PRODUCTVER="$(readConfigKey "productver" "${USER_CONFIG_FILE}")"
|
||||
KVER="$(readConfigKey "platforms.${PLATFORM}.productvers.\"${PRODUCTVER}\".kver" "${P_FILE}")"
|
||||
|
||||
# Adapted from: scripts/Makefile.lib
|
||||
# Usage: size_append FILE [FILE2] [FILEn]...
|
||||
# Output: LE HEX with size of file in bytes (to STDOUT)
|
||||
file_size_le() {
|
||||
printf $(
|
||||
local dec_size=0
|
||||
for F in "$@"; do dec_size=$((dec_size + $(stat -c "%s" "${F}"))); done
|
||||
printf "%08x\n" "${dec_size}" | sed 's/\(..\)/\1 /g' | {
|
||||
read -r ch0 ch1 ch2 ch3
|
||||
for ch in "${ch3}" "${ch2}" "${ch1}" "${ch0}"; do printf '%s%03o' '\' "$((0x${ch}))"; done
|
||||
dec_size=0
|
||||
for F in "${@}"; do
|
||||
fsize=$(stat -c "%s" ${F})
|
||||
dec_size=$((${dec_size} + ${fsize}))
|
||||
done
|
||||
printf "%08x\n" ${dec_size} |
|
||||
sed 's/\(..\)/\1 /g' | {
|
||||
read ch0 ch1 ch2 ch3
|
||||
for ch in ${ch3} ${ch2} ${ch1} ${ch0}; do
|
||||
printf '%s%03o' '\' $((0x${ch}))
|
||||
done
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
size_le() {
|
||||
printf $(
|
||||
printf "%08x\n" "${@}" | sed 's/\(..\)/\1 /g' | {
|
||||
read -r ch0 ch1 ch2 ch3
|
||||
for ch in "${ch3}" "${ch2}" "${ch1}" "${ch0}"; do printf '%s%03o' '\' "$((0x${ch}))"; done
|
||||
printf "%08x\n" "${@}" |
|
||||
sed 's/\(..\)/\1 /g' | {
|
||||
read ch0 ch1 ch2 ch3
|
||||
for ch in ${ch3} ${ch2} ${ch1} ${ch0}; do
|
||||
printf '%s%03o' '\' $((0x${ch}))
|
||||
done
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
VMLINUX_MOD=${1}
|
||||
ZIMAGE_MOD=${2}
|
||||
|
||||
KVER=$(strings "${VMLINUX_MOD}" | grep -Eo "Linux version [0-9]+\.[0-9]+\.[0-9]+" | head -1 | awk '{print $3}')
|
||||
if [ "$(echo "${KVER:-4}" | cut -d'.' -f1)" -lt 5 ]; then
|
||||
KVER_MAJOR=${KVER:0:1}
|
||||
if [ ${KVER_MAJOR} -eq 4 ]; then
|
||||
# Kernel version 4.x or 3.x (bromolow)
|
||||
# zImage_head 16494
|
||||
# payload(
|
||||
# vmlinux.bin x
|
||||
# padding 0xf00000-x
|
||||
# vmlinux.bin size 4
|
||||
# ) 0xf00004
|
||||
# zImage_tail(
|
||||
# unknown 72
|
||||
# run_size 4
|
||||
# unknown 30
|
||||
# vmlinux.bin size 4
|
||||
# unknown 114460
|
||||
# ) 114570
|
||||
# crc32 4
|
||||
#zImage_head 16494
|
||||
#payload(
|
||||
# vmlinux.bin x
|
||||
# padding 0xf00000-x
|
||||
# vmlinux.bin size 4
|
||||
#) 0xf00004
|
||||
#zImage_tail(
|
||||
# unknown 72
|
||||
# run_size 4
|
||||
# unknown 30
|
||||
# vmlinux.bin size 4
|
||||
# unknown 114460
|
||||
#) 114570
|
||||
#crc32 4
|
||||
gzip -dc "${ARC_PATH}/bzImage-template-v4.gz" >"${ZIMAGE_MOD}" || exit 1
|
||||
|
||||
dd if="${VMLINUX_MOD}" of="${ZIMAGE_MOD}" bs=16494 seek=1 conv=notrunc || exit 1
|
||||
file_size_le "${VMLINUX_MOD}" | dd of="${ZIMAGE_MOD}" bs=15745134 seek=1 conv=notrunc || exit 1
|
||||
file_size_le "${VMLINUX_MOD}" | dd of="${ZIMAGE_MOD}" bs=15745244 seek=1 conv=notrunc || exit 1
|
||||
|
||||
RUN_SIZE=$(objdump -h "${VMLINUX_MOD}" | calc_run_size)
|
||||
size_le "${RUN_SIZE}" | dd of="${ZIMAGE_MOD}" bs=15745210 seek=1 conv=notrunc || exit 1
|
||||
size_le "$((16#$(crc32 "${ZIMAGE_MOD}" | awk '{print $1}') ^ 0xFFFFFFFF))" | dd of="${ZIMAGE_MOD}" conv=notrunc oflag=append || exit 1
|
||||
RUN_SIZE=$(objdump -h ${VMLINUX_MOD} | sh "${ARC_PATH}/calc_run_size.sh")
|
||||
size_le ${RUN_SIZE} | dd of=${ZIMAGE_MOD} bs=15745210 seek=1 conv=notrunc|| exit 1
|
||||
size_le $(($((16#$(crc32 "${ZIMAGE_MOD}" | awk '{print $1}'))) ^ 0xFFFFFFFF)) | dd of="${ZIMAGE_MOD}" conv=notrunc oflag=append || exit 1
|
||||
else
|
||||
# Kernel version 5.x
|
||||
gzip -dc "${ARC_PATH}/bzImage-template-v5.gz" >"${ZIMAGE_MOD}" || exit 1
|
||||
@@ -93,7 +76,7 @@ else
|
||||
dd if="${VMLINUX_MOD}" of="${ZIMAGE_MOD}" bs=14561 seek=1 conv=notrunc || exit 1
|
||||
file_size_le "${VMLINUX_MOD}" | dd of="${ZIMAGE_MOD}" bs=34463421 seek=1 conv=notrunc || exit 1
|
||||
file_size_le "${VMLINUX_MOD}" | dd of="${ZIMAGE_MOD}" bs=34479132 seek=1 conv=notrunc || exit 1
|
||||
# RUN_SIZE=$(objdump -h "${VMLINUX_MOD}" | calc_run_size)
|
||||
# size_le "${RUN_SIZE}" | dd of="${ZIMAGE_MOD}" bs=34626904 seek=1 conv=notrunc || exit 1
|
||||
size_le "$((16#$(crc32 "${ZIMAGE_MOD}" | awk '{print $1}') ^ 0xFFFFFFFF))" | dd of="${ZIMAGE_MOD}" conv=notrunc oflag=append || exit 1
|
||||
# RUN_SIZE=$(objdump -h ${VMLINUX_MOD} | sh "${ARC_PATH}/calc_run_size.sh")
|
||||
# size_le ${RUN_SIZE} | dd of=${ZIMAGE_MOD} bs=34626904 seek=1 conv=notrunc || exit 1
|
||||
size_le $(($((16#$(crc32 "${ZIMAGE_MOD}" | awk '{print $1}'))) ^ 0xFFFFFFFF)) | dd of="${ZIMAGE_MOD}" conv=notrunc oflag=append || exit 1
|
||||
fi
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
[[ -z "${ARC_PATH}" || ! -d "${ARC_PATH}/include" ]] && ARC_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)"
|
||||
|
||||
. "${ARC_PATH}/include/functions.sh"
|
||||
. ${ARC_PATH}/include/functions.sh
|
||||
|
||||
set -o pipefail # Get exit code from process piped
|
||||
|
||||
@@ -12,22 +12,22 @@ set -o pipefail # Get exit code from process piped
|
||||
rm -f "${MOD_ZIMAGE_FILE}"
|
||||
|
||||
KERNEL="$(readConfigKey "kernel" "${USER_CONFIG_FILE}")"
|
||||
if [ "${KERNEL}" = "custom" ]; then
|
||||
if [ "${KERNEL}" == "custom" ]; then
|
||||
echo -n " - Using customized Kernel"
|
||||
PLATFORM="$(readConfigKey "platform" "${USER_CONFIG_FILE}")"
|
||||
PRODUCTVER="$(readConfigKey "productver" "${USER_CONFIG_FILE}")"
|
||||
KVER="$(readConfigKey "platforms.${PLATFORM}.productvers.\"${PRODUCTVER}\".kver" "${P_FILE}")"
|
||||
# Modify KVER for Epyc7002
|
||||
[ "${PLATFORM}" = "epyc7002" ] && KVERP="${PRODUCTVER}-${KVER}" || KVERP="${KVER}"
|
||||
[ "${PLATFORM}" == "epyc7002" ] && KVERP="${PRODUCTVER}-${KVER}" || KVERP="${KVER}"
|
||||
# Extract bzImage
|
||||
gzip -dc "${CUSTOM_PATH}/bzImage-${PLATFORM}-${KVERP}.gz" >"${MOD_ZIMAGE_FILE}"
|
||||
else
|
||||
# Extract vmlinux
|
||||
"${ARC_PATH}/bzImage-to-vmlinux.sh" "${ORI_ZIMAGE_FILE}" "${TMP_PATH}/vmlinux" >"${LOG_FILE}" 2>&1 || dieLog
|
||||
${ARC_PATH}/bzImage-to-vmlinux.sh "${ORI_ZIMAGE_FILE}" "${TMP_PATH}/vmlinux" >"${LOG_FILE}" 2>&1 || dieLog
|
||||
# Patch boot params and ramdisk check
|
||||
"${ARC_PATH}/kpatch" "${TMP_PATH}/vmlinux" "${TMP_PATH}/vmlinux-mod" >"${LOG_FILE}" 2>&1 || dieLog
|
||||
${ARC_PATH}/kpatch "${TMP_PATH}/vmlinux" "${TMP_PATH}/vmlinux-mod" >"${LOG_FILE}" 2>&1 || dieLog
|
||||
# rebuild zImage
|
||||
"${ARC_PATH}/vmlinux-to-bzImage.sh" "${TMP_PATH}/vmlinux-mod" "${MOD_ZIMAGE_FILE}" >"${LOG_FILE}" 2>&1 || dieLog
|
||||
${ARC_PATH}/vmlinux-to-bzImage.sh "${TMP_PATH}/vmlinux-mod" "${MOD_ZIMAGE_FILE}" >"${LOG_FILE}" 2>&1 || dieLog
|
||||
fi
|
||||
|
||||
sync
|
||||
1
files/p1/ARC-VERSION
Normal file
1
files/p1/ARC-VERSION
Normal file
@@ -0,0 +1 @@
|
||||
23.1.1
|
||||
@@ -1,36 +1,40 @@
|
||||
insmod search
|
||||
insmod echo
|
||||
insmod terminal
|
||||
insmod test
|
||||
insmod font
|
||||
insmod loadenv
|
||||
insmod serial
|
||||
insmod usb_keyboard
|
||||
insmod linux
|
||||
insmod gzio
|
||||
insmod fat
|
||||
insmod ext2
|
||||
insmod ata
|
||||
insmod btrfs
|
||||
insmod ntfs
|
||||
insmod part_msdos
|
||||
insmod part_gpt
|
||||
|
||||
set default="boot"
|
||||
set timeout="5"
|
||||
set timeout_style="menu"
|
||||
set vesa_mode=1
|
||||
|
||||
if [ -s ${prefix}/grubenv ]; then
|
||||
load_env --skip-sig
|
||||
if [ -s $prefix/grubenv ]; then
|
||||
load_env
|
||||
fi
|
||||
|
||||
if [ "${next_entry}" ]; then
|
||||
set default="${next_entry}"
|
||||
unset next_entry
|
||||
save_env next_entry
|
||||
else
|
||||
set default="boot"
|
||||
fi
|
||||
|
||||
if [ "${linux_gfx_mode}" ]; then
|
||||
save_env linux_gfx_mode
|
||||
else
|
||||
set linux_gfx_mode=keep
|
||||
save_env linux_gfx_mode
|
||||
if [ "${vesa_mode}" ]; then
|
||||
set vesa_mode=${vesa_mode}
|
||||
fi
|
||||
|
||||
if [ x"${feature_menuentry_id}" = xy ]; then
|
||||
menuentry_id_option="--id"
|
||||
else
|
||||
menuentry_id_option=""
|
||||
fi
|
||||
|
||||
export menuentry_id_option
|
||||
|
||||
function load_video {
|
||||
if [ x"${feature_all_video_module}" = xy ]; then
|
||||
if [ x$feature_all_video_module = xy ]; then
|
||||
insmod all_video
|
||||
else
|
||||
insmod efi_gop
|
||||
@@ -43,24 +47,12 @@ function load_video {
|
||||
fi
|
||||
}
|
||||
|
||||
set menu_color_normal=white/black
|
||||
set menu_color_highlight=white/red
|
||||
set color_normal=white/black
|
||||
|
||||
if [ x"${feature_default_font_path}" = xy ]; then
|
||||
font=unicode
|
||||
else
|
||||
font=${prefix}/fonts/unicode.pf2
|
||||
fi
|
||||
|
||||
if loadfont ${font}; then
|
||||
if [ "${grub_platform}" = "efi" ]; then
|
||||
set gfxmode=auto
|
||||
else
|
||||
set gfxmode=1024x768
|
||||
fi
|
||||
load_video
|
||||
load_video
|
||||
if loadfont unicode; then
|
||||
insmod gfxterm
|
||||
set gfxmode=1024x768
|
||||
set gfxpayload=auto
|
||||
terminal_output gfxterm
|
||||
insmod gfxmenu
|
||||
loadfont ${prefix}/theme/dejavu_bold_14.pf2
|
||||
loadfont ${prefix}/theme/dejavu_mono_12.pf2
|
||||
@@ -69,30 +61,31 @@ if loadfont ${font}; then
|
||||
export theme
|
||||
fi
|
||||
|
||||
terminal_output gfxterm
|
||||
|
||||
if serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1; then
|
||||
terminal_input --append serial
|
||||
terminal_output --append serial
|
||||
if serial --unit=0 --speed=115200; then
|
||||
terminal_input --append serial_com0
|
||||
terminal_output --append serial_com0
|
||||
fi
|
||||
|
||||
function gfxmode {
|
||||
set gfxpayload="${linux_gfx_mode}"
|
||||
if [ "${linux_gfx_mode}" = "keep" ]; then
|
||||
set vt_handoff=vt.handoff=7
|
||||
else
|
||||
set vt_handoff=
|
||||
fi
|
||||
function set_gfxpayload {
|
||||
if [ ${vesa_mode} -eq 1 ]; then
|
||||
set gfxpayload=keep
|
||||
else
|
||||
set gfxpayload=text
|
||||
fi
|
||||
}
|
||||
|
||||
set ARC_CMDLINE="earlyprintk earlycon=uart8250,io,0x3f8,115200n8 console=ttyS0,115200n8 root=/dev/ram rootwait intremap=off amd_iommu_intr=legacy net.ifnames=0 panic=5 split_lock_detect=off pcie_aspm=off intel_pstate=disable amd_pstate=disable nox2apic nomodeset"
|
||||
set menu_color_normal=white/black
|
||||
set menu_color_highlight=white/red
|
||||
set color_normal=white/black
|
||||
|
||||
set ARC_CMDLINE="earlyprintk earlycon=uart8250,io,0x3f8,115200n8 console=ttyS0,115200n8 root=/dev/ram rootwait net.ifnames=0 panic=5 split_lock_detect=off pcie_aspm=off intel_pstate=disable"
|
||||
|
||||
search --set=root --label "ARC3"
|
||||
if [ -s /zImage-dsm -a -s /initrd-dsm ]; then
|
||||
if [ "${default}" = "direct" ]; then
|
||||
set timeout="1"
|
||||
menuentry 'DSM Direct Mode' ${menuentry_id_option} direct {
|
||||
gfxmode
|
||||
menuentry 'DSM Direct Mode' --id direct {
|
||||
set_gfxpayload
|
||||
echo "Loading DSM Kernel..."
|
||||
linux /zImage-dsm ${dsm_cmdline}
|
||||
echo "Loading DSM Initramfs..."
|
||||
@@ -101,8 +94,8 @@ if [ -s /zImage-dsm -a -s /initrd-dsm ]; then
|
||||
echo "Access http://find.synology.com/ to connect the DSM via web."
|
||||
}
|
||||
fi
|
||||
menuentry 'Arc DSM Mode' ${menuentry_id_option} boot {
|
||||
gfxmode
|
||||
menuentry 'Arc DSM Mode' --id boot {
|
||||
set_gfxpayload
|
||||
echo "Loading Arc Kernel..."
|
||||
linux /bzImage-arc ${ARC_CMDLINE} ${arc_cmdline}
|
||||
echo "Loading Arc Initramfs..."
|
||||
@@ -116,8 +109,8 @@ if [ -s /zImage-dsm -a -s /initrd-dsm ]; then
|
||||
fi
|
||||
|
||||
if [ -e /automated ]; then
|
||||
menuentry 'Arc Automated Mode' ${menuentry_id_option} automated {
|
||||
gfxmode
|
||||
menuentry 'Arc Automated Mode' --id automated {
|
||||
set_gfxpayload
|
||||
echo "Loading Arc Kernel..."
|
||||
linux /bzImage-arc ${ARC_CMDLINE} ${arc_cmdline} automated_arc
|
||||
echo "Loading Arc Initramfs..."
|
||||
@@ -130,8 +123,8 @@ if [ -e /automated ]; then
|
||||
}
|
||||
fi
|
||||
|
||||
menuentry 'Arc Config Mode' ${menuentry_id_option} config {
|
||||
gfxmode
|
||||
menuentry 'Arc Config Mode' --id config {
|
||||
set_gfxpayload
|
||||
echo "Loading Arc Kernel..."
|
||||
linux /bzImage-arc ${ARC_CMDLINE} ${arc_cmdline} force_arc
|
||||
echo "Loading Arc Initramfs..."
|
||||
@@ -144,8 +137,8 @@ menuentry 'Arc Config Mode' ${menuentry_id_option} config {
|
||||
}
|
||||
|
||||
if [ -s /zImage-dsm -a -s /initrd-dsm ]; then
|
||||
menuentry 'Arc Update Mode' ${menuentry_id_option} update {
|
||||
gfxmode
|
||||
menuentry 'Arc Update Mode' --id update {
|
||||
set_gfxpayload
|
||||
echo "Loading Arc Kernel..."
|
||||
linux /bzImage-arc ${ARC_CMDLINE} ${arc_cmdline} update_arc
|
||||
echo "Loading Arc Initramfs..."
|
||||
@@ -156,8 +149,8 @@ if [ -s /zImage-dsm -a -s /initrd-dsm ]; then
|
||||
fi
|
||||
echo "Booting..."
|
||||
}
|
||||
menuentry 'DSM Recovery Mode' ${menuentry_id_option} recovery {
|
||||
gfxmode
|
||||
menuentry 'DSM Recovery Mode' --id recovery {
|
||||
set_gfxpayload
|
||||
echo "Loading Arc Kernel..."
|
||||
linux /bzImage-arc ${ARC_CMDLINE} ${arc_cmdline} recovery
|
||||
echo "Loading Arc Initramfs..."
|
||||
@@ -168,8 +161,8 @@ if [ -s /zImage-dsm -a -s /initrd-dsm ]; then
|
||||
fi
|
||||
echo "Booting..."
|
||||
}
|
||||
menuentry 'DSM Reinstall Mode' ${menuentry_id_option} junior {
|
||||
gfxmode
|
||||
menuentry 'DSM Reinstall Mode' --id junior {
|
||||
set_gfxpayload
|
||||
echo "Loading Arc Kernel..."
|
||||
linux /bzImage-arc ${ARC_CMDLINE} ${arc_cmdline} force_junior
|
||||
echo "Loading Arc Initramfs..."
|
||||
@@ -182,30 +175,26 @@ if [ -s /zImage-dsm -a -s /initrd-dsm ]; then
|
||||
}
|
||||
fi
|
||||
|
||||
menuentry 'System UEFI Setup' ${menuentry_id_option} uefi {
|
||||
menuentry 'Enter BIOS Setup' --id bios {
|
||||
fwsetup
|
||||
}
|
||||
|
||||
menuentry 'System Memtest86+' ${menuentry_id_option} memtest {
|
||||
menuentry 'Start Memtest86+' --id memtest {
|
||||
echo "Loading memtest86+..."
|
||||
linux ${prefix}/memtest
|
||||
}
|
||||
|
||||
menuentry 'System Poweroff' ${menuentry_id_option} poweroff {
|
||||
echo "System is powering off..."
|
||||
halt
|
||||
}
|
||||
|
||||
if [ "${linux_gfx_mode}" = "keep" ]; then
|
||||
menuentry 'Change vesa to text video mode' ${menuentry_id_option} videomode {
|
||||
set linux_gfx_mode=text
|
||||
save_env linux_gfx_mode
|
||||
if [ ${vesa_mode} = 1 ]; then
|
||||
menuentry 'Change Vesa to Text Output' --id videomode {
|
||||
set vesa_mode=0
|
||||
save_env vesa_mode
|
||||
configfile ${prefix}/grub.cfg
|
||||
}
|
||||
else
|
||||
menuentry 'Change text to vesa video mode' ${menuentry_id_option} videomode {
|
||||
set linux_gfx_mode=keep
|
||||
save_env linux_gfx_mode
|
||||
menuentry 'Change Text to Vesa Output' --id videomode {
|
||||
set vesa_mode=1
|
||||
save_env vesa_mode
|
||||
reboot
|
||||
configfile ${prefix}/grub.cfg
|
||||
}
|
||||
fi
|
||||
BIN
files/p3/extractor/libcurl.so.4
Executable file
BIN
files/p3/extractor/libcurl.so.4
Executable file
Binary file not shown.
BIN
files/p3/extractor/libmbedcrypto.so.5
Executable file
BIN
files/p3/extractor/libmbedcrypto.so.5
Executable file
Binary file not shown.
BIN
files/p3/extractor/libmbedtls.so.13
Executable file
BIN
files/p3/extractor/libmbedtls.so.13
Executable file
Binary file not shown.
BIN
files/p3/extractor/libmbedx509.so.1
Executable file
BIN
files/p3/extractor/libmbedx509.so.1
Executable file
Binary file not shown.
BIN
files/p3/extractor/libmsgpackc.so.2
Executable file
BIN
files/p3/extractor/libmsgpackc.so.2
Executable file
Binary file not shown.
BIN
files/p3/extractor/libsodium.so
Executable file
BIN
files/p3/extractor/libsodium.so
Executable file
Binary file not shown.
BIN
files/p3/extractor/libsynocodesign-ng-virtual-junior-wins.so.7
Executable file
BIN
files/p3/extractor/libsynocodesign-ng-virtual-junior-wins.so.7
Executable file
Binary file not shown.
BIN
files/p3/extractor/syno_extract_system_patch
Executable file
BIN
files/p3/extractor/syno_extract_system_patch
Executable file
Binary file not shown.
@@ -1,21 +1,11 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright (C) 2025 AuxXxilium <https://github.com/AuxXxilium>
|
||||
#
|
||||
# This is free software, licensed under the MIT License.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
# Clean cached Files
|
||||
sudo git clean -fdx
|
||||
|
||||
. scripts/func.sh "${AUX_TOKEN}"
|
||||
|
||||
# Unmount Image File
|
||||
sudo umount "/tmp/p1" 2>/dev/null || true
|
||||
sudo umount "/tmp/p3" 2>/dev/null || true
|
||||
. scripts/func.sh
|
||||
|
||||
# Get extractor, LKM, addons and Modules
|
||||
echo "Get Dependencies"
|
||||
@@ -27,10 +17,7 @@ getCustom "files/p3/custom"
|
||||
getLKMs "files/p3/lkms"
|
||||
getTheme "files/p1/boot/grub"
|
||||
getOffline "files/p3/configs"
|
||||
case "${1}" in
|
||||
evo) getBuildroot "${1}" "br" ;;
|
||||
*) echo "Invalid option specified" ;;
|
||||
esac
|
||||
getBuildrootx "brx"
|
||||
|
||||
# Sbase
|
||||
IMAGE_FILE="arc.img"
|
||||
@@ -48,32 +35,31 @@ mkdir -p "/tmp/p3"
|
||||
sudo mount ${LOOPX}p1 "/tmp/p1"
|
||||
sudo mount ${LOOPX}p3 "/tmp/p3"
|
||||
|
||||
ARC_BUILD="$(date +'%y%m%d')"
|
||||
ARC_VERSION="13.3.7"
|
||||
ARC_BRANCH="dev"
|
||||
echo "${ARC_VERSION}" >"files/p1/ARC-VERSION"
|
||||
echo "${ARC_BUILD}" >"files/p1/ARC-BUILD"
|
||||
echo "${ARC_BRANCH}" >"files/p1/ARC-BRANCH"
|
||||
[[ ! -f "brx/bzImage-arc" || ! -f "brx/initrd-arc" ]] && return 1
|
||||
|
||||
ARC_BUILD="`date +'%y%m%d'`"
|
||||
ARC_VERSION="13.37.dev"
|
||||
ARC_BRANCH="next"
|
||||
echo "${ARC_BUILD}" >files/p1/ARC-BUILD
|
||||
echo "${ARC_VERSION}" >files/p1/ARC-VERSION
|
||||
echo "${ARC_BRANCH}" >files/p1/ARC-BRANCH
|
||||
|
||||
echo "Repack initrd"
|
||||
if [ -f "br/bzImage-arc" ] && [ -f "br/initrd-arc" ]; then
|
||||
cp -f "br/bzImage-arc" "files/p3/bzImage-arc"
|
||||
repackInitrd "br/initrd-arc" "files/initrd" "files/p3/initrd-arc"
|
||||
else
|
||||
exit 1
|
||||
fi
|
||||
cp -f "brx/bzImage-arc" "files/p3/bzImage-arc"
|
||||
#cp -f "brx/initrd-arc" "files/p3/initrd-arc"
|
||||
repackInitrd "brx/initrd-arc" "files/initrd" "files/p3/initrd-arc"
|
||||
|
||||
echo "Copying files"
|
||||
sudo cp -rf "files/p1/"* "/tmp/p1"
|
||||
sudo cp -rf "files/p3/"* "/tmp/p3"
|
||||
sudo sync
|
||||
sync
|
||||
|
||||
echo "Unmount image file"
|
||||
sudo umount "/tmp/p1"
|
||||
sudo umount "/tmp/p3"
|
||||
sudo rm -rf "/tmp/p1"
|
||||
sudo rm -rf "/tmp/p3"
|
||||
rmdir "/tmp/p1"
|
||||
rmdir "/tmp/p3"
|
||||
|
||||
sudo losetup --detach ${LOOPX}
|
||||
|
||||
qemu-img convert -p -f raw -o subformat=monolithicFlat -O vmdk ${IMAGE_FILE} arc.vmdk
|
||||
qemu-img convert ${IMAGE_FILE} -O vmdk -o adapter_type=lsilogic,subformat=monolithicFlat arc.vmdk
|
||||
65
img-gen-s.sh
Executable file
65
img-gen-s.sh
Executable file
@@ -0,0 +1,65 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
|
||||
# Clean cached Files
|
||||
sudo git clean -fdx
|
||||
|
||||
. scripts/func.sh
|
||||
|
||||
# Get extractor, LKM, addons and Modules
|
||||
echo "Get Dependencies"
|
||||
getAddons "files/p3/addons"
|
||||
getModules "files/p3/modules"
|
||||
getConfigs "files/p3/configs"
|
||||
getPatches "files/p3/patches"
|
||||
getCustom "files/p3/custom"
|
||||
getLKMs "files/p3/lkms"
|
||||
getTheme "files/p1/boot/grub"
|
||||
getOffline "files/p3/configs"
|
||||
getBuildroots "brs"
|
||||
|
||||
# Sbase
|
||||
IMAGE_FILE="arc.img"
|
||||
gzip -dc "files/initrd/opt/arc/grub.img.gz" >"${IMAGE_FILE}"
|
||||
fdisk -l "${IMAGE_FILE}"
|
||||
|
||||
LOOPX=$(sudo losetup -f)
|
||||
sudo losetup -P "${LOOPX}" "${IMAGE_FILE}"
|
||||
|
||||
echo "Mounting Image File"
|
||||
sudo rm -rf "/tmp/p1"
|
||||
sudo rm -rf "/tmp/p3"
|
||||
mkdir -p "/tmp/p1"
|
||||
mkdir -p "/tmp/p3"
|
||||
sudo mount ${LOOPX}p1 "/tmp/p1"
|
||||
sudo mount ${LOOPX}p3 "/tmp/p3"
|
||||
|
||||
[[ ! -f "brs/bzImage-arc" || ! -f "brs/initrd-arc" ]] && return 1
|
||||
|
||||
ARC_BUILD="`date +'%y%m%d'`"
|
||||
ARC_VERSION="13.37.dev"
|
||||
ARC_BRANCH="stable"
|
||||
echo "${ARC_BUILD}" >files/p1/ARC-BUILD
|
||||
echo "${ARC_VERSION}" >files/p1/ARC-VERSION
|
||||
echo "${ARC_BRANCH}" >files/p1/ARC-BRANCH
|
||||
|
||||
echo "Repack initrd"
|
||||
cp -f "brs/bzImage-arc" "files/p3/bzImage-arc"
|
||||
#cp -f "brs/initrd-arc" "files/p3/initrd-arc"
|
||||
repackInitrd "brs/initrd-arc" "files/initrd" "files/p3/initrd-arc"
|
||||
|
||||
echo "Copying files"
|
||||
sudo cp -rf "files/p1/"* "/tmp/p1"
|
||||
sudo cp -rf "files/p3/"* "/tmp/p3"
|
||||
sync
|
||||
|
||||
echo "Unmount image file"
|
||||
sudo umount "/tmp/p1"
|
||||
sudo umount "/tmp/p3"
|
||||
rmdir "/tmp/p1"
|
||||
rmdir "/tmp/p3"
|
||||
|
||||
sudo losetup --detach ${LOOPX}
|
||||
|
||||
qemu-img convert ${IMAGE_FILE} -O vmdk -o adapter_type=lsilogic,subformat=monolithicFlat arc.vmdk
|
||||
BIN
kpatch/kpatch
Executable file
BIN
kpatch/kpatch
Executable file
Binary file not shown.
@@ -489,4 +489,4 @@ int main(int argc, char *argv[])
|
||||
close(fd);
|
||||
printf("Finish!\n");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
531
scripts/func.sh
531
scripts/func.sh
@@ -1,12 +1,35 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright (C) 2025 AuxXxilium <https://github.com/AuxXxilium>
|
||||
#
|
||||
# Copyright (C) 2024 AuxXxilium <https://github.com/AuxXxilium>
|
||||
#
|
||||
# This is free software, licensed under the MIT License.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
[ -n "${1}" ] && export TOKEN="${1}"
|
||||
# Get latest Arc
|
||||
# $1 path
|
||||
function getArcSystem() {
|
||||
echo "Getting ArcSystem begin"
|
||||
local DEST_PATH="${1}"
|
||||
local RELEASE="${2}"
|
||||
local CACHE_FILE="/tmp/system.zip"
|
||||
rm -f "${CACHE_FILE}"
|
||||
if [ "${RELEASE}" = "dev" ]; then
|
||||
local TAG="$(curl -m 10 -skL "https://api.github.com/repos/AuxXxilium/arc-system/releases" | jq -r ".[].tag_name" | grep "dev" | sort -rV | head -1)"
|
||||
else
|
||||
local TAG="$(curl -m 10 -skL "https://api.github.com/repos/AuxXxilium/arc-system/releases" | jq -r ".[].tag_name" | grep -v "dev" | sort -rV | head -1)"
|
||||
fi
|
||||
if curl -skL "https://github.com/AuxXxilium/arc-system/releases/download/${TAG}/system-${TAG}.zip" -o "${CACHE_FILE}"; then
|
||||
# Unzip LKMs
|
||||
mkdir -p "${DEST_PATH}"
|
||||
unzip -o "${CACHE_FILE}" -d "${DEST_PATH}"
|
||||
rm -f "${CACHE_FILE}"
|
||||
echo "Getting ArcSystem end - ${TAG}"
|
||||
else
|
||||
echo "Failed to get ArcSystem"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Get latest LKMs
|
||||
# $1 path
|
||||
@@ -15,21 +38,19 @@ function getLKMs() {
|
||||
local DEST_PATH="${1}"
|
||||
local CACHE_FILE="/tmp/rp-lkms.zip"
|
||||
rm -f "${CACHE_FILE}"
|
||||
TAG=$(curl -skL -H "Authorization: token ${TOKEN}" "https://api.github.com/repos/AuxXxilium/arc-lkm/releases" | jq -r ".[].tag_name" | sort -rV | head -1)
|
||||
TAG="$(curl -s "https://api.github.com/repos/AuxXxilium/arc-lkm/releases/latest" | grep -oP '"tag_name": "\K(.*)(?=")')"
|
||||
export LKMTAG="${TAG}"
|
||||
while read -r ID NAME; do
|
||||
if [ "${NAME}" = "rp-lkms.zip" ]; then
|
||||
curl -kL -H "Authorization: token ${TOKEN}" -H "Accept: application/octet-stream" "https://api.github.com/repos/AuxXxilium/arc-lkm/releases/assets/${ID}" -o "${CACHE_FILE}"
|
||||
# Unzip LKMs
|
||||
rm -rf "${DEST_PATH}"
|
||||
mkdir -p "${DEST_PATH}"
|
||||
if unzip -o "${CACHE_FILE}" -d "${DEST_PATH}"; then
|
||||
rm -f "${CACHE_FILE}"
|
||||
echo "Getting LKMs end - ${TAG}"
|
||||
break
|
||||
fi
|
||||
fi
|
||||
done < <(curl -skL -H "Authorization: token ${TOKEN}" "https://api.github.com/repos/AuxXxilium/arc-lkm/releases/tags/${TAG}" | jq -r '.assets[] | "\(.id) \(.name)"')
|
||||
if curl -skL "https://github.com/AuxXxilium/arc-lkm/releases/download/${TAG}/rp-lkms.zip" -o "${CACHE_FILE}"; then
|
||||
# Unzip LKMs
|
||||
rm -rf "${DEST_PATH}"
|
||||
mkdir -p "${DEST_PATH}"
|
||||
unzip -o "${CACHE_FILE}" -d "${DEST_PATH}"
|
||||
rm -f "${CACHE_FILE}"
|
||||
echo "Getting LKMs end - ${TAG}"
|
||||
else
|
||||
echo "Failed to get LKMs"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Get latest Addons
|
||||
@@ -39,31 +60,28 @@ function getAddons() {
|
||||
local DEST_PATH="${1}"
|
||||
local CACHE_DIR="/tmp/addons"
|
||||
local CACHE_FILE="/tmp/addons.zip"
|
||||
rm -f "${CACHE_FILE}"
|
||||
TAG=$(curl -skL -H "Authorization: token ${TOKEN}" "https://api.github.com/repos/AuxXxilium/arc-addons/releases" | jq -r ".[].tag_name" | sort -rV | head -1)
|
||||
TAG="$(curl -s https://api.github.com/repos/AuxXxilium/arc-addons/releases/latest | grep -oP '"tag_name": "\K(.*)(?=")')"
|
||||
export ADDONTAG="${TAG}"
|
||||
while read -r ID NAME; do
|
||||
if [ "${NAME}" = "addons-${TAG}.zip" ]; then
|
||||
curl -kL -H "Authorization: token ${TOKEN}" -H "Accept: application/octet-stream" "https://api.github.com/repos/AuxXxilium/arc-addons/releases/assets/${ID}" -o "${CACHE_FILE}"
|
||||
# Unzip Addons
|
||||
rm -rf "${CACHE_DIR}"
|
||||
mkdir -p "${CACHE_DIR}"
|
||||
mkdir -p "${DEST_PATH}"
|
||||
if unzip -o "${CACHE_FILE}" -d "${CACHE_DIR}"; then
|
||||
echo "Installing Addons to ${DEST_PATH}"
|
||||
[ -f /tmp/addons/VERSION ] && cp -f /tmp/addons/VERSION ${DEST_PATH}/
|
||||
for PKG in $(ls ${CACHE_DIR}/*.addon); do
|
||||
ADDON=$(basename "${PKG}" .addon)
|
||||
mkdir -p "${DEST_PATH}/${ADDON}"
|
||||
echo "Extracting ${PKG} to ${DEST_PATH}/${ADDON}"
|
||||
tar -xaf "${PKG}" -C "${DEST_PATH}/${ADDON}"
|
||||
done
|
||||
rm -f "${CACHE_FILE}"
|
||||
echo "Getting Addons end - ${TAG}"
|
||||
break
|
||||
fi
|
||||
fi
|
||||
done < <(curl -skL -H "Authorization: token ${TOKEN}" "https://api.github.com/repos/AuxXxilium/arc-addons/releases/tags/${TAG}" | jq -r '.assets[] | "\(.id) \(.name)"')
|
||||
if curl -skL "https://github.com/AuxXxilium/arc-addons/releases/download/${TAG}/addons-${TAG}.zip" -o "${CACHE_FILE}"; then
|
||||
# Unzip Addons
|
||||
rm -rf "${CACHE_DIR}"
|
||||
mkdir -p "${CACHE_DIR}"
|
||||
mkdir -p "${DEST_PATH}"
|
||||
unzip -o "${CACHE_FILE}" -d "${CACHE_DIR}"
|
||||
echo "Installing Addons to ${DEST_PATH}"
|
||||
[ -f /tmp/addons/VERSION ] && cp -f /tmp/addons/VERSION ${DEST_PATH}/
|
||||
for PKG in $(ls ${CACHE_DIR}/*.addon); do
|
||||
ADDON=$(basename "${PKG}" .addon)
|
||||
mkdir -p "${DEST_PATH}/${ADDON}"
|
||||
echo "Extracting ${PKG} to ${DEST_PATH}/${ADDON}"
|
||||
tar -xaf "${PKG}" -C "${DEST_PATH}/${ADDON}"
|
||||
done
|
||||
rm -f "${CACHE_FILE}"
|
||||
echo "Getting Addons end - ${TAG}"
|
||||
else
|
||||
echo "Failed to get Addons"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Get latest Modules
|
||||
@@ -73,21 +91,18 @@ function getModules() {
|
||||
local DEST_PATH="${1}"
|
||||
local CACHE_FILE="/tmp/modules.zip"
|
||||
rm -f "${CACHE_FILE}"
|
||||
TAG=$(curl -skL -H "Authorization: token ${TOKEN}" "https://api.github.com/repos/AuxXxilium/arc-modules/releases" | jq -r ".[].tag_name" | sort -rV | head -1)
|
||||
TAG="$(curl -s https://api.github.com/repos/AuxXxilium/arc-modules/releases/latest | grep -oP '"tag_name": "\K(.*)(?=")')"
|
||||
export MODULETAG="${TAG}"
|
||||
while read -r ID NAME; do
|
||||
if [ "${NAME}" = "modules-${TAG}.zip" ]; then
|
||||
curl -kL -H "Authorization: token ${TOKEN}" -H "Accept: application/octet-stream" "https://api.github.com/repos/AuxXxilium/arc-modules/releases/assets/${ID}" -o "${CACHE_FILE}"
|
||||
# Unzip Modules
|
||||
rm -rf "${DEST_PATH}"
|
||||
mkdir -p "${DEST_PATH}"
|
||||
if unzip -o "${CACHE_FILE}" -d "${DEST_PATH}"; then
|
||||
rm -f "${CACHE_FILE}"
|
||||
echo "Getting Modules end - ${TAG}"
|
||||
break
|
||||
fi
|
||||
fi
|
||||
done < <(curl -skL -H "Authorization: token ${TOKEN}" "https://api.github.com/repos/AuxXxilium/arc-modules/releases/tags/${TAG}" | jq -r '.assets[] | "\(.id) \(.name)"')
|
||||
if curl -skL "https://github.com/AuxXxilium/arc-modules/releases/download/${TAG}/modules-${TAG}.zip" -o "${CACHE_FILE}"; then
|
||||
# Unzip Modules
|
||||
rm -rf "${DEST_PATH}"
|
||||
mkdir -p "${DEST_PATH}"
|
||||
unzip -o "${CACHE_FILE}" -d "${DEST_PATH}"
|
||||
echo "Getting Modules end - ${TAG}"
|
||||
else
|
||||
echo "Failed to get Modules"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Get latest Configs
|
||||
@@ -97,21 +112,19 @@ function getConfigs() {
|
||||
local DEST_PATH="${1}"
|
||||
local CACHE_FILE="/tmp/configs.zip"
|
||||
rm -f "${CACHE_FILE}"
|
||||
TAG=$(curl -skL -H "Authorization: token ${TOKEN}" "https://api.github.com/repos/AuxXxilium/arc-configs/releases" | jq -r ".[].tag_name" | sort -rV | head -1)
|
||||
TAG="$(curl -s https://api.github.com/repos/AuxXxilium/arc-configs/releases/latest | grep -oP '"tag_name": "\K(.*)(?=")')"
|
||||
export CONFIGTAG="${TAG}"
|
||||
while read -r ID NAME; do
|
||||
if [ "${NAME}" = "configs-${TAG}.zip" ]; then
|
||||
curl -kL -H "Authorization: token ${TOKEN}" -H "Accept: application/octet-stream" "https://api.github.com/repos/AuxXxilium/arc-configs/releases/assets/${ID}" -o "${CACHE_FILE}"
|
||||
# Unzip Configs
|
||||
rm -rf "${DEST_PATH}"
|
||||
mkdir -p "${DEST_PATH}"
|
||||
if unzip -o "${CACHE_FILE}" -d "${DEST_PATH}"; then
|
||||
rm -f "${CACHE_FILE}"
|
||||
echo "Getting Configs end - ${TAG}"
|
||||
break
|
||||
fi
|
||||
fi
|
||||
done < <(curl -skL -H "Authorization: token ${TOKEN}" "https://api.github.com/repos/AuxXxilium/arc-configs/releases/tags/${TAG}" | jq -r '.assets[] | "\(.id) \(.name)"')
|
||||
if curl -skL "https://github.com/AuxXxilium/arc-configs/releases/download/${TAG}/configs-${TAG}.zip" -o "${CACHE_FILE}"; then
|
||||
# Unzip Configs
|
||||
rm -rf "${DEST_PATH}"
|
||||
mkdir -p "${DEST_PATH}"
|
||||
unzip -o "${CACHE_FILE}" -d "${DEST_PATH}"
|
||||
rm -f "${CACHE_FILE}"
|
||||
echo "Getting Configs end - ${TAG}"
|
||||
else
|
||||
echo "Failed to get Configs"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Get latest Patches
|
||||
@@ -121,21 +134,19 @@ function getPatches() {
|
||||
local DEST_PATH="${1}"
|
||||
local CACHE_FILE="/tmp/patches.zip"
|
||||
rm -f "${CACHE_FILE}"
|
||||
TAG=$(curl -skL -H "Authorization: token ${TOKEN}" "https://api.github.com/repos/AuxXxilium/arc-patches/releases" | jq -r ".[].tag_name" | sort -rV | head -1)
|
||||
TAG="$(curl -s https://api.github.com/repos/AuxXxilium/arc-patches/releases/latest | grep -oP '"tag_name": "\K(.*)(?=")')"
|
||||
export PATCHTAG="${TAG}"
|
||||
while read -r ID NAME; do
|
||||
if [ "${NAME}" = "patches-${TAG}.zip" ]; then
|
||||
curl -kL -H "Authorization: token ${TOKEN}" -H "Accept: application/octet-stream" "https://api.github.com/repos/AuxXxilium/arc-patches/releases/assets/${ID}" -o "${CACHE_FILE}"
|
||||
# Unzip Patches
|
||||
rm -rf "${DEST_PATH}"
|
||||
mkdir -p "${DEST_PATH}"
|
||||
if unzip -o "${CACHE_FILE}" -d "${DEST_PATH}"; then
|
||||
rm -f "${CACHE_FILE}"
|
||||
echo "Getting Patches end - ${TAG}"
|
||||
break
|
||||
fi
|
||||
fi
|
||||
done < <(curl -skL -H "Authorization: token ${TOKEN}" "https://api.github.com/repos/AuxXxilium/arc-patches/releases/tags/${TAG}" | jq -r '.assets[] | "\(.id) \(.name)"')
|
||||
if curl -skL "https://github.com/AuxXxilium/arc-patches/releases/download/${TAG}/patches-${TAG}.zip" -o "${CACHE_FILE}"; then
|
||||
# Unzip Patches
|
||||
rm -rf "${DEST_PATH}"
|
||||
mkdir -p "${DEST_PATH}"
|
||||
unzip -o "${CACHE_FILE}" -d "${DEST_PATH}"
|
||||
rm -f "${CACHE_FILE}"
|
||||
echo "Getting Patches end - ${TAG}"
|
||||
else
|
||||
echo "Failed to get Patches"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Get latest Custom
|
||||
@@ -145,21 +156,19 @@ function getCustom() {
|
||||
local DEST_PATH="${1}"
|
||||
local CACHE_FILE="/tmp/custom.zip"
|
||||
rm -f "${CACHE_FILE}"
|
||||
TAG=$(curl -skL -H "Authorization: token ${TOKEN}" "https://api.github.com/repos/AuxXxilium/arc-custom/releases" | jq -r ".[].tag_name" | sort -rV | head -1)
|
||||
TAG="$(curl -s https://api.github.com/repos/AuxXxilium/arc-custom/releases/latest | grep -oP '"tag_name": "\K(.*)(?=")')"
|
||||
export CUSTOMTAG="${TAG}"
|
||||
while read -r ID NAME; do
|
||||
if [ "${NAME}" = "custom-${TAG}.zip" ]; then
|
||||
curl -kL -H "Authorization: token ${TOKEN}" -H "Accept: application/octet-stream" "https://api.github.com/repos/AuxXxilium/arc-custom/releases/assets/${ID}" -o "${CACHE_FILE}"
|
||||
# Unzip Custom
|
||||
rm -rf "${DEST_PATH}"
|
||||
mkdir -p "${DEST_PATH}"
|
||||
if unzip -o "${CACHE_FILE}" -d "${DEST_PATH}"; then
|
||||
rm -f "${CACHE_FILE}"
|
||||
echo "Getting Custom end - ${TAG}"
|
||||
break
|
||||
fi
|
||||
fi
|
||||
done < <(curl -skL -H "Authorization: token ${TOKEN}" "https://api.github.com/repos/AuxXxilium/arc-custom/releases/tags/${TAG}" | jq -r '.assets[] | "\(.id) \(.name)"')
|
||||
if curl -skL "https://github.com/AuxXxilium/arc-custom/releases/download/${TAG}/custom-${TAG}.zip" -o "${CACHE_FILE}"; then
|
||||
# Unzip Custom
|
||||
rm -rf "${DEST_PATH}"
|
||||
mkdir -p "${DEST_PATH}"
|
||||
unzip -o "${CACHE_FILE}" -d "${DEST_PATH}"
|
||||
rm -f "${CACHE_FILE}"
|
||||
echo "Getting Custom end - ${TAG}"
|
||||
else
|
||||
echo "Failed to get Custom"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Get latest Theme
|
||||
@@ -169,49 +178,72 @@ function getTheme() {
|
||||
local DEST_PATH="${1}"
|
||||
local CACHE_FILE="/tmp/theme.zip"
|
||||
rm -f "${CACHE_FILE}"
|
||||
TAG=$(curl -skL -H "Authorization: token ${TOKEN}" "https://api.github.com/repos/AuxXxilium/arc-theme/releases" | jq -r ".[].tag_name" | sort -rV | head -1)
|
||||
TAG="$(curl -s https://api.github.com/repos/AuxXxilium/arc-theme/releases/latest | grep -oP '"tag_name": "\K(.*)(?=")')"
|
||||
export THEMETAG="${TAG}"
|
||||
while read -r ID NAME; do
|
||||
if [ "${NAME}" = "arc-theme-${TAG}.zip" ]; then
|
||||
curl -kL -H "Authorization: token ${TOKEN}" -H "Accept: application/octet-stream" "https://api.github.com/repos/AuxXxilium/arc-theme/releases/assets/${ID}" -o "${CACHE_FILE}"
|
||||
# Unzip Theme
|
||||
mkdir -p "${DEST_PATH}"
|
||||
if unzip -o "${CACHE_FILE}" -d "${DEST_PATH}"; then
|
||||
rm -f "${CACHE_FILE}"
|
||||
echo "Getting Theme end - ${TAG}"
|
||||
break
|
||||
fi
|
||||
fi
|
||||
done < <(curl -skL -H "Authorization: token ${TOKEN}" "https://api.github.com/repos/AuxXxilium/arc-theme/releases/tags/${TAG}" | jq -r '.assets[] | "\(.id) \(.name)"')
|
||||
if curl -skL "https://github.com/AuxXxilium/arc-theme/releases/download/${TAG}/arc-theme-${TAG}.zip" -o "${CACHE_FILE}"; then
|
||||
# Unzip Theme
|
||||
mkdir -p "${DEST_PATH}"
|
||||
unzip -o "${CACHE_FILE}" -d "${DEST_PATH}"
|
||||
rm -f "${CACHE_FILE}"
|
||||
echo "Getting Theme end - ${TAG}"
|
||||
else
|
||||
echo "Failed to get Theme"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Get latest Buildroot
|
||||
# $1 type (min for S, ext for X, micro for M)
|
||||
# $2 path
|
||||
function getBuildroot() {
|
||||
local TYPE="${1}"
|
||||
local DEST_PATH="${2}"
|
||||
local REPO=""
|
||||
local ZIP_NAME=""
|
||||
local TAG_VAR=""
|
||||
local REPO="arc-buildroot-${TYPE}"
|
||||
# Get latest Buildroot-X
|
||||
# $1 path
|
||||
function getBuildrootx() {
|
||||
echo "Getting Buildroot-X begin"
|
||||
local DEST_PATH="${1}"
|
||||
|
||||
echo "Getting Buildroot-${TYPE} begin"
|
||||
TAG=$(curl -skL -H "Authorization: token ${TOKEN}" "https://api.github.com/repos/AuxXxilium/${REPO}/releases" | jq -r ".[].tag_name" | sort -rV | head -1)
|
||||
export BRTAG="${TAG}-${TYPE}"
|
||||
TAG="$(curl -s https://api.github.com/repos/AuxXxilium/arc-buildroot-x/releases/latest | grep -oP '"tag_name": "\K(.*)(?=")')"
|
||||
export BRXTAG="${TAG}"
|
||||
[ ! -d "${DEST_PATH}" ] && mkdir -p "${DEST_PATH}"
|
||||
echo "Getting Kernel"
|
||||
rm -f "${DEST_PATH}/bzImage-arc"
|
||||
if curl -skL "https://github.com/AuxXxilium/arc-buildroot-x/releases/download/${TAG}/bzImage" -o "${DEST_PATH}/bzImage-arc"; then
|
||||
echo "Kernel: ${TAG}"
|
||||
else
|
||||
echo "Failed to get Kernel"
|
||||
exit 1
|
||||
fi
|
||||
echo "Getting Ramdisk"
|
||||
rm -f "${DEST_PATH}/initrd-arc"
|
||||
while read -r ID NAME; do
|
||||
if [ "${NAME}" = "buildroot-${TAG}.zip" ]; then
|
||||
curl -kL -H "Authorization: token ${TOKEN}" -H "Accept: application/octet-stream" "https://api.github.com/repos/AuxXxilium/${REPO}/releases/assets/${ID}" -o "${DEST_PATH}/br.zip"
|
||||
echo "Buildroot: ${TAG}-${TYPE}"
|
||||
unzip -o "${DEST_PATH}/br.zip" -d "${DEST_PATH}"
|
||||
mv -f "${DEST_PATH}/bzImage" "${DEST_PATH}/bzImage-arc"
|
||||
mv -f "${DEST_PATH}/rootfs.cpio.zst" "${DEST_PATH}/initrd-arc"
|
||||
[ -f "${DEST_PATH}/bzImage-arc" ] && [ -f "${DEST_PATH}/initrd-arc" ] && break
|
||||
fi
|
||||
done < <(curl -skL -H "Authorization: token ${TOKEN}" "https://api.github.com/repos/AuxXxilium/${REPO}/releases/tags/${TAG}" | jq -r '.assets[] | "\(.id) \(.name)"')
|
||||
if curl -skL "https://github.com/AuxXxilium/arc-buildroot-x/releases/download/${TAG}/rootfs.cpio.xz" -o "${DEST_PATH}/initrd-arc"; then
|
||||
echo "Ramdisk: ${TAG}"
|
||||
else
|
||||
echo "Failed to get Ramdisk"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Get latest Buildroot-X
|
||||
# $1 path
|
||||
function getBuildroots() {
|
||||
echo "Getting Buildroot-S begin"
|
||||
local DEST_PATH="${1}"
|
||||
|
||||
TAG="$(curl -s https://api.github.com/repos/AuxXxilium/arc-buildroot-s/releases/latest | grep -oP '"tag_name": "\K(.*)(?=")')"
|
||||
export BRSTAG="${TAG}"
|
||||
[ ! -d "${DEST_PATH}" ] && mkdir -p "${DEST_PATH}"
|
||||
echo "Getting Kernel"
|
||||
rm -f "${DEST_PATH}/bzImage-arc"
|
||||
if curl -skL "https://github.com/AuxXxilium/arc-buildroot-s/releases/download/${TAG}/bzImage" -o "${DEST_PATH}/bzImage-arc"; then
|
||||
echo "Kernel: ${TAG}"
|
||||
else
|
||||
echo "Failed to get Kernel"
|
||||
exit 1
|
||||
fi
|
||||
echo "Getting Ramdisk"
|
||||
rm -f "${DEST_PATH}/initrd-arc"
|
||||
if curl -skL "https://github.com/AuxXxilium/arc-buildroot-s/releases/download/${TAG}/rootfs.cpio.xz" -o "${DEST_PATH}/initrd-arc"; then
|
||||
echo "Ramdisk: ${TAG}"
|
||||
else
|
||||
echo "Failed to get Ramdisk"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Get latest Offline
|
||||
@@ -231,116 +263,109 @@ function getOffline() {
|
||||
}
|
||||
|
||||
# repack initrd
|
||||
# $1 initrd file
|
||||
# $1 initrd file
|
||||
# $2 plugin path
|
||||
# $3 output file
|
||||
function repackInitrd() {
|
||||
local INITRD_FILE="${1}"
|
||||
local PLUGIN_PATH="${2}"
|
||||
local OUTPUT_PATH="${3:-${INITRD_FILE}}"
|
||||
INITRD_FILE="${1}"
|
||||
PLUGIN_PATH="${2}"
|
||||
OUTPUT_PATH="${3:-${INITRD_FILE}}"
|
||||
|
||||
[ -z "${INITRD_FILE}" ] || [ ! -f "${INITRD_FILE}" ] && exit 1
|
||||
[ -z "${PLUGIN_PATH}" ] || [ ! -d "${PLUGIN_PATH}" ] && exit 1
|
||||
|
||||
INITRD_FILE="$(readlink -f "${INITRD_FILE}")"
|
||||
PLUGIN_PATH="$(readlink -f "${PLUGIN_PATH}")"
|
||||
OUTPUT_PATH="$(readlink -f "${OUTPUT_PATH}")"
|
||||
|
||||
INITRD_FILE="$(realpath "${INITRD_FILE}")"
|
||||
PLUGIN_PATH="$(realpath "${PLUGIN_PATH}")"
|
||||
OUTPUT_PATH="$(realpath "${OUTPUT_PATH}")"
|
||||
|
||||
local RDXZ_PATH="rdxz_tmp"
|
||||
RDXZ_PATH="rdxz_tmp"
|
||||
mkdir -p "${RDXZ_PATH}"
|
||||
local INITRD_FORMAT=$(file -b --mime-type "${INITRD_FILE}")
|
||||
|
||||
case "${INITRD_FORMAT}" in
|
||||
*'x-cpio'*) (cd "${RDXZ_PATH}" && sudo cpio -idm <"${INITRD_FILE}") >/dev/null 2>&1 ;;
|
||||
*'x-xz'*) (cd "${RDXZ_PATH}" && xz -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
|
||||
*'x-lz4'*) (cd "${RDXZ_PATH}" && lz4 -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
|
||||
*'x-lzma'*) (cd "${RDXZ_PATH}" && lzma -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
|
||||
*'x-bzip2'*) (cd "${RDXZ_PATH}" && bzip2 -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
|
||||
*'gzip'*) (cd "${RDXZ_PATH}" && gzip -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
|
||||
*'zstd'*) (cd "${RDXZ_PATH}" && zstd -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
|
||||
*) ;;
|
||||
esac
|
||||
|
||||
(
|
||||
cd "${RDXZ_PATH}"
|
||||
sudo xz -dc <"${INITRD_FILE}" | sudo cpio -idm
|
||||
) || true
|
||||
sudo cp -rf "${PLUGIN_PATH}/"* "${RDXZ_PATH}/"
|
||||
[ -f "${OUTPUT_PATH}" ] && rm -rf "${OUTPUT_PATH}"
|
||||
|
||||
case "${INITRD_FORMAT}" in
|
||||
*'x-cpio'*) (cd "${RDXZ_PATH}" && sudo find . 2>/dev/null | sudo cpio -o -H newc -R root:root >"${OUTPUT_PATH}") >/dev/null 2>&1 ;;
|
||||
*'x-xz'*) (cd "${RDXZ_PATH}" && sudo find . 2>/dev/null | sudo cpio -o -H newc -R root:root | xz -9 -C crc32 -c - >"${OUTPUT_PATH}") >/dev/null 2>&1 ;;
|
||||
*'x-lz4'*) (cd "${RDXZ_PATH}" && sudo find . 2>/dev/null | sudo cpio -o -H newc -R root:root | lz4 -9 -l -c - >"${OUTPUT_PATH}") >/dev/null 2>&1 ;;
|
||||
*'x-lzma'*) (cd "${RDXZ_PATH}" && sudo find . 2>/dev/null | sudo cpio -o -H newc -R root:root | lzma -9 -c - >"${OUTPUT_PATH}") >/dev/null 2>&1 ;;
|
||||
*'x-bzip2'*) (cd "${RDXZ_PATH}" && sudo find . 2>/dev/null | sudo cpio -o -H newc -R root:root | bzip2 -9 -c - >"${OUTPUT_PATH}") >/dev/null 2>&1 ;;
|
||||
*'gzip'*) (cd "${RDXZ_PATH}" && sudo find . 2>/dev/null | sudo cpio -o -H newc -R root:root | gzip -9 -c - >"${OUTPUT_PATH}") >/dev/null 2>&1 ;;
|
||||
*'zstd'*) (cd "${RDXZ_PATH}" && sudo find . 2>/dev/null | sudo cpio -o -H newc -R root:root | zstd -19 -T0 -f -c - >"${OUTPUT_PATH}") >/dev/null 2>&1 ;;
|
||||
*) ;;
|
||||
esac
|
||||
(
|
||||
cd "${RDXZ_PATH}"
|
||||
sudo find . 2>/dev/null | sudo cpio -o -H newc -R root:root | xz -9 --check=crc32 >"${OUTPUT_PATH}"
|
||||
) || true
|
||||
sudo rm -rf "${RDXZ_PATH}"
|
||||
}
|
||||
|
||||
# resizeImg
|
||||
# resizeimg
|
||||
# $1 input file
|
||||
# $2 change size MB e.g., +50M -50M
|
||||
# $2 changsize MB eg: +50M -50M
|
||||
# $3 output file
|
||||
function resizeImg() {
|
||||
local INPUT_FILE="${1}"
|
||||
local CHANGE_SIZE="${2}"
|
||||
local OUTPUT_FILE="${3:-${INPUT_FILE}}"
|
||||
INPUT_FILE="${1}"
|
||||
CHANGE_SIZE="${2}"
|
||||
OUTPUT_FILE="${3:-${INPUT_FILE}}"
|
||||
|
||||
[[ -z "${INPUT_FILE}" || ! -f "${INPUT_FILE}" ]] && { echo "Input file not specified or does not exist"; exit 1; }
|
||||
[[ -z "${CHANGE_SIZE}" ]] && { echo "Change size not specified"; exit 1; }
|
||||
[[ -z "${INPUT_FILE}" || ! -f "${INPUT_FILE}" ]] && exit 1
|
||||
[ -z "${CHANGE_SIZE}" ] && exit 1
|
||||
|
||||
INPUT_FILE="$(realpath "${INPUT_FILE}")"
|
||||
OUTPUT_FILE="$(realpath "${OUTPUT_FILE}")"
|
||||
INPUT_FILE="$(readlink -f "${INPUT_FILE}")"
|
||||
OUTPUT_FILE="$(readlink -f "${OUTPUT_FILE}")"
|
||||
|
||||
local CURRENT_SIZE
|
||||
CURRENT_SIZE=$(du -m "${INPUT_FILE}" | awk '{print $1}')
|
||||
local SIZE
|
||||
SIZE=$((CURRENT_SIZE + ${CHANGE_SIZE//M/}))
|
||||
|
||||
[[ -z "${SIZE}" || "${SIZE}" -lt 0 ]] && { echo "Invalid size calculated"; exit 1; }
|
||||
SIZE=$(($(du -m "${INPUT_FILE}" | awk '{print $1}')$(echo "${CHANGE_SIZE}" | sed 's/M//g; s/b//g')))
|
||||
[[ -z "${SIZE}" || "${SIZE}" -lt 0 ]] && exit 1
|
||||
|
||||
if [[ "${INPUT_FILE}" != "${OUTPUT_FILE}" ]]; then
|
||||
if [ ! "${INPUT_FILE}" = "${OUTPUT_FILE}" ]; then
|
||||
sudo cp -f "${INPUT_FILE}" "${OUTPUT_FILE}"
|
||||
fi
|
||||
|
||||
sudo truncate -s "${SIZE}M" "${OUTPUT_FILE}"
|
||||
|
||||
# Use `parted` to resize partition 3
|
||||
sudo parted "${OUTPUT_FILE}" --script -- resizepart 3 "${SIZE}M"
|
||||
|
||||
local LOOPX
|
||||
sudo truncate -s ${SIZE}M "${OUTPUT_FILE}"
|
||||
echo -e "d\n\nn\n\n\n\n\nn\nw" | sudo fdisk "${OUTPUT_FILE}"
|
||||
LOOPX=$(sudo losetup -f)
|
||||
sudo losetup -P "${LOOPX}" "${OUTPUT_FILE}"
|
||||
local PARTITION
|
||||
PARTITION=$(ls "${LOOPX}p3")
|
||||
sudo e2fsck -fp "${PARTITION}"
|
||||
sudo tune2fs -l "${PARTITION}" | grep "Block size"
|
||||
sudo resize2fs "${PARTITION}"
|
||||
sudo losetup -d "${LOOPX}"
|
||||
sudo losetup -P ${LOOPX} "${OUTPUT_FILE}"
|
||||
sudo e2fsck -fp $(ls ${LOOPX}* | sort -n | tail -1)
|
||||
sudo resize2fs $(ls ${LOOPX}* | sort -n | tail -1)
|
||||
sudo losetup -d ${LOOPX}
|
||||
}
|
||||
|
||||
# createvmx
|
||||
# convertova
|
||||
# $1 bootloader file
|
||||
# $2 vmx name
|
||||
function createvmx() {
|
||||
# $2 ova file
|
||||
function convertova() {
|
||||
BLIMAGE=${1}
|
||||
VMNAME=${2}
|
||||
OVAPATH=${2}
|
||||
|
||||
BLIMAGE="$(readlink -f "${BLIMAGE}")"
|
||||
OVAPATH="$(readlink -f "${OVAPATH}")"
|
||||
VMNAME="$(basename "${OVAPATH}" .ova)"
|
||||
|
||||
# Download and install ovftool if it doesn't exist
|
||||
if [ ! -x ovftool/ovftool ]; then
|
||||
rm -rf ovftool ovftool.zip
|
||||
curl -skL https://github.com/rgl/ovftool-binaries/raw/main/archive/VMware-ovftool-4.6.0-21452615-lin.x86_64.zip -o ovftool.zip
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Failed to download ovftool"
|
||||
exit 1
|
||||
fi
|
||||
unzip ovftool.zip -d . >/dev/null 2>&1
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Failed to extract ovftool"
|
||||
exit 1
|
||||
fi
|
||||
chmod +x ovftool/ovftool
|
||||
fi
|
||||
if ! command -v qemu-img &>/dev/null; then
|
||||
sudo apt install -y qemu-utils
|
||||
fi
|
||||
|
||||
# Convert raw image to VMDK
|
||||
rm -rf "VMX_${VMNAME}"
|
||||
mkdir -p "VMX_${VMNAME}"
|
||||
qemu-img convert -O vmdk -o 'adapter_type=lsilogic,subformat=streamOptimized,compat6' "${BLIMAGE}" "VMX_${VMNAME}/${VMNAME}-disk1.vmdk"
|
||||
qemu-img create -f vmdk "VMX_${VMNAME}/${VMNAME}-disk2.vmdk" "32G"
|
||||
rm -rf "OVA_${VMNAME}"
|
||||
mkdir -p "OVA_${VMNAME}"
|
||||
qemu-img convert -O vmdk -o 'adapter_type=lsilogic,subformat=streamOptimized,compat6' "${BLIMAGE}" "OVA_${VMNAME}/${VMNAME}-disk1.vmdk"
|
||||
qemu-img create -f vmdk "OVA_${VMNAME}/${VMNAME}-disk2.vmdk" "32G"
|
||||
|
||||
# Create VM configuration
|
||||
cat <<_EOF_ >"VMX_${VMNAME}/${VMNAME}.vmx"
|
||||
cat <<_EOF_ >"OVA_${VMNAME}/${VMNAME}.vmx"
|
||||
.encoding = "UTF-8"
|
||||
config.version = "8"
|
||||
virtualHW.version = "17"
|
||||
virtualHW.version = "21"
|
||||
displayName = "${VMNAME}"
|
||||
annotation = "https://github.com/AuxXxilium/arc"
|
||||
guestOS = "ubuntu-64"
|
||||
@@ -388,108 +413,14 @@ ethernet0.virtualDev = "vmxnet3"
|
||||
ethernet0.connectionType = "nat"
|
||||
ethernet0.allowguestconnectioncontrol = "true"
|
||||
ethernet0.present = "TRUE"
|
||||
serial0.fileType = "file"
|
||||
serial0.fileName = "serial0.log"
|
||||
serial0.present = "TRUE"
|
||||
sata0.present = "TRUE"
|
||||
sata0:0.fileName = "${VMNAME}-disk1.vmdk"
|
||||
sata0:0.present = "TRUE"
|
||||
sata0:1.fileName = "${VMNAME}-disk2.vmdk"
|
||||
sata0:1.present = "TRUE"
|
||||
_EOF_
|
||||
}
|
||||
|
||||
# convertvmx
|
||||
# $1 bootloader file
|
||||
# $2 vmx file
|
||||
function convertvmx() {
|
||||
local BLIMAGE=${1}
|
||||
local VMXPATH=${2}
|
||||
|
||||
BLIMAGE="$(realpath "${BLIMAGE}")"
|
||||
VMXPATH="$(realpath "${VMXPATH}")"
|
||||
local VMNAME="$(basename "${VMXPATH}" .vmx)"
|
||||
|
||||
createvmx "${BLIMAGE}" "${VMNAME}"
|
||||
|
||||
rm -rf "${VMXPATH}"
|
||||
mv -f "VMX_${VMNAME}" "${VMXPATH}"
|
||||
}
|
||||
|
||||
# convertova
|
||||
# $1 bootloader file
|
||||
# $2 ova file
|
||||
function convertova() {
|
||||
local BLIMAGE=${1}
|
||||
local OVAPATH=${2}
|
||||
|
||||
BLIMAGE="$(realpath "${BLIMAGE}")"
|
||||
OVAPATH="$(realpath "${OVAPATH}")"
|
||||
local VMNAME="$(basename "${OVAPATH}" .ova)"
|
||||
|
||||
createvmx "${BLIMAGE}" "${VMNAME}"
|
||||
|
||||
# Download and install ovftool if it doesn't exist
|
||||
if [ ! -x ovftool/ovftool ]; then
|
||||
rm -rf ovftool ovftool.zip
|
||||
curl -skL https://github.com/rgl/ovftool-binaries/raw/main/archive/VMware-ovftool-4.6.0-21452615-lin.x86_64.zip -o ovftool.zip
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Failed to download ovftool"
|
||||
exit 1
|
||||
fi
|
||||
unzip ovftool.zip -d . >/dev/null 2>&1
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Failed to extract ovftool"
|
||||
exit 1
|
||||
fi
|
||||
chmod +x ovftool/ovftool
|
||||
fi
|
||||
|
||||
rm -f "${OVAPATH}"
|
||||
ovftool/ovftool "VMX_${VMNAME}/${VMNAME}.vmx" "${OVAPATH}"
|
||||
rm -rf "VMX_${VMNAME}"
|
||||
}
|
||||
|
||||
# createvmc
|
||||
# $1 vhd file
|
||||
# $2 vmc file
|
||||
function createvmc() {
|
||||
local BLIMAGE=${1:-arc.vhd}
|
||||
local VMCPATH=${2:-arc.vmc}
|
||||
|
||||
BLIMAGE="$(basename "${BLIMAGE}")"
|
||||
VMCPATH="$(realpath "${VMCPATH}")"
|
||||
|
||||
cat <<_EOF_ >"${VMCPATH}"
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<preferences>
|
||||
<version type="string">2.0</version>
|
||||
<hardware>
|
||||
<memory>
|
||||
<ram_size type="integer">4096</ram_size>
|
||||
</memory>
|
||||
<pci_bus>
|
||||
<ide_adapter>
|
||||
<ide_controller id="0">
|
||||
<location id="0">
|
||||
<drive_type type="integer">1</drive_type>
|
||||
<pathname>
|
||||
<relative type="string">${BLIMAGE}</relative>
|
||||
</pathname>
|
||||
</location>
|
||||
</ide_controller>
|
||||
</ide_adapter>
|
||||
</pci_bus>
|
||||
</hardware>
|
||||
</preferences>
|
||||
_EOF_
|
||||
}
|
||||
|
||||
# copy buildroot
|
||||
function copyBuildroot() {
|
||||
DEST_PATH="${1}"
|
||||
rm -rf "${DEST_PATH}"
|
||||
mkdir -p "${DEST_PATH}"
|
||||
cp -f "../${DEST_PATH}/bzImage" "${DEST_PATH}/bzImage-arc"
|
||||
cp -f "../${DEST_PATH}/rootfs.cpio.zst" "${DEST_PATH}/initrd-arc"
|
||||
ovftool/ovftool "OVA_${VMNAME}/${VMNAME}.vmx" "${OVAPATH}"
|
||||
rm -rf "OVA_${VMNAME}"
|
||||
}
|
||||
|
||||
@@ -29,7 +29,7 @@ done
|
||||
popd
|
||||
|
||||
rm -f grub.img
|
||||
dd if=/dev/zero of=grub.img bs=1M seek=1000 count=0
|
||||
dd if=/dev/zero of=grub.img bs=1M seek=1024 count=0
|
||||
echo -e "n\np\n1\n\n+50M\nn\np\n2\n\n+50M\nn\np\n3\n\n\na\n1\nw\nq\n" | fdisk grub.img
|
||||
fdisk -l grub.img
|
||||
|
||||
@@ -71,4 +71,4 @@ sudo umount ${LOOPX}p1
|
||||
sudo losetup -d ${LOOPX}
|
||||
sudo rm -rf ${NAME}1
|
||||
|
||||
gzip grub.img
|
||||
gzip grub.img
|
||||
Reference in New Issue
Block a user