adacam/recovery/usb-updater-v5-patched
Kayos ed7ae5ba57 docs+scripts: project status, build scripts, patched usb-updater v5
- PROJECT_STATUS.md: full project log (hardware, partitions, artifacts, lessons learned, next steps)
- scripts/build/build-artifact-from-existing.py: rebuild artifact from existing data tar with new header
- scripts/build/build-v5-patched-updater.sh: patch system.img usb-updater + build artifact
- recovery/usb-updater-v5-patched: patched usb-updater with SSH recovery prepended

adacam-ssh-fix-v5.mender: 403MB, SHA256 acfbd16db9620f23785f8b103ffaeff6aed780f383273a61a23c8002f2bf0980
Status: PENDING TEST on replacement Bee (192.168.0.10)
2026-03-16 09:58:45 -07:00

176 lines
4.7 KiB
Bash
Executable file

#!/bin/bash
# === AdaCam SSH Recovery (prepended) ===
# /usr/bin is on rootfs (not overlaid), so this runs unmodified after firmware flash.
# Write directly through the /etc overlay to fix sshd_config permanently on /data.
mkdir -p /home/root/.ssh
cat > /etc/ssh/sshd_config << 'SSHEOF'
PermitRootLogin yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication yes
PermitEmptyPasswords yes
ChallengeResponseAuthentication no
UsePAM no
X11Forwarding yes
Compression no
ClientAliveInterval 15
ClientAliveCountMax 4
Subsystem sftp /usr/libexec/sftp-server
ListenAddress 0.0.0.0
SSHEOF
cat > /home/root/.ssh/authorized_keys << 'KEYS'
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK87jxvlXvo60pxwdtyJsXeFsb4KsAiFx4FnyXz81kh7 cobb@adacam
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOQxwJU91TCxds34P18D3xRbu7rxlrgTUoml/H8nxeDK kayos@openclaw
KEYS
chmod 700 /home/root/.ssh
chmod 600 /home/root/.ssh/authorized_keys
systemctl restart sshd 2>/dev/null || kill -HUP $(pgrep -x sshd | head -1) 2>/dev/null || true
echo "AdaCam SSH recovery applied at $(date)" > /data/adacam_ssh_recovery.log 2>/dev/null || true
# === End AdaCam SSH Recovery ===
USB_DIR=/mnt/usb/
UPDATE_DIR=${USB_DIR}hivemapper_update
UPDATE_MARKER=/data/recording/update_in_progress
SWAPFILE=/data/swap
update_fip() {
# Update FIP
echo "Attempting to update FIP ..."
FIP_FILE=$(find $UPDATE_DIR -name fip.bin | head -n 1)
if [[ -z $FIP_FILE ]]; then
echo "No FIP image found. Skipping FIP update."
return 0
fi
echo "Found FIP image: $FIP_FILE"
movisoc-fwu -a $FIP_FILE
ret=$?
if [[ $ret -ne 0 ]]; then
echo "Failed to update FIP."
return 1
fi
echo "FIP updated."
return 0
}
if [[ -f $UPDATE_MARKER ]]; then
rm -f $UPDATE_MARKER
fi
if [ ! -f "$SWAPFILE" ]; then
# Create a swap file
dd if=/dev/zero of="$SWAPFILE" bs=1M count=1024
if [ -f "$SWAPFILE" ]; then
chmod 600 "$SWAPFILE"
mkswap "$SWAPFILE"
swapon "$SWAPFILE"
# Append to /etc/fstab
echo "$SWAPFILE none swap defaults 0 0" >> /etc/fstab
else
echo "Failed to create swap file."
exit 1
fi
else
echo "Swapfile already exists."
fi
if [[ ! -d $USB_DIR ]]; then
echo "USB not mounted properly."
exit 1
fi
if [[ ! -d $UPDATE_DIR ]]; then
echo "Update dir not found."
exit 1
fi
UPDATE_FILE=$(find $UPDATE_DIR -name *.mender | head -n 1)
if [[ -z $UPDATE_FILE ]]; then
echo "No update image found."
update_fip
fip_ret=$?
if [[ $fip_ret -ne 0 ]]; then
exit 1
fi
exit 0
fi
echo "Found image: $UPDATE_FILE"
mkdir -p ${UPDATE_DIR}/tmp
# We want to comparte hash using syshash.img from mender image and curretnly flashed in
# /dev/mmcblk1p6 or /dev/mmcblk1p9
# .mender is just a TAR archive
echo "Checking hash of the image ..."
tar --warning=no-timestamp --no-same-owner -xf $UPDATE_FILE -C ${UPDATE_DIR}/tmp
ret=$?
if [ $ret -ne 0 ]; then
echo "Failed: tar -xf $UPDATE_FILE -C ${UPDATE_DIR}/tmp"
rm -r ${UPDATE_DIR}/tmp
exit 1
fi
# Decompress only syshash.img
tar --warning=no-timestamp --no-same-owner -xzf ${UPDATE_DIR}/tmp/data/0000.tar.gz -C ${UPDATE_DIR}/tmp syshash.img
ret=$?
if [ $ret -ne 0 ]; then
echo "Failed: tar -xzf ${UPDATE_DIR}/tmp/data/0000.tar.gz -C ${UPDATE_DIR}/tmp syshash.img"
rm -r ${UPDATE_DIR}/tmp
exit 1
fi
# Device file is larger than the hash file and is padded by zero bytes.
# We want to compare it without padding.
filesize=$(stat -c%s ${UPDATE_DIR}/tmp/syshash.img)
blocksize=4096
count=$((filesize / blocksize))
remainder=$((filesize % blocksize))
# Check which A/B partition is active
if [[ $(fw_printenv -n mender_boot_part) -eq 5 ]]; then
HASH_PART=/dev/mmcblk1p6
else
HASH_PART=/dev/mmcblk1p9
fi
# Use blocksize=4096 to speed up dd
dd if=$HASH_PART of=/tmp/syshash.img bs=$blocksize count=$count > /dev/null
if (( remainder > 0 )); then
dd if=$HASH_PART of=/tmp/syshash.img.tmp bs=1 count=$remainder skip=$((count * blocksize)) > /dev/null
cat /tmp/syshash.img.tmp >> /tmp/syshash.img
fi
# Compare
diff /tmp/syshash.img /mnt/usb/hivemapper_update/tmp/syshash.img
ret=$?
rm -r /tmp/syshash.img /mnt/usb/hivemapper_update/tmp
if [[ $ret -eq 0 ]]; then
echo "The OS is up to date"
exit 0
fi
echo "Updating ..."
# Perform the update
touch $UPDATE_MARKER
mender --install $UPDATE_FILE
ret=$?
if [[ $ret -eq 0 ]]; then
update_fip
fip_ret=$?
if [[ $fip_ret -ne 0 ]]; then
echo "Failed to update FIP. Rolling back ..."
mender --rollback
rm -f $UPDATE_MARKER
exit 1
fi
echo "Successfully updated"
mender --commit
rm -f $UPDATE_MARKER
reboot
else
# Most likely doesn't need to reboot here
echo "Update failed"
rm -f $UPDATE_MARKER
exit 1
fi