1 |
# $MidnightBSD$ |
2 |
# |
3 |
# Refer to devd.conf(5) and devd(8) man pages for the details on how to |
4 |
# run and configure devd. |
5 |
# |
6 |
|
7 |
# NB: All regular expressions have an implicit ^$ around them. |
8 |
# NB: device-name is shorthand for 'match device-name' |
9 |
|
10 |
options { |
11 |
# Each "directory" directive adds a directory to the list of |
12 |
# directories that we scan for files. Files are loaded in the order |
13 |
# that they are returned from readdir(3). The rule-sets are combined |
14 |
# to create a DFA that's used to match events to actions. |
15 |
directory "/etc/devd"; |
16 |
directory "/usr/local/etc/devd"; |
17 |
pid-file "/var/run/devd.pid"; |
18 |
|
19 |
# Setup some shorthand for regex that we use later in the file. |
20 |
#XXX Yes, these are gross -- imp |
21 |
set scsi-controller-regex |
22 |
"(aac|adv|adw|aha|ahb|ahc|ahd|aic|amd|amr|asr|bt|ciss|ct|dpt|\ |
23 |
esp|ida|iir|ips|isp|mlx|mly|mpt|ncr|ncv|nsp|stg|sym|trm|wds)\ |
24 |
[0-9]+"; |
25 |
}; |
26 |
|
27 |
# Note that the attach/detach with the highest value wins, so that one can |
28 |
# override these general rules. |
29 |
|
30 |
# |
31 |
# Configure the interface on attach. Due to a historical accident, this |
32 |
# script is called pccard_ether. |
33 |
# |
34 |
# NB: DETACH events are ignored; the kernel should handle all cleanup |
35 |
# (routes, arp cache). Beware of races against immediate create |
36 |
# of a device with the same name; e.g. |
37 |
# ifconfig bridge0 destroy; ifconfig bridge0 create |
38 |
# |
39 |
notify 0 { |
40 |
match "system" "IFNET"; |
41 |
match "type" "ATTACH"; |
42 |
action "/etc/pccard_ether $subsystem start"; |
43 |
}; |
44 |
|
45 |
# |
46 |
# Try to start dhclient on Ethernet-like interfaces when the link comes |
47 |
# up. Only devices that are configured to support DHCP will actually |
48 |
# run it. No link down rule exists because dhclient automatically exits |
49 |
# when the link goes down. |
50 |
# |
51 |
notify 0 { |
52 |
match "system" "IFNET"; |
53 |
match "type" "LINK_UP"; |
54 |
media-type "ethernet"; |
55 |
action "/etc/rc.d/dhclient quietstart $subsystem"; |
56 |
}; |
57 |
|
58 |
# |
59 |
# Like Ethernet devices, but separate because |
60 |
# they have a different media type. We may want |
61 |
# to exploit this later. |
62 |
# |
63 |
detach 0 { |
64 |
media-type "802.11"; |
65 |
action "/etc/pccard_ether $device-name stop"; |
66 |
}; |
67 |
attach 0 { |
68 |
media-type "802.11"; |
69 |
action "/etc/pccard_ether $device-name start"; |
70 |
}; |
71 |
notify 0 { |
72 |
match "system" "IFNET"; |
73 |
match "type" "LINK_UP"; |
74 |
media-type "802.11"; |
75 |
action "/etc/rc.d/dhclient quietstart $subsystem"; |
76 |
}; |
77 |
|
78 |
# An entry like this might be in a different file, but is included here |
79 |
# as an example of how to override things. Normally 'ed50' would match |
80 |
# the above attach/detach stuff, but the value of 100 makes it |
81 |
# hard wired to 1.2.3.4. |
82 |
attach 100 { |
83 |
device-name "ed50"; |
84 |
action "ifconfig $device-name inet 1.2.3.4 netmask 0xffff0000"; |
85 |
}; |
86 |
detach 100 { |
87 |
device-name "ed50"; |
88 |
}; |
89 |
|
90 |
# When a USB Bluetooth dongle appears, activate it |
91 |
attach 100 { |
92 |
device-name "ubt[0-9]+"; |
93 |
action "/etc/rc.d/bluetooth quietstart $device-name"; |
94 |
}; |
95 |
detach 100 { |
96 |
device-name "ubt[0-9]+"; |
97 |
action "/etc/rc.d/bluetooth quietstop $device-name"; |
98 |
}; |
99 |
|
100 |
# Firmware downloader for Atheros AR3011 based USB Bluetooth devices |
101 |
#attach 100 { |
102 |
# match "vendor" "0x0cf3"; |
103 |
# match "product" "0x3000"; |
104 |
# action "sleep 2 && /usr/sbin/ath3kfw -d $device-name -f /usr/local/etc/ath3k-1.fw"; |
105 |
#}; |
106 |
|
107 |
# When a USB keyboard arrives, attach it as the console keyboard. |
108 |
attach 100 { |
109 |
device-name "ukbd0"; |
110 |
action "/etc/rc.d/syscons setkeyboard /dev/ukbd0"; |
111 |
}; |
112 |
detach 100 { |
113 |
device-name "ukbd0"; |
114 |
action "/etc/rc.d/syscons setkeyboard /dev/kbd0"; |
115 |
}; |
116 |
|
117 |
attach 100 { |
118 |
device-name "ums[0-9]+"; |
119 |
action "/etc/rc.d/moused quietstart $device-name"; |
120 |
}; |
121 |
|
122 |
detach 100 { |
123 |
device-name "ums[0-9]+"; |
124 |
action "/etc/rc.d/moused stop $device-name"; |
125 |
}; |
126 |
|
127 |
# Firmware download into the ActiveWire board. After the firmware download is |
128 |
# done, the device detaches and reappears as something new and shiny |
129 |
# automatically. |
130 |
attach 100 { |
131 |
match "vendor" "0x0854"; |
132 |
match "product" "0x0100"; |
133 |
match "release" "0x0000"; |
134 |
action "/usr/local/bin/ezdownload -f /usr/local/share/usb/firmware/0854.0100.0_01.hex $device-name"; |
135 |
}; |
136 |
|
137 |
# Firmware download for Entrega Serial DB25 adapter. |
138 |
attach 100 { |
139 |
match "vendor" "0x1645"; |
140 |
match "product" "0x8001"; |
141 |
match "release" "0x0101"; |
142 |
action "if ! kldstat -n usio > /dev/null 2>&1 ; then kldload usio; fi; /usr/sbin/ezdownload -v -f /usr/share/usb/firmware/1645.8001.0101 /dev/$device-name"; |
143 |
}; |
144 |
|
145 |
# This entry starts the ColdSync tool in daemon mode. Make sure you have an up |
146 |
# to date /usr/local/etc/palms. We override the 'listen' settings for port and |
147 |
# type in /usr/local/etc/coldsync.conf. |
148 |
notify 100 { |
149 |
match "system" "USB"; |
150 |
match "subsystem" "DEVICE"; |
151 |
match "type" "ATTACH"; |
152 |
match "vendor" "0x082d"; |
153 |
match "product" "0x0100"; |
154 |
match "release" "0x0100"; |
155 |
action "/usr/local/bin/coldsync -md -p /dev/$cdev -t usb"; |
156 |
}; |
157 |
|
158 |
# |
159 |
# Rescan scsi device-names on attach, but not detach. However, it is |
160 |
# disabled by default due to reports of problems. |
161 |
# |
162 |
attach 0 { |
163 |
device-name "$scsi-controller-regex"; |
164 |
// action "camcontrol rescan all"; |
165 |
}; |
166 |
|
167 |
# Don't even try to second guess what to do about drivers that don't |
168 |
# match here. Instead, pass it off to syslog. Commented out for the |
169 |
# moment, as the pnpinfo variable isn't set in devd yet. Individual |
170 |
# variables within the bus supplied pnpinfo are set. |
171 |
nomatch 0 { |
172 |
# action "logger Unknown device: $pnpinfo $location $bus"; |
173 |
}; |
174 |
|
175 |
# Various logging of unknown devices. |
176 |
nomatch 10 { |
177 |
match "bus" "uhub[0-9]+"; |
178 |
action "logger Unknown USB device: vendor $vendor product $product \ |
179 |
bus $bus"; |
180 |
}; |
181 |
|
182 |
# Some PC-CARDs don't offer numerical manufacturer/product IDs, just |
183 |
# show the CIS info there. |
184 |
nomatch 20 { |
185 |
match "bus" "pccard[0-9]+"; |
186 |
match "manufacturer" "0xffffffff"; |
187 |
match "product" "0xffffffff"; |
188 |
action "logger Unknown PCCARD device: CISproduct $cisproduct \ |
189 |
CIS-vendor $cisvendor bus $bus"; |
190 |
}; |
191 |
|
192 |
nomatch 10 { |
193 |
match "bus" "pccard[0-9]+"; |
194 |
action "logger Unknown PCCARD device: manufacturer $manufacturer \ |
195 |
product $product CISproduct $cisproduct CIS-vendor \ |
196 |
$cisvendor bus $bus"; |
197 |
}; |
198 |
|
199 |
nomatch 10 { |
200 |
match "bus" "cardbus[0-9]+"; |
201 |
action "logger Unknown Cardbus device: device $device class $class \ |
202 |
vendor $vendor bus $bus"; |
203 |
}; |
204 |
|
205 |
# Switch power profiles when the AC line state changes. |
206 |
notify 10 { |
207 |
match "system" "ACPI"; |
208 |
match "subsystem" "ACAD"; |
209 |
action "/etc/rc.d/power_profile $notify"; |
210 |
}; |
211 |
|
212 |
# Notify all users before beginning emergency shutdown when we get |
213 |
# a _CRT or _HOT thermal event and we're going to power down the system |
214 |
# very soon. |
215 |
notify 10 { |
216 |
match "system" "ACPI"; |
217 |
match "subsystem" "Thermal"; |
218 |
match "notify" "0xcc"; |
219 |
action "logger -p kern.emerg 'WARNING: system temperature too high, shutting down soon!'"; |
220 |
}; |
221 |
|
222 |
# Sample ZFS problem reports handling. |
223 |
notify 10 { |
224 |
match "system" "ZFS"; |
225 |
match "type" "zpool"; |
226 |
action "logger -p kern.err 'ZFS: failed to load zpool $pool'"; |
227 |
}; |
228 |
|
229 |
notify 10 { |
230 |
match "system" "ZFS"; |
231 |
match "type" "vdev"; |
232 |
action "logger -p kern.err 'ZFS: vdev failure, zpool=$pool type=$type'"; |
233 |
}; |
234 |
|
235 |
notify 10 { |
236 |
match "system" "ZFS"; |
237 |
match "type" "data"; |
238 |
action "logger -p kern.warn 'ZFS: zpool I/O failure, zpool=$pool error=$zio_err'"; |
239 |
}; |
240 |
|
241 |
notify 10 { |
242 |
match "system" "ZFS"; |
243 |
match "type" "io"; |
244 |
action "logger -p kern.warn 'ZFS: vdev I/O failure, zpool=$pool path=$vdev_path offset=$zio_offset size=$zio_size error=$zio_err'"; |
245 |
}; |
246 |
|
247 |
notify 10 { |
248 |
match "system" "ZFS"; |
249 |
match "type" "checksum"; |
250 |
action "logger -p kern.warn 'ZFS: checksum mismatch, zpool=$pool path=$vdev_path offset=$zio_offset size=$zio_size'"; |
251 |
}; |
252 |
|
253 |
# User requested suspend, so perform preparation steps and then execute |
254 |
# the actual suspend process. |
255 |
notify 10 { |
256 |
match "system" "ACPI"; |
257 |
match "subsystem" "Suspend"; |
258 |
action "/etc/rc.suspend acpi $notify"; |
259 |
}; |
260 |
notify 10 { |
261 |
match "system" "ACPI"; |
262 |
match "subsystem" "Resume"; |
263 |
action "/etc/rc.resume acpi $notify"; |
264 |
}; |
265 |
|
266 |
/* EXAMPLES TO END OF FILE |
267 |
|
268 |
# An example of something that a vendor might install if you were to |
269 |
# add their device. This might reside in /usr/local/etc/devd/deqna.conf. |
270 |
# A deqna is, in this hypothetical example, a pccard ethernet-like device. |
271 |
# Students of history may know other devices by this name, and will get |
272 |
# the in-jokes in this entry. |
273 |
nomatch 10 { |
274 |
match "bus" "pccard[0-9]+"; |
275 |
match "manufacturer" "0x1234"; |
276 |
match "product" "0x2323"; |
277 |
action "kldload if_deqna"; |
278 |
}; |
279 |
attach 10 { |
280 |
device-name "deqna[0-9]+"; |
281 |
action "/etc/pccard_ether $device-name start"; |
282 |
}; |
283 |
detach 10 { |
284 |
device-name "deqna[0-9]+"; |
285 |
action "/etc/pccard_ether $device-name stop"; |
286 |
}; |
287 |
|
288 |
# Examples of notify hooks. A notify is a generic way for a kernel |
289 |
# subsystem to send event notification to userland. |
290 |
|
291 |
# Here are some examples of ACPI notify handlers. ACPI subsystems that |
292 |
# generate notifies include the AC adapter, power/sleep buttons, |
293 |
# control method batteries, lid switch, and thermal zones. |
294 |
# |
295 |
# Information returned is not always the same as the ACPI notify |
296 |
# events. See the ACPI specification for more information about |
297 |
# notifies. Here is the information returned for each subsystem: |
298 |
# |
299 |
# ACAD: AC line state (0 is offline, 1 is online) |
300 |
# Button: Button pressed (0 for power, 1 for sleep) |
301 |
# CMBAT: ACPI battery events |
302 |
# Lid: Lid state (0 is closed, 1 is open) |
303 |
# RCTL: Resource limits |
304 |
# Suspend, Resume: Suspend and resume notification |
305 |
# Thermal: ACPI thermal zone events |
306 |
# |
307 |
# This example calls a script when the AC state changes, passing the |
308 |
# notify value as the first argument. If the state is 0x00, it might |
309 |
# call some sysctls to implement economy mode. If 0x01, it might set |
310 |
# the mode to performance. |
311 |
notify 10 { |
312 |
match "system" "ACPI"; |
313 |
match "subsystem" "ACAD"; |
314 |
action "/etc/acpi_ac $notify"; |
315 |
}; |
316 |
|
317 |
# This example works around a memory leak in PostgreSQL, restarting |
318 |
# it when the "user:pgsql:swap:devctl=1G" rctl(8) rule gets triggered. |
319 |
notify 0 { |
320 |
match "system" "RCTL"; |
321 |
match "rule" "user:70:swap:.*"; |
322 |
action "/usr/local/etc/rc.d/postgresql restart" |
323 |
}; |
324 |
|
325 |
*/ |