#!/bin/bash
version="partinfo-1.0.1 (Oct. 14, 2015)"

# Check that user is root.
[ $(id -u) -eq 0 ] || { echo -e $"\n\t You need to be root!\n" ; exit 1 ; }

show_help () {
	printf "$help_text"
	exit 0
}

show_version () {
	printf "\n$version\n\n"
	exit 0
}

help_text="
	Usage:  `basename $0` <device> [options]

	Display the NAME, SIZE, FSTYPE(by name), FSTYPE (by code), LABEL information
        of the partitions of the selected device (/dev/sda, /dev/sdb, /dev/sdc, etc)

	valid options:
                -e, --efi-filter	remove data about Microsoft reserved partitions,
					Recovery partitions, and EFI System partitions
					from the `basename $0` command's output

		-h, --help		show this help text

		-r, --real-type-name	Display the actual fstype name output by the
					lsblk and sgdisk commands. When this option isn't
					used the following fstypes are displayed as \"Linux\"
					btrfs, ext2, ext3, ext4, jfs, nilfs2, reiser4, reiserfs, ufs, xfs.
                                        Also vfat is shown as \"FAT32\", and hfsplus as \"HPFS\".

		-v, --version	display the version information

"

if [ $# = 0 ]; then show_help
else

while [[ $1 == -* ]]; do
	case "$1" in
		-e|--efi-filter)
			printf "\t add option: $1 after <device> i.e. `basename $0` /dev/sda $1\n\n"
			printf "\t Try:  $0 -h for full help. \n\n"
			exit 1 ;;

		-h|--help)
			show_help ;;

		-r|--real-type-name)
			printf "\t add option: $1 after <device> i.e. `basename $0` /dev/sda $1\n\n"
			printf "\t Try:  $0 -h for full help. \n\n"
			exit 1 ;;

		-v|--version)
                        show_version ;;

		*)
			printf "\t invalid option: $1 \n\n"
			printf "\t Try:  $0 -h for full help. \n\n"
			exit 1 ;;
    esac
done


while [[ $2 == -* ]]; do
	case "$2" in
		-e|--efi-filter)
			break ;;

		-h|--help)
			show_help ;;

		-r|--real-type-name)
			break ;;

		-v|--version)
                        show_version ;;

		*)
			printf "\t invalid option: $2 \n\n"
			printf "\t Try:  $0 -h for full help. \n\n"
			exit 1 ;;
    esac
done

while [[ $3 == -* ]]; do
	case "$3" in
		-e|--efi-filter)
			break ;;

		-h|--help)
			show_help ;;

		-r|--real-type-name)
			break ;;

		-v|--version)
                        show_version ;;

		*)
			printf "\t invalid option: $2 \n\n"
			printf "\t Try:  $0 -h for full help. \n\n"
			exit 1 ;;
    esac
done

IntermediateResult=$(paste <(lsblk -b -P -o NAME,SIZE,FSTYPE,LABEL $1 | xargs echo -e | sed 's/ NAME=/\nNAME=/g' | sed 's/=/="/g' | sed 's/ SIZE/" SIZE/' | sed 's/ FSTYPE/" FSTYPE/' | sed 's/ LABEL/" LABEL/' | sed 's/$/"/g' | sort -V | sed 's/""/"~~~~~"/g' | cut -f2,4,6,8 -d\" | sed 's/ /~.~/g' | sed 's/"/ /g' | grep -E ^[hsv][d][a-z]+[0-9]+[\ ]) <(for i in $(cat /proc/partitions | awk '{print $4}' | grep $(basename $1) | grep -Eo [0-9]+$ | sort -V);do sgdisk -p $1 | awk '{if ($1 == "'$i'") print $6}'; sgdisk -p $1 | grep -q '  '$i' ' || echo ~~~~; done) | awk '{OFMT="%.0f"};{print "/dev/"$1,$2/1024,$3,$5,$4}' | grep -Ev $1[0-9]+[\ ]+'1 ')

if [ "$2" = "--efi-filter" ] || [ "$2" = "-e" ] || [ "$3" = "--efi-filter" ] || [ "$3" = "-e" ]

  then
    #exclude iso9660, Microsoft reserved partitions (0C01), Microsoft reserved partitions (2700) and EFI System partitions (EF00) 
    IntermediateResult="$(sed 's| /dev|\n/dev|g' <<<$IntermediateResult | awk '{if ($3 == "iso9660" || $4 == "0C01" || $4 == "2700" || $4 == "EF00"); else print $0}')"

  else
    :
fi

if [ "$2" = "--real-type-name" ] || [ "$2" = "-r" ] || [ "$3" = "--real-type-name" ] || [ "$3" = "-r" ]
  then
    :

  else
    #for Linux GPT Partitions (8300) strip off the partition type (ext3, ext4, etc.) so they're named just 'Linux 8300'
    IntermediateResult="$(sed 's| /dev|\n/dev|g' <<<$IntermediateResult | sed 's/\(.*\) \(.*\) 8300 /\1 Linux 8300 /')"

    #rename hfsplus to HPFS
    IntermediateResult="$(sed 's| /dev|\n/dev|g' <<<$IntermediateResult | sed 's/hfsplus/HPFS/')"

    #rename vfat to FAT32
    IntermediateResult="$(sed 's| /dev|\n/dev|g' <<<$IntermediateResult | sed 's/vfat/FAT32/')"

    #Linux GPT Partitions created with older versions of GParted are identified as a 'Basic data partition' (0700),
    # the same as NTFS partitions, so rename them to 'Linux 8300'
    IntermediateResult="$(sed 's| /dev|\n/dev|g' <<<$IntermediateResult | \
                        sed -r 's/(btrfs|ext2|ext3|ext4|jfs|nilfs2|reiser4|reiserfs|ufs|xfs) 0700/Linux 8300/')"
fi

sed 's| /dev|\n/dev|g' <<<$IntermediateResult | awk '{print $1,$2,$3,$4,$5}' | column -t

exit 0
fi
