#!/bin/sh

if [ "$(id -u)" != "0" ]; then
 echo "Error: You must be root to run this script!" >&2
 exit 1
fi

# dup uuid check
check_uuid () {
[ -n "$UUID_CHECK" ] && eval "case $1 in $UUID_CHECK) echo Error: Dup UUID found: $1 >&2; exit 2;; esac"
if [ -z "$UUID_CHECK" ]; then
 UUID_CHECK=$1
else
 UUID_CHECK="$UUID_CHECK|$1"
fi
}
unset UUID_CHECK
for p in $(tail -n +3 /proc/partitions|sed -r 's/.* (\S*)/\/dev\/\1/'|grep -v ^/dev/dm-;ls /dev/mapper/* 2>/dev/null); do
 unset ID_FS_USAGE ID_FS_TYPE ID_FS_UUID
 eval $(/lib/udev/vol_id $p 2>/dev/null|grep -e ^ID_FS_USAGE -e ^ID_FS_TYPE -e ^ID_FS_UUID)
 if [ -n "$ID_FS_UUID" ]; then
  [ "$ID_FS_USAGE" = "filesystem" ] && check_uuid $ID_FS_UUID
  [ "$ID_FS_USAGE" = "other" -a "$ID_FS_TYPE" = "swap" ] && check_uuid $ID_FS_UUID
 else
  echo "Warning: No UUID found for $p (${ID_FS_USAGE:-no-filesystem} ${ID_FS_TYPE:-no-type})" >&2
 fi
done

# write new fstab
INPUT=/etc/fstab
OUTPUT=/etc/fstab.new
rm -f $OUTPUT
echo "# /etc/fstab: static file system information." >$OUTPUT
echo "#" >> $OUTPUT
echo "# <file system> <mount point>   <type>  <options>       <dump>  <pass>" >> $OUTPUT
printf "%-15s %-15s %-7s %-15s %-7s %s\n" proc /proc proc defaults 0 0 >> $OUTPUT
unset ROOT UUID_USED
while read filesystem mountpoint type options dump pass; do
 unset DEV UUID
 case $filesystem in
  /dev/mapper/*) ;;
  /dev/disk/by-uuid/*) DEV=/dev/$(readlink $filesystem|sed s@../../@@)
                       UUID="UUID=${filesystem#/dev/disk/by-uuid/}"
		       ;;
  /dev/*) DEV=$filesystem
          UUID="UUID=$(/lib/udev/vol_id -u $filesystem)"
 	  ;;
  UUID=*) UUID=$filesystem
          DEV=/dev/$(readlink /dev/disk/by-uuid/${filesystem#UUID=}|sed s@../../@@)
 	  ;;
 esac
 [ -n "${DEV#/dev/}" ] && echo "# $DEV" >> $OUTPUT
 if [ -n "${UUID#UUID=}" -a ! "$1" = "-d" ]; then
  [ -n "$UUID_USED" -a -n "${UUID#UUID=}" ] && eval "case $UUID in $UUID_USED) echo Error: Already used $UUID >&2;rm -f $OUTPUT;exit 3 ;; esac"
  if [ -z "$UUID_USED" ]; then
   UUID_USED=$UUID
  else
   UUID_USED="$UUID_USED|$UUID"
  fi
  if [ "${type%-3g}" = "ntfs" -o "${type%plus}" = "hfs" -a ! "$1" = "-n" ]; then
   printf "%-15s %-15s %-7s %-15s %-7s %s\n" "/dev/disk/by-uuid/${UUID#UUID=}" $mountpoint $type $options $dump $pass >> $OUTPUT
  else 
   printf "%-15s %-15s %-7s %-15s %-7s %s\n" $UUID $mountpoint $type $options $dump $pass >> $OUTPUT
  fi
 else
  printf "%-15s %-15s %-7s %-15s %-7s %s\n" $filesystem $mountpoint $type $options $dump $pass >> $OUTPUT
 fi
 if [ "$mountpoint" = "/" ]; then
  [ -n "${UUID#UUID=}" ] && ROOT=$UUID || ROOT=$DEV
 fi
done <<EOT
$(awk '$2 !~ /^\/(proc|sys|media\/cdrom|media\/floppy|dev\/shm)/ && !/#|^$/' $INPUT|sort -k2)
EOT
# add cdroms
CDROM=0
for c in $(awk '/name/{for (i=NF;i>=3;i--) {print $i}}' /proc/sys/dev/cdrom/info 2>/dev/null); do
 [ -d /media/cdrom$CDROM ] || mkdir -p /media/cdrom$CDROM
 if [ "$CDROM" = "0" ]; then
  if [ "$(readlink /media/cdrom)" != "cdrom0" ]; then
   rm -f /media/cdrom
   ln -s cdrom0 /media/cdrom
  fi
  if [ "$(readlink /cdrom)" != "media/cdrom" ]; then
   rm -f /cdrom
   ln -s media/cdrom /cdrom
  fi
 fi
 printf "%-15s %-15s %-7s %-15s %-7s %s\n" "/dev/$c" "/media/cdrom$CDROM" "udf,iso9660" "user,noauto" "0" "0" >> $OUTPUT
 CDROM=$(($CDROM+1))
done
if [ "$CDROM" = "0" ]; then
 rm -f /cdrom /media/cdrom
fi
# add floppy
for f in $(ls -d /sys/block/fd* 2>/dev/null); do
 [ -d /media/floppy${f#/sys/block/fd} ] || mkdir -p /media/floppy${f#/sys/block/fd}
 printf "%-15s %-15s %-7s %-15s %-7s %s\n" "/dev${f#/sys/block}" "/media/floppy${f#/sys/block/fd}" "auto" "rw,user,noauto" "0" "0" >> $OUTPUT
done

[ "$1" = "-v" ] && cat $OUTPUT

[ -e $INPUT.1st ] || mv -v $INPUT $INPUT.1st
rm -f $INPUT
mv $OUTPUT $INPUT
