#!/bin/sh

# This script sets method "lvm" for all partitions that have the lvm
# flag set.  It also discovers the logical volumes and creates in them
# a loop partition table and partition.

. /lib/partman/lib/base.sh

# Avoid warnings from lvm2 tools about open file descriptors
export LVM_SUPPRESS_FD_WARNINGS=1

log-output -t partman pvscan
log-output -t partman vgscan

if [ -x /sbin/vgdisplay ]; then
	vgroups=$(/sbin/vgdisplay | grep '^[ ]*VG Name' | \
		sed -e 's/.*[[:space:]]\(.*\)$/\1/' | sort)
else
	vgroups=''
fi

for dev in /var/lib/partman/devices/*; do
	[ -d "$dev" ] || continue
	cd $dev
	partitions=
	open_dialog PARTITIONS
	while { read_line num id size type fs path name; [ "$id" ]; }; do
		if [ "$fs" != free ]; then
			partitions="$partitions $id"
		fi
	done
	close_dialog

	for id in $partitions; do
		lvm=no

		# If the device is in fact being used for lvm, mark it as such.
		# This is a hack and it only works for full block devices, not
		# partitions. It makes raid devices used for lvm show up as such.
		if pvdisplay $(cat $dev/device) >/dev/null 2>&1 ; then
			lvm=yes
		fi

		open_dialog GET_FLAGS $id
		while { read_line flag; [ "$flag" ]; }; do
			if [ "$flag" = lvm ]; then
				lvm=yes
				# can not break here
			fi
		done
		close_dialog
		if [ "$lvm" = yes ]; then
			mkdir -p $id
			echo lvm >$id/method
		fi
	done

	if [ -f device ]; then
		# Obtain the VG from the device name
		device=`cat device`
		case "$device" in
		    # LVM2
		    /dev/mapper/*)
			vglv=${device#/dev/mapper/}
			vglv=$(echo "$vglv" | sed -e 's/\([^-]\)-\([^-]\)/\1 \2/' |
			       sed -e 's/--/-/g')
			vg=$(echo "$vglv" | cut -d" " -f1)
			;;
		    # LVM1
		    *)
			vg=$(sed 's,^/[^/]*/\([^/]*\)/.*,\1,' device)
			;;
		esac
		is_vg=no
		for vgs in $vgroups; do
			[ "$vgs" = "$vg" ] && is_vg=yes
		done
		if [ "$is_vg" = yes ] ; then
			# this is an activated logical volume
			# let's create label on it
			open_dialog NEW_LABEL loop
			close_dialog
			# find the free space
			open_dialog PARTITIONS
			free_space=''
			while { read_line num id size type fs path name; [ "$id" ]; }; do
				case $fs in
				    free|unknown)
					free_space=$id
					free_size=$size
					free_fs=$fs
					;;
				esac
			done
			close_dialog
			# create partition in the free space
			if [ "$free_space" ]; then
				id=
				if [ "$free_fs" = unknown ]; then
					# parted >= 3.2 gives us a partition
					# automatically.
					id=$free_space
				else
					# With parted < 3.2 we must create a
					# partition manually.
					open_dialog NEW_PARTITION primary ext2 $free_space full $free_size
					read_line num id size type fs path name
					close_dialog
				fi
				if [ "$id" ]; then
					open_dialog GET_FILE_SYSTEM $id
					read_line filesystem
					close_dialog
					if [ "$filesystem" != none ]; then
						open_dialog CHANGE_FILE_SYSTEM $id $filesystem
						close_dialog
					fi
				fi
			fi
			open_dialog DISK_UNCHANGED
			close_dialog
		fi
	fi
done
