From: md@Linux.IT (Marco d'Itri)
To: linux-hotplug@vger.kernel.org
Subject: persistent CD aliases
Date: Wed, 29 Mar 2006 11:50:13 +0000 [thread overview]
Message-ID: <20060329115013.GA9763@wonderland.linux.it> (raw)
[-- Attachment #1.1: Type: text/plain, Size: 149 bytes --]
I am attaching the rules and the script which I am using in the Debian
package to generate on demand aliases for CD readers.
--
ciao,
Marco
[-- Attachment #1.2: cd-aliases-generator.rules --]
[-- Type: text/plain, Size: 694 bytes --]
# These rules generate rules for the /dev/{cdrom,dvd,...} symlinks and
# write them in /etc/udev/rules.d/z20_persistent-cd.rules.
#
# If you want to configure them manually then just delete the symlink
# pointing to this file.
#
# The default symlink for this file is z75_cd-aliases-generator.rules.
ACTION!="add", GOTO="cd_aliases_generator_end"
SUBSYSTEM!="block", GOTO="cd_aliases_generator_end"
ENV{GENERATED}=="?*", GOTO="cd_aliases_generator_end"
# The variables for IDE devices are imported in permissions.rules.
KERNEL=="sr[0-9]*", IMPORT{program}="cdrom_id --export $tempnode"
ENV{ID_CDROM}=="?*", PROGRAM="write_cd_aliases", SYMLINK+="%c"
LABEL="cd_aliases_generator_end"
[-- Attachment #1.3: write_cd_aliases --]
[-- Type: text/plain, Size: 3033 bytes --]
#!/bin/sh -e
RULES_FILE="/etc/udev/rules.d/z25_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
}
# returns true if a directory is writeable
writeable() {
if ln -s check $1/.is-writeable 2> /dev/null; then
rm -f $1/.is-writeable
return 0
else
return 1
fi
}
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
}
##############################################################################
find_next_available() {
local links="$(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" $RO_RULES_FILE $RULES_FILE
}
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 "ACTION==\"add\", $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
# Prevent parallel 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_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
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 191 bytes --]
next reply other threads:[~2006-03-29 11:50 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-03-29 11:50 Marco d'Itri [this message]
2006-03-31 5:46 ` persistent CD aliases Alexander E. Patrakov
2006-03-31 7:26 ` Marco d'Itri
2006-04-16 7:57 ` Alexander E. Patrakov
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=20060329115013.GA9763@wonderland.linux.it \
--to=md@linux.it \
--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).