chiark / gitweb /
write_cd_rules: set default link type to "by-id" for usb and ieee1394 devices
[elogind.git] / extras / rule_generator / write_cd_rules
1 #!/bin/sh -e
2
3 # This script is run if an optical drive lacks a rule for persistent naming.
4 #
5 # It adds symlinks for optical drives based on the device class determined
6 # by cdrom_id and used ID_PATH to identify the device.
7 #
8 # (C) 2006 Marco d'Itri <md@Linux.IT>
9 #
10 # This program is free software; you can redistribute it and/or modify it
11 # under the terms of the GNU General Public License as published by the
12 # Free Software Foundation version 2 of the License.
13
14 RULES_FILE="/etc/udev/rules.d/70-persistent-cd.rules"
15
16 . /lib/udev/rule_generator.functions
17
18 find_next_available() {
19         raw_find_next_available "$(find_all_rules 'SYMLINK+=' $1)"
20 }
21
22 write_rule() {
23         local match="$1"
24         local link="$2"
25         local comment="$3"
26
27         {
28         if [ "$PRINT_HEADER" ]; then
29                 PRINT_HEADER=
30                 echo "# This file was automatically generated by the $0"
31                 echo "# program, probably run by the cd-aliases-generator.rules rules file."
32                 echo "#"
33                 echo "# You can modify it, as long as you keep each rule on a single line"
34                 echo "# and set the \$GENERATED variable."
35                 echo ""
36         fi
37
38         [ "$comment" ] && echo "# $comment"
39         echo "$match, SYMLINK+=\"$link\", ENV{GENERATED}=\"1\""
40         } >> $RULES_FILE
41         SYMLINKS="$SYMLINKS $link"
42 }
43
44 if [ -z "$DEVPATH" ]; then
45         echo "Missing \$DEVPATH." >&2
46         exit 1
47 fi
48 if [ -z "$ID_CDROM" ]; then
49         echo "$DEVPATH is not a CD reader." >&2
50         exit 1
51 fi
52
53 if [ "$1" ]; then
54         METHOD="$1"
55 else
56         case "$ID_BUS" in
57                 usb|ieee1394)
58                 METHOD='by-id'
59                 ;;
60
61                 *)
62                 METHOD='by-path'
63                 ;;
64         esac
65 fi
66
67 case "$METHOD" in
68         by-path)
69         if [ -z "$ID_PATH" ]; then
70                 echo "$DEVPATH not supported by path_id. by-id may work." >&2
71                 exit 1
72         fi
73         RULE="ENV{ID_PATH}==\"$ID_PATH\""
74         ;;
75
76         by-id)
77         if [ "$ID_SERIAL" ]; then
78                 RULE="ENV{ID_SERIAL}==\"$ID_SERIAL\""
79         elif [ "$ID_MODEL" -a "$ID_REVISION" ]; then
80                 RULE="ENV{ID_MODEL}==\"$ID_MODEL\", ENV{ID_REVISION}==\"$ID_REVISION\""
81         else
82                 echo "$DEVPATH not supported by ata_id. by-path may work." >&2
83                 exit 1
84         fi
85         ;;
86
87         *)
88         echo "Invalid argument (must be either by-path or by-id)." >&2
89         exit 1
90         ;;
91 esac
92
93 # Prevent concurrent processes from modifying the file at the same time.
94 lock_rules_file
95
96 # Check if the rules file is writeable.
97 choose_rules_file
98
99 link_num=$(find_next_available 'cdrom[0-9]*')
100
101 match="ENV{ID_CDROM}==\"?*\", $RULE"
102
103 comment="$ID_MODEL ($ID_PATH)"
104
105         write_rule "$match" "cdrom$link_num" "$comment"
106 [ "$ID_CDROM_CD_R" -o "$ID_CDROM_CD_RW" ] && \
107         write_rule "$match" "cdrw$link_num"
108 [ "$ID_CDROM_DVD" ] && \
109         write_rule "$match" "dvd$link_num"
110 [ "$ID_CDROM_DVD_R" -o "$ID_CDROM_DVD_RW" -o "$ID_CDROM_DVD_RAM" ] && \
111         write_rule "$match" "dvdrw$link_num"
112
113 unlock_rules_file
114
115 echo $SYMLINKS
116
117 exit 0
118