# Programs
XMLSTARLET=xmlstarlet
RESIZE2FS=resize2fs
+PARTED=parted
CLEANUP=( )
fi
}
+get_last_partition() {
+ local dev="$1"
+
+ "$PARTED" -s -m "$dev" unit s print | tail -1
+}
+
+get_partition() {
+ local dev="$1"
+ local id="$2"
+
+ "$PARTED" -s -m "$dev" unit s print | grep "^$id"
+}
+
+get_partition_count() {
+ local dev="$1"
+
+ expr $("$PARTED" -s -m "$dev" unit s print | wc -l) - 2
+}
+
+get_last_free_sector() {
+ local dev="$1"
+ local last_line=$("$PARTED" -s -m "$dev" unit s print free | tail -1)
+ local type=$(echo "$last_line" | cut -d: -f 5)
+
+ if [ "$type" = "free;" ]; then
+ echo "$last_line" | cut -d: -f 3
+ fi
+}
+
cleanup() {
# if something fails here, it shouldn't call cleanup again...
trap - EXIT
add_cleanup rmdir "$target"
export SNF_IMAGE_TARGET="$target"
+export SNF_IMAGE_ROOTDEV="${SNF_IMAGE_DEV}${SNF_IMAGE_ROOT}"
if [ ! -d "@tasksdir@" ]; then
log_error "snf-image/tasks directory is missing"
--- /dev/null
+#! /bin/bash
+
+### BEGIN TASK INFO
+# Provides: FixPartitionTable
+# RunBefore: FilesystemResizeUnmounted
+# Short-Description: Resize filesystem to use all the available space
+### END TASK INFO
+
+set -e
+. "@commondir@/common.sh"
+
+if [ ! -b "$SNF_IMAGE_DEV" ]; then
+ log_error "Device file:\`${SNF_IMAGE_DEV}' is not a block device"
+fi
+
+if [ $(get_partition_count "$SNF_IMAGE_DEV") -eq 0 ]; then
+ log_error "Device: \`${SNF_IMAGE_DEV}' does not contain any partition"
+fi
+
+retval=$(get_last_partition "$SNF_IMAGE_DEV")
+
+id=$(echo $retval | cut -d: -f1)
+
+if [ $id -gt 4 ]; then
+ log_error "We don't support logical volumes"
+fi
+
+pstart=$(echo $retval | cut -d: -f2)
+pend=$(echo $retval | cut -d: -f3)
+ptype=$(echo $retval | cut -d: -f5)
+
+if [ x"$ptype" = "x" ]; then
+ # Don't know how to handle this
+ echo "Warning: Last partition with id: \`$id' is empty" \
+ "or has unknown filesystem"
+
+ exit 0
+fi
+
+new_pend=$(get_last_free_sector "$SNF_IMAGE_DEV")
+
+#Extend the partition
+
+$PARTED -s -m "$SNF_IMAGE_DEV" rm $id
+$PARTED -s -m "$SNF_IMAGE_DEV" mkpart primary "$ptype" "$pstart" "$new_pend"
+
+#inform the kernel about the changes
+partprobe "$SNF_IMAGE_DEV"
+
+exit 0
+
+# vim: set sta sts=4 shiftwidth=4 sw=4 et ai :
#! /bin/bash
### BEGIN TASK INFO
-# Provides: ResizeUnmounted
+# Provides: FilesystemResizeUnmounted
# RunBefore: MountImage
+# RunAfter: FixPartitionTable
# Short-Description: Resize filesystem to use all the available space
### END TASK INFO
if [ ! -b "$SNF_IMAGE_DEV" ]; then
log_error "Device file:\`${SNF_IMAGE_DEV}' is not a block device"
-
fi
+
if [ -z "$SNF_IMAGE_TYPE" ]; then
log_error "Image type does not exist"
fi
-if [ "$SNF_IMAGE_TYPE" = "extdump" ]; then
- "$RESIZE2FS" "$SNF_IMAGE_DEV"
-fi
+last_partition=$(get_last_partition "$SNF_IMAGE_DEV")
+id=$(echo "$last_partition" | cut -d: -f1)
+ptype=$(echo "$last_partition" | cut -d: -f5)
+
+if [[ "$ptype" =~ ext[234] ]]; then
+ device="$SNF_IMAGE_DEV""$id"
+ "$RESIZE2FS" "$device"
+fi
exit 0
log_error "Target dir:\`$SNF_IMAGE_TARGET' is missing"
fi
-if [ ! -b "$SNF_IMAGE_DEV" ]; then
- log_error "Device file:\`$SNF_IMAGE_DEV' is not a block device"
+if [ ! -b "$SNF_IMAGE_ROOTDEV" ]; then
+ log_error "Device file:\`$SNF_IMAGE_ROOTDEV' is not a block device"
fi
-mount "$SNF_IMAGE_DEV" "$SNF_IMAGE_TARGET"
+mount "$SNF_IMAGE_ROOTDEV" "$SNF_IMAGE_TARGET"
exit 0
#! /bin/bash
### BEGIN TASK INFO
-# Provides: ResizeMounted
+# Provides: FilesystemResizeMounted
# RunBefore: UmountImage
# RunAfter: MountImage
# Short-Description: Resize filesystem to use all the available space
log_error "Target directory \`$SNF_IMAGE_TARGET' is missing"
fi
-if [ "$SNF_IMAGE_TYPE" = "ntfsdump" ]; then
+last_partition=$(get_last_partition "$SNF_IMAGE_DEV")
+id=$(echo "$last_partition" | cut -d: -f1)
+ptype=$(echo "$last_partition" | cut -d: -f5)
+
+if [ "$ptype" = "ntfs" ]; then
# Write a diskpart script to %SystemDrive%\Windows\SnfScripts. Sysprep will
# try to execute this script during the specialize pass.
mkdir -p "$SNF_IMAGE_TARGET/Windows/SnfScripts"
cat > "$SNF_IMAGE_TARGET/Windows/SnfScripts/ExtendFilesystem" <<EOF
select disk 0
-select volume 1
+select volume $id
extend filesystem
exit
EOF