From 3f8fd6d433b38ed9f18ab7ffe25fd7a4a0c5c246 Mon Sep 17 00:00:00 2001 From: phnzb <139914799+phnzb@users.noreply.github.com> Date: Fri, 15 Dec 2023 11:35:15 +0300 Subject: [PATCH] Synology support (spk) (#72) --- .github/workflows/build.yml | 17 ++-- .github/workflows/synology.yml | 43 ++++++++++ .gitignore | 1 + README.md | 3 + synology/README.md | 53 ++++++++++++ synology/build-info.md | 44 ++++++++++ synology/build-nzbget.sh | 52 ++++++++++++ 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/build | 25 ++++++ synology/package/SynoBuildConf/depends | 4 + synology/package/SynoBuildConf/install | 55 ++++++++++++ .../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 | 32 +++++++ 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 + 28 files changed, 536 insertions(+), 6 deletions(-) create mode 100644 .github/workflows/synology.yml create mode 100644 synology/README.md create mode 100644 synology/build-info.md 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/build 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 53fdcaae5..57371068b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,11 +17,14 @@ jobs: 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, build-synology] steps: - name: Download build artifacts @@ -30,9 +33,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) if [ "$GITHUB_REF_NAME" != "main" ]; then VERSION="$VERSION-testing"; fi @@ -44,7 +48,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) @@ -80,6 +84,7 @@ jobs: nzbget-windows-installers nzbget-linux-installers nzbget-osx-installers + nzbget-synology-packages make-testing-release: runs-on: ubuntu-latest @@ -95,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 new file mode 100644 index 000000000..70be5cb7f --- /dev/null +++ b/.github/workflows/synology.yml @@ -0,0 +1,43 @@ +name: synology 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 -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} + sudo mv $FILE $NEW_FILE + done + + - 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: | + sudo rm /toolkit/result_spk/nzbget/*.spk diff --git a/.gitignore b/.gitignore index a5e6c1703..600afee68 100644 --- a/.gitignore +++ b/.gitignore @@ -78,6 +78,7 @@ ipch/ # NZBGet specific nzbget build +!synology/package/SynoBuildConf/build *.temp *.pyc pytest.ini diff --git a/README.md b/README.md index 3eea975ae..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) @@ -35,6 +36,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 new file mode 100644 index 000000000..03b1b513f --- /dev/null +++ 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 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. + +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 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 + +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 new file mode 100644 index 000000000..5f1330a1b --- /dev/null +++ b/synology/build-info.md @@ -0,0 +1,44 @@ +# About + +"build-nzbget.sh" is a bash script which is used to build nzbget Synology packages. + +# 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 + +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 + +- /toolkit/result_spk/nzbget/*.spk - one file per platform diff --git a/synology/build-nzbget.sh b/synology/build-nzbget.sh new file mode 100644 index 000000000..12b699902 --- /dev/null +++ b/synology/build-nzbget.sh @@ -0,0 +1,52 @@ +#!/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/ +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/ +chmod +x scripts/* +chmod -x scripts/vars +chmod +x SynoBuildConf/* +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 | 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-$SPK_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..1c5337249 --- /dev/null +++ b/synology/package/scripts/postinst @@ -0,0 +1,32 @@ +#!/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" \ + -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/ + 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