Blame view

embedian/mount.sh 4.13 KB
7b9a140fa   Eric Lee   Debian Buster Sup...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
  #!/bin/sh
  #
  # Called from udev
  #
  # Attempt to mount any added block devices and umount any removed devices
  
  BASE_INIT="`readlink -f "/sbin/init"`"
  INIT_SYSTEMD="/lib/systemd/systemd"
  
  if [ "x$BASE_INIT" = "x$INIT_SYSTEMD" ];then
      # systemd as init uses systemd-mount to mount block devices
      MOUNT="/usr/bin/systemd-mount"
      UMOUNT="/usr/bin/systemd-umount"
  
      if [ -x $MOUNT ] && [ -x $UMOUNT ];
      then
          logger "Using systemd-mount to finish mount"
      else
          logger "Linux init is using systemd, so please install systemd-mount to finish mount"
          exit 1
      fi
  else
      MOUNT="/bin/mount"
      UMOUNT="/bin/umount"
  fi
  
  PMOUNT="/usr/bin/pmount"
  
  for line in `grep -h -v ^# /etc/udev/mount.blacklist /etc/udev/mount.blacklist.d/*`
  do
  	if [ ` expr match "$DEVNAME" "$line" ` -gt 0 ];
  	then
  		logger "udev/mount.sh" "[$DEVNAME] is blacklisted, ignoring"
  		exit 0
  	fi
  done
  
  automount_systemd() {
      name="`basename "$DEVNAME"`"
  
      # Skip the partition which are already in /etc/fstab
      grep "^[[:space:]]*$DEVNAME" /etc/fstab && return
      for n in LABEL PARTLABEL UUID PARTUUID; do
          tmp="$(lsblk -o $n $DEVNAME | sed -e '1d')"
          test -z "$tmp" && continue
          tmp="$n=$tmp"
          grep "^[[:space:]]*$tmp" /etc/fstab && return
      done
  
      [ -d "/run/media/$name" ] || mkdir -p "/run/media/$name"
  
      MOUNT="$MOUNT -o silent"
  
      # If filesystemtype is vfat, change the ownership group to 'disk', and
      # grant it with  w/r/x permissions.
      case $ID_FS_TYPE in
      vfat|fat)
          MOUNT="$MOUNT -o umask=007,gid=`awk -F':' '/^disk/{print $3}' /etc/group`"
          ;;
      # TODO
      *)
          ;;
      esac
  
      if ! $MOUNT --no-block -t auto $DEVNAME "/run/media/$name"
      then
          #logger "mount.sh/automount" "$MOUNT -t auto $DEVNAME \"/run/media/$name\" failed!"
          rm_dir "/run/media/$name"
      else
          logger "mount.sh/automount" "Auto-mount of [/run/media/$name] successful"
          touch "/tmp/.automount-$name"
      fi
  }
  
  automount() {
  	name="`basename "$DEVNAME"`"
  
  	if [ -x "$PMOUNT" ]; then
  		$PMOUNT $DEVNAME 2> /dev/null
  	elif [ -x $MOUNT ]; then
  		$MOUNT $DEVNAME 2> /dev/null
  	fi
  
  	# If the device isn't mounted at this point, it isn't
  	# configured in fstab
  	grep -q "^$DEVNAME " /proc/mounts && return
  
  	! test -d "/run/media/$name" && mkdir -p "/run/media/$name"
  	# Silent util-linux's version of mounting auto
  	if [ "x`readlink $MOUNT`" = "x/bin/mount.util-linux" ] ;
  	then
  		MOUNT="$MOUNT -o silent"
  	fi
  
  	# If filesystem type is vfat, change the ownership group to 'disk', and
  	# grant it with  w/r/x permissions.
  	case $ID_FS_TYPE in
  	vfat|fat)
  		MOUNT="$MOUNT -o umask=007,gid=`awk -F':' '/^disk/{print $3}' /etc/group`"
  		;;
  	# TODO
  	*)
  		;;
  	esac
  
  	if ! $MOUNT -t auto $DEVNAME "/run/media/$name"
  	then
  		#logger "mount.sh/automount" "$MOUNT -t auto $DEVNAME \"/run/media/$name\" failed!"
  		rm_dir "/run/media/$name"
  	else
  		logger "mount.sh/automount" "Auto-mount of [/run/media/$name] successful"
  		touch "/tmp/.automount-$name"
  	fi
  }
  
  rm_dir() {
  	# We do not want to rm -r populated directories
  	if test "`find "$1" | wc -l | tr -d " "`" -lt 2 -a -d "$1"
  	then
  		! test -z "$1" && rm -r "$1"
  	else
  		logger "mount.sh/automount" "Not removing non-empty directory [$1]"
  	fi
  }
  
  # No ID_FS_TYPE for cdrom device, yet it should be mounted
  name="`basename "$DEVNAME"`"
  [ -e /sys/block/$name/device/media ] && media_type=`cat /sys/block/$name/device/media`
  
  if [ "$ACTION" = "add" ] && [ -n "$DEVNAME" ] && [ -n "$ID_FS_TYPE" -o "$media_type" = "cdrom" ]; then
      # Note the root filesystem can show up as /dev/root in /proc/mounts,
      # so check the device number too
      if expr $MAJOR "*" 256 + $MINOR != `stat -c %d /`; then
          if [ "`basename $MOUNT`" = "systemd-mount" ];then
              automount_systemd
          else
              automount
          fi
      fi
  fi
  
  if [ "$ACTION" = "remove" ] || [ "$ACTION" = "change" ] && [ -x "$UMOUNT" ] && [ -n "$DEVNAME" ]; then
      for mnt in `cat /proc/mounts | grep "$DEVNAME" | cut -f 2 -d " " `
      do
          $UMOUNT $mnt
      done
  
      # Remove empty directories from auto-mounter
      name="`basename "$DEVNAME"`"
      test -e "/tmp/.automount-$name" && rm_dir "/run/media/$name"
  fi