#!/bin/bash
####################
# This utility searches for available HFS+, NTFS and FAT32 partitions, creates
# mount points for them and adds them to /etc/fstab
# (c)2005 Dennis Kaarsemaker <dennis@ubuntu-nl.org>
# Thanks to Nalioth for suggesting, assisting with and testing the HFS+ bits
#
# Addition to detect default locale and iocharset for NTFS and FAT32 
# partitions by Mikko Rauhala <mjr@iki.fi>. Dunno if applicable to HFS+.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
# 
# Instructions for use:
#  - Save this file on your local hard drive
#  - Open a terminal and type sudo bash winmac_fstab
#  - If sudo asks for a password, use your own password
#  - Your windows and mac partitions will now be mounted everytime
#    you boot. You can delete this script now
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
###################

# Root check
if [[ $UID != 0 ]]; then
    echo 'You should run this program as root or using sudo'
    exit 1
fi

# Get label for disk, consisting of size and name (fs labels proves too hard)
getlabel() {
    MAJ=`file /dev/$drive | sed -e 's/.*(\(.\).*/\1/'`
    MIN=`file /dev/$drive | sed -e 's/.*(..\(.\).*/\1/'`
    UDI="/org/freedesktop/Hal/devices/block_${MAJ}_${MIN}"
    SIZE=`hal-get-property --udi $UDI --key volume.size`
    GB=`python -c "print int(round($SIZE.0 / (1024**3)))"`
    label="$GB\\040GB\\040Disk\\040($drive)"
    label2="$GB GB Disk ($drive)"
}

# Simple command line argument for installers
# -w: mount them with user,umask=0111
# -r: mount them with user,umask=0133,uid=1000,gid=1000
RWALL=-1;
if [[ $1 == '-w' ]]; then RWALL=1; fi
if [[ $1 == '-r' ]]; then RWALL=0; fi

if [[ $RWALL == -1 ]]; then
    echo 'By default the disks will be writable only by root and'
    cat /etc/passwd | awk -F ':|,' '/:1000:/ {print $5 " (" $1 ")"}'
    echo 'Do you want to make the disk writable by all users instead? (y/n)'
    read RESP
    if [[ $RESP == 'y' || $RESP == 'Y' ]]; then
        RWALL=1
    else
        RWALL=0
    fi
fi

NLS=$(grep "^$(grep ^LANG= /etc/environment | cut -d "=" -f 2)" /etc/locale.gen | cut -d " " -f 2 | sed s/-// | tr [A-Z] [a-z])
if ! [ -e "/lib/modules/$(uname -r)/kernel/fs/nls/nls_$NLS.ko" ]; then
    NLS=utf8
fi

if [[ $RWALL == 1 ]]; then
    OPTIONS='user,iocharset=$NLS,fmask=0111,dmask=0000'
    MACOPTIONS='user,file_umask=0111,dir_umask=0000'
else
    OPTIONS='user,iocharset=$NLS,fmask=0133,dmask=0022,uid=1000,gid=1000'
    MACOPTIONS='user,file_umask=0133,dir_umask=0022,uid=1000,gid=1000'
fi

# Now for the real work
drivesntfs=`fdisk -l | grep -i 'ntfs' | awk -F '/| ' '{print $3}'`
drivesfat=`fdisk -l | grep -i 'fat32' | awk -F '/| ' '{print $3}'`
driveshfs=`fdisk -l | grep -i 'Apple_HFS' | awk -F '/| ' '{print $3}'`

donesomething='n'
for drive in $drivesntfs
do
    getlabel $drive
    if [[ ! `grep $drive /etc/fstab` ]]
    then
        mkdir "/media/$label2"
        echo "#Added by winmac_fstab utility" >> /etc/fstab
        echo "/dev/$drive /media/$label ntfs ro,$OPTIONS 0 0" >> /etc/fstab
        echo "Added /dev/$drive as '/media/$label2'"
        donesomething='y'
    else
        echo "Ignoring /dev/$drive - already in /etc/fstab"
    fi
done
if [[ $donesomething == 'y' ]]
then
    echo "NTFS drives will be mounted read-only!"
fi
for drive in $drivesfat
do
    getlabel $drive
    if [[ ! `grep $drive /etc/fstab` ]]
    then
        mkdir "/media/$label2"
        ln -s "/media/$label2" /media/$drive # yay, spaceless link for b0rken programs
        echo "#Added by winmac_fstab utility" >> /etc/fstab
        echo "/dev/$drive /media/$label vfat rw,$OPTIONS 0 0" >> /etc/fstab
        echo "Added /dev/$drive as '/media/$label2'"
        donesomething='y'
    else
        echo "Ignoring /dev/$drive - already in /etc/fstab"
    fi
done
for drive in $driveshfs
do
    getlabel $drive
    if [[ ! `grep $drive /etc/fstab` ]]
    then
        mkdir "/media/$label2"
        echo "#Added by winmac_fstab utility" >> /etc/fstab
        echo "/dev/$drive /media/$label hfsplus rw,$MACOPTIONS 0 0" >> /etc/fstab
        echo "Added /dev/$drive as '/media/$label2'"
        donesomething='y'
    else
        echo "Ignoring /dev/$drive - already in /etc/fstab"
    fi
done

if [[ $donesomething == 'y' ]]
then
    # And mount them
    mount -a
    echo "All windows and mac partitions will now be mounted every time you boot"
    echo "You do not need to reboot, the partitions are mounted now too"
else
    echo "No usable windows/mac partitions found"
fi

