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 if [ "$CONFIG_FSTAB" = "no" ] ; then
61 if grep -q ' $MOUNTPOINT_PREFIX ' /proc/mounts ; then
62 logit '$MOUNTPOINT_PREFIX is a mounted directory, exiting.'
66 LABEL=true # by default use labels
68 if [ -r /etc/grml/rebuildfstab.conf ] ; then
69 logit 'Reading /etc/grml/rebuildfstab.conf'
70 . /etc/grml/rebuildfstab.conf
72 if [ "$LABEL" = "false" ] ; then
73 logit 'Disabling LABEL=... in /etc/fstab as requested via LABEL=false'
77 # support overriding via boot option
78 if grep -q ' nolabel' /proc/cmdline ; then
82 if grep -q ' label' /proc/cmdline ; then
86 # default directories {{{
87 if [ -d "$MOUNTPOINT_PREFIX" ] ; then
88 [ -d "$MOUNTPOINT_PREFIX/floppy" ] || mkdir "$MOUNTPOINT_PREFIX/floppy"
89 [ -d "$MOUNTPOINT_PREFIX/cdrom" ] || mkdir "$MOUNTPOINT_PREFIX/cdrom"
90 [ -d "$MOUNTPOINT_PREFIX/test" ] || mkdir "$MOUNTPOINT_PREFIX/test"
94 # make sure we have the $MNTFILE before reading/writing into it
95 if [ -z "$NO_AUTO_FILE" ] ; then
96 [ -r $MNTFILE ] || touch $MNTFILE
100 # make sure we have a /etc/fstab at all
103 if ! [ -f /etc/fstab ] ; then
104 cat > /etc/fstab << EOF
105 # /etc/fstab - static file system information
106 # <filesystem> <mountpoint> <type> <options> <dump> <pass>
107 proc /proc proc rw,nosuid,nodev,noexec 0 0
108 none /proc/bus/usb usbfs defaults,noauto 0 0
109 sysfs /sys sysfs rw,nosuid,nodev,noexec 0 0
110 devpts /dev/pts devpts noauto,mode=0622 0 0
111 /dev/external ${MOUNTPOINT_PREFIX}/external auto user,noauto,exec,rw,uid=grml,gid=grml 0 0
112 /dev/external1 ${MOUNTPOINT_PREFIX}/external1 auto user,noauto,exec,rw,uid=grml,gid=grml 0 0
113 /dev/cdrom ${MOUNTPOINT_PREFIX}/cdrom auto user,noauto,exec,ro 0 0
114 /dev/dvd ${MOUNTPOINT_PREFIX}/dvd auto user,noauto,exec,ro 0 0
115 # some other examples:
116 # /dev/sda1 /Grml ext3 dev,suid,user,noauto 0 2
117 # //1.2.3.4/pub /smb/pub smbfs defaults,user,noauto,uid=grml,gid=grml 0 0
118 # linux:/pub /beer nfs defaults 0 0
119 # tmpfs /tmp tmpfs size=300M 0 0
120 # none /proc/bus/usb usbfs defaults,nodev,noexec,nosuid,noauto,devgid=1001,devmode=664 0 0
121 # 192.168.1.101:/backups ${MOUNTPOINT_PREFIX}/nfs nfs defaults,user,wsize=8192,rsize=8192 0 0
123 # Warning! Please do *not* change any lines below because they are auto-generated.
124 # If you want to disable rebuildfstab set CONFIG_FSTAB='no' in /etc/grml/autoconfig!
125 # See 'man grml-udev-rebuildfstab' for more details about the following entries.
128 ) 200>/var/run/rebuildfstab.lock
130 [ ! -w /etc/fstab ] && {
131 logit "fatal - /etc/fstab not writeable, exiting"
135 # Simple shell grep, searches for lines STARTING with string
145 # Remove comment line $1 and the following line from file $2
146 # sed '/^# Added by GRML/{N;d;}'
149 entry=$(echo $1 | sed "s#/#\\\/#g")
152 sed -i -e "/$entry/{N;d}" /etc/fstab
153 ) 200>/var/run/rebuildfstab.lock
159 # dont use labels for some filesystem
164 if "$LABEL" && [ -n "$ID_FS_LABEL_ENC" ] ; then
165 # see check_for_label() in scanpartitions for details
166 case $ID_FS_LABEL_ENC in
168 logit "special char in label ($ID_FS_LABEL_ENC) not supported, skipping label for $DEVNAME"
171 echo "LABEL=$ID_FS_LABEL_ENC"
178 [ -n "$DM_NAME" ] && echo /dev/mapper/$DM_NAME && return
181 for name in $DEVLINKS ; do
183 *usb-sd*|*cdrom*|*dvd*)
194 mountpoint="${device##*/}"
195 mountpoint="${mountpoint#*=}"
196 echo "$MOUNTPOINT_PREFIX/$mountpoint"
202 echo $ADDEDBYGRML $1 >> /etc/fstab
203 echo "$2" >> /etc/fstab
204 ) 200>/var/run/rebuildfstab.lock
209 if [ -n "$CONFIG_FSTAB_USER" ] ; then
210 user="$CONFIG_FSTAB_USER"
212 user='1000' # take default
214 if [ -n "$CONFIG_FSTAB_GROUP" ] ; then
215 group="$CONFIG_FSTAB_GROUP"
217 group='users' # take default
220 if [ -z "$ACTION" ] ; then
221 logit "Seems that $0 is not run in a udev environment, exiting." >&2
225 # ignore loop devices for now.
232 removeentries "$ADDEDBYGRML $DEVNAME" /etc/fstab
234 device=$(get_device_name)
235 mountpoint=$(get_mount_point $device)
237 # if entry is already present in /etc/fstab ignore the current event
240 grep -v '^#' /etc/fstab > $TMPFILE
241 ) 200>/var/run/rebuildfstab.lock
243 for devicelink in $DEVLINKS ; do
245 case "$devicelink" in *external*) continue ;; esac
246 stringinfile $devicelink $TMPFILE && bailout 0
249 # if entry is already present ignore it
250 stringinfile $device $TMPFILE && bailout 0
252 if [ "$ID_FS_USAGE" != "filesystem" -a "$ID_FS_TYPE" != "swap" ]; then
253 # blockdevice in question won't be mountable in this case
257 options=noauto,user,dev,suid,exec
260 options=$options,dmask=000,fmask=111
263 options=$options,dmask=000,fmask=111
274 test -n "$user" && options=$options,uid=$user
275 test -n "$group" && options=$options,gid=$group
279 # when we don't use labels then write the label information into the comment
280 if ! "$LABEL" && [ -n "$ID_FS_LABEL_ENC" ] ; then
281 addinfo="# LABEL=$ID_FS_LABEL_ENC"
283 else # otherwise (when using labels) write the device name into the comment
291 echo "$ADDEDBYGRML $DEVNAME" >> /etc/fstab
292 echo "$device $mountpoint $ID_FS_TYPE $options 0 0 ${addinfo}${devinfo}" >> /etc/fstab
293 ) 200>/var/run/rebuildfstab.lock
299 # Clean $MOUNTPOINT_PREFIX according to info $MNTFILE
300 if [ -r "$MNTFILE" ] ; then
301 for directory in $(cat $MNTFILE) ; do
302 rmdir $directory 2>/dev/null && sed -i "s#$directory##" $MNTFILE
304 grep '^/.*$' $MNTFILE | sort -u > $TMPFILE
305 cat $TMPFILE > $MNTFILE
308 # Make sure we have all directories in $MOUNTPOINT_PREFIX
309 while read p m f relax; do
310 case "$m" in *none*|*proc*|*sys*|'') continue ;; esac
311 if ! grep -q "$m" /proc/mounts ; then
312 if ! [ -d "$m" ] ; then
313 if mkdir -m 755 -p "$m" ; then
314 [ -r "$MNTFILE" ] && grep -q "$m" $MNTFILE || echo "$m" >> $MNTFILE
319 $(cat /etc/fstab | grep -v '^#')
322 # sort the file again...
323 if [ -r "$MNTFILE" ] ; then
324 grep '^/.*$' $MNTFILE | sort -u > $TMPFILE
325 cat $TMPFILE > $MNTFILE
328 # ensure systemd uses recent fstab configuration
329 if [ -d /run/systemd/system ]; then
330 logit 'Reloading systemd manager configuration to use current fstab'
331 systemctl daemon-reload
336 ## END OF FILE #################################################################