From: "Alexander E. Patrakov" <patrakov@ums.usu.ru>
To: linux-hotplug@vger.kernel.org
Subject: Re: persistent CD aliases
Date: Sun, 16 Apr 2006 07:57:59 +0000 [thread overview]
Message-ID: <4441F907.60009@ums.usu.ru> (raw)
In-Reply-To: <20060329115013.GA9763@wonderland.linux.it>
[-- Attachment #1: Type: text/plain, Size: 1227 bytes --]
Marco d'Itri wrote:
> I am attaching the rules and the script which I am using in the Debian
> package to generate on demand aliases for CD readers.
This is a bit buggy :(
> choose_rules_file() {
> [ -e "$RULES_FILE" ] || PRINT_HEADER=1
> if writeable ${RULES_FILE%/*}; then
> RO_RULES_FILE='/dev/null'
> else
> RO_RULES_FILE=$RULES_FILE
> RULES_FILE="/dev/.udev/tmp-rules--${RULES_FILE##*/}"
> fi
> }
Sorry, I don't understand how /dev/.udev/tmp-rules--* is moved to
/etc/udev/rules.d. In my version, I removed this hack and instead added the rule
to fail the entire uevent if / is not writeable. Then the udev_retry script that
runs after mounting filesystems picks the uevents up from /dev/.udev/failed
(yes, I know that this script is not available in Debian).
> find_next_available() {
> local links="$(find_all_symlinks $1)"
This contains embedded newlines.
> local basename=${links%%[0-9]*}
This doesn't work as expected because of newlines. To see the effect, connect 4
IDE CD-ROMs to one box (special thanks to Archaic from the Linux From Scratch
team for testing this).
Anyway, the fixed script (adapted to non-Debian systems) and rules are attached.
--
Alexander E. Patrakov
[-- Attachment #2: 81-cdrom.rules --]
[-- Type: text/plain, Size: 96 bytes --]
ACTION=="add", ENV{ID_TYPE}=="cd", IMPORT{program}="cdrom_id --export $tempnode", GROUP="cdrom"
[-- Attachment #3: 83-cdrom.rules --]
[-- Type: text/plain, Size: 521 bytes --]
ACTION!="add", GOTO="cd_aliases_generator_end"
SUBSYSTEM!="block", GOTO="cd_aliases_generator_end"
ENV{GENERATED}=="?*", GOTO="cd_aliases_generator_end"
# Fail the uevent if the autogenerated rules cannot be saved
ENV{ID_CDROM}=="?*", PROGRAM="/bin/grep -c ' / [^[:space:]]* rw' /proc/mounts", RESULT!="2", RUN+="/bin/false", GOTO="cd_aliases_generator_end"
ENV{ID_CDROM}=="?*", PROGRAM="write_cd_aliases", SYMLINK+="%c"
LABEL="cd_aliases_generator_end"
[-- Attachment #4: write_cd_aliases --]
[-- Type: text/plain, Size: 2646 bytes --]
#!/bin/sh -e
RULES_FILE="/etc/udev/rules.d/82-persistent-cd.rules"
##############################################################################
lock_rules_file() {
RULES_LOCK="/dev/.udev/.lock-${RULES_FILE##*/}"
retry=30
while ! mkdir $RULES_LOCK 2> /dev/null; do
if [ $retry -eq 0 ]; then
echo "Cannot lock $RULES_FILE!" >&2
exit 2
fi
sleep 1
retry=$(($retry - 1))
done
}
unlock_rules_file() {
rmdir $RULES_LOCK || true
}
##############################################################################
find_next_available() {
# use echo to convert newlines to spaces
local links=`echo $(find_all_symlinks $1)`
local basename=${links%%[ 0-9]*}
local max=-1
for name in $links; do
local num=${name#$basename}
[ "$num" ] || num=0
[ $num -gt $max ] && max=$num
done
max=$(($max + 1))
# "name0" actually is just "name"
[ $max -eq 0 ] && return
echo "$max"
}
find_all_symlinks() {
local linkre="$1"
local match="$2"
[ -e $RULES_FILE ] || return
local search='.*[[:space:],]SYMLINK+="\('"$linkre"'\)"[[:space:]]*\(,.*\|\\\|\)$'
sed -n -e "${match}s/${search}/\1/p" $RULES_FILE
}
write_rule() {
local match="$1"
local link="$2"
local comment="$3"
[ -e "$RULES_FILE" ] || PRINT_HEADER=1
{
if [ "$PRINT_HEADER" ]; then
PRINT_HEADER=
echo "# This file was automatically generated by the $0"
echo "# program, probably run by the 83-cdrom.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 "ACTION==\"add\", $match, ENV{ID_CDROM}==\"1\", 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
# Prevent parallel processes from modifying the file at the same time.
lock_rules_file
link_num=$(find_next_available 'cdrom[0-9]*')
#match="ENV{ID_PATH}==\"$ID_PATH\""
#kernel=${DEVPATH##*/}
#match="KERNEL==\"$kernel\""
id=${PHYSDEVPATH##*/}
match="BUS==\"$PHYSDEVBUS\", ID==\"$id\""
comment="$ID_MODEL ($ID_PATH)"
write_rule "$match" "cdrom$link_num" "$comment"
[ "$ID_CDROM_CD_RW" ] && write_rule "$match" "cdrw$link_num"
[ "$ID_CDROM_DVD" ] && write_rule "$match" "dvd$link_num"
[ "$ID_CDROM_DVD_RW" ] && write_rule "$match" "dvdrw$link_num"
unlock_rules_file
echo $SYMLINKS
exit 0
next prev parent reply other threads:[~2006-04-16 7:57 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-03-29 11:50 persistent CD aliases Marco d'Itri
2006-03-31 5:46 ` Alexander E. Patrakov
2006-03-31 7:26 ` Marco d'Itri
2006-04-16 7:57 ` Alexander E. Patrakov [this message]
2006-04-17 17:25 ` Andrey Borzenkov
2006-04-18 1:58 ` Alexander E. Patrakov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4441F907.60009@ums.usu.ru \
--to=patrakov@ums.usu.ru \
--cc=linux-hotplug@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).