├── .github └── workflows │ └── ci.yml ├── .gitignore ├── LICENSE ├── README.md ├── docker ├── Dockerfile ├── Dockerfile_test ├── build.sh └── sources.list ├── env ├── rk33xx.env ├── rk35xx.env ├── rpi4.env └── x86_64.env ├── files ├── all │ └── etc │ │ ├── config │ │ └── nginx │ │ └── nginx │ │ └── uci.conf.template ├── bcm2711 │ └── lib │ │ └── upgrade │ │ └── ota.sh ├── rk33xx │ └── lib │ │ └── upgrade │ │ └── ota.sh ├── rk35xx │ └── lib │ │ └── upgrade │ │ └── ota.sh └── x86_64 │ └── lib │ └── upgrade │ └── ota.sh ├── packages └── all │ └── luci-theme-argon_2.2.10.10_all.ipk ├── patches └── 001-all-profiles.patch ├── runmynas.sh └── src ├── multi.mk ├── release.mk ├── repositories_aarch64.conf ├── repositories_rk33xx.conf ├── repositories_rk35xx.conf ├── repositories_x86_64.conf ├── target_bcm2711.manifest ├── target_rk33xx.manifest ├── target_rk35xx.manifest └── target_x86_64.manifest /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: iStore Intl Builder 2 | 3 | on: 4 | workflow_dispatch: 5 | inputs: 6 | target: 7 | description: 'build target ["x86_64", "rk35xx", "rk33xx", "rpi4", "all"]' 8 | required: true 9 | default: 'all' 10 | env: 11 | TZ: Asia/Shanghai 12 | 13 | jobs: 14 | matrix: 15 | runs-on: ubuntu-latest 16 | outputs: 17 | matrix: ${{ steps.set-matrix.outputs.matrix }} 18 | steps: 19 | - name: Detect build target 20 | id: set-matrix 21 | env: 22 | MATRIX_TARGET: ${{ github.event.inputs.target }} 23 | run: | 24 | if [ "x${MATRIX_TARGET}" = "x" -o "x${MATRIX_TARGET}" = "xall" ]; then \ 25 | echo "matrix={\"target\":[\"x86_64\", \"rk35xx\", \"rk33xx\", \"rpi4\"]}" >> $GITHUB_OUTPUT; \ 26 | else \ 27 | targets=""; \ 28 | for target in ${MATRIX_TARGET}; do \ 29 | targets="$targets, \"$target\""; 30 | done; \ 31 | echo "matrix={\"target\":[${targets#, }]}" >> $GITHUB_OUTPUT; \ 32 | fi 33 | build: 34 | needs: matrix 35 | runs-on: ubuntu-latest 36 | name: iStore Intl for ${{ matrix.target }} 37 | strategy: 38 | matrix: ${{fromJson(needs.matrix.outputs.matrix)}} 39 | steps: 40 | - name: Checkout 41 | uses: actions/checkout@main 42 | with: 43 | fetch-depth: 1 44 | 45 | - name: Import Env 46 | env: 47 | MATRIX_TARGET: ${{ matrix.target }} 48 | run: cat env/${MATRIX_TARGET}.env >> "$GITHUB_ENV" 49 | 50 | - name: Initialization environment 51 | env: 52 | DEBIAN_FRONTEND: noninteractive 53 | run: | 54 | sudo -E apt-get -qq update 55 | sudo -E apt-get -qq install binutils bzip2 xz-utils unzip git wget patch device-tree-compiler 56 | sudo -E apt-get -qq clean 57 | sudo timedatectl set-timezone "$TZ" 58 | 59 | - name: Install ORAS 60 | env: 61 | VERSION: 1.1.0 62 | run: | 63 | wget -O /tmp/oras.tar.gz "https://github.com/oras-project/oras/releases/download/v${VERSION}/oras_${VERSION}_linux_amd64.tar.gz" 64 | mkdir -p /tmp/oras-install/ 65 | tar -zxf /tmp/oras.tar.gz -C /tmp/oras-install/ 66 | sudo mv /tmp/oras-install/oras /usr/local/bin/ 67 | rm -rf /tmp/oras.tar.gz /tmp/oras-install/ 68 | 69 | - name: Download IB 70 | run: | 71 | mkdir dl 72 | wget -O dl/${IB_NAME}.tar.xz ${IB_URL}${IB_NAME}.tar.xz 73 | wget -O dl/sha256sums ${IB_URL}sha256sums 74 | [ -s dl/sha256sums ] 75 | [ -s dl/${IB_NAME}.tar.xz ] 76 | grep -Fq ${IB_NAME}.tar.xz dl/sha256sums 77 | cd dl && sha256sum -c --ignore-missing --status sha256sums 78 | wget -O dl/${MF_NAME} ${IB_URL}${MF_NAME} 79 | 80 | - name: Unpack IB 81 | run: | 82 | mkdir ib 83 | tar -C ib --strip-components=1 -xJf dl/${IB_NAME}.tar.xz 84 | cp -a src/* ib/ 85 | ls patches/ | sort | xargs -n1 sh -c 'patch -p1 -d ib -i ../patches/$0' 86 | sed -i 's/ unofficial/ oversea/' ib/Makefile 87 | ls packages/all | cut -d "_" -f 1 | xargs -n1 sh -c 'rm ib/packages/$0*.ipk' 88 | cp packages/all/*.ipk ib/packages/ 89 | mkdir -p ib/files 90 | cp -a files/all/* ib/files 91 | cp dl/${MF_NAME} ib/target.manifest 92 | case ${IB_URL} in 93 | *x86*) 94 | cp src/repositories_x86_64.conf ib/repositories.conf 95 | cp src/target_x86_64.manifest ib/custom.manifest 96 | cp -a files/x86_64/* ib/files 97 | ;; 98 | *rk35xx*) 99 | cp src/repositories_rk35xx.conf ib/repositories.conf 100 | cp src/target_rk35xx.manifest ib/custom.manifest 101 | cp -a files/rk35xx/* ib/files 102 | ;; 103 | *rk33xx*) 104 | cp src/repositories_rk33xx.conf ib/repositories.conf 105 | cp src/target_rk33xx.manifest ib/custom.manifest 106 | cp -a files/rk33xx/* ib/files 107 | ;; 108 | *bcm2711*) 109 | cp src/repositories_aarch64.conf ib/repositories.conf 110 | cp src/target_bcm2711.manifest ib/custom.manifest 111 | cp -a files/bcm2711/* ib/files 112 | ;; 113 | esac 114 | 115 | - name: Build 116 | run: | 117 | cd ib && make -f multi.mk image_multi FILES="files" 118 | 119 | - name: Pack 120 | run: | 121 | cd ib 122 | make -f release.mk IB=1 123 | make -f multi.mk release_env >> "$GITHUB_ENV" 124 | 125 | - name: Compare manifest 126 | run: | 127 | cd ib 128 | diff ../dl/${MF_NAME} ${IB_BIN_DIR}/${MF_NAME} || true 129 | 130 | - name: Upload 131 | env: 132 | OCI_REGISTER: ghcr.io 133 | OCI_USERNAME: ${{ secrets.OCI_USERNAME }} 134 | OCI_PASSWORD: ${{ secrets.GITHUB_TOKEN }} 135 | OCI_PATH: ${{ secrets.OCI_PATH }} 136 | IMAGE_SOURCE: ${{ secrets.IMAGE_SOURCE }} 137 | run: | 138 | oras login -u ${OCI_USERNAME} -p ${OCI_PASSWORD} ${OCI_REGISTER} 139 | cd build 140 | for board in `ls ./`; do 141 | [ -s $board/version.index ] || continue 142 | img=$(head -1 $board/version.latest | sed -E 's/.*\((.+)\).*/\1/') 143 | ver=$(head -1 $board/version.index) 144 | echo "Uploading $board firmware..." 145 | oras push --annotation "org.istoreos.version=$ver" \ 146 | --annotation "org.opencontainers.image.source=${IMAGE_SOURCE}" \ 147 | --annotation "org.opencontainers.image.description=iStoreOS $ver for $board" \ 148 | ${OCI_REGISTER}/${OCI_PATH}/$board:latest \ 149 | ./$board/$img:application/vnd.istoreos.firmware 150 | done 151 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | build 2 | dl 3 | ib 4 | ib_x86_64 5 | ib_rk35xx 6 | ib_rk33xx 7 | 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Liangbin Lian 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # iStoreNAS 2 | 3 | Define a system base iStoreOS by yourself. 4 | 5 | ## usage 6 | 7 | * ./runmynas.sh x86_64 8 | * ./runmynas.sh rk35xx 9 | * ./runmynas.sh rk33xx 10 | 11 | 12 | -------------------------------------------------------------------------------- /docker/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM debian:buster 2 | 3 | COPY sources.list /etc/apt/sources.list 4 | 5 | RUN apt-get update &&\ 6 | apt-get install -y \ 7 | sudo time git-core build-essential g++ bash make \ 8 | libssl-dev patch libncurses5 libncurses5-dev zlib1g-dev gawk \ 9 | flex gettext wget unzip bzip2 xz-utils device-tree-compiler rsync curl python3 python3-distutils-extra python3-setuptools \ 10 | libsnmp-dev liblzma-dev libpam0g-dev cpio rsync gcc-multilib && \ 11 | apt-get clean && \ 12 | useradd -m builder && \ 13 | echo 'builder ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/builder 14 | 15 | # set system wide dummy git config 16 | RUN git config --system user.name "builder" && git config --system user.email "builder@example.com" 17 | 18 | USER builder 19 | 20 | VOLUME /work 21 | VOLUME /work/ib 22 | 23 | ENV WORK_SOURCE=/work 24 | ENV WORK_TARGET=x86_64 25 | 26 | COPY build.sh /bin/build.sh 27 | 28 | WORKDIR /work 29 | 30 | ENTRYPOINT [ "/bin/build.sh" ] 31 | 32 | -------------------------------------------------------------------------------- /docker/Dockerfile_test: -------------------------------------------------------------------------------- 1 | FROM ibuilder2:0.9 2 | 3 | USER builder 4 | 5 | VOLUME /work 6 | VOLUME /work/ib 7 | 8 | ENV WORK_SOURCE=/work 9 | ENV WORK_TARGET=x86_64 10 | 11 | COPY build.sh /bin/build.sh 12 | 13 | WORKDIR /work 14 | 15 | ENTRYPOINT [ "/bin/build.sh" ] 16 | 17 | -------------------------------------------------------------------------------- /docker/build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | case ${WORK_TARGET} in 4 | x86_64) 5 | ;; 6 | rk35xx) 7 | ;; 8 | rk33xx) 9 | ;; 10 | *) 11 | echo "not supported" 12 | exit 1 13 | ;; 14 | esac 15 | 16 | source env/${WORK_TARGET}.env 17 | 18 | IB_FOUND=0 19 | if grep -q istore_nas ib/repositories.conf; then 20 | IB_FOUND=1 21 | else 22 | IB_FOUND=0 23 | fi 24 | 25 | set -e 26 | if [ "$IB_FOUND" = "0" ]; then 27 | if [ ! -f dl/${IB_NAME}.tar.xz ]; then 28 | wget -O dl/${MF_NAME} ${IB_URL}${MF_NAME} 29 | wget -O dl/${IB_NAME}.tar.xz ${IB_URL}${IB_NAME}.tar.xz 30 | wget -O dl/sha256sums ${IB_URL}sha256sums 31 | [ -s dl/sha256sums ] 32 | [ -s dl/${MF_NAME} ] 33 | [ -s dl/${IB_NAME}.tar.xz ] 34 | grep -Fq ${IB_NAME}.tar.xz dl/sha256sums 35 | cd dl && sha256sum -c --ignore-missing --status sha256sums 36 | fi 37 | 38 | cd ${WORK_SOURCE} 39 | tar -C ib --strip-components=1 -xJf dl/${IB_NAME}.tar.xz 40 | cp -a src/* ib/ 41 | ls patches/ | sort | xargs -n1 sh -c 'patch -p1 -d ib -i ../patches/$0' 42 | sed -i 's/ unofficial/ oversea/' ib/Makefile 43 | ls packages/all | cut -d "_" -f 1 | xargs -n1 sh -c 'rm ib/packages/$0*.ipk' 44 | cp packages/all/*.ipk ib/packages/ 45 | mkdir -p ib/files 46 | cp -a files/all/* ib/files 47 | cp dl/${MF_NAME} ib/target.manifest 48 | case ${WORK_TARGET} in 49 | *x86*) 50 | cp src/repositories_x86_64.conf ib/repositories.conf 51 | cp src/target_x86_64.manifest ib/custom.manifest 52 | cp -a files/x86_64/* ib/files 53 | ;; 54 | *rk35xx*) 55 | cp src/repositories_rk35xx.conf ib/repositories.conf 56 | cp src/target_rk35xx.manifest ib/custom.manifest 57 | cp -a files/rk35xx/* ib/files 58 | ;; 59 | *rk33xx*) 60 | cp src/repositories_rk33xx.conf ib/repositories.conf 61 | cp src/target_rk33xx.manifest ib/custom.manifest 62 | cp -a files/rk33xx/* ib/files 63 | ;; 64 | *bcm2711*) 65 | cp src/repositories_aarch64.conf ib/repositories.conf 66 | cp src/target_bcm2711.manifest ib/custom.manifest 67 | cp -a files/bcm2711/* ib/files 68 | ;; 69 | esac 70 | fi 71 | set +e 72 | 73 | cd ${WORK_SOURCE}/ib 74 | 75 | case $1 in 76 | Pack) 77 | make -f release.mk IB=1 78 | make -f multi.mk release_env 79 | ;; 80 | *) 81 | make -f multi.mk image_multi FILES="files" 82 | ;; 83 | esac 84 | 85 | -------------------------------------------------------------------------------- /docker/sources.list: -------------------------------------------------------------------------------- 1 | deb http://mirrors.aliyun.com/debian/ buster main non-free contrib 2 | #deb-src http://mirrors.aliyun.com/debian/ buster main non-free contrib 3 | deb http://mirrors.aliyun.com/debian-security buster/updates main 4 | #deb-src http://mirrors.aliyun.com/debian-security buster/updates main 5 | deb http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib 6 | #deb-src http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib 7 | #deb http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib 8 | #deb-src http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib 9 | 10 | -------------------------------------------------------------------------------- /env/rk33xx.env: -------------------------------------------------------------------------------- 1 | IB_NAME=istoreos-imagebuilder-rockchip-armv8.Linux-x86_64 2 | MF_NAME=istoreos-rockchip-armv8.manifest 3 | IB_URL=https://fw.koolcenter.com/iStoreOS/ib/rk33xx/ 4 | -------------------------------------------------------------------------------- /env/rk35xx.env: -------------------------------------------------------------------------------- 1 | IB_NAME=istoreos-imagebuilder-rockchip-rk35xx.Linux-x86_64 2 | MF_NAME=istoreos-rockchip-rk35xx.manifest 3 | IB_URL=https://fw.koolcenter.com/iStoreOS/ib/rk35xx/ 4 | -------------------------------------------------------------------------------- /env/rpi4.env: -------------------------------------------------------------------------------- 1 | IB_NAME=istoreos-imagebuilder-bcm27xx-bcm2711.Linux-x86_64 2 | MF_NAME=istoreos-bcm27xx-bcm2711-rpi-4.manifest 3 | IB_URL=https://fw.koolcenter.com/iStoreOS/ib/bcm2711/ 4 | -------------------------------------------------------------------------------- /env/x86_64.env: -------------------------------------------------------------------------------- 1 | IB_NAME=istoreos-imagebuilder-x86-64.Linux-x86_64 2 | MF_NAME=istoreos-x86-64-generic.manifest 3 | IB_URL=https://fw.koolcenter.com/iStoreOS/ib/x86_64/ 4 | -------------------------------------------------------------------------------- /files/all/etc/config/nginx: -------------------------------------------------------------------------------- 1 | 2 | config main global 3 | option uci_enable 'true' 4 | 5 | config server '_lan' 6 | list listen '443 ssl default_server' 7 | list listen '[::]:443 ssl default_server' 8 | option server_name '_lan' 9 | list include 'restrict_locally' 10 | list include 'conf.d/*.locations' 11 | option uci_manage_ssl 'self-signed' 12 | option ssl_certificate '/etc/nginx/conf.d/_lan.crt' 13 | option ssl_certificate_key '/etc/nginx/conf.d/_lan.key' 14 | option ssl_session_cache 'shared:SSL:32k' 15 | option ssl_session_timeout '64m' 16 | option access_log 'off; # logd openwrt' 17 | 18 | config server '_lan80' 19 | list listen '80' 20 | list listen '[::]:80' 21 | option server_name '_lan80' 22 | list include 'restrict_locally' 23 | list include 'conf.d/*.locations' 24 | option access_log 'off; # logd openwrt' -------------------------------------------------------------------------------- /files/all/etc/nginx/uci.conf.template: -------------------------------------------------------------------------------- 1 | # Consider using UCI or creating files in /etc/nginx/conf.d/ for configuration. 2 | # Parsing UCI configuration is skipped if uci set nginx.global.uci_enable=false 3 | # For details see: https://openwrt.org/docs/guide-user/services/webserver/nginx 4 | 5 | worker_processes auto; 6 | 7 | user root; 8 | 9 | events {} 10 | 11 | http { 12 | access_log off; 13 | log_format openwrt 14 | '$request_method $scheme://$host$request_uri => $status' 15 | ' (${body_bytes_sent}B in ${request_time}s) <- $http_referer'; 16 | 17 | include mime.types; 18 | default_type application/octet-stream; 19 | sendfile on; 20 | 21 | proxy_request_buffering off; 22 | proxy_http_version 1.1; 23 | client_max_body_size 0; 24 | large_client_header_buffers 4 32k; 25 | 26 | gzip on; 27 | gzip_vary on; 28 | gzip_proxied any; 29 | 30 | root /www; 31 | 32 | #UCI_HTTP_CONFIG 33 | include conf.d/*.conf; 34 | } 35 | -------------------------------------------------------------------------------- /files/bcm2711/lib/upgrade/ota.sh: -------------------------------------------------------------------------------- 1 | 2 | type 'board_name' >/dev/null 2>/dev/null || . /lib/functions.sh 3 | 4 | export_ota_url() { 5 | local board="$(board_name)" 6 | case "$board" in 7 | raspberrypi,400 |\ 8 | raspberrypi,4-compute-module |\ 9 | raspberrypi,4-model-b) 10 | export -n OTA_URL_BASE="https://fw0.koolcenter.com/iStoreNAS/rpi4" 11 | ;; 12 | *) 13 | return 1 14 | ;; 15 | esac 16 | } 17 | -------------------------------------------------------------------------------- /files/rk33xx/lib/upgrade/ota.sh: -------------------------------------------------------------------------------- 1 | 2 | type 'board_name' >/dev/null 2>/dev/null || . /lib/functions.sh 3 | 4 | export_ota_url() { 5 | local board="$(board_name)" 6 | case "$board" in 7 | friendlyarm,nanopi-r2s|\ 8 | friendlyarm,nanopi-r4s|\ 9 | friendlyarm,nanopi-r4se) 10 | export -n OTA_URL_BASE="https://fw0.koolcenter.com/iStoreNAS/${board##*-}" 11 | ;; 12 | *) 13 | return 1 14 | ;; 15 | esac 16 | } 17 | -------------------------------------------------------------------------------- /files/rk35xx/lib/upgrade/ota.sh: -------------------------------------------------------------------------------- 1 | 2 | type 'board_name' >/dev/null 2>/dev/null || . /lib/functions.sh 3 | 4 | export_ota_url() { 5 | local board="$(board_name)" 6 | case "$board" in 7 | hlink,h28k|\ 8 | radxa,e20c|\ 9 | lyt,t68m|\ 10 | easepi,ars4) 11 | export -n OTA_URL_BASE="https://fw0.koolcenter.com/iStoreNAS/${board##*,}" 12 | ;; 13 | fastrhino,r66s|\ 14 | fastrhino,r68s) 15 | export -n OTA_URL_BASE="https://fw0.koolcenter.com/iStoreNAS/r6xs" 16 | ;; 17 | friendlyelec,nanopi-r5c|\ 18 | friendlyelec,nanopi-r5s-c1|\ 19 | friendlyelec,nanopi-r5s) 20 | export -n OTA_URL_BASE="https://fw0.koolcenter.com/iStoreNAS/r5s" 21 | ;; 22 | friendlyelec,nanopi-r6s|\ 23 | friendlyelec,nanopi-r6c) 24 | export -n OTA_URL_BASE="https://fw0.koolcenter.com/iStoreNAS/r6s" 25 | ;; 26 | firefly,rk3568-roc-pc) 27 | export -n OTA_URL_BASE="https://fw0.koolcenter.com/iStoreNAS/station-p2" 28 | ;; 29 | hinlink,opc-h66k|\ 30 | hinlink,opc-h68k|\ 31 | hinlink,opc-h69k) 32 | export -n OTA_URL_BASE="https://fw0.koolcenter.com/iStoreNAS/h6xk" 33 | ;; 34 | hinlink,h88k-*|\ 35 | hinlink,h88k) 36 | export -n OTA_URL_BASE="https://fw0.koolcenter.com/iStoreNAS/h88k" 37 | ;; 38 | *) 39 | return 1 40 | ;; 41 | esac 42 | } 43 | -------------------------------------------------------------------------------- /files/x86_64/lib/upgrade/ota.sh: -------------------------------------------------------------------------------- 1 | 2 | export_ota_url() { 3 | local partition_type=$(. /lib/upgrade/common.sh; export_bootdevice && export_partdevice diskdev 0 || exit 0; blkid -o value -s PTTYPE /dev/$diskdev) 4 | case "$partition_type" in 5 | "gpt") 6 | export -n OTA_URL_BASE="https://fw0.koolcenter.com/iStoreNAS/x86_64_efi" 7 | ;; 8 | "dos") 9 | export -n OTA_URL_BASE="https://fw0.koolcenter.com/iStoreNAS/x86_64" 10 | ;; 11 | *) 12 | return 1 13 | ;; 14 | esac 15 | } 16 | -------------------------------------------------------------------------------- /packages/all/luci-theme-argon_2.2.10.10_all.ipk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkease/iStoreNAS/1c8197f3054aaeccd5e2d582376f4f174576ebfc/packages/all/luci-theme-argon_2.2.10.10_all.ipk -------------------------------------------------------------------------------- /patches/001-all-profiles.patch: -------------------------------------------------------------------------------- 1 | diff --git a/include/image.mk b/include/image.mk 2 | index ba1bd3c03f..16a7b0a443 100644 3 | --- a/include/image.mk 4 | +++ b/include/image.mk 5 | @@ -438,10 +438,11 @@ define Device/Export 6 | $(1) : FILESYSTEM:=$(2) 7 | endef 8 | 9 | +DEVICE_CHECK_PROFILE = $(CONFIG_TARGET_$(if $(CONFIG_TARGET_MULTI_PROFILE),DEVICE_)$(call target_conf,$(BOARD)$(if $(SUBTARGET),_$(SUBTARGET)))_$(1)) 10 | ifdef IB 11 | +ifneq ($(PROFILE),) 12 | DEVICE_CHECK_PROFILE = $(filter $(1),DEVICE_$(PROFILE) $(PROFILE)) 13 | -else 14 | - DEVICE_CHECK_PROFILE = $(CONFIG_TARGET_$(if $(CONFIG_TARGET_MULTI_PROFILE),DEVICE_)$(call target_conf,$(BOARD)$(if $(SUBTARGET),_$(SUBTARGET)))_$(1)) 15 | +endif 16 | endif 17 | 18 | DEVICE_EXTRA_PACKAGES = $(call qstrip,$(CONFIG_TARGET_DEVICE_PACKAGES_$(call target_conf,$(BOARD)$(if $(SUBTARGET),_$(SUBTARGET)))_DEVICE_$(1))) 19 | -------------------------------------------------------------------------------- /runmynas.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | TARGET=$1 4 | case ${TARGET} in 5 | x86_64) 6 | ;; 7 | rk35xx) 8 | ;; 9 | rk33xx) 10 | ;; 11 | *) 12 | echo "Please choose target: x86_64 or rk35xx or rk33xx" 13 | exit 1 14 | ;; 15 | esac 16 | 17 | 18 | CURR=`pwd` 19 | mkdir -p dl 20 | mkdir -p ${CURR}/ib_${TARGET} 21 | 22 | if [ "$PACK" = "1" ]; then 23 | docker run -it --rm -u $(id -u):$(id -g) \ 24 | -v ${CURR}:/work \ 25 | -v ${CURR}/ib_${TARGET}:/work/ib \ 26 | -e WORK_TARGET=${TARGET} \ 27 | linkease/runmynas:latest Pack 28 | else 29 | docker run -it --rm -u $(id -u):$(id -g) \ 30 | -v ${CURR}:/work \ 31 | -v ${CURR}/ib_${TARGET}:/work/ib \ 32 | -e WORK_TARGET=${TARGET} \ 33 | linkease/runmynas:latest 34 | fi 35 | 36 | -------------------------------------------------------------------------------- /src/multi.mk: -------------------------------------------------------------------------------- 1 | # build image as .config 2 | # make -f multi.mk image_multi 3 | # by jjm2473@gmail.com 4 | 5 | include Makefile 6 | 7 | package_install_multi: FORCE 8 | @echo 9 | @echo Installing manifest packages... 10 | $(OPKG) install $(firstword $(wildcard $(LINUX_DIR)/libc_*.ipk $(PACKAGE_DIR)/libc_*.ipk)) 11 | $(OPKG) install $(firstword $(wildcard $(LINUX_DIR)/kernel_*.ipk $(PACKAGE_DIR)/kernel_*.ipk)) 12 | cut -d' ' -f1 target.manifest >$(TMP_DIR)/opkg_install_list 13 | rm -f $(TMP_DIR)/opkg_add_list $(TMP_DIR)/opkg_remove_list 14 | if [ -s custom.manifest ]; then \ 15 | grep '^-' custom.manifest | sed 's/^- *//g' >$(TMP_DIR)/opkg_remove_list; \ 16 | grep -v '^-' custom.manifest >$(TMP_DIR)/opkg_add_list; \ 17 | fi 18 | @echo Installing base packages... 19 | if grep -Eq '^src +imagebuilder +file:packages$$' repositories.conf; then \ 20 | echo 'src imagebuilder file:packages' >$(TMP_DIR)/base_repositories.conf; \ 21 | grep '^option ' repositories.conf >>$(TMP_DIR)/base_repositories.conf; \ 22 | $(OPKG) -f $(TMP_DIR)/base_repositories.conf install --nodeps $$(cat $(TMP_DIR)/opkg_install_list); \ 23 | else \ 24 | $(OPKG) install --nodeps $$(cat $(TMP_DIR)/opkg_install_list); \ 25 | fi 26 | if [ -s $(TMP_DIR)/opkg_remove_list ]; then \ 27 | echo "Removing custom packages..."; \ 28 | $(OPKG) remove --force-removal-of-dependent-packages $$(cat $(TMP_DIR)/opkg_remove_list); \ 29 | fi 30 | if [ -s $(TMP_DIR)/opkg_add_list ]; then \ 31 | echo "Installing custom packages..."; \ 32 | $(OPKG) install $$(cat $(TMP_DIR)/opkg_add_list); \ 33 | fi 34 | 35 | build_image_multi: FORCE 36 | @echo 37 | @echo Building multi images... 38 | $(NO_TRACE_MAKE) -C target/linux/$(BOARD)/image install TARGET_BUILD=1 IB=1 EXTRA_IMAGE_NAME="$(EXTRA_IMAGE_NAME)" 39 | 40 | _call_image_multi: staging_dir/host/.prereq-build 41 | echo 'Building images for $(BOARD)' 42 | echo 43 | rm -rf $(TARGET_DIR) $(TARGET_DIR_ORIG) 44 | mkdir -p $(TARGET_DIR) $(BIN_DIR) $(TMP_DIR) $(DL_DIR) 45 | $(MAKE) package_reload 46 | $(MAKE) -f multi.mk package_install_multi 47 | $(MAKE) -s prepare_rootfs 48 | $(MAKE) -f multi.mk build_image_multi 49 | $(MAKE) -s checksum 50 | 51 | image_multi: 52 | $(MAKE) -s _check_profile 53 | $(MAKE) -s _check_keys 54 | (unset PROFILE FILES PACKAGES MAKEFLAGS; \ 55 | $(MAKE) -f multi.mk -s _call_image_multi \ 56 | $(if $(FILES),USER_FILES="$(FILES)") ) 57 | 58 | profiles_multi: 59 | @$(STAGING_DIR_HOST)/bin/sed -n 's/^CONFIG_TARGET_$(if $(CONFIG_TARGET_MULTI_PROFILE),DEVICE_)$(call target_conf,$(BOARD)$(if $(SUBTARGET),_$(SUBTARGET)))_\(.*\)=y/\1/p' .config 60 | 61 | release_env: 62 | @echo "IB_BIN_DIR=$(BIN_DIR)" 63 | @echo "IB_OS_RELEASE=$(VERSION_DIST_SANITIZED)-$(VERSION_NUMBER)-$(VERSION_CODE)" 64 | -------------------------------------------------------------------------------- /src/release.mk: -------------------------------------------------------------------------------- 1 | 2 | CUR_MAKEFILE:=$(filter-out Makefile,$(firstword $(MAKEFILE_LIST))) 3 | SUBMAKE:=make $(if $(CUR_MAKEFILE),-f $(CUR_MAKEFILE)) 4 | 5 | ifneq ($(BUILD),) 6 | 7 | include $(TOPDIR)/rules.mk 8 | REVISION:=$(shell $(TOPDIR)/scripts/getver.sh) 9 | SOURCE_DATE_EPOCH:=$(shell $(TOPDIR)/scripts/get_source_date_epoch.sh) 10 | include $(INCLUDE_DIR)/image.mk 11 | 12 | all: $(BOARD)$(if $(SUBTARGET),-$(SUBTARGET))$(if $(PROFILE_SANITIZED),-$(PROFILE_SANITIZED)) 13 | 14 | define IMAGE/TARGET 15 | 16 | FIRMWARE_BASE_NAME:=$(patsubst %.img,%,$(patsubst %.gz,%,$(3))) 17 | 18 | $(1)/$(2)/version.index: $(1)/$(2)/$$(FIRMWARE_BASE_NAME).yaml 19 | echo "$(VERSION_NUMBER)-$(VERSION_CODE)" > $$@ 20 | 21 | $(1)/$(2)/$$(FIRMWARE_BASE_NAME).yaml: $(1)/$(2)/version.latest 22 | echo "filename: $(3)" > $$@ 23 | echo "path: /iStoreOS/$(2)/" >> $$@ 24 | head -3 $(1)/$(2)/version.latest | tail -2 | tr 'A-Z' 'a-z' >> $$@ 25 | echo "device: $(2)" >> $$@ 26 | echo "version: $(VERSION_NUMBER)" >> $$@ 27 | echo "release: $(VERSION_CODE)" >> $$@ 28 | TZ='CST-8' date +'date: %F %T' -r '$(1)/$(2)/$(3)' >> $$@ 29 | echo "type: istoreos" >> $$@ 30 | 31 | $(1)/$(2)/version.latest: $(1)/$(2)/$(3) 32 | echo "[$(3)]($(3))" > $$@; \ 33 | FIRMWARE_SHA256=`sha256sum $(1)/$(2)/$(3) | cut -d' ' -f1`; \ 34 | echo "SHA256: $$$${FIRMWARE_SHA256}" >> $$@ ; \ 35 | FIRMWARE_MD5=`md5sum $(1)/$(2)/$(3)| cut -d' ' -f1`; \ 36 | echo "MD5: $$$${FIRMWARE_MD5}" >> $$@ 37 | 38 | $(1)/$(2)/$(3): $(BIN_DIR)/$(if $(4),$(4),$(3)) 39 | mkdir -p $(1)/$(2) 40 | ifeq ($(IB),) 41 | $(CP) $(BIN_DIR)/feeds.buildinfo $(1)/$(2)/ 42 | $(CP) $(BIN_DIR)/config.buildinfo $(1)/$(2)/ 43 | git log -n 1 --format="%h" > $(1)/$(2)/commit.buildinfo 44 | $(CP) ./feeds.conf $(1)/$(2)/ 45 | ./scripts/diffconfig.sh > $(1)/$(2)/config.seed 46 | endif # !IB 47 | $(CP) $$< $$@ 48 | 49 | endef 50 | 51 | define IMAGE/BUILDER 52 | 53 | $(1)/$(2)/$(3).tar.xz: $(BIN_DIR)/$(3).tar.xz 54 | mkdir -p $(1)/$(2) 55 | $(CP) $$< $$@ 56 | 57 | $(1)/$(2)/$(4): $(BIN_DIR)/$(4) 58 | mkdir -p $(1)/$(2) 59 | $(CP) $$< $$@ 60 | 61 | $(1)/$(2)/sha256sums: $(1)/$(2)/$(3).tar.xz $(1)/$(2)/$(4) 62 | @$$(call sha256sums,$(1)/$(2)) 63 | 64 | endef 65 | 66 | DIST_DIR:=../build 67 | 68 | COMMON/IMAGE=$(call IMAGE/TARGET,$(DIST_DIR),$(2),$(VERSION_DIST_SANITIZED)-$(VERSION_NUMBER)-$(VERSION_CODE)-$(1)-$(2)-squashfs.img.gz,$(IMG_PREFIX)$(if $(PROFILE_SANITIZED),-$(PROFILE_SANITIZED))-squashfs-sysupgrade.img.gz) 69 | 70 | COMMON/MULTI_DEVICES=$(call IMAGE/TARGET,$(DIST_DIR),$(if $(3),$(3),$(2)),$(VERSION_DIST_SANITIZED)-$(VERSION_NUMBER)-$(VERSION_CODE)-$(if $(3),$(3),$(2))-squashfs.img.gz,$(IMG_PREFIX)-$(1)_$(2)-squashfs-sysupgrade.img.gz) 71 | 72 | COMMON/COMBINED_DEVICE=$(call IMAGE/TARGET,$(DIST_DIR),$(if $(3),$(3),$(2)),$(VERSION_DIST_SANITIZED)-$(VERSION_NUMBER)-$(VERSION_CODE)-$(if $(3),$(3),$(2))-squashfs-combined.img.gz,$(IMG_PREFIX)-$(1)_$(2)-squashfs-combined.img.gz) 73 | 74 | HOST_OS:=$(shell uname) 75 | HOST_ARCH:=$(shell uname -m) 76 | IB_DIR:=$(DIST_DIR)/ib 77 | IB_NAME:=$(VERSION_DIST_SANITIZED)-imagebuilder-$(if $(CONFIG_VERSION_FILENAMES),$(VERSION_NUMBER)-)$(BOARD)$(if $(SUBTARGET),-$(SUBTARGET)).$(HOST_OS)-$(HOST_ARCH) 78 | MF_NAME:=$(IMG_PREFIX)$(if $(PROFILE_SANITIZED),-$(PROFILE_SANITIZED)).manifest 79 | 80 | COMMON/BUILDER=$(call IMAGE/BUILDER,$(IB_DIR),$(1),$(IB_NAME),$(MF_NAME)) 81 | 82 | ifeq ($(BOARD), x86) 83 | X86_64_DIR:=$(DIST_DIR)/x86_64 84 | X86_64_IMG_PREFIX:=$(VERSION_DIST_SANITIZED)-$(VERSION_NUMBER)-$(VERSION_CODE)-x86-64-squashfs-combined 85 | X86_64_SRC_PREFIX:=$(IMG_PREFIX)$(if $(PROFILE_SANITIZED),-$(PROFILE_SANITIZED))-squashfs-combined 86 | 87 | X86_64/IMAGE=$(call IMAGE/TARGET,$(DIST_DIR),x86_64$(if $(1),_$(1)),$(X86_64_IMG_PREFIX)$(if $(1),-$(1)).img.gz,$(X86_64_SRC_PREFIX)$(if $(1),-$(1)).img.gz) 88 | 89 | $(eval $(call X86_64/IMAGE,)) 90 | $(eval $(call X86_64/IMAGE,efi)) 91 | $(eval $(call COMMON/BUILDER,x86_64)) 92 | 93 | x86-64-generic: $(X86_64_DIR)/version.index $(X86_64_DIR)_efi/version.index \ 94 | $(if $(IB),,$(IB_DIR)/x86_64/sha256sums) 95 | endif 96 | 97 | ifeq ($(BOARD), rockchip) 98 | ifeq ($(SUBTARGET), armv8) 99 | ifneq ($(PROFILE_SANITIZED),) 100 | $(eval $(call COMMON/IMAGE,nanopi,r2s)) 101 | 102 | rockchip-armv8-friendlyarm_nanopi-r2s: $(DIST_DIR)/r2s/version.index 103 | 104 | $(eval $(call COMMON/IMAGE,nanopi,r4s)) 105 | 106 | rockchip-armv8-friendlyarm_nanopi-r4s: $(DIST_DIR)/r4s/version.index 107 | else # !PROFILE_SANITIZED 108 | 109 | $(eval $(call COMMON/MULTI_DEVICES,friendlyarm,nanopi-r2s,r2s)) 110 | $(eval $(call COMMON/MULTI_DEVICES,friendlyarm,nanopi-r4s,r4s)) 111 | $(eval $(call COMMON/MULTI_DEVICES,friendlyarm,nanopi-r4se,r4se)) 112 | 113 | $(eval $(call COMMON/BUILDER,rk33xx)) 114 | 115 | rockchip-armv8: $(DIST_DIR)/r2s/version.index $(DIST_DIR)/r4s/version.index $(DIST_DIR)/r4se/version.index \ 116 | $(if $(IB),,$(IB_DIR)/rk33xx/sha256sums) 117 | 118 | endif # PROFILE_SANITIZED 119 | endif # armv8 120 | 121 | ifeq ($(SUBTARGET), rk35xx) 122 | $(eval $(call COMMON/COMBINED_DEVICE,fastrhino,r6xs)) 123 | $(eval $(call COMMON/COMBINED_DEVICE,friendlyarm,nanopi-r5s,r5s)) 124 | $(eval $(call COMMON/COMBINED_DEVICE,friendlyarm,nanopi-r6s,r6s)) 125 | $(eval $(call COMMON/MULTI_DEVICES,firefly,station-p2)) 126 | $(eval $(call COMMON/MULTI_DEVICES,lyt,t68m)) 127 | $(eval $(call COMMON/COMBINED_DEVICE,hinlink,opc-h6xk,h6xk)) 128 | $(eval $(call COMMON/COMBINED_DEVICE,hinlink,h88k)) 129 | $(eval $(call COMMON/MULTI_DEVICES,hlink,h28k)) 130 | $(eval $(call COMMON/BUILDER,rk35xx)) 131 | rockchip-rk35xx: $(DIST_DIR)/r6xs/version.index \ 132 | $(DIST_DIR)/r5s/version.index $(DIST_DIR)/r6s/version.index \ 133 | $(DIST_DIR)/station-p2/version.index \ 134 | $(DIST_DIR)/h6xk/version.index \ 135 | $(DIST_DIR)/h88k/version.index \ 136 | $(DIST_DIR)/h28k/version.index \ 137 | $(DIST_DIR)/t68m/version.index \ 138 | $(if $(IB),,$(IB_DIR)/rk35xx/sha256sums) 139 | endif # rk35xx 140 | 141 | endif # rockchip 142 | 143 | ifeq ($(BOARD)-$(SUBTARGET), bcm27xx-bcm2711) 144 | $(eval $(call COMMON/IMAGE,raspberrypi,rpi4)) 145 | $(eval $(call COMMON/BUILDER,bcm2711)) 146 | bcm27xx-bcm2711-rpi-4: $(DIST_DIR)/rpi4/version.index \ 147 | $(if $(IB),,$(IB_DIR)/bcm2711/sha256sums) 148 | endif # bcm27xx-bcm2711 149 | 150 | else 151 | 152 | TOPDIR:=${CURDIR} 153 | 154 | LC_ALL:=C 155 | LANG:=C 156 | TZ:=UTC 157 | export TOPDIR LC_ALL LANG TZ 158 | 159 | export PATH:=$(TOPDIR)/staging_dir/host/bin:$(PATH) 160 | 161 | all: FORCE 162 | $(SUBMAKE) BUILD=1 $(if $(IB),IB="$(IB)") 163 | %: FORCE 164 | $(SUBMAKE) BUILD=1 $@ $(if $(IB),IB="$(IB)") 165 | 166 | FORCE: ; 167 | .PHONY: FORCE 168 | endif 169 | -------------------------------------------------------------------------------- /src/repositories_aarch64.conf: -------------------------------------------------------------------------------- 1 | ## Place your custom repositories here, they must match the architecture and version. 2 | # src/gz %n %U 3 | # src custom file:///usr/src/openwrt/bin/%T/packages 4 | 5 | src/gz openwrt_base https://downloads.openwrt.org/releases/22.03.6/packages/aarch64_cortex-a53/base 6 | src/gz openwrt_luci https://downloads.openwrt.org/releases/22.03.6/packages/aarch64_cortex-a53/luci 7 | src/gz openwrt_packages https://downloads.openwrt.org/releases/22.03.6/packages/aarch64_cortex-a53/packages 8 | src/gz openwrt_routing https://downloads.openwrt.org/releases/22.03.6/packages/aarch64_cortex-a53/routing 9 | src/gz openwrt_telephony https://downloads.openwrt.org/releases/22.03.6/packages/aarch64_cortex-a53/telephony 10 | 11 | src/gz istore_all_compat https://istore.linkease.com/repo/all/compat 12 | src/gz istore_all https://istore.linkease.com/repo/all/store 13 | src/gz istore_all_meta https://istore.linkease.com/repo/all/meta 14 | src/gz istore_all_nas_luci https://istore.linkease.com/repo/all/nas_luci 15 | src/gz istore_nas https://istore.linkease.com/repo/aarch64_cortex-a53/nas 16 | 17 | ## This is the local package repository, do not remove! 18 | src imagebuilder file:packages 19 | 20 | # option check_signature 21 | -------------------------------------------------------------------------------- /src/repositories_rk33xx.conf: -------------------------------------------------------------------------------- 1 | ## Place your custom repositories here, they must match the architecture and version. 2 | # src/gz %n %U 3 | # src custom file:///usr/src/openwrt/bin/%T/packages 4 | 5 | src/gz openwrt_base https://downloads.openwrt.org/releases/22.03.6/packages/aarch64_generic/base 6 | src/gz openwrt_luci https://downloads.openwrt.org/releases/22.03.6/packages/aarch64_generic/luci 7 | src/gz openwrt_packages https://downloads.openwrt.org/releases/22.03.6/packages/aarch64_generic/packages 8 | src/gz openwrt_routing https://downloads.openwrt.org/releases/22.03.6/packages/aarch64_generic/routing 9 | src/gz openwrt_telephony https://downloads.openwrt.org/releases/22.03.6/packages/aarch64_generic/telephony 10 | 11 | src/gz istore_all_compat https://istore.linkease.com/repo/all/compat 12 | src/gz istore_all https://istore.linkease.com/repo/all/store 13 | src/gz istore_all_meta https://istore.linkease.com/repo/all/meta 14 | src/gz istore_all_nas_luci https://istore.linkease.com/repo/all/nas_luci 15 | src/gz istore_nas https://istore.linkease.com/repo/aarch64_cortex-a53/nas 16 | 17 | ## This is the local package repository, do not remove! 18 | src imagebuilder file:packages 19 | 20 | # option check_signature 21 | -------------------------------------------------------------------------------- /src/repositories_rk35xx.conf: -------------------------------------------------------------------------------- 1 | ## Place your custom repositories here, they must match the architecture and version. 2 | # src/gz %n %U 3 | # src custom file:///usr/src/openwrt/bin/%T/packages 4 | 5 | src/gz openwrt_base https://downloads.openwrt.org/releases/22.03.6/packages/aarch64_cortex-a53/base 6 | src/gz openwrt_luci https://downloads.openwrt.org/releases/22.03.6/packages/aarch64_cortex-a53/luci 7 | src/gz openwrt_packages https://downloads.openwrt.org/releases/22.03.6/packages/aarch64_cortex-a53/packages 8 | src/gz openwrt_routing https://downloads.openwrt.org/releases/22.03.6/packages/aarch64_cortex-a53/routing 9 | src/gz openwrt_telephony https://downloads.openwrt.org/releases/22.03.6/packages/aarch64_cortex-a53/telephony 10 | 11 | src/gz istore_all_compat https://istore.linkease.com/repo/all/compat 12 | src/gz istore_all https://istore.linkease.com/repo/all/store 13 | src/gz istore_all_meta https://istore.linkease.com/repo/all/meta 14 | src/gz istore_all_nas_luci https://istore.linkease.com/repo/all/nas_luci 15 | src/gz istore_nas https://istore.linkease.com/repo/aarch64_cortex-a53/nas 16 | 17 | ## This is the local package repository, do not remove! 18 | src imagebuilder file:packages 19 | 20 | # option check_signature 21 | -------------------------------------------------------------------------------- /src/repositories_x86_64.conf: -------------------------------------------------------------------------------- 1 | ## Place your custom repositories here, they must match the architecture and version. 2 | # src/gz %n %U 3 | # src custom file:///usr/src/openwrt/bin/%T/packages 4 | 5 | #src/gz openwrt_core https://downloads.openwrt.org/releases/22.03.6/targets/x86/64/packages 6 | src/gz openwrt_base https://downloads.openwrt.org/releases/22.03.6/packages/x86_64/base 7 | src/gz openwrt_luci https://downloads.openwrt.org/releases/22.03.6/packages/x86_64/luci 8 | src/gz openwrt_packages https://downloads.openwrt.org/releases/22.03.6/packages/x86_64/packages 9 | src/gz openwrt_routing https://downloads.openwrt.org/releases/22.03.6/packages/x86_64/routing 10 | src/gz openwrt_telephony https://downloads.openwrt.org/releases/22.03.6/packages/x86_64/telephony 11 | 12 | src/gz istore_all_compat https://istore.linkease.com/repo/all/compat 13 | src/gz istore_all https://istore.linkease.com/repo/all/store 14 | src/gz istore_all_meta https://istore.linkease.com/repo/all/meta 15 | src/gz istore_all_nas_luci https://istore.linkease.com/repo/all/nas_luci 16 | src/gz istore_nas https://istore.linkease.com/repo/x86_64/nas 17 | 18 | ## This is the local package repository, do not remove! 19 | src imagebuilder file:packages 20 | 21 | # option check_signature 22 | -------------------------------------------------------------------------------- /src/target_bcm2711.manifest: -------------------------------------------------------------------------------- 1 | istoreos-intl 2 | 3 | -------------------------------------------------------------------------------- /src/target_rk33xx.manifest: -------------------------------------------------------------------------------- 1 | kmod-rkwifi-bcmdhd 2 | rkwifi-firmware-ap6256 3 | kmod-sound-soc-rk3308 4 | nginx 5 | nginx-mod-luci 6 | routergo 7 | luci-app-routerdog 8 | aria2 9 | luci-app-aria2 10 | app-meta-routerdog 11 | 12 | -------------------------------------------------------------------------------- /src/target_rk35xx.manifest: -------------------------------------------------------------------------------- 1 | nginx 2 | nginx-mod-luci 3 | routergo 4 | luci-app-routerdog 5 | aria2 6 | luci-app-aria2 7 | app-meta-routerdog 8 | 9 | -------------------------------------------------------------------------------- /src/target_x86_64.manifest: -------------------------------------------------------------------------------- 1 | nginx 2 | nginx-mod-luci 3 | routergo 4 | luci-app-routerdog 5 | aria2 6 | luci-app-aria2 7 | app-meta-routerdog 8 | 9 | --------------------------------------------------------------------------------