--- ./src/rule_generator/write_cd_rules.orig 2012-01-28 18:15:46.958827013 -0600 +++ ./src/rule_generator/write_cd_rules 2013-01-17 22:58:27.294859303 -0600 @@ -3,7 +3,8 @@ # 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. +# by cdrom_id and uses ID_SERIAL or ID_MODEL and ID_REVISION to +# identify the device. # (C) 2006 Marco d'Itri # @@ -66,37 +67,16 @@ exit 1 fi -if [ "$1" ]; then - METHOD="$1" +# ID_PATH is gone from the ata subsystem used in recent kernels, so +# always use the by-id method: +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 - 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 + echo "$DEVPATH not supported by ata_id. Unable to generate persistent rules." >&2 exit 1 - ;; -esac +fi # Prevent concurrent processes from modifying the file at the same time. lock_rules_file @@ -105,18 +85,62 @@ choose_rules_file link_num=$(find_next_available 'cdrom[0-9]*') +[ "$link_num" = "" ] && link_num=0 match="SUBSYSTEM==\"block\", ENV{ID_CDROM}==\"?*\", $RULE" -comment="$ID_MODEL ($ID_PATH)" - +comment="$ID_MODEL ($ID_SERIAL)" 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" + if [ "$link_num" = "0" ]; then + write_rule "$match" "cdrom" + fi + + if [ "$ID_CDROM_CD_R" ]; then + write_rule "$match" "cdr$link_num" + if [ "$link_num" = "0" ]; then + write_rule "$match" "cdr" + fi + + write_rule "$match" "cdwriter$link_num" + if [ "$link_num" = "0" ]; then + write_rule "$match" "cdwriter" + fi + + if [ "$ID_CDROM_CD_RW" ]; then + write_rule "$match" "cdrw$link_num" + if [ "$link_num" = "0" ]; then + write_rule "$match" "cdrw" + fi + fi + + if [ "$link_num" = "0" ]; then + write_rule "$match" "writer" + fi + fi + + if [ "$ID_CDROM_DVD" ]; then + write_rule "$match" "dvd$link_num" + if [ "$link_num" = "0" ]; then + write_rule "$match" "dvd" + fi + + if [ "$ID_CDROM_DVD_R" -o "$ID_CDROM_DVD_RW" -o "$ID_CDROM_DVD_RAM" ]; then + write_rule "$match" "dvdr$link_num" + if [ "$link_num" = "0" ]; then + write_rule "$match" "dvdr" + fi + + write_rule "$match" "dvdrw$link_num" + if [ "$link_num" = "0" ]; then + write_rule "$match" "dvdrw" + fi + + write_rule "$match" "dvdwriter$link_num" + if [ "$link_num" = "0" ]; then + write_rule "$match" "dvdwriter" + fi + fi + fi echo >> $RULES_FILE unlock_rules_file