Skip to content

Instantly share code, notes, and snippets.

@mietzen
Last active April 8, 2024 08:26
Show Gist options
  • Save mietzen/e9b823006cf241662cb41fd3ab353d01 to your computer and use it in GitHub Desktop.
Save mietzen/e9b823006cf241662cb41fd3ab353d01 to your computer and use it in GitHub Desktop.
A shell script to auto update SynoCommunity Packages

Auto Update SynoCommunity Packages

I always had the problem that synology doesn't let us auto update 3rd party packages such as the ones from SynoCommunity, so I wrote a shell script to auto update SynoCommunity Packages:

#! /bin/bash -e

PATH="/bin:/usr/syno/bin:${PATH}"

SYSTEM_PKGS=$(synopkg checkupdateall)

if [[ $(echo "${SYSTEM_PKGS}" | jq length) == 0 ]]
then
    echo "Everything is up to date!"
    exit 0
fi

TEMP_DIR=$(mktemp -d --suffix '_SynoCommunityAutoUpdate')
cd ${TEMP_DIR}

ARCH=$(uname -a | awk '{print $14}' | cut -d'_' -f2)
BUILD=$(uname -v | awk '{print $1}' | grep -o -E '[0-9]+')

PKGS=$(curl -SsL -d "arch=${ARCH}" -d 'language=enu' -d "build=${BUILD}" https://packages.synocommunity.com)

echo "${SYSTEM_PKGS}" | jq '.[]' -c | while read -r line
do
    PKG_NAME=$(echo "$line" | jq -r '.id')
    if $(echo "${PKGS}" | jq -e "any(.packages[].package; contains(\"${PKG_NAME}\"))")
    then
        NEW_VERSION=$(echo "$line" | jq -r '.version')
        OLD_VERSION=$(synopkg version ${PKG_NAME})
        echo "Upgrading ${PKG_NAME} from ${OLD_VERSION} to ${NEW_VERSION}"

        LINK=$(echo "${PKGS}" | jq ".packages[] | select(.package==\"${PKG_NAME}\") | .link" -r)
        echo "Downloading to: ${TEMP_DIR}/${PKG_NAME}-${NEW_VERSION}.spk"
        curl -SsL -o ${PKG_NAME}-${NEW_VERSION}.spk ${LINK}
        INSTALL=$(synopkg install ${PKG_NAME}-${NEW_VERSION}.spk)
        if [[ $(echo ${INSTALL} | jq '.success' -r) == 'true' ]]
        then
            echo "Successfully installed ${PKG_NAME}: ${NEW_VERSION}"
        else
            echo "Something went wrong!"
            echo "${INSTALL}" | jq
            echo ""
            echo "Dumped enviroment at: ${TEMP_DIR}"
            echo "${INSTALL}" > install_error.json
            echo "${SYSTEM_PKGS}" > system_pkgs.json
            echo "${PKGS}" > synocommunity_pkgs.json
            echo "${ARCH}" > arch
            echo "${BUILD}" > build
            echo "${PKG_NAME}" > pkg_name
            echo "${NEW_VERSION}" > version
            exit 1
        fi
    else
        echo "${PKG_NAME}: not found in SynoCommunity repository!"
    fi
done
rm -rf ${TEMP_DIR}

Install

SSH into your NAS, then make a folder to store the script:

$ mkdir -p $HOME/.local/bin

Copy the script above in to a file:

$ nano $HOME/.local/bin/synocommunity_autoupdate

Make it executable:

$ chmod +x $HOME/.local/bin/synocommunity_autoupdate

Create a scheduled task (user defined script) to run once per day as root.
As command put in the output of:

$ echo "$HOME/.local/bin/synocommunity_autoupdate"

Tested on:

  • DS418Play (DSM 7.2)
  • DS216Play (DSM 7.2)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment