From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Alexander E. Patrakov" Date: Sun, 16 Apr 2006 07:57:59 +0000 Subject: Re: persistent CD aliases Message-Id: <4441F907.60009@ums.usu.ru> MIME-Version: 1 Content-Type: multipart/mixed; boundary="=_ums.usu.ru-13315-1145174148-0001-2" List-Id: References: <20060329115013.GA9763@wonderland.linux.it> In-Reply-To: <20060329115013.GA9763@wonderland.linux.it> To: linux-hotplug@vger.kernel.org This is a MIME-formatted message. If you see this text it means that your E-mail software does not support MIME-formatted messages. --=_ums.usu.ru-13315-1145174148-0001-2 Content-Type: text/plain; charset=koi8-r; format=flowed Content-Transfer-Encoding: 7bit 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 --=_ums.usu.ru-13315-1145174148-0001-2 Content-Type: text/plain; name="81-cdrom.rules"; charset=iso-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="81-cdrom.rules" ACTION=="add", ENV{ID_TYPE}=="cd", IMPORT{program}="cdrom_id --export $tempnode", GROUP="cdrom" --=_ums.usu.ru-13315-1145174148-0001-2 Content-Type: text/plain; name="83-cdrom.rules"; charset=iso-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="83-cdrom.rules" 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" --=_ums.usu.ru-13315-1145174148-0001-2 Content-Type: text/plain; name="write_cd_aliases"; charset=iso-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="write_cd_aliases" #!/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 --=_ums.usu.ru-13315-1145174148-0001-2-- ------------------------------------------------------- This SF.Net email is sponsored by xPML, a groundbreaking scripting language that extends applications into web and mobile media. Attend the live webcast and join the prime developer group breaking into this new coding territory! http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642 _______________________________________________ Linux-hotplug-devel mailing list http://linux-hotplug.sourceforge.net Linux-hotplug-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-hotplug-devel