mirror of
https://github.com/systemd/systemd.git
synced 2024-11-06 08:26:52 +03:00
0837c28e9b
The argument to find_all_rules must be quoted or it will be subject to shell expansion, which will happen if in the root directory there are mount points with the same base name. See http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=407738 for details.
111 lines
2.5 KiB
Bash
111 lines
2.5 KiB
Bash
#!/bin/sh -e
|
|
|
|
# This script is run if an optical drive lacks a rule for persistent naming.
|
|
#
|
|
# It adds symlinks for optical drives based on the device class determined
|
|
# by cdrom_id and used ID_PATH to identify the device.
|
|
#
|
|
# (C) 2006 Marco d'Itri <md@Linux.IT>
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify it
|
|
# under the terms of the GNU General Public License as published by the
|
|
# Free Software Foundation version 2 of the License.
|
|
|
|
RULES_FILE="/etc/udev/rules.d/70-persistent-cd.rules"
|
|
|
|
. /lib/udev/rule_generator.functions
|
|
|
|
find_next_available() {
|
|
raw_find_next_available "$(find_all_rules 'SYMLINK+=' "$1")"
|
|
}
|
|
|
|
write_rule() {
|
|
local match="$1"
|
|
local link="$2"
|
|
local comment="$3"
|
|
|
|
{
|
|
if [ "$PRINT_HEADER" ]; then
|
|
PRINT_HEADER=
|
|
echo "# This file was automatically generated by the $0"
|
|
echo "# program, probably run by the cd-aliases-generator.rules rules file."
|
|
echo "#"
|
|
echo "# You can modify it, as long as you keep each rule on a single line"
|
|
echo "# and set the \$GENERATED variable."
|
|
echo ""
|
|
fi
|
|
|
|
[ "$comment" ] && echo "# $comment"
|
|
echo "$match, SYMLINK+=\"$link\", ENV{GENERATED}=\"1\""
|
|
} >> $RULES_FILE
|
|
SYMLINKS="$SYMLINKS $link"
|
|
}
|
|
|
|
if [ -z "$DEVPATH" ]; then
|
|
echo "Missing \$DEVPATH." >&2
|
|
exit 1
|
|
fi
|
|
if [ -z "$ID_CDROM" ]; then
|
|
echo "$DEVPATH is not a CD reader." >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [ "$1" ]; then
|
|
METHOD="$1"
|
|
else
|
|
METHOD='by-path'
|
|
fi
|
|
|
|
case "$METHOD" in
|
|
by-path)
|
|
if [ -z "$ID_PATH" ]; then
|
|
echo "$DEVPATH not supported by path_id. by-id may work." >&2
|
|
exit 1
|
|
fi
|
|
RULE="ENV{ID_PATH}==\"$ID_PATH\""
|
|
;;
|
|
|
|
by-id)
|
|
if [ "$ID_SERIAL" ]; then
|
|
RULE="ENV{ID_SERIAL}==\"$ID_SERIAL\""
|
|
elif [ "$ID_MODEL" -a "$ID_REVISION" ]; then
|
|
RULE="ENV{ID_MODEL}==\"$ID_MODEL\", ENV{ID_REVISION}==\"$ID_REVISION\""
|
|
else
|
|
echo "$DEVPATH not supported by ata_id. by-path may work." >&2
|
|
exit 1
|
|
fi
|
|
;;
|
|
|
|
*)
|
|
echo "Invalid argument (must be either by-path or by-id)." >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
# Prevent concurrent processes from modifying the file at the same time.
|
|
lock_rules_file
|
|
|
|
# Check if the rules file is writeable.
|
|
choose_rules_file
|
|
|
|
link_num=$(find_next_available 'cdrom[0-9]*')
|
|
|
|
match="ENV{ID_CDROM}==\"?*\", $RULE"
|
|
|
|
comment="$ID_MODEL ($ID_PATH)"
|
|
|
|
write_rule "$match" "cdrom$link_num" "$comment"
|
|
[ "$ID_CDROM_CD_R" -o "$ID_CDROM_CD_RW" ] && \
|
|
write_rule "$match" "cdrw$link_num"
|
|
[ "$ID_CDROM_DVD" ] && \
|
|
write_rule "$match" "dvd$link_num"
|
|
[ "$ID_CDROM_DVD_R" -o "$ID_CDROM_DVD_RW" -o "$ID_CDROM_DVD_RAM" ] && \
|
|
write_rule "$match" "dvdrw$link_num"
|
|
|
|
unlock_rules_file
|
|
|
|
echo $SYMLINKS
|
|
|
|
exit 0
|
|
|