2 # Filename: scripts/grml-udev-rebuildfstab
3 # Purpose: udev script to update /etc/fstab
4 # Authors: grml-team (grml.org)
5 # Bug-Reports: see http://grml.org/bugs/
6 # License: This file is licensed under the GPL v2+.
7 ################################################################################
9 PATH="/bin:/sbin:/usr/bin:/usr/sbin"
10 TMP=$(mktemp 2>/dev/null)
11 TMPFILE=$(mktemp 2>/dev/null)
12 ADDEDBYGRML="# Added by GRML"
13 MOUNTPOINT_PREFIX=/media
14 MNTFILE="$MOUNTPOINT_PREFIX/.grml-auto-created_do-not-delete-this-file"
18 if [ -x /usr/bin/logger ] ; then
19 /usr/bin/logger -i -t rebuildfstab "$*"
24 [ -n "$1" ] && EXITCODE="$1" || EXITCODE=1
25 rm -f $TMP $TMPFILE /var/run/rebuildfstab.pid
29 echo "$$" > /var/run/rebuildfstab.pid
35 [ -e /etc/grml/autconfig ] && . /etc/grml/autoconfig
37 if ! [ -w "$(dirname $MNTFILE)" ] ; then
38 echo "$0: can not write to $MNTFILE">&2
39 logit "can not write to $MNTFILE"
43 if [ -z "$TMP" -o -z "$TMPFILE" ] ; then
44 echo "$0: could not create tmpfile (is / mounted read-only?), exiting" >&2
45 logit 'fatal - could not create tmpfile (is / mounted read-only?), exiting'
49 # trap "rm -f $TMP $TMPFILE" 2 3 11
52 if grep -q " nofstab" /proc/cmdline ; then
56 grep -q 'nolabel' /proc/cmdline && NOLABEL='TRUE' || LABEL='TRUE'
60 if [ "$CONFIG_FSTAB" = "no" ] ; then
65 if grep -q ' $MOUNTPOINT_PREFIX ' /proc/mounts ; then
66 logit '$MOUNTPOINT_PREFIX is a mounted directory, exiting.'
70 # default directories {{{
71 if [ -d "$MOUNTPOINT_PREFIX" ] ; then
72 [ -d "$MOUNTPOINT_PREFIX/floppy" ] || mkdir "$MOUNTPOINT_PREFIX/floppy"
73 [ -d "$MOUNTPOINT_PREFIX/cdrom" ] || mkdir "$MOUNTPOINT_PREFIX/cdrom"
74 [ -d "$MOUNTPOINT_PREFIX/test" ] || mkdir "$MOUNTPOINT_PREFIX/test"
78 # make sure we have the $MNTFILE before reading/writing into it
79 if [ -z "$NO_AUTO_FILE" ] ; then
80 [ -r $MNTFILE ] || touch $MNTFILE
84 # make sure we have a /etc/fstab at all
87 if ! [ -f /etc/fstab ] ; then
88 cat > /etc/fstab << EOF
89 # /etc/fstab - static file system information
90 # <filesystem> <mountpoint> <type> <options> <dump> <pass>
91 proc /proc proc rw,nosuid,nodev,noexec 0 0
92 none /proc/bus/usb usbfs defaults,noauto 0 0
93 sysfs /sys sysfs rw,nosuid,nodev,noexec 0 0
94 devpts /dev/pts devpts noauto,mode=0622 0 0
95 /dev/external ${MOUNTPOINT_PREFIX}/external auto user,noauto,exec,rw,uid=grml,gid=grml 0 0
96 /dev/external1 ${MOUNTPOINT_PREFIX}/external1 auto user,noauto,exec,rw,uid=grml,gid=grml 0 0
97 /dev/cdrom ${MOUNTPOINT_PREFIX}/cdrom auto user,noauto,exec,ro 0 0
98 /dev/dvd ${MOUNTPOINT_PREFIX}/dvd auto user,noauto,exec,ro 0 0
99 # some other examples:
100 # /dev/sda1 /Grml ext3 dev,suid,user,noauto 0 2
101 # //1.2.3.4/pub /smb/pub smbfs defaults,user,noauto,uid=grml,gid=grml 0 0
102 # linux:/pub /beer nfs defaults 0 0
103 # tmpfs /tmp tmpfs size=300M 0 0
104 # none /proc/bus/usb usbfs defaults,nodev,noexec,nosuid,noauto,devgid=1001,devmode=664 0 0
105 # 192.168.1.101:/backups ${MOUNTPOINT_PREFIX}/nfs nfs defaults,user,wsize=8192,rsize=8192 0 0
107 # Warning! Please do *not* change any lines below because they are auto-generated.
108 # If you want to disable rebuildfstab set CONFIG_FSTAB='no' in /etc/grml/autoconfig!
109 # See 'man grml-udev-rebuildfstab' for more details about the following entries.
112 ) 200>/var/run/rebuildfstab.lock
114 [ ! -w /etc/fstab ] && {
115 logit "fatal - /etc/fstab not writeable, exiting"
119 # Simple shell grep, searches for lines STARTING with string
129 # Remove comment line $1 and the following line from file $2
130 # sed '/^# Added by GRML/{N;d;}'
133 entry=$(echo $1 | sed "s#/#\\\/#g")
136 sed -i -e "/$entry/{N;d}" /etc/fstab
137 ) 200>/var/run/rebuildfstab.lock
143 # dont use labels for some filesystem
148 if [ -n "$LABEL" ] && [ -n "$ID_FS_LABEL_ENC" ] ; then
149 # see check_for_label() in scanpartitions for details
150 case $ID_FS_LABEL_ENC in
152 addinfo=" # special char in label ($ID_FS_LABEL_ENC) not supported"
155 echo "LABEL=$ID_FS_LABEL_ENC"
162 [ -n "$DM_NAME" ] && echo /dev/mapper/$DM_NAME && return
165 for name in $DEVLINKS ; do
167 *usb-sd*|*cdrom*|*dvd*)
178 mountpoint="${device##*/}"
179 mountpoint="${mountpoint#*=}"
180 echo "$MOUNTPOINT_PREFIX/$mountpoint"
186 echo $ADDEDBYGRML $1 >> /etc/fstab
187 echo "$2" >> /etc/fstab
188 ) 200>/var/run/rebuildfstab.lock
193 if [ -n "$CONFIG_FSTAB_USER" ] ; then
194 user="$CONFIG_FSTAB_USER"
196 user='1000' # take default
198 if [ -n "$CONFIG_FSTAB_GROUP" ] ; then
199 group="$CONFIG_FSTAB_GROUP"
201 group='users' # take default
204 if [ -z "$ACTION" ] ; then
205 logit "Seems that $0 is not run in a udev environment, exiting." >&2
209 # ignore loop devices for now.
216 removeentries "$ADDEDBYGRML $DEVNAME" /etc/fstab
218 device=$(get_device_name)
219 mountpoint=$(get_mount_point $device)
221 # if entry is already present in /etc/fstab ignore the current event
224 grep -v '^#' /etc/fstab > $TMPFILE
225 ) 200>/var/run/rebuildfstab.lock
227 for devicelink in $DEVLINKS ; do
229 case "$devicelink" in *external*) continue ;; esac
230 stringinfile $devicelink $TMPFILE && bailout 0
233 # if entry is already present ignore it
234 stringinfile $device $TMPFILE && bailout 0
236 if [ "$ID_FS_USAGE" != "filesystem" -a "$ID_FS_TYPE" != "swap" ]; then
237 # blockdevice in question won't be mountable in this case
241 options=noauto,user,dev,suid,exec
244 options=$options,dmask=000,fmask=111
247 options=$options,dmask=000,fmask=111
258 test -n "$user" && options=$options,uid=$user
259 test -n "$group" && options=$options,gid=$group
267 echo "$ADDEDBYGRML $DEVNAME" >> /etc/fstab
268 echo "$device $mountpoint $ID_FS_TYPE $options 0 0 $addinfo # $DEVNAME" >> /etc/fstab
269 ) 200>/var/run/rebuildfstab.lock
275 # Clean $MOUNTPOINT_PREFIX according to info $MNTFILE
276 if [ -r "$MNTFILE" ] ; then
277 for directory in $(cat $MNTFILE) ; do
278 rmdir $directory 2>/dev/null && sed -i "s#$directory##" $MNTFILE
280 grep '^/.*$' $MNTFILE | sort -u > $TMPFILE
281 cat $TMPFILE > $MNTFILE
284 # Make sure we have all directories in $MOUNTPOINT_PREFIX
285 while read p m f relax; do
286 case "$m" in *none*|*proc*|*sys*|'') continue ;; esac
287 if ! grep -q "$m" /proc/mounts ; then
288 if ! [ -d "$m" ] ; then
289 if mkdir -m 755 -p "$m" ; then
290 [ -r "$MNTFILE" ] && grep -q "$m" $MNTFILE || echo "$m" >> $MNTFILE
295 $(cat /etc/fstab | grep -v '^#')
298 # sort the file again...
299 if [ -r "$MNTFILE" ] ; then
300 grep '^/.*$' $MNTFILE | sort -u > $TMPFILE
301 cat $TMPFILE > $MNTFILE
306 ## END OF FILE #################################################################