All of lore.kernel.org
 help / color / mirror / Atom feed
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


  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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.