К серверу системы мониторинга Zabbix, подключен USB модем для отсылки SMS-сообщений посредством smsd.
Модем, в силу некоторых обстоятельств, может быть переподключен к серверу и ему может назачиться новое имя последовательного устройства, в результате чего smsd отвалится.
Чтобы после переподключения последовательный порт модема назывался всегда одинаково, нужно знать принцип именования последовательных устройств и реагировать на их подключение/отключение.
Имя последовательного порта можно узнать через sysctl:
1 2 3 4 5 6 7 8 9 |
root@mon01:/# sysctl dev.u3g dev.u3g.0.ttyports: 2 dev.u3g.0.ttyname: U0 dev.u3g.0.%parent: uhub3 dev.u3g.0.%pnpinfo: vendor=0x12d1 product=0x1003 devclass=0x00 devsubclass=0x00 sernum="" release=0x0000 mode=host intclass=0xff intsubclass=0xff intprotocol=0xff ttyname=U0 ttyports=2 dev.u3g.0.%location: bus=4 hubaddr=1 port=1 devaddr=2 interface=0 ugen=ugen4.2 dev.u3g.0.%driver: u3g dev.u3g.0.%desc: HUAWEI Technology HUAWEI Mobile, class 0/0, rev 2.00/0.00, addr 2 dev.u3g.%parent: |
ttyname как раз и указывает на имя устройства, т.е в данном случае оно будет /dev/ttyU0. Также можно распарсить dev.u3g.0.%pnpinfo и получить ttyname от туда.
Имя получили, теперь создадим ссылку при помощи /etc/devd. В /etc/devd.conf прописываем:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
attach 10 { match "vendor" "0x12d1"; match "product" "0x1003"; action "rm /dev/modem0"; action "ln -s /dev/tty`sysctl dev.u3g | grep 'vendor=$vendor*.product=$product' | sed -e 's/.*ttyname=//' | sed -e 's/\ ttyport.*//'`.0 /dev/modem0"; action "/usr/local/etc/rc.d/smsd status && /usr/local/etc/rc.d/smsd restart"; }; detach 10 { match "vendor" "0x12d1"; match "product" "0x1003"; action "/usr/local/etc/rc.d/smsd status && /usr/local/etc/rc.d/smsd stop"; action "rm -r /dev/modem0"; }; |
Здесь при подключении модема удаляем старую ссылку на устройство, грепаем sysctl по вендору и PID, выделяем имя устройства, создаем софтлинк на модем и перезагружаем devd.
Всех с праздником!
P.S.: Те люди, чьим родным языком является язык sed, скажут, что можно всё сделать одной строкой и будут в чем-то правы, но так тоже не плохо.
Спасибо