File: udev.postinst

package info (click to toggle)
udev 0.105-4etch1
  • links: PTS
  • area: main
  • in suites: etch
  • size: 672 kB
  • ctags: 54
  • sloc: sh: 1,636; makefile: 273
file content (239 lines) | stat: -rw-r--r-- 6,405 bytes parent folder | download | duplicates (2)
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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
#!/bin/sh -e

make_extra_nodes() {
  if [ "$(echo /lib/udev/devices/*)" != "/lib/udev/devices/*" ]; then
    cp --archive --update /lib/udev/devices/* /$1/
  fi

  [ -e /etc/udev/links.conf ] || return 0
  grep '^[^#]' /etc/udev/links.conf | \
  while read type name arg1; do
    [ "$type" -a "$name" -a ! -e "/$1/$name" -a ! -L "/$1/$name" ] ||continue
    case "$type" in
      L) ln -s $arg1 /$1/$name ;;
      D) mkdir -p /$1/$name ;;
      M) mknod -m 600 /$1/$name $arg1 ;;
      *) echo "links.conf: unparseable line ($type $name $arg1)" ;;
    esac
  done
}

supported_kernel() {
  case "$(uname -r)" in
    2.[012345].*|2.6.[0-9]|2.6.[0-9][!0-9]*) return 1 ;;
    2.6.1[0-4]|2.6.1[0-4][!0-9]*) return 1 ;;
  esac
  return 0
}

# create a default symlink if the directory exists and is empty
create_rules_symlink() {
  cd /etc/udev/rules.d/ || return 0

  # stop if one of the links already exists
  for file in devfs.rules compat.rules compat-full.rules \
      udev.rules 020_permissions.rules z55_hotplug.rules \
      z20_persistent-input.rules z45_persistent-net-generator.rules \
      z20_persistent.rules z50_run.rules \
      z75_cd-aliases-generator.rules; do
    [ ! -e $file -a ! -L $file ] || return 0
  done

  ln -s ../permissions.rules		020_permissions.rules
  ln -s ../persistent.rules		z20_persistent.rules
  ln -s ../persistent-input.rules	z20_persistent-input.rules
  ln -s ../run.rules			z50_run.rules
  ln -s ../hotplug.rules		z55_hotplug.rules
  ln -s ../cd-aliases-generator.rules	z75_cd-aliases-generator.rules
  if [ "$(dpkg --print-architecture)" != s390 ]; then
    ln -s ../persistent-net-generator.rules z45_persistent-net-generator.rules
  fi

  if [ -c /dev/.devfsd -o -c /dev/vc/1 ]; then
    # not perfect, but a good enough heuristic
    if [ -e /dev/tty1 ]; then
      ln -s ../devfs.rules ../compat-full.rules .
    else
      ln -s ../devfs.rules ../compat.rules .
    fi
  else
    ln -s ../udev.rules .
  fi
}

tempdir() {
  local dir=$(tempfile --prefix=udev.)
  rm $dir
  mkdir $dir
  echo $dir
}

chrooted() {
  if [ "$(stat -c %d/%i /)" = "$(stat -Lc %d/%i /proc/1/root 2>/dev/null)" ];
  then
    # the devicenumber/inode pair of / is the same as that of /sbin/init's
    # root, so we're *not* in a chroot and hence return false.
    return 1
  fi
  echo "A chroot environment has been detected, udev not started."
  return 0
}

restart_udevd() {
  start-stop-daemon --stop --name udevd --oknodo --quiet --retry 5

  local rc=0
  udevd --daemon || rc=$?
  if [ $rc -ne 0 ]; then
    echo "Cannot start udevd. (rc=$rc)"
    return $rc
  fi
}

can_start_udevd() {
  if ! supported_kernel; then
    echo "udev requires a kernel >= 2.6.15, not started."
    return 1
  fi

  if [ ! -d /sys/class/ ]; then
    echo "udev requires a mounted sysfs, not started."
    return 1
  fi

  if [ ! -e /proc/sys/kernel/hotplug ]; then
    echo "udev requires hotplug support, not started."
    return 1
  fi

  if ! grep -q '[[:space:]]tmpfs$' /proc/filesystems; then
    echo "udev requires tmpfs support, not started."
    return 1
  fi

  if [ -e /etc/udev/disabled ]; then
    echo "/etc/udev/disabled has been detected, udev not started."
    return 1
  fi

  return 0
}

enable_udev() {
  can_start_udevd || return 0

  echo > /proc/sys/kernel/hotplug

  # create the directory which will hold our new /dev
  TEMPDEV=$(tempdir)

  export UDEV_ROOT=$TEMPDEV
  UDEV_RUN=no restart_udevd

  if ! mount -n -o size=10M,mode=0755 -t tmpfs tmpfs $TEMPDEV; then
    echo "Not enabling udev because the system lacks tmpfs support!"
    rm -f $TEMPDEV/.udev/uevent_seqnum
    rmdir $TEMPDEV/.udev/ 2> /dev/null || true
    return
  fi

  echo "Populating the new /dev filesystem temporarily mounted on $TEMPDEV/..."
  mkdir -p $TEMPDEV/.udev/db/ $TEMPDEV/.udev/queue/
  make_extra_nodes $TEMPDEV
  udevtrigger

  # make symlinks to the sockets and pipes on the old /dev
  find /dev -type s -o -type p | sed "s@/dev/@@" | \
    while read file; do
      local dir="${file%/*}"
      if [ "$dir" != "$file" ]; then
        mkdir -p "$TEMPDEV/$dir"
      fi
      ln -s "/dev/.static/dev/$file" "$TEMPDEV/$file"
    done

  # the directory may not be present on systems which had devfs installed
  [ -d /dev/shm/ ] || mkdir /dev/shm/

  # wait for the udevd childs to finish
  udevsettle || true

  # -n is used because mount gets very confused by --bind (see #282205)
  for dir in pts shm; do
    [ -d /dev/$dir ] || continue
    mount -n --bind /dev/$dir $TEMPDEV/$dir
  done

  mkdir -p $TEMPDEV/.static/dev/
  chmod 700 $TEMPDEV/.static/
  mount -n --bind /dev/ $TEMPDEV/.static/dev/

  mount -n --move $TEMPDEV /dev

  # start the final daemon with the normal configuration
  unset UDEV_ROOT
  restart_udevd

  # XXX Some people reported that the directory was not empty.
  # This should fix the issue (udevd reopens the file for each event):
  rm -f $TEMPDEV/.udev/uevent_seqnum
  rmdir $TEMPDEV/.udev/ 2> /dev/null || true

  if ! rmdir $TEMPDEV; then
    echo "WARNING: $TEMPDEV is not empty!"
    ls -laR $TEMPDEV
  fi

  # try anyway to restart syslogd because /dev/.static/dev/ is not
  # accessible by unprivileged users and the real /dev/log is still there
  local sysloginits="inetutils-syslogd metalog socklog-run sysklogd syslog-ng"
  for script in $sysloginits; do
    [ -x /etc/init.d/$script ] && invoke-rc.d $script restart || true
  done
}

update_initramfs() {
  [ -x /usr/sbin/update-initramfs -a -e /etc/initramfs-tools/initramfs.conf ] \
    || return 0
  update-initramfs -u
}

case "$1" in
    configure)
    if [ -z "$2" ]; then # first install
      create_rules_symlink
      /lib/udev/write_net_rules all_interfaces
      if ! chrooted; then
	enable_udev
      fi
    else # upgrades
      if [ -e /etc/udev/run-write_net_rules ]; then
	[ -e /etc/udev/rules.d/z25_persistent-net.rules ] ||
	  /lib/udev/write_net_rules all_interfaces
	rm /etc/udev/run-write_net_rules
      fi
      if ! chrooted; then
	if [ -e /etc/udev/kernel-upgrade ]; then
	  echo "Kernel upgrade mode, udevd has not been restarted."
	  echo "Please reboot the system as soon as possible."
	  rm /etc/udev/kernel-upgrade
	elif can_start_udevd; then
	  restart_udevd
	fi
      fi
    fi

    update_initramfs
    ;;

    abort-upgrade|abort-remove|abort-deconfigure)
    ;;

    *)
    echo "$0 called with unknown argument '$1'" >&2
    exit 1
    ;;
esac

#DEBHELPER#