From 49d092fcf9951e0e37fbe436e80072b641f3e018 Mon Sep 17 00:00:00 2001 From: phnzb Date: Fri, 1 Dec 2023 15:56:01 +0000 Subject: [PATCH 01/16] Initial synology support --- .github/workflows/build.yml | 34 ++++---- .github/workflows/synology.yml | 31 +++++++ synology/build-nzbget.sh | 41 +++++++++ synology/package/INFO.sh | 22 +++++ synology/package/PACKAGE_ICON.PNG | Bin 0 -> 13154 bytes synology/package/PACKAGE_ICON_256.PNG | Bin 0 -> 37045 bytes synology/package/README.md | 7 ++ synology/package/SynoBuildConf/depends | 4 + synology/package/SynoBuildConf/install | 54 ++++++++++++ .../package/WIZARD_UIFILES/install_uifile | 80 ++++++++++++++++++ .../package/WIZARD_UIFILES/uninstall_uifile | 16 ++++ .../package/WIZARD_UIFILES/upgrade_uifile | 12 +++ synology/package/conf/privilege | 5 ++ synology/package/conf/resource | 19 +++++ synology/package/nzbget.sc | 5 ++ synology/package/scripts/postinst | 26 ++++++ synology/package/scripts/postuninst | 8 ++ synology/package/scripts/postupgrade | 3 + synology/package/scripts/preinst | 3 + synology/package/scripts/preuninst | 3 + synology/package/scripts/preupgrade | 3 + synology/package/scripts/start-stop-status | 25 ++++++ synology/package/scripts/vars | 2 + 23 files changed, 388 insertions(+), 15 deletions(-) create mode 100644 .github/workflows/synology.yml create mode 100644 synology/build-nzbget.sh create mode 100755 synology/package/INFO.sh create mode 100644 synology/package/PACKAGE_ICON.PNG create mode 100644 synology/package/PACKAGE_ICON_256.PNG create mode 100644 synology/package/README.md create mode 100644 synology/package/SynoBuildConf/depends create mode 100644 synology/package/SynoBuildConf/install create mode 100644 synology/package/WIZARD_UIFILES/install_uifile create mode 100644 synology/package/WIZARD_UIFILES/uninstall_uifile create mode 100644 synology/package/WIZARD_UIFILES/upgrade_uifile create mode 100644 synology/package/conf/privilege create mode 100644 synology/package/conf/resource create mode 100644 synology/package/nzbget.sc create mode 100755 synology/package/scripts/postinst create mode 100755 synology/package/scripts/postuninst create mode 100755 synology/package/scripts/postupgrade create mode 100755 synology/package/scripts/preinst create mode 100755 synology/package/scripts/preuninst create mode 100755 synology/package/scripts/preupgrade create mode 100755 synology/package/scripts/start-stop-status create mode 100644 synology/package/scripts/vars diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a2005f179..d620fdf73 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -8,20 +8,24 @@ on: workflow_dispatch: jobs: - build-windows: - uses: ./.github/workflows/windows.yml + # build-windows: + # uses: ./.github/workflows/windows.yml - build-linux: - uses: ./.github/workflows/linux.yml + # build-linux: + # uses: ./.github/workflows/linux.yml - build-osx: - uses: ./.github/workflows/osx.yml + # build-osx: + # uses: ./.github/workflows/osx.yml + + build-synology: + uses: ./.github/workflows/synology.yml generate-signatures: env: PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }} runs-on: ubuntu-latest - needs: [build-windows, build-linux, build-osx] + # needs: [build-windows, build-linux, build-osx] + needs: [build-synology] steps: - name: Download build artifacts @@ -43,7 +47,7 @@ jobs: echo "nzbget_signatures({" | tee $SIGS_FILE echo | tee -a $SIGS_FILE - for FILE in *.exe *.run *.zip; do + for FILE in *.exe *.run *.zip *.spk; do [ -f $FILE ] || continue MD5=$(openssl dgst -md5 $FILE | cut -d ' ' -f 2) @@ -72,10 +76,10 @@ jobs: path: builds/* retention-days: 5 - - name: Delete unneded platform-specific artifacts - uses: geekyeggo/delete-artifact@v2 - with: - name: | - nzbget-windows-installers - nzbget-linux-installers - nzbget-osx-installers + # - name: Delete unneded platform-specific artifacts + # uses: geekyeggo/delete-artifact@v2 + # with: + # name: | + # nzbget-windows-installers + # nzbget-linux-installers + # nzbget-osx-installers diff --git a/.github/workflows/synology.yml b/.github/workflows/synology.yml new file mode 100644 index 000000000..d26097466 --- /dev/null +++ b/.github/workflows/synology.yml @@ -0,0 +1,31 @@ +name: linux build + +on: + workflow_call: + workflow_dispatch: + +jobs: + build: + runs-on: [self-hosted, linux] + + steps: + + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Build + run: | + sudo bash synology/build-nzbget.sh + + - name: Upload build artifacts + uses: actions/upload-artifact@v3 + with: + name: nzbget-synology-packages + path: /toolkit/result_spk/nzbget/*.spk + retention-days: 5 + + - name: Cleanup + run: | + rm /toolkit/result_spk/nzbget/*.spk diff --git a/synology/build-nzbget.sh b/synology/build-nzbget.sh new file mode 100644 index 000000000..c7ae81c85 --- /dev/null +++ b/synology/build-nzbget.sh @@ -0,0 +1,41 @@ +#!/bin/bash +BUILD_PLATFORM=$1 +if [ ! -z "$BUILD_PLATFORM" ]; then BUILD_PARAM="-p $BUILD_PLATFORM"; fi + +# clean up +rm -rf /toolkit/source/nzbget +rm -rf /toolkit/result_spk/ +if [ ! -z "$BUILD_PLATFORM" ]; then + PLATFORMS=$BUILD_PLATFORM +else + PLATFORMS="alpine armada370 armada375 armada37xx armada38x armadaxp avoton evansport monaco" +fi +for PLATFORM in $PLATFORMS; do + echo "Cleanup $PLATFORM environment ..." + rm -rf /toolkit/build_env/ds.$PLATFORM-7.0/image/packages +done + +# copy source and prepare package structure +mkdir -p /toolkit/source/nzbget +cp -r . /toolkit/source/nzbget +cp -r synology/package/* /toolkit/source/nzbget/ +cd /toolkit/source/nzbget/ +autoreconf --install +chmod +x scripts/* +chmod +x SynoBuildConf/* +chmod +x INFO.sh + +# correct build version in INFO.sh +VERSION=$(grep "AC_INIT(nzbget, " configure.ac | cut -d "," -f 2) +VERSION=${VERSION//[. ]/} +VERSION=$(date '+%Y%m%d')-$VERSION +sed -e "s|version=.*$|version=\"$VERSION\"|g" -i INFO.sh + +# build +cd /toolkit/pkgscripts-ng +./PkgCreate.py -v 7.0 -c nzbget $BUILD_PARAM + +# remove debug packages and set user perms on packages +mv /toolkit/result_spk/nzbget-$VERSION/ /toolkit/result_spk/nzbget/ +rm /toolkit/result_spk/nzbget/*_debug.spk +chmod 666 /toolkit/result_spk/nzbget/* diff --git a/synology/package/INFO.sh b/synology/package/INFO.sh new file mode 100755 index 000000000..621e84365 --- /dev/null +++ b/synology/package/INFO.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +source /pkgscripts/include/pkg_util.sh + +package="nzbget" +version="yyyymmdd-version" +displayname="NZBGet" +os_min_ver="7.0-41201" +maintainer="nzbget@nzbget.com" +adminport="6789" +description="NZBGet is a binary downloader, which downloads files from Usenet based on information given in nzb-files." + +# populate arch +BUILD_ARCH="$(pkg_get_platform)" +arch=$BUILD_ARCH +if [ "$BUILD_ARCH" == "alpine" ]; then arch="alpine alpine4k"; fi +if [ "$BUILD_ARCH" == "armada37xx" ]; then arch="armada37xx rtd1296 rtd1619 aarch64"; fi +if [ "$BUILD_ARCH" == "avoton" ]; then arch="apollolake avoton braswell broadwell broadwellnk broadwellntb broadwellntbap bromolow cedarview coffeelake denverton geminilake grantley kvmx64 purley skylaked v1000 x86_64"; fi +if [ "$BUILD_ARCH" == "evansport" ]; then arch="evansport x86 i686"; fi + +[ "$(caller)" != "0 NULL" ] && return 0 +pkg_dump_info diff --git a/synology/package/PACKAGE_ICON.PNG b/synology/package/PACKAGE_ICON.PNG new file mode 100644 index 0000000000000000000000000000000000000000..93a07e852f53071bc9ffc11935d11ba5818b5a2e GIT binary patch literal 13154 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 IM6N<$g1F7`z5oCK literal 0 HcmV?d00001 diff --git a/synology/package/PACKAGE_ICON_256.PNG b/synology/package/PACKAGE_ICON_256.PNG new file mode 100644 index 0000000000000000000000000000000000000000..6e1397828625e90c07e21769adf7762e33170bb8 GIT binary patch literal 37045 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 INFO + cp INFO $PKG_DIR/INFO + + ### Create the final spk. + # pkg_make_spk + # Please put the result spk into /image/packages + # spk name functions: pkg_get_spk_name pkg_get_spk_unified_name pkg_get_spk_family_name + mkdir -p /image/packages + pkg_make_spk $PKG_DIR "/image/packages" $(pkg_get_spk_family_name) +} + +main() { + create_package_tgz + create_spk +} + +main "$@" diff --git a/synology/package/WIZARD_UIFILES/install_uifile b/synology/package/WIZARD_UIFILES/install_uifile new file mode 100644 index 000000000..7d3658640 --- /dev/null +++ b/synology/package/WIZARD_UIFILES/install_uifile @@ -0,0 +1,80 @@ +[{ + "step_title": "Shared folder configuration", + "items": [{ + "desc": "Shared folder for downloaded files." + }, { + "type": "combobox", + "desc": "Please select a shared folder", + "subitems": [{ + "key": "wizard_download_folder", + "desc": "Shared folder", + "mode": "remote", + "displayField": "name", + "valueField": "name", + "api_store": { + "api": "SYNO.Core.Share", + "method": "list", + "version": 1, + "baseParams": { + "limit": -1, + "offset": 0 + }, + "root": "shares", + "idProperty": "name", + "fields": ["name"] + }, + "validator": { + "allowBlank": false + } + } + ] + }, { + "type": "textfield", + "desc": "Download directory (shared folder sub-folder) - optional", + "subitems": [{ + "key": "wizard_download_subfolder", + "desc": "Download directory", + "defaultValue": "nzbget", + "validator": { + "allowBlank": true, + "regex": { + "expr": "/^[^<>: */?\"]*/", + "errorText": "Directory must be a folder name only. Path separators, spaces and other special chars are not allowed." + } + } + } + ] + } + ] + }, { + "step_title": "User configuration", + "items": [{ + "desc": "User Credentials for the web interface." + }, { + "type": "textfield", + "desc": "Username for web interface", + "subitems": [{ + "key": "wizard_username", + "desc": "Username. Defaults to nzbget", + "defaultValue": "nzbget", + "validator": { + "allowBlank": false + } + } + ] + }, { + "type": "password", + "desc": "Password for web interface", + "subitems": [{ + "key": "wizard_password", + "desc": "Password. Defaults to nzbget", + "defaultValue": "nzbget", + "validator": { + "allowBlank": false + } + } + ] + } + ] + } +] diff --git a/synology/package/WIZARD_UIFILES/uninstall_uifile b/synology/package/WIZARD_UIFILES/uninstall_uifile new file mode 100644 index 000000000..f8f022099 --- /dev/null +++ b/synology/package/WIZARD_UIFILES/uninstall_uifile @@ -0,0 +1,16 @@ +[{ + "step_title": "Uninstall package", + "items": [{ + "type": "singleselect", + "desc": "Keep/delete package settings.", + "subitems": [{ + "key": "wizard_keep_data", + "desc": "Uninstall only. Keep existing config files.", + "defaultValue": true + }, { + "key": "", + "desc": "Erase all of the package data files.", + "defaultValue": false + }] + }] +}] diff --git a/synology/package/WIZARD_UIFILES/upgrade_uifile b/synology/package/WIZARD_UIFILES/upgrade_uifile new file mode 100644 index 000000000..6ad34b37e --- /dev/null +++ b/synology/package/WIZARD_UIFILES/upgrade_uifile @@ -0,0 +1,12 @@ +[{ + "step_title": "Upgrade package", + "items": [{ + "type": "singleselect", + "desc": "Keep package settings.", + "subitems": [{ + "key": "wizard_keep_data", + "desc": "Keep existing config files.", + "defaultValue": true + }] + }] +}] diff --git a/synology/package/conf/privilege b/synology/package/conf/privilege new file mode 100644 index 000000000..2aafe2347 --- /dev/null +++ b/synology/package/conf/privilege @@ -0,0 +1,5 @@ +{ + "defaults": { + "run-as": "package" + } +} diff --git a/synology/package/conf/resource b/synology/package/conf/resource new file mode 100644 index 000000000..ebe6f568c --- /dev/null +++ b/synology/package/conf/resource @@ -0,0 +1,19 @@ +{ + "usr-local-linker": { + "bin": ["usr/local/bin/nzbget"] + }, + "port-config": { + "protocol-file": "usr/local/bin/nzbget.sc" + }, + "data-share": { + "shares": [{ + "name": "{{wizard_download_folder}}", + "permission": { + "rw": [ + "nzbget" + ] + } + } + ] + } +} diff --git a/synology/package/nzbget.sc b/synology/package/nzbget.sc new file mode 100644 index 000000000..00f1772d5 --- /dev/null +++ b/synology/package/nzbget.sc @@ -0,0 +1,5 @@ +[nzbget] +title="NZBGet (HTTP)" +desc="NZBGet" +port_forward="yes" +dst.ports="6789/tcp" diff --git a/synology/package/scripts/postinst b/synology/package/scripts/postinst new file mode 100755 index 000000000..482ad4cff --- /dev/null +++ b/synology/package/scripts/postinst @@ -0,0 +1,26 @@ +#!/bin/sh +. `dirname $0`/vars + +# check conf file location, copy if not exist +# and populate from synology defaults +if [ ! -f $CFG ]; then + cp $SYNOPKG_PKGDEST/usr/local/share/nzbget/nzbget.conf $CFG + if [ -z "$wizard_download_subfolder" ]; then + DOWNLOAD_PATH=$wizard_download_folder + else + DOWNLOAD_PATH=$wizard_download_folder/$wizard_download_subfolder + fi + sed -e "s|MainDir=.*$|MainDir=/var/packages/nzbget/shares/$DOWNLOAD_PATH|g" \ + -e "s/ControlUsername=.*$/ControlUsername=$wizard_username/g" \ + -e "s/ControlPassword=.*$/ControlPassword=$wizard_password/g" \ + -e "s|WebDir=.*$|WebDir=$SYNOPKG_PKGDEST/usr/local/share/nzbget/webui|g" \ + -e "s|LogFile=.*$|LogFile=$SYNOPKG_PKGVAR/nzbget.log|g" \ + -e "s|LockFile=.*$|LockFile=$SYNOPKG_PKGVAR/nzbget.lock|g" \ + -e "s|ConfigTemplate=.*$|ConfigTemplate=$SYNOPKG_PKGDEST/usr/local/share/nzbget/nzbget.conf|g" \ + -i $CFG + # copy bundled scripts + mkdir -p /var/packages/nzbget/shares/$DOWNLOAD_PATH/scripts/ + cp $SYNOPKG_PKGDEST/usr/local/share/nzbget/scripts/* /var/packages/nzbget/shares/$DOWNLOAD_PATH/scripts/ +fi + +exit 0 diff --git a/synology/package/scripts/postuninst b/synology/package/scripts/postuninst new file mode 100755 index 000000000..0c02027b9 --- /dev/null +++ b/synology/package/scripts/postuninst @@ -0,0 +1,8 @@ +#!/bin/sh +. `dirname $0`/vars + +if [ "$wizard_keep_data" != "true" ]; then + rm $CFG +fi + +exit 0 diff --git a/synology/package/scripts/postupgrade b/synology/package/scripts/postupgrade new file mode 100755 index 000000000..c52d3c26b --- /dev/null +++ b/synology/package/scripts/postupgrade @@ -0,0 +1,3 @@ +#!/bin/sh + +exit 0 diff --git a/synology/package/scripts/preinst b/synology/package/scripts/preinst new file mode 100755 index 000000000..c52d3c26b --- /dev/null +++ b/synology/package/scripts/preinst @@ -0,0 +1,3 @@ +#!/bin/sh + +exit 0 diff --git a/synology/package/scripts/preuninst b/synology/package/scripts/preuninst new file mode 100755 index 000000000..c52d3c26b --- /dev/null +++ b/synology/package/scripts/preuninst @@ -0,0 +1,3 @@ +#!/bin/sh + +exit 0 diff --git a/synology/package/scripts/preupgrade b/synology/package/scripts/preupgrade new file mode 100755 index 000000000..c52d3c26b --- /dev/null +++ b/synology/package/scripts/preupgrade @@ -0,0 +1,3 @@ +#!/bin/sh + +exit 0 diff --git a/synology/package/scripts/start-stop-status b/synology/package/scripts/start-stop-status new file mode 100755 index 000000000..2e7452847 --- /dev/null +++ b/synology/package/scripts/start-stop-status @@ -0,0 +1,25 @@ +#!/bin/sh +. `dirname $0`/vars + +case $1 in + start) + ### Start this package. + $NZBGET -D -c $CFG + echo "nzbget has been started" > $SYNOPKG_TEMP_LOGFILE + exit 0 + ;; + stop) + ### Stop this package. + $NZBGET -Q -c $CFG + echo "nzbget has been stopped" > $SYNOPKG_TEMP_LOGFILE + exit 0 + ;; + status) + ### Check package alive. + if [ -z $(ps aux | grep $NZBGET | grep -v "grep $NZBGET") ]; then + exit 1; + else + exit 0; + fi + ;; +esac diff --git a/synology/package/scripts/vars b/synology/package/scripts/vars new file mode 100644 index 000000000..863498aec --- /dev/null +++ b/synology/package/scripts/vars @@ -0,0 +1,2 @@ +CFG=/usr/syno/etc/packages/nzbget/nzbget.conf +NZBGET=/usr/local/bin/nzbget From d68ded45b3041b5e7c6f59157c86d169e68a2f15 Mon Sep 17 00:00:00 2001 From: phnzb Date: Fri, 1 Dec 2023 18:45:03 +0000 Subject: [PATCH 02/16] Try to fix build --- synology/build-nzbget.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/synology/build-nzbget.sh b/synology/build-nzbget.sh index c7ae81c85..91075ae16 100644 --- a/synology/build-nzbget.sh +++ b/synology/build-nzbget.sh @@ -32,8 +32,7 @@ VERSION=$(date '+%Y%m%d')-$VERSION sed -e "s|version=.*$|version=\"$VERSION\"|g" -i INFO.sh # build -cd /toolkit/pkgscripts-ng -./PkgCreate.py -v 7.0 -c nzbget $BUILD_PARAM +/toolkit/pkgscripts-ng/PkgCreate.py -v 7.0 -c nzbget $BUILD_PARAM # remove debug packages and set user perms on packages mv /toolkit/result_spk/nzbget-$VERSION/ /toolkit/result_spk/nzbget/ From 644ee1c05fa71051c7217b270f444e1afeede261 Mon Sep 17 00:00:00 2001 From: phnzb Date: Fri, 1 Dec 2023 18:52:21 +0000 Subject: [PATCH 03/16] Add exception for vars --- synology/build-nzbget.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/synology/build-nzbget.sh b/synology/build-nzbget.sh index 91075ae16..d42da134d 100644 --- a/synology/build-nzbget.sh +++ b/synology/build-nzbget.sh @@ -22,6 +22,7 @@ cp -r synology/package/* /toolkit/source/nzbget/ cd /toolkit/source/nzbget/ autoreconf --install chmod +x scripts/* +chmod -x scripts/vars chmod +x SynoBuildConf/* chmod +x INFO.sh From 2e0698821277fa1e8894e5d5a3af622ceb5d61d5 Mon Sep 17 00:00:00 2001 From: phnzb Date: Fri, 1 Dec 2023 18:59:33 +0000 Subject: [PATCH 04/16] Update build script. Fix gitignore. --- .gitignore | 1 + synology/build-nzbget.sh | 1 + synology/package/SynoBuildConf/build | 23 +++++++++++++++++++++++ 3 files changed, 25 insertions(+) create mode 100644 synology/package/SynoBuildConf/build diff --git a/.gitignore b/.gitignore index 16ee1cd98..907ffb8a6 100644 --- a/.gitignore +++ b/.gitignore @@ -78,6 +78,7 @@ ipch/ # NZBGet specific nzbget build +!synology/package/SynoBuildConf/build code_revision.cpp *.temp *.pyc diff --git a/synology/build-nzbget.sh b/synology/build-nzbget.sh index d42da134d..cdfff5f11 100644 --- a/synology/build-nzbget.sh +++ b/synology/build-nzbget.sh @@ -24,6 +24,7 @@ autoreconf --install chmod +x scripts/* chmod -x scripts/vars chmod +x SynoBuildConf/* +chmod -x SynoBuildConf/depends chmod +x INFO.sh # correct build version in INFO.sh diff --git a/synology/package/SynoBuildConf/build b/synology/package/SynoBuildConf/build new file mode 100644 index 000000000..d07113dd0 --- /dev/null +++ b/synology/package/SynoBuildConf/build @@ -0,0 +1,23 @@ +#!/bin/bash + +case ${MakeClean} in + [Yy][Ee][Ss]) + make clean + ;; +esac + +case ${CleanOnly} in + [Yy][Ee][Ss]) + return + ;; +esac + +# prefix with /usr/local, all files will be installed into /usr/local +env CC="${CC}" CXX="${CXX}" LD="${LD}" AR=${AR} STRIP=${STRIP} RANLIB=${RANLIB} NM=${NM} \ + CFLAGS="${CFLAGS} -Os" CXXFLAGS="${CXXFLAGS}" LDFLAGS="${LDFLAGS}" \ + ./configure ${ConfigOpt} \ + --prefix=/usr/local --program-prefix="" --program-suffix="" + +make ${MAKE_FLAGS} + +make install From fd3e616ad3b84e11b2165aaa1174b14a34c0a907 Mon Sep 17 00:00:00 2001 From: phnzb Date: Fri, 1 Dec 2023 19:08:39 +0000 Subject: [PATCH 05/16] Move autoreconf to synobuild --- synology/build-nzbget.sh | 1 - synology/package/SynoBuildConf/build | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/synology/build-nzbget.sh b/synology/build-nzbget.sh index cdfff5f11..fb2daf37a 100644 --- a/synology/build-nzbget.sh +++ b/synology/build-nzbget.sh @@ -20,7 +20,6 @@ mkdir -p /toolkit/source/nzbget cp -r . /toolkit/source/nzbget cp -r synology/package/* /toolkit/source/nzbget/ cd /toolkit/source/nzbget/ -autoreconf --install chmod +x scripts/* chmod -x scripts/vars chmod +x SynoBuildConf/* diff --git a/synology/package/SynoBuildConf/build b/synology/package/SynoBuildConf/build index d07113dd0..bdf1cb33f 100644 --- a/synology/package/SynoBuildConf/build +++ b/synology/package/SynoBuildConf/build @@ -12,6 +12,8 @@ case ${CleanOnly} in ;; esac +autoreconf --install + # prefix with /usr/local, all files will be installed into /usr/local env CC="${CC}" CXX="${CXX}" LD="${LD}" AR=${AR} STRIP=${STRIP} RANLIB=${RANLIB} NM=${NM} \ CFLAGS="${CFLAGS} -Os" CXXFLAGS="${CXXFLAGS}" LDFLAGS="${LDFLAGS}" \ From c677823ebeeeef3629556185e8c89e340793d286 Mon Sep 17 00:00:00 2001 From: phnzb Date: Fri, 1 Dec 2023 19:48:32 +0000 Subject: [PATCH 06/16] Decrease concurrency. Fix cleanup. --- .github/workflows/synology.yml | 2 +- synology/build-nzbget.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/synology.yml b/.github/workflows/synology.yml index d26097466..5311ed853 100644 --- a/.github/workflows/synology.yml +++ b/.github/workflows/synology.yml @@ -28,4 +28,4 @@ jobs: - name: Cleanup run: | - rm /toolkit/result_spk/nzbget/*.spk + sudo rm /toolkit/result_spk/nzbget/*.spk diff --git a/synology/build-nzbget.sh b/synology/build-nzbget.sh index fb2daf37a..f98c13a9c 100644 --- a/synology/build-nzbget.sh +++ b/synology/build-nzbget.sh @@ -33,7 +33,7 @@ VERSION=$(date '+%Y%m%d')-$VERSION sed -e "s|version=.*$|version=\"$VERSION\"|g" -i INFO.sh # build -/toolkit/pkgscripts-ng/PkgCreate.py -v 7.0 -c nzbget $BUILD_PARAM +/toolkit/pkgscripts-ng/PkgCreate.py -v 7.0 -c -P 2 nzbget $BUILD_PARAM # remove debug packages and set user perms on packages mv /toolkit/result_spk/nzbget-$VERSION/ /toolkit/result_spk/nzbget/ From 1e65a79449de462c9bcf31901229fc3fefdace29 Mon Sep 17 00:00:00 2001 From: phnzb Date: Mon, 4 Dec 2023 06:12:55 +0000 Subject: [PATCH 07/16] Fix generate signatures --- .github/workflows/build.yml | 7 ++++--- synology/build-nzbget.sh | 27 ++++++++++++++++----------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d620fdf73..be459b4eb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -34,9 +34,10 @@ jobs: - name: Generate signatures run: | mkdir -p builds - mv nzbget-windows-installers/* builds - mv nzbget-linux-installers/* builds - mv nzbget-osx-installers/* builds + mv nzbget-windows-installers/* builds || true + mv nzbget-linux-installers/* builds || true + mv nzbget-osx-installers/* builds || true + mv nzbget-synology-packages/* builds || true cd builds VERSION=$(ls | grep bin-windows-setup | cut -d - -f 2) SIGS_FILE="nzbget-$VERSION.sig.txt" diff --git a/synology/build-nzbget.sh b/synology/build-nzbget.sh index f98c13a9c..0bb69eb7c 100644 --- a/synology/build-nzbget.sh +++ b/synology/build-nzbget.sh @@ -1,10 +1,15 @@ #!/bin/bash + +# synology toolkit path +TOOLKIT=/toolkit + +# parameter can be build platform BUILD_PLATFORM=$1 if [ ! -z "$BUILD_PLATFORM" ]; then BUILD_PARAM="-p $BUILD_PLATFORM"; fi # clean up -rm -rf /toolkit/source/nzbget -rm -rf /toolkit/result_spk/ +rm -rf $TOOLKIT/source/nzbget +rm -rf $TOOLKIT/result_spk/ if [ ! -z "$BUILD_PLATFORM" ]; then PLATFORMS=$BUILD_PLATFORM else @@ -12,14 +17,14 @@ else fi for PLATFORM in $PLATFORMS; do echo "Cleanup $PLATFORM environment ..." - rm -rf /toolkit/build_env/ds.$PLATFORM-7.0/image/packages + rm -rf $TOOLKIT/build_env/ds.$PLATFORM-7.0/image/packages done # copy source and prepare package structure -mkdir -p /toolkit/source/nzbget -cp -r . /toolkit/source/nzbget -cp -r synology/package/* /toolkit/source/nzbget/ -cd /toolkit/source/nzbget/ +mkdir -p $TOOLKIT/source/nzbget +cp -r . $TOOLKIT/source/nzbget +cp -r synology/package/* $TOOLKIT/source/nzbget/ +cd $TOOLKIT/source/nzbget/ chmod +x scripts/* chmod -x scripts/vars chmod +x SynoBuildConf/* @@ -33,9 +38,9 @@ VERSION=$(date '+%Y%m%d')-$VERSION sed -e "s|version=.*$|version=\"$VERSION\"|g" -i INFO.sh # build -/toolkit/pkgscripts-ng/PkgCreate.py -v 7.0 -c -P 2 nzbget $BUILD_PARAM +$TOOLKIT/pkgscripts-ng/PkgCreate.py -v 7.0 -c -P 2 nzbget $BUILD_PARAM # remove debug packages and set user perms on packages -mv /toolkit/result_spk/nzbget-$VERSION/ /toolkit/result_spk/nzbget/ -rm /toolkit/result_spk/nzbget/*_debug.spk -chmod 666 /toolkit/result_spk/nzbget/* +mv $TOOLKIT/result_spk/nzbget-$VERSION/ $TOOLKIT/result_spk/nzbget/ +rm $TOOLKIT/result_spk/nzbget/*_debug.spk +chmod 666 $TOOLKIT/result_spk/nzbget/* From cf8756f9c793143b4c5097c0417b02bd94d7d1f4 Mon Sep 17 00:00:00 2001 From: phnzb Date: Mon, 4 Dec 2023 13:40:58 +0000 Subject: [PATCH 08/16] Add basic info --- synology/README.md | 0 synology/build-info.md | 15 +++++++++++++++ synology/package/SynoBuildConf/install | 1 + synology/package/scripts/postinst | 6 ++++++ 4 files changed, 22 insertions(+) create mode 100644 synology/README.md create mode 100644 synology/build-info.md diff --git a/synology/README.md b/synology/README.md new file mode 100644 index 000000000..e69de29bb diff --git a/synology/build-info.md b/synology/build-info.md new file mode 100644 index 000000000..60d099835 --- /dev/null +++ b/synology/build-info.md @@ -0,0 +1,15 @@ +About +----- +"build-nzbget.sh" is a bash script which is used to build nzbget Synology packages. + +Prerequisites +------------- + + +Building NZBGet +--------------- + + +Output files +------------ + diff --git a/synology/package/SynoBuildConf/install b/synology/package/SynoBuildConf/install index 586959c30..ccc1f825e 100644 --- a/synology/package/SynoBuildConf/install +++ b/synology/package/SynoBuildConf/install @@ -20,6 +20,7 @@ create_package_tgz() { mkdir -p $binary_dir cp -av nzbget $binary_dir cp -av nzbget.sc $binary_dir + curl --insecure -o $binary_dir/cacert.pem https://curl.se/ca/cacert.pem make install DESTDIR="$package_tgz_dir" diff --git a/synology/package/scripts/postinst b/synology/package/scripts/postinst index 482ad4cff..1c5337249 100755 --- a/synology/package/scripts/postinst +++ b/synology/package/scripts/postinst @@ -17,6 +17,12 @@ if [ ! -f $CFG ]; then -e "s|LogFile=.*$|LogFile=$SYNOPKG_PKGVAR/nzbget.log|g" \ -e "s|LockFile=.*$|LockFile=$SYNOPKG_PKGVAR/nzbget.lock|g" \ -e "s|ConfigTemplate=.*$|ConfigTemplate=$SYNOPKG_PKGDEST/usr/local/share/nzbget/nzbget.conf|g" \ + -e 's|DestDir=.*$|DestDir=${MainDir}/completed|g' \ + -e 's|InterDir=.*$|InterDir=${MainDir}/intermediate|g' \ + -e 's|UnrarCmd=.*$|UnrarCmd=unrar|g' \ + -e 's|SevenZipCmd=.*$|SevenZipCmd=7z|g' \ + -e 's|UpdateCheck=.*$|UpdateCheck=none|g' \ + -e "s|CertStore=.*$|CertStore=$SYNOPKG_PKGDEST/usr/local/bin/cacert.pem|g" \ -i $CFG # copy bundled scripts mkdir -p /var/packages/nzbget/shares/$DOWNLOAD_PATH/scripts/ From 607c72fd0b814aabd5c4b760f48367a8a58d8f69 Mon Sep 17 00:00:00 2001 From: phnzb Date: Tue, 5 Dec 2023 08:00:13 +0000 Subject: [PATCH 09/16] Update Synology readme and build info. --- synology/README.md | 53 ++++++++++++++++++++++++++++++++++++++++++ synology/build-info.md | 45 ++++++++++++++++++++++++++++------- 2 files changed, 90 insertions(+), 8 deletions(-) diff --git a/synology/README.md b/synology/README.md index e69de29bb..eb36e8625 100644 --- a/synology/README.md +++ b/synology/README.md @@ -0,0 +1,53 @@ +# Synology nzbget packages + +## Package versions + +We provide native packages for most Synology platforms (DSM 7.x). To select a correct package for yours platform please find Synology model in [Synology NAS list](https://kb.synology.com/en-us/DSM/tutorial/What_kind_of_CPU_does_my_NAS_have) and select package based on `Package Arch` field: + +| Package Arch | NZBGet package name +|:---------------|:- +| alpine | nzbget-armv7-*.spk +| alpine4k | nzbget-armv7-*.spk +| apollolake | nzbget-x86_64-*.spk +| armada370 | nzbget-armada370-*.spk +| armada375 | nzbget-armada375-*.spk +| armada37xx | nzbget-armv8-*.spk +| armadaxp | nzbget-armadaxp-*.spk +| avoton | nzbget-x86_64-*.spk +| braswell | nzbget-x86_64-*.spk +| broadwell | nzbget-x86_64-*.spk +| broadwellnk | nzbget-x86_64-*.spk +| broadwellntb | nzbget-x86_64-*.spk +| broadwellntbap | nzbget-x86_64-*.spk +| bromolow | nzbget-x86_64-*.spk +| cedarview | nzbget-x86_64-*.spk +| coffeelake | nzbget-x86_64-*.spk +| comcerto2k | `not supported` +| denverton | nzbget-x86_64-*.spk +| evansport | nzbget-i686-*.spk +| geminilake | nzbget-x86_64-*.spk +| grantley | nzbget-x86_64-*.spk +| kvmx64 | nzbget-x86_64-*.spk +| monaco | nzbget-monaco-*.spk +| purley | nzbget-x86_64-*.spk +| rtd1296 | nzbget-armv8-*.spk +| rtd1619 | nzbget-armv8-*.spk +| skylaked | nzbget-x86_64-*.spk +| v1000 | nzbget-x86_64-*.spk + +## Installing / upgrading / uninstalling / reinstalling + +To install NZBGet package from Synology Package Center press Manual Install and select downloaded package -> Next -> Agree -> Select shared folder and download directory -> Credentials for web interface -> Done. +After installation NZBGet web interface will be availabe from http://[Synology NAS IP or Hostname]:6789. Also this link avaulable from package center "Open" button on installed NZBGet package icon. + +To upgrade nzbget package - do the same thing with new package. NZBGet settings will be keeped. + +Uninstall - from Package center select NZBGet package and hit uninstall in action combo box. You can keep existing config files or cleanup all package data. If you keep existing config files, all settings selected in next package installations will be ignored, old config files settings will be preferred. + +## Shared folders permissions and nzbget + +When installed, the package adds all the necessary permissions for the selected Shared folder to work correcty. If you want to change the download path to another shared folder, you must manually add permissions for the nsbget user. For example - you changed MainDir to /volume2/some_shared_folder/some_download_directory. You must add r/w permission to `nzbget` user via Control Panel -> Shared Folder -> Select `some_shared_folder` -> Edit -> Permissions tab -> select from combobox `System internal user` -> nzbget -> Read/Write -> Save. + +## Extensions + +You can put custom extension in `ScriptDir` directory. During installation this directory appears in `selected_shared_folder\selected_download_directory\scripts` and populates with default scripts (Email and Logger). Synology DSM 7.x bundled with python 3.8, so you must make sure that the script you are installing supports it. Our forks of VideoSort/FailureLink/FakeDetector are tested and working. diff --git a/synology/build-info.md b/synology/build-info.md index 60d099835..5f1330a1b 100644 --- a/synology/build-info.md +++ b/synology/build-info.md @@ -1,15 +1,44 @@ -About ------ +# About + "build-nzbget.sh" is a bash script which is used to build nzbget Synology packages. -Prerequisites -------------- +# Prerequisites + +## Synology toolkit and environments + +Basic setup (assuming have Debian/Ubuntu host): + +1. Install Synology toolkit (reference - https://help.synology.com/developer-guide/getting_started/prepare_environment.html) +``` +sudo apt-get install git cifs-utils python3 python3-pip +sudo mkdir -p /toolkit +sudo chmod 777 /toolkit +cd /toolkit +git clone https://github.com/SynologyOpenSource/pkgscripts-ng +cd /toolkit/pkgscripts-ng/ +git checkout DSM7.0 +``` + +2. Install needed environments (please note - user must have sudo access) + +- according to https://help.synology.com/developer-guide/appendix/platarchs.html - one per architecture, and specific separately +- we exclude `comcerto2k` - toolchain for this platform does not support C++14 + +``` +cd /toolkit/pkgscripts-ng/ +for PLATFORM in alpine armada370 armada375 armada37xx armada38x armadaxp avoton evansport monaco; do sudo ./EnvDeploy -v 7.0 -p $PLATFORM; done +``` + +## Building NZBGet -Building NZBGet ---------------- +From cloned repository run +``` +sudo bash synology/build-nzbget.sh [platform] +``` +Please note - user must have sudo access. Synology toolkit requires root access to build packages. -Output files ------------- +## Output files +- /toolkit/result_spk/nzbget/*.spk - one file per platform From 46e621f7673a5f48db17fe5dcff9e246275af4e5 Mon Sep 17 00:00:00 2001 From: phnzb Date: Tue, 5 Dec 2023 08:02:51 +0000 Subject: [PATCH 10/16] Update CI/CD --- .github/workflows/build.yml | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index be459b4eb..e2f04f3c8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -8,14 +8,14 @@ on: workflow_dispatch: jobs: - # build-windows: - # uses: ./.github/workflows/windows.yml + build-windows: + uses: ./.github/workflows/windows.yml - # build-linux: - # uses: ./.github/workflows/linux.yml + build-linux: + uses: ./.github/workflows/linux.yml - # build-osx: - # uses: ./.github/workflows/osx.yml + build-osx: + uses: ./.github/workflows/osx.yml build-synology: uses: ./.github/workflows/synology.yml @@ -24,8 +24,7 @@ jobs: env: PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }} runs-on: ubuntu-latest - # needs: [build-windows, build-linux, build-osx] - needs: [build-synology] + needs: [build-windows, build-linux, build-osx, build-synology] steps: - name: Download build artifacts @@ -77,10 +76,11 @@ jobs: path: builds/* retention-days: 5 - # - name: Delete unneded platform-specific artifacts - # uses: geekyeggo/delete-artifact@v2 - # with: - # name: | - # nzbget-windows-installers - # nzbget-linux-installers - # nzbget-osx-installers + - name: Delete unneded platform-specific artifacts + uses: geekyeggo/delete-artifact@v2 + with: + name: | + nzbget-windows-installers + nzbget-linux-installers + nzbget-osx-installers + nzbget-synology-packages From 3130ee074f67db2ee0a005583764d89f22de441e Mon Sep 17 00:00:00 2001 From: phnzb Date: Tue, 5 Dec 2023 08:17:02 +0000 Subject: [PATCH 11/16] Update base README. Fix typos. --- README.md | 2 ++ synology/README.md | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3eea975ae..f8acc8e78 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,8 @@ Please download binaries from our [releases](https://github.com/nzbgetcom/nzbget We also provide a docker image for popular architectures. [Docker readme](docker/README.md) +Synology DSM 7.x packages also available. [Synology readme](synology/README.md) + ## Supported platforms for installers `Windows`: Windows 7 and later, 32 or 64 Bit. diff --git a/synology/README.md b/synology/README.md index eb36e8625..854190383 100644 --- a/synology/README.md +++ b/synology/README.md @@ -46,7 +46,7 @@ Uninstall - from Package center select NZBGet package and hit uninstall in actio ## Shared folders permissions and nzbget -When installed, the package adds all the necessary permissions for the selected Shared folder to work correcty. If you want to change the download path to another shared folder, you must manually add permissions for the nsbget user. For example - you changed MainDir to /volume2/some_shared_folder/some_download_directory. You must add r/w permission to `nzbget` user via Control Panel -> Shared Folder -> Select `some_shared_folder` -> Edit -> Permissions tab -> select from combobox `System internal user` -> nzbget -> Read/Write -> Save. +When installed, the package adds all the necessary permissions for the selected Shared folder to work correcty. If you want to change the download path to another shared folder, you must manually add permissions for the nzbget user. For example - you changed MainDir to /volume2/some_shared_folder/some_download_directory. You must add r/w permission to `nzbget` user via Control Panel -> Shared Folder -> Select `some_shared_folder` -> Edit -> Permissions tab -> select from combobox `System internal user` -> nzbget -> Read/Write -> Save. ## Extensions From 8464e4f2bc7b782a6e62326aaae324a4c9aafe68 Mon Sep 17 00:00:00 2001 From: phnzb Date: Tue, 5 Dec 2023 08:30:29 +0000 Subject: [PATCH 12/16] Add synology build badge --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f8acc8e78..7d8833418 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ [![windows build](https://github.com/nzbgetcom/nzbget/actions/workflows/windows.yml/badge.svg?branch=main)](https://github.com/nzbgetcom/nzbget/actions/workflows/windows.yml) [![osx build](https://github.com/nzbgetcom/nzbget/actions/workflows/osx.yml/badge.svg)](https://github.com/nzbgetcom/nzbget/actions/workflows/osx.yml) [![docker build](https://github.com/nzbgetcom/nzbget/actions/workflows/docker.yml/badge.svg)](https://github.com/nzbgetcom/nzbget/actions/workflows/docker.yml) +[![synology build](https://github.com/nzbgetcom/nzbget/actions/workflows/synology.yml/badge.svg)](https://github.com/nzbgetcom/nzbget/actions/workflows/synology.yml) ![Contributions welcome](https://img.shields.io/badge/contributions-welcome-blue.svg) From bb8465e57d9bac7397847724304fda691bd3b6fa Mon Sep 17 00:00:00 2001 From: phnzb Date: Tue, 5 Dec 2023 08:33:57 +0000 Subject: [PATCH 13/16] Update synology workflow name --- .github/workflows/synology.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/synology.yml b/.github/workflows/synology.yml index 5311ed853..78d4718ce 100644 --- a/.github/workflows/synology.yml +++ b/.github/workflows/synology.yml @@ -1,4 +1,4 @@ -name: linux build +name: synology build on: workflow_call: From 77ce062bae2461b2bcfb5c7608cff006933ba245 Mon Sep 17 00:00:00 2001 From: phnzb Date: Tue, 5 Dec 2023 12:07:55 +0000 Subject: [PATCH 14/16] Update Synology README --- synology/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/synology/README.md b/synology/README.md index 854190383..03b1b513f 100644 --- a/synology/README.md +++ b/synology/README.md @@ -38,7 +38,7 @@ We provide native packages for most Synology platforms (DSM 7.x). To select a co ## Installing / upgrading / uninstalling / reinstalling To install NZBGet package from Synology Package Center press Manual Install and select downloaded package -> Next -> Agree -> Select shared folder and download directory -> Credentials for web interface -> Done. -After installation NZBGet web interface will be availabe from http://[Synology NAS IP or Hostname]:6789. Also this link avaulable from package center "Open" button on installed NZBGet package icon. +After installation NZBGet web interface will be availabe from http://[Synology NAS IP or Hostname]:6789 with provided during installation username/password (nzbget/nzbget by default). Also this link available from package center "Open" button on installed NZBGet package icon. To upgrade nzbget package - do the same thing with new package. NZBGet settings will be keeped. From 9ab744406b2229c6c9872c630dd3c21b92c6bea5 Mon Sep 17 00:00:00 2001 From: phnzb Date: Thu, 14 Dec 2023 08:38:56 +0000 Subject: [PATCH 15/16] Update synology workflow --- .github/workflows/build.yml | 2 +- .github/workflows/synology.yml | 14 +++++++++++++- synology/build-nzbget.sh | 16 +++++++++++----- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3d74ff02c..57371068b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -100,7 +100,7 @@ jobs: - name: Create latest artifacts run: | cp $(find nzbget-installers/ -name *linux.run) nzbget-installers/nzbget-latest-testing-bin-linux.run - cp $(find nzbget-installers/ -name *windows-setup.exe) nzbget-installers/nzbget-latest-testing-bin-windows-setup + cp $(find nzbget-installers/ -name *windows-setup.exe) nzbget-installers/nzbget-latest-testing-bin-windows-setup.exe - name: Delete tag and release uses: dev-drprasad/delete-tag-and-release@v0.2.1 diff --git a/.github/workflows/synology.yml b/.github/workflows/synology.yml index 78d4718ce..95fb0fc3a 100644 --- a/.github/workflows/synology.yml +++ b/.github/workflows/synology.yml @@ -17,7 +17,19 @@ jobs: - name: Build run: | - sudo bash synology/build-nzbget.sh + sudo -E bash synology/build-nzbget.sh + + - name: Rename build artifacts + if: github.ref_name != 'main' + run: | + cd /toolkit/result_spk/nzbget/ + VERSION=$(date '+%Y%m%d') + NEW_VERSION="$VERSION-testing" + for FILE in *.spk; do + [ -f $FILE ] || continue + NEW_FILE=${FILE/$VERSION/$NEW_VERSION} + mv $FILE $NEW_FILE + done - name: Upload build artifacts uses: actions/upload-artifact@v3 diff --git a/synology/build-nzbget.sh b/synology/build-nzbget.sh index 0bb69eb7c..12b699902 100644 --- a/synology/build-nzbget.sh +++ b/synology/build-nzbget.sh @@ -32,15 +32,21 @@ chmod -x SynoBuildConf/depends chmod +x INFO.sh # correct build version in INFO.sh -VERSION=$(grep "AC_INIT(nzbget, " configure.ac | cut -d "," -f 2) -VERSION=${VERSION//[. ]/} -VERSION=$(date '+%Y%m%d')-$VERSION -sed -e "s|version=.*$|version=\"$VERSION\"|g" -i INFO.sh +VERSION=$(grep "AC_INIT(nzbget, " configure.ac | cut -d "," -f 2 | xargs) +SPK_VERSION=$(date '+%Y%m%d')-${VERSION//./} +# if running from CI/CD, add testing to builds from non-main branch +if [ -n "$GITHUB_REF_NAME" ]; then + if [ "$GITHUB_REF_NAME" != "main" ]; then + NEW_VERSION="$VERSION-testing-$(date '+%Y%m%d')" + sed -e "s|AC_INIT(nzbget.*|AC_INIT(nzbget, $NEW_VERSION, https://github.com/nzbgetcom/nzbget/issues)|g" -i configure.ac + fi +fi +sed -e "s|version=.*$|version=\"$SPK_VERSION\"|g" -i INFO.sh # build $TOOLKIT/pkgscripts-ng/PkgCreate.py -v 7.0 -c -P 2 nzbget $BUILD_PARAM # remove debug packages and set user perms on packages -mv $TOOLKIT/result_spk/nzbget-$VERSION/ $TOOLKIT/result_spk/nzbget/ +mv $TOOLKIT/result_spk/nzbget-$SPK_VERSION/ $TOOLKIT/result_spk/nzbget/ rm $TOOLKIT/result_spk/nzbget/*_debug.spk chmod 666 $TOOLKIT/result_spk/nzbget/* From 71840123852e2e54974c9aebb711d02aa52c3528 Mon Sep 17 00:00:00 2001 From: phnzb Date: Thu, 14 Dec 2023 09:30:24 +0000 Subject: [PATCH 16/16] Fix permissions problems --- .github/workflows/synology.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/synology.yml b/.github/workflows/synology.yml index 95fb0fc3a..70be5cb7f 100644 --- a/.github/workflows/synology.yml +++ b/.github/workflows/synology.yml @@ -28,7 +28,7 @@ jobs: for FILE in *.spk; do [ -f $FILE ] || continue NEW_FILE=${FILE/$VERSION/$NEW_VERSION} - mv $FILE $NEW_FILE + sudo mv $FILE $NEW_FILE done - name: Upload build artifacts