====== Ubiquiti - Controller - Upgrade Controller ====== Read the synopsis for the specific upgrade release at https://community.ui.com/releases. Obtain the URL from the **Download Links**. * Example, https://dl.ui.com/unifi/6.0.36/unifi_sysvinit_all.deb. ---- ===== Use SSH ===== ssh ubnt@192.168.1.10 ubnt@192.168.1.10's password: cd /tmp ls -l rm unifi_sysvinit_all.deb wget https://dl.ui.com/unifi/6.0.36/unifi_sysvinit_all.deb sudo dpkg -i unifi_sysvinit_all.deb rm unifi_sysvinit_all.deb ---- ===== On UDMP ===== unifi-os shell rm /tmp/unifi_sysvinit_all.deb &> /dev/null; curl -o "/tmp/unifi_sysvinit_all.deb" https://dl.ui.com/unifi/6.0.36/unifi_sysvinit_all.deb && dpkg -i /tmp/unifi_sysvinit_all.deb && rm /tmp/unifi_sysvinit_all.deb ---- ===== Use Bash Script ===== #!/bin/bash https_url='https://dl.ui.com' package_name='unifi_sysvinit_all.deb' upgrade_log="${HOME}/ssh_upgrade.log" # CLI opts checksum='' version='' function cleanup { echo "$(timestamp) Removing temp directory ${output_dir}" | tee -a "${upgrade_log}" rm -rf "${output_dir}" } function timestamp { local __tstamp=$1 local mytstamp=$(date '+%Y-%m-%d %H:%M:%S') if [[ "$__tstamp" ]] then eval $__tstamp="'${mytstamp}'" else echo "${mytstamp}" fi } function usage { echo "Usage: $0 [-v ] [-c ]" 1>&2 exit 1 } # Get command line args while getopts ":c:v:" opt do case "${opt}" in c) checksum="${OPTARG}" ;; v) version="${OPTARG}" ;; *) usage ;; esac done shift $((OPTIND-1)) # Make sure required args are passed if [ -z "${version}" ] || [ -z "${checksum}" ] then usage fi # Make sure checksum looks like a sha256 hash if ! [[ ${checksum} =~ ^[0-9a-f]{64}$ ]] then echo "$(timestamp) Error: checksum must be a sha256 hash string" | tee -a "${upgrade_log}" exit 1 fi # Get currently installed unifi package version current_ver=$(dpkg -s unifi | grep '^Version:' | grep -o -E '[0-9]+\.[0-9]+\.[0-9]+') target_ver=$(echo "${version}" | grep -o -E '[0-9]+\.[0-9]+\.[0-9]+') # Don't bother upgrading to same version as installed if [ "${current_ver}" = "${target_ver}" ] then echo "$(timestamp) Error: Current controller version and target controller version are the same (${current_ver})" | tee -a "${upgrade_log}" exit 1 fi # Create a temp dir to store downloads if ! output_dir=$(mktemp -d -t unifi_${version}_$(date +%Y-%m-%d-%H-%M-%S)_XXXXXXXXXX) then echo "$(timestamp) Error: Failed to create output directory" | tee -a "${upgrade_log}" exit 1 fi trap cleanup 0 # Download package echo "$(timestamp) Downloading ${https_url}/unifi/${version}/${package_name}" | tee -a "${upgrade_log}" cd "${output_dir}" && wget -O "${output_dir}/${package_name}" "${https_url}/unifi/${version}/${package_name}" retval=$? if [[ ! ${retval} -eq 0 ]] then echo "$(timestamp) Error: wget exited with error ${retval}" | tee -a "${upgrade_log}" exit 1 fi # Verify package checksum echo "${checksum} ${output_dir}/${package_name}" > "${output_dir}/${package_name}.sha256" if [ -f "${output_dir}/${package_name}.sha256" ] then echo "$(timestamp) Checking downloaded file integrity..." | tee -a "${upgrade_log}" if ! shasum -c "${output_dir}/${package_name}.sha256" -a 256 -s then echo "$(timestamp) Error: File failed integrity check" | tee -a "${upgrade_log}" exit 1 else echo "$(timestamp) File passed integrity check, performing package update" | tee -a "${upgrade_log}" dpkg --debug=1 --install "${output_dir}/${package_name}" | tee -a "${upgrade_log}" fi else echo "$(timestamp) Error: Cannot verify downloaded file integrity (missing checksum)" | tee -a "${upgrade_log}" exit 1 fi echo "$(timestamp) Done." | tee -a "${upgrade_log}" exit 0 Run it as: ./ssh_upgrade.sh -v 6.0.26-dfb550c0bf -c b4496144e3a9feb4a6779622611407b59d5cd48b8379c0c81525776aa068ffb0 ---- ===== References ===== https://help.ui.com/hc/en-us/articles/216655518-UniFi-UDM-UCK-How-to-Change-the-Controller-Version-Using-SSH- https://help.ui.com/hc/en-us/articles/216655518