DMSETUP="dmsetup"
FSTRIM="fstrim"
STAT="stat"
-BTRFS="/usr/sbin/btrfs"
FOTA_GUI="/usr/bin/fota_gui"
FOTA_GUI_ENABLE=
PART_USER=$("$BLKID" --match-token PARTLABEL=user -o device || "$BLKID" --match-token LABEL=user -o device)
}
-delete_btrfs_snapshot() {
- PART="$1"
- MNT_POINT="$2"
- log "[Info] Deleting btrfs snapshot"
- # we have to delete /fota/RO_update subvolume form root volume
- # so ensure that root volume is mounted
- if ! "$UMOUNT" "$MNT_POINT"; then
- log "[Error] Unable to umount $MNT_POINT"
- return 1
- fi
- if ! "$MOUNT" -o subvolid=5,rw "$PART" "$MNT_POINT"; then
- log "[Error] Unable to mount $PART root subvolume to: $MNT_POINT"
- return 1
- fi
- # delete subvolume /fota/RO_update containing checkpoint data
- "$BTRFS" subvolume delete "$MNT_POINT/fota/RO_update"
- # delete /fota directory, as it is no longer needed
- # because data was already restored
- rm -rf -- "$MNT_POINT/fota"
- if ! "$UMOUNT" "$MNT_POINT"; then
- log "[Error] Unable to umount $MNT_POINT"
- return 1
- fi
- # mount default volume
- if ! "$MOUNT" "$PART" "$MNT_POINT"; then
- log "[Error] Unable to mount default subvolume $PART to $MNT_POINT"
- return 1
- fi
-}
-
-restore_btrfs_snapshot() {
- PART="$1"
- MNT_POINT="$2"
- DEST_DIR="$MNT_POINT/ROOTFS"
-
- if [ -d "$MNT_POINT/fota/RO_update" ] && "$BTRFS" subvolume list "$MNT_POINT/fota/RO_update"; then
- # There is snapshot form previously failed update
- # Use snapshot as source data.
- log "[Info] Got previous snapshot."
- SOURCE_DIR="$MNT_POINT/fota/RO_update"
- # root volume 5 has to be set as default otherwise /ROOTFS subvolume can not be deleted
- # as it is default subvolume
- if ! "$BTRFS" subvolume set-default "$MNT_POINT"; then
- log "[Error] Unable to set $DEST_DIR as default subvolume"
- return 1
- fi
- "$BTRFS" subvolume delete "$DEST_DIR"
- rm -rf "$DEST_DIR"
- elif [ ! -d "$MNT_POINT/ROOTFS" ]; then
- # There is no /ROOTFS subvolume, create it and set is as default one.
- # This will execute during first update when data on root volume 5 exist.
- # After this update /ROOTFS will be default subvolume. Automatically mounted by mount.
- # Use / (root volume 5) as source data.
- log '[Info] Create initial /ROOTFS subvolume'
- SOURCE_DIR="$MNT_POINT"
- else
- # There is no data to restore because there was not previous update attempts.
- # Howether data is stored in /ROOTFS instead off inside root volume 5 /
- # Therefore there is no need to restore anything so remove any leftover data
- # and proceed with the update.
- log "[Info] Removing leftover data from previous snapshot."
- rm -rf -- "$MNT_POINT/fota"
- return 0
- fi
- if ! "$BTRFS" subvolume snapshot "$SOURCE_DIR" "$DEST_DIR"; then
- log "[Error] Unable to create snapshot from: $SOURCE_DIR to $DEST_DIR"
- return 1
- fi
-
- # Remove special directories /dev /proc /sys content
- # it is required because "btrfs subvolume snapshot" copies some files from this directories
- rm -rf -- "$DEST_DIR/proc/"* "$DEST_DIR/sys/"*
-
- # Make $DEST_DIR (/ROOTFS) as new root (/).
- # From now on it will become new default filesystem mounted by mount command.
- if ! "$BTRFS" subvolume set-default "$DEST_DIR"; then
- log "[Error] Unable to set $DEST_DIR as default subvolume"
- return 1
- fi
- if [ -d "$MNT_POINT/fota" ]; then
- delete_btrfs_snapshot "$PART" "$MNT_POINT"
- # Remount root volume 5 because delete_btrfs_snapshot will mount default subvolume
- # which is /ROOTFS.
- if ! "$UMOUNT" "$MNT_POINT"; then
- log "[Error] Unable to umount $MNT_POINT"
- return 1
- fi
- if ! "$MOUNT" -o subvolid=5,rw "$PART" "$MNT_POINT"; then
- log "[Error] Unable to mount $PART root subvolume to: $MNT_POINT"
- return 1
- fi
- fi
- # delete all files in root volume except new rootfs /ROOTFS
- for var in "$MNT_POINT"/* "$MNT_POINT"/.[!.]*; do
- test "$var" = "$MNT_POINT/ROOTFS" && continue
- rm -rf -- "$var"
- done
-}
-
-
#------------------------------------------------
# restore_checkpoint
#------------------------------------------------
FS_TYPE="$(blkid -o value -s TYPE "${PART}")"
if [ "$FS_TYPE" = "ext4" ]; then
"$BOW_RESTORE" "${PART}"
- elif [ "$FS_TYPE" = "btrfs" ]; then
- restore_btrfs_snapshot "${PART}" "${DIRECTORY}"
fi
}
log "[Debug] Mounted ${PARTITION} as F2FS checkpoint=disable" "${INT_LOG_FILE}"
}
-mount_btrfs_partition() {
- LABEL=${1}
- PARTITION=${2}
- DIRECTORY=${3}
- # mount btrfs root subvolume
- if ! "${MOUNT}" -o rw,subvolid=5 "${PARTITION}" "${DIRECTORY}"; then
- log "[Error] Cannot mount ${PARTITION} into ${DIRECTORY}"
- return 1
- fi
- log "[Debug] Mounted ${PARTITION} as btrfs" "${INT_LOG_FILE}"
-}
-
restore_mount_checkpoint_partition() {
LABEL=${1}
PARTITION=${2}
if ! mount_f2fs_partition "${LABEL}" "${PARTITION}" "${DIRECTORY}" ; then
return 1
fi
- elif [ "${FSTYPE}" = "btrfs" ]; then
- # btrfs has to be mounted to restore data
- if ! mount_btrfs_partition "${LABEL}" "${PARTITION}" "${DIRECTORY}"; then
- return 1
- fi
- restore_checkpoint "${PARTITION}" "${DIRECTORY}"
- # Create new checkpoint
- if ! "$MKDIR" -p "$DIRECTORY/fota"; then
- log "[Error] Unable to create $DIRECTORY/fota dir."
- return 1
- fi
- if ! "$BTRFS" subvolume snapshot "$DIRECTORY/ROOTFS" "$DIRECTORY/fota/RO_update"; then
- log "[Error] Unable to create snapshot from $DIRECTORY/ROOTFS to $DIRECTORY/fota/RO_update"
- retun 1
- fi
- # mount /ROOTFS partition instead of root volume
- if ! "$UMOUNT" "${PARTITION}"; then
- log "[Error] Cannot umount ${PARTITION}"
- return 1
- fi
- if ! "$MOUNT" "${PARTITION}" "${DIRECTORY}"; then
- log "[Error] Cannot mount ${PARTITION} into ${DIRECTORY}"
- return 1
- fi
-
else
"${MOUNT}" "${PARTITION}" "${DIRECTORY}"
log "[Info] Unsupported filesystem ${FSTYPE} on ${PARTITION}" "${INT_LOG_FILE}"
log "[Info] Changes on partition ${LABEL} commited (f2fs)" "${INT_LOG_FILE}"
}
-commit_btrfs_partition()
-{
- LABEL=${1}
- MNT_POINT=${2}
- PART_SYSTEM_DATA=$(blkid --match-token PARTLABEL="${LABEL}" -o device || blkid --match-token LABEL="${LABEL}" -o device)
- delete_btrfs_snapshot "${PART_SYSTEM_DATA}" "${MNT_POINT}"
- log "[Info] Changes on partition ${LABEL} commited (btrfs)" "${INT_LOG_FILE}"
-}
-
commit_partition()
{
LABEL=${1}
commit_bow_partition "${LABEL}"
elif [ "${TYPE}" = "f2fs" ]; then
commit_f2fs_partition "${LABEL}"
- elif [ "$TYPE" = "btrfs" ]; then
- commit_btrfs_partition "${LABEL}" "${MNT_POINT}"
else
log "[Info] Cannot commit ${LABEL}: Unsupported filesystem ${TYPE}" "${INT_LOG_FILE}"
fi