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=/mnt
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 # make sure we have the $MNTFILE before reading/writing into it
71 if [ -z "$NO_AUTO_FILE" ] ; then
72 [ -r $MNTFILE ] || touch $MNTFILE
76 # make sure we have a /etc/fstab at all
79 if ! [ -f /etc/fstab ] ; then
80 cat > /etc/fstab << EOF
81 # /etc/fstab - static file system information
82 # <filesystem> <mountpoint> <type> <options> <dump> <pass>
83 proc /proc proc rw,nosuid,nodev,noexec 0 0
84 none /proc/bus/usb usbfs defaults,noauto 0 0
85 sysfs /sys sysfs rw,nosuid,nodev,noexec 0 0
86 devpts /dev/pts devpts noauto,mode=0622 0 0
87 /dev/external $MOUNTPOINT_PREFIX/external auto user,noauto,exec,rw,uid=grml,gid=grml 0 0
88 /dev/external1 $MOUNTPOINT_PREFIX/external1 auto user,noauto,exec,rw,uid=grml,gid=grml 0 0
89 /dev/cdrom $MOUNTPOINT_PREFIX/cdrom auto user,noauto,exec,ro 0 0
90 /dev/dvd $MOUNTPOINT_PREFIX/dvd auto user,noauto,exec,ro 0 0
91 # some other examples:
92 # /dev/sda1 /Grml ext3 dev,suid,user,noauto 0 2
93 # //1.2.3.4/pub /smb/pub smbfs defaults,user,noauto,uid=grml,gid=grml 0 0
94 # linux:/pub /beer nfs defaults 0 0
95 # tmpfs /tmp tmpfs size=300M 0 0
96 # none /proc/bus/usb usbfs defaults,nodev,noexec,nosuid,noauto,devgid=1001,devmode=664 0 0
97 # 192.168.1.101:/backups /mnt/nfs nfs defaults,user,wsize=8192,rsize=8192 0 0
99 # Warning! Please do *not* change any lines below because they are auto-generated.
100 # If you want to disable rebuildfstab set CONFIG_FSTAB='no' in /etc/grml/autoconfig!
101 # See 'man grml-udev-rebuildfstab' for more details about the following entries.
104 ) 200>/var/run/rebuildfstab.lock
106 [ ! -w /etc/fstab ] && {
107 logit "fatal - /etc/fstab not writeable, exiting"
111 # Simple shell grep, searches for lines STARTING with string
121 # Remove comment line $1 and the following line from file $2
122 # sed '/^# Added by GRML/{N;d;}'
125 entry=$(echo $1 | sed "s#/#\\\/#g")
128 sed -i -e "/$entry/{N;d}" /etc/fstab
129 ) 200>/var/run/rebuildfstab.lock
135 # dont use labels for some filesystem
140 if [ -n "$LABEL" ] && [ -n "$ID_FS_LABEL_ENC" ] ; then
141 # see check_for_label() in scanpartitions for details
142 case $ID_FS_LABEL_ENC in
144 addinfo=" # special char in label ($ID_FS_LABEL_ENC) not supported"
147 echo "LABEL=$ID_FS_LABEL_ENC"
154 [ -n "$DM_NAME" ] && echo /dev/mapper/$DM_NAME && return
157 for name in $DEVLINKS ; do
159 *usb-sd*|*cdrom*|*dvd*)
170 mountpoint="${device##*/}"
171 mountpoint="${mountpoint#*=}"
172 echo "$MOUNTPOINT_PREFIX/$mountpoint"
178 echo $ADDEDBYGRML $1 >> /etc/fstab
179 echo "$2" >> /etc/fstab
180 ) 200>/var/run/rebuildfstab.lock
185 if [ -n "$CONFIG_FSTAB_USER" ] ; then
186 user="$CONFIG_FSTAB_USER"
188 user='1000' # take default
190 if [ -n "$CONFIG_FSTAB_GROUP" ] ; then
191 group="$CONFIG_FSTAB_GROUP"
193 group='users' # take default
196 if [ -z "$ACTION" ] ; then
197 logit "Seems that $0 is not run in a udev environment, exiting." >&2
201 # ignore loop devices for now.
208 removeentries "$ADDEDBYGRML $DEVNAME" /etc/fstab
210 device=$(get_device_name)
211 mountpoint=$(get_mount_point $device)
213 # if entry is already present in /etc/fstab ignore the current event
216 grep -v '^#' /etc/fstab > $TMPFILE
217 ) 200>/var/run/rebuildfstab.lock
219 for devicelink in $DEVLINKS ; do
221 case "$devicelink" in *external*) continue ;; esac
222 stringinfile $devicelink $TMPFILE && bailout 0
225 # if entry is already present ignore it
226 stringinfile $device $TMPFILE && bailout 0
228 if [ "$ID_FS_USAGE" != "filesystem" -a "$ID_FS_TYPE" != "swap" ]; then
229 # blockdevice in question won't be mountable in this case
233 options=noauto,user,dev,suid,exec
236 options=$options,ro,umask=000
239 options=$options,umask=000
250 test -n "$user" && options=$options,uid=$user
251 test -n "$group" && options=$options,gid=$group
259 echo "$ADDEDBYGRML $DEVNAME" >> /etc/fstab
260 echo "$device $mountpoint $ID_FS_TYPE $options 0 0 $addinfo # $DEVNAME" >> /etc/fstab
261 ) 200>/var/run/rebuildfstab.lock
267 # Clean /mnt/... according to info $MNTFILE
268 if [ -r "$MNTFILE" ] ; then
269 for directory in $(cat $MNTFILE) ; do
270 rmdir $directory 2>/dev/null && sed -i "s#$directory##" $MNTFILE
272 grep '^/.*$' $MNTFILE | sort -u > $TMPFILE
273 cat $TMPFILE > $MNTFILE
276 # Make sure we have all /mnt/* directories
277 while read p m f relax; do
278 case "$m" in *none*|*proc*|*sys*|'') continue ;; esac
279 if ! grep -q "$m" /proc/mounts ; then
280 if ! [ -d "$m" ] ; then
281 if mkdir -m 755 -p "$m" ; then
282 [ -r "$MNTFILE" ] && grep -q "$m" $MNTFILE || echo "$m" >> $MNTFILE
287 $(cat /etc/fstab | grep -v '^#')
290 # sort the file again...
291 if [ -r "$MNTFILE" ] ; then
292 grep '^/.*$' $MNTFILE | sort -u > $TMPFILE
293 cat $TMPFILE > $MNTFILE
298 ## END OF FILE #################################################################