CM5 with Ubuntu Plucky Support

Please support newer Ubuntu server version 25.04 codename plucky on Raspberry Pi Compute Module 5. I was able to update the install script which is attached for reference but you are not offering any packages in apt repository. It is still supported until January 2026 or are you only going to serve LTS support?

Thanks for quick response.

Reading package lists...
Error: Failed to fetch https://zk-sw-repo.s3.amazonaws.com/apt-repo-plucky-aarch64/dists/plucky/InRelease  403  Forbidden [IP: 52.217.121.233 443]
Error: The repository 'https://zk-sw-repo.s3.amazonaws.com/apt-repo-plucky-aarch64 plucky InRelease' is not signed.
Installing Zymkey Packages...Reading package lists...
Building dependency tree...
Reading state information...
Error: Unable to locate package libzymkeyssl
Error: Unable to locate package zkbootrtc
Error: Unable to locate package zkifc
Error: Unable to locate package zkapputilslib
Error: Unable to locate package zksaapps
Error: Unable to locate package zkpkcs11

Updated install_zk_sw.sh

#!/bin/bash

#---------------------------------------------------------------------------------------------------------------------------------------------------------------
# Copyright (C) 2021-2022 by copyright Zymbit
#
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without l> imitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#---------------------------------------------------------------------------------------------------------------------------------------------------------------

mod=""

# ensure running as root or exit
if [ "$(id -u)" != "0" ]; then
  echo "run this as root or use sudo" 2>&1 && exit 1;
fi;

function pip()
{
   python -m pip $@
}

function pip3()
{
   if [ "${distro}" != "bookworm" ] && [ "${distro}" != "noble" ] && [ "${distro}" != "plucky" ]
   then
      python3 -m pip $@
   else
      python3 -m pip $@ --break-system-packages
   fi
}

function apt()
{
   NEEDRESTART_MODE=a DEBIAN_FRONTEND=noninteractive DEBIAN_PRIORITY=critical \
      /usr/bin/apt --yes --quiet \
         --option Dpkg::Options::=--force-confold \
         --option Dpkg::Options::=--force-confdef \
         "$@" # &>/dev/null
}

# for older versions of Raspbian, insure that apt-transport-https is installed first
echo -n "Installing prerequisites (this might take a few minutes)..."
apt update --allow-releaseinfo-change
apt install libboost-thread-dev lsb-release

distro=`lsb_release -c | cut -f2 -d$'\t'`
if { uname -m | grep -q "arm"; }
then
   arch=""
else
   arch="-"`uname -m`
fi

if [ "$distro" = "noble" ] && [ "$distro" = "plucky" ]
then
   USE_SYSFS_GPIO=false
else 
   USE_SYSFS_GPIO=true
fi

if $USE_SYSFS_GPIO; then
   # ensure that the group 'gpio' exists
   if ! grep "^gpio" /etc/group; then
      if [ "$1" == "-y" ]
      then
         answer="YES"
      else
         echo "Group 'gpio' does not exist. This group is necessary for zymbit software to operate normally."
         read -p 'Type yes in all capital letters (YES) to create this group: ' answer <&1
      fi
      if [ "${answer}" == "YES" ]
      then
         # Add group 'gpio'
         groupadd -r gpio
      else
         echo "Quitting..."
         exit -1
      fi
      # Modify /etc/rc.local to change the group of /etc/sys/class/gpio
      if ! grep -q "chown -R root:gpio" /etc/rc.local; then
         [[ -f /etc/rc.local ]] || echo '#!/bin/sh' > /etc/rc.local
         echo "chown -R root:gpio /sys/class/gpio" >> /etc/rc.local
         echo "chmod -R ug+rw /sys/class/gpio" >> /etc/rc.local
      fi
   fi
fi

# Check for existence of udev rule
if [[ ! -f "/etc/udev/rules.d/80-gpio-noroot.rules" ]]; then
   echo "ACTION==\"add\", SUBSYSTEM==\"gpio\", PROGRAM=\"/bin/sh -c 'chown -R root:gpio /sys/\$devpath; chmod -R g+w /sys/\$devpath'\"" >> /etc/udev/rules.d/80-gpio-noroot.rules
fi

# jammy uses python3-dev; no longer supports python-dev
if [ "${distro}" != "jammy" ] && [ "${distro}" != "bookworm" ]  && [ "${distro}" != "noble" ] && [ "${distro}" != "plucky" ]
then
   apt install apt-transport-https curl libyaml-dev libssl-dev libcurl4-openssl-dev python3-pip python-setuptools i2c-tools
else
   apt install apt-transport-https curl libyaml-dev libssl-dev libcurl4-openssl-dev python3-pip python3-setuptools python3-pycurl i2c-tools
fi
if [ "${distro}" != "focal" ] && [ "${distro}" != "bookworm" ] && [ "${distro}" != "bullseye" ] && [ "${distro}" != "jammy" ] && [ "${distro}" != "noble" ] && [ "${distro}" != "plucky" ]
then
   apt install -y python-pip
   pip install inotify || exit
   pip install pycurl progress python-gnupg
fi
pip3 install inotify progress python-gnupg
pip3 install pycurl &>/dev/null || exit  # Will error for bookworm; installed via apt install above
echo "done."

baseurl="https://zk-sw-repo${mod}.s3.amazonaws.com"
# import zymbit gpg key
gpg_key_url="$baseurl/apt-zymkey-pubkey.gpg"
echo -n "Importing Zymbit Packages gpg key... "
# import the gpg key
curl -L "${gpg_key_url}" 2>/dev/null | sudo gpg --dearmor --yes -o /usr/share/keyrings/zymbit.gpg
echo "done."

# add zymbit apt repo to sources list
apt_source_path="/etc/apt/sources.list.d/zymbit.list"
echo -n "Installing $apt_source_path..."
repodist="$distro"
#if [[ "$distro" == noble ]]; then
#   repodist="jammy"
#fi
echo "deb [signed-by=/usr/share/keyrings/zymbit.gpg] $baseurl/apt-repo-${repodist}${arch}/ ${repodist} main" > $apt_source_path
echo "done...Updating now."
apt update

# install our packages
echo -n "Installing Zymkey Packages..."
apt install libzymkeyssl zkbootrtc zkifc zkapputilslib zksaapps zkpkcs11 cryptsetup || exit
if [ "${distro}" != "focal" ] && [ "${distro}" != "bookworm" ] && [ "${distro}" != "bullseye" ] && [ "${distro}" != "jammy" ] && [ "${distro}" != "noble" ] && [ "${distro}" != "plucky" ]
then
   pip install -U zku zk_luks &>/dev/null
fi
pip3 install -U zku zk_luks &>/dev/null
if [ "${distro}" != "focal" ] && [ "${distro}" != "bookworm" ] && [ "${distro}" != "bullseye" ] && [ "${distro}" != "jammy" ] && [ "${distro}" != "noble" ] && [ "${distro}" != "plucky" ]
then
   ln -s /usr/local/lib/python2.7/dist-packages/zk_luks/__init__.py /usr/local/bin/create_zk_crypt_vol
fi

# Install example scripts
echo; echo "Installing example scripts..."
mkdir -p /usr/local/share/zymkey/examples
curl -G https://s3.amazonaws.com/zk-sw-repo/zk_app_utils_test.py > /usr/local/share/zymkey/examples/zk_app_utils_test.py
curl -G https://s3.amazonaws.com/zk-sw-repo/zk_crypto_test.py > /usr/local/share/zymkey/examples/zk_crypto_test.py

curl -G https://s3.amazonaws.com/zk-sw-repo/zk_prep_encr > /usr/local/bin/zk_prep_encr
chmod +x /usr/local/bin/zk_prep_encr

# Make sure necessary crypt packages are included
apt install cryptsetup-initramfs cryptsetup-run 

# Check for NVIDIA Xavier platform
nv_model_fn="/proc/device-tree/model"
if [ -e  ${nv_model_fn} ]
then
   if grep -q -i "Xavier" ${nv_model_fn}
   then
      # Configure the zymkey environment variables for the xavier
      echo "Configuring zymkey environment for Xavier..."
      sed -i "s/216/436/" /var/lib/zymbit/zkenv.conf
      sed -i "s/=1/=8/" /var/lib/zymbit/zkenv.conf
   fi
fi

# Debian 6.6 and later use different GPIO numbering, no long forces the base number of the main GPIO controller to be global GPIO 0.
# Need to determine correct wake pin number
function version_gt() { test "$(printf '%s\n' "$@" | sort -V | head -n 1)" = "$1"; }
version_to_check="6.6"
current_version=`uname -r`
if version_gt $version_to_check $current_version
then
   wake_pin=`grep GPIO4 /sys/kernel/debug/gpio | sed -r 's/[^0-9]*([0-9]*).*/\1/'`
   echo "ZK_GPIO_WAKE_PIN=$wake_pin" > /var/lib/zymbit/zkenv.conf
fi

# temp workaround to set for noble for standalone apps
if [[ "$distro" == noble ]] && [ "${distro}" != "plucky" ]
then
   if grep -q "Pi 5" /sys/firmware/devicetree/base/model; then
      wake_pin=575
   elif grep -q "Compute Module 5" /sys/firmware/devicetree/base/model; then
      wake_pin=573
   elif grep -q "Pi 4" /sys/firmware/devicetree/base/model; then
      wake_pin=516
   elif grep -q "Compute Module 4" /sys/firmware/devicetree/base/model; then
      wake_pin=516
   else
      :
   fi
   if [ -n "$wake_pin" ]; then
      echo "ZK_GPIO_WAKE_PIN=$wake_pin" > /var/lib/zymbit/zkenv.conf
   fi
fi

#jammy uses dialout group for i2c. Add zymbit to dialout group
if [[ "${distro}" == jammy ]] || [[ "$distro" == noble ]] && [ "${distro}" != "plucky" ]
then
   adduser zymbit dialout
fi

systemctl restart zkifc
sync
sleep 10

# reboot
echo "Rebooting now..."
reboot