Мы — долго запрягаем, быстро ездим, и сильно тормозим.

FreeBSD
  настройка
  подсчёт трафика
  программы
  почтовые системы
  Шелезяки
  UPS APC-1500
  NetMos NM9845
  cisco & syslog
  LAN card`s test
  HDD & UDMA100
  S.M.A.R.T.
  D-Link DE-200TP
  Marvell 88E8053
  D-Link DGE530T
  КПК + FreeBSD
  D-Link DWL-G520
  SkyLink-CDMA
  Atheros AR5007EG
  BlueTooth mouse
  Asus Eee PC
  atacontrol
  SkyStar-2+SlonAx
  TT budget S-1401
  SiS*Mirage*1 на D201GLY2
  NetXtreme BCM5722
  snd_hda
  Peoplenet + C-motech (3G)
  freebsd + huawei 162 gsm modem
  tw_cli
  pc_speaker
  Canon/gphotofs
  Охранная система на FreeBSD+LPT
  Даешь 220 в LPT
  Мелочи
  Файловая система
  WWW
  Security
  system
  Games Servers
  X11
  Programming
Очумелые Ручки
OpenBSD
Cisco


www.lissyara.su —> статьи —> FreeBSD —> Шелезяки —> Даешь 220 в LPT

Мониторим 220 на FreeBSD через LPT

Автор: -ZG-.


Недавняя реализация простой охранной системы через LPT на FreeBSD, дала почву для развития этой темы. По сути это ее продолжение но немного отделенное по смыслу.
В статье описан способ мониторинга наличия напряжения 220 вольт в электросети через LPT порт.

Статья будет полезна тем, у кого есть ПК с LPT портом, UPS без возможности управления с ПК, желающим корректного завершения работы ОС, вырубания соседних машин и уведомления при отсутствии электричества.

Общая схема:



Дано:

UPS без возможности подключения к ПК.
Сервер FreeBSD с LPT портом
Простейшая безопасная схема для подключения 220 к LPT =).
Программа lptmon

Пример работы:

Гдето работает сервер, внезапно пропадает электричество. Cервер и его друзья: конвертер, маршрутизатор, серверы и пр. продолжают работать от UPS.
Cервер, почуяв неладное отправляет об этом смс админу, пишет лог, ждет минуту (вдруг это 5ти секундный сбой) и вырубает другие серверы. Все корректно завершено, данные не утеряны, админ в курсе.
Если электричество появилось, но минута не прошла и сервер не успел вырубиться, он отправляет смс админу что все впорядке и продолжает работать.
Если сервер успел вырубиться, и электричество появилось например через час, то при появлении 220 сервер врубается (через опцию в биосе), загружается, врубает другие сервера через Wake on LAN (прим: настройка Wake on LAN в статье не описывается) и отправляет смс админу о том что все ок.

Инструменты:

FreeBSD + mysql (второе не обязательно, только для лога)
LPT порт
Паяльник, припой, канифоль, провода
Cхема мониторинга 220 (блок питания и оптрон)
программа lptmon

Суть:

У LPT порта есть 5 ног чтения (они же пины) 10,11,12,13 и 15, заметьте 14й тут нет!. Они являются входами и используются принтерами как тумблеры, при событиях например:
кончилась бумага,
принтер занят,
ошибка печати, итд итп.

Они то нам и нужны, к ним можно подключить 5 разных устройств.

Распиновка LPT порта



Под FreeBSD работает программа lptmon которая мониторит эти пины.
Если взять кусок проволоки и замкнуть любой из вышеперечисленных
пинов на землю. (земля - любой с 18 по 25 пин этого же LPT порта) то программа
будет считать что пин включился. Каждый пин, через программу lptmon, может вызывать 3 события при которых можно выполнять комманды или запускать скрипты:
1. Пин включился
2. Пин работает (срабатывает каждую секунду пока пин замкнут)
3. Пин выключился

Собстно lptmon выполняя комманды при событиях от пинов запускает скрипты которые пишут в базу лог срабатывания, текущее состояние устройств подключенных к lpt порту, сохраняет скриншоты с камеры на винт, отправляют смс если нада итд.

План действий

1. Собрать схему, подключить ее к LPT
2. Настроить lptmon
3. Настроить скрипты.

1. Сборка и подключение схемы

Схема


Т.к мы будем подключать 220 к порту, необходимо позаботиться о его безопасности. Для этого нужно использовтаь небольшое напряжение, для чего берем блок питания (я нашел на 5в, 2.5А от конвертера) подключаем его к оптрону через резистор и потом уже к LPT.
Оптрон, грубо говоря, работает по принципу: если есть достаточное напряжение и сила тока на 1 и 2 ногах то он замыкает 5 и 4 ноги. Если силы и напряжения не достаточно (когда БП выключен) то он не замыкает 4 и 5 ноги. А если более чем достаточные (например бп переглючил и он стал давать 120вольт) то оптрон сгарает и это не влияет на 4 и 5 ноги (т.е на вторую цепь).
Поскольку оптрон (4n35) штука защитная, имеющая две цепи не связанные между собой, он еще и призван умирать при силе тока большей чем 60мА ( это 0.06А, а у моего БП аж 2.5А). То есть, силы тока 2.5А более чем достаточно для того чтоб он испугался и умер. По этому, для того чтобы ограничить силу тока используем резистор. В моем случае это 500ом. Резистор подбирается индивидуально под блок питания. Вычислить резистор можно формулой R=U/I где U - напряжение дающее БП (вольты), I - нужная оптрону сила тока (Амперы) для работы. Сила тока нужная оптрону для замыкания второй цепи лежит в пределах от 0 до 60 мА, Допустим решили подавать ему 1мА для чего расчитаем резистор: R=5в/0.01А , R = 500 следовательно нам нужен резистор 500ом. Можно взять и меньше, 400, 300 ом главное чтоб сила тока не получилась больше 60мА.

Для подключения к LPT был разобран старый шнур от принтера. В корпусе от шнура собраны гнездо для подключения БП и оптрон.
Вот что получилось:

Готовый lpt разьем и черный кабель от БП.


Оптрон с резистором, они внутри разъема



2. Настройка lptmon

Создаем директорию /usr/local/etc/lptmon
качаем архив lptmon.tar.gz с программой lptmon и примерами скриптов и распаковываем:
#mkdir /usr/local/etc/lptmon
#cd /usr/local/etc/lptmon
#fetch http://zgbox.ru/files/notes/lptmon.tar.gz
#tar -xzvf lptmon.tar.gz

Зеркало:
файл скачан размер размещён примечание
lptmon+.tar.gz
334 26.3kb 2011-06-29 lptmon, скрипты, исходники

В архиве лежит lptmon.c - это исходники программы, писал я ее сам, это моя первая программа на С++ под FreeBSD как и в прочем первая на C =) так что если есть примечения, дополнения - в студию.
Также там лежит сам уже откомпелированный файл lptmon, можно юзать его, установив chmod 777 lptmon если необходимо, а можно откомпелировать исходники коммандой
#CC lptmon.c -o lptmon_compiled

Директория to_rc.d содержит скрипт lptmon который необходимо скопировать директорию в /usr/local/etc/rc.d/ он нужен для автоматического запуска программы lptmon при старте FreeBSD. Также необходимо в файл /etc/rc.conf прописать lptmon_enable="YES" иначе никакого (авто)запуска он выполнять небудет. Собсно делаем:
#cp to_rc.d/lptmon /usr/local/etc/rc.d/lptmon
#echo lptmon_enable="YES" >> /etc/rc.conf

Теперь программа lptmon будет стартовать с системой, также ее можно стартовать вручную как просто запустив ./lptmon так и выполнив rc.d скрипт /usr/local/etc/rc.d/lptmon start или stop
В запуске нет ничего особенного, просто запускается /usr/local/etc/lptmoon/lptmon а при stop убивается коммандой killall lptmon
Но пока не нужно ничего запускать, сначала нужно настроить конфиг, об этом чуть пожже.
Директория testlpt, в ней лежит программа pr22 и ее исходник для тестирования lpt порта. Работает просто: запускается, получает состояния с 10 по 15 пинов и если какойто пин замкнут на землю то выдает pin10 on
у меня в данный момент 10й пин замкнут на что программа отвечает
#./pr22
pin10 on

Можно смело использовать в своих скриптах
Итак собсно пробуем замнкть один или несколько из 10,11,12,13,15 пинов на землю (на любой с 18 по 25 пин) и запустить ./pr22
Если программа показывает что замкнутые пин(ы) on значит все ок, если нет - то я хз почему не видит ваш lpt порт, ковыряйте исходники %)

Переходим к настройке самого lptmon.
Итак, исходя из того, что у нас будет подключена схема к 12 пину то сконфигурим так чтоб при событиях 12 пина при старте и запуске выполнялись скрипты 12_start, 12_end.

Ложим конфиг lptmon.config из расспакованного архива в /usr/local/etc/lptmon.config и редактируем любимым редактором, у меня это mcedit от mc.
#cp lptmon.config /usr/local/etc/lptmon.config
#mcedit /usr/local/etc/lptmon.config

Это сокращенный, необходимый только для этой статьи конфиг, подробный в архиве.
#конфиг файл lptmon.config программы lptmon
#должн лежать в /usr/local/etc/
#в параметрах допускаются табы и пробелы
#ковычки не допустимы!

#каждый пин может вызывать 3 события (выполнять комманды) при смене состояния:
#1. при переходе из пассивного состояния в активное
#2. при работе в цикле (срабатыват каждый раз при опросе если пин 
# в активном состоянии)
#3. при переходе из активного состояния в пассивное

pin12enable = yes
pin12onstart = /usr/local/etc/lptmon/220v/12_start
pin12oncycle = /usr/local/etc/lptmon/220v/12_cycle
pin12onend = /usr/local/etc/lptmon/220v/12_end


3. Настройка скриптов

листинг 12_start
#!/bin/sh

#скрипт срабатывает когда дали электричество
#или загрузился комп

db_host=localhost
db_pass=
db_user=root
db_name=security
obname=220v

#двумя запросами пишем лог в базу и устанавливаем статус on для устройства 220v

sql="use $db_name; insert into objects_hist (obname,status,dt) values \
('$obname','on',now());"
#echo $sql
/bin/echo $sql | /usr/local/bin/mysql -h$db_host -u$db_user -p$db_pass

sql="use $db_name; update objects set status='on', dtstart=now() \ 
where obname='$obname';"
/bin/echo $sql | /usr/local/bin/mysql -h$db_host -u$db_user -p$db_pass

#отправляем смс админу о том что 220 дали или серв включился

/usr/local/etc/lptmon/sms '220v ON '`date +%m.%d-%H:%M:%S`

листинг 12_end
#!/bin/sh

#срабатывает когда отключилось 220

db_host=localhost
db_pass=
db_user=root
db_name=security
obname=220v

#пишем в базу логи и состояние off устройства 220v

sql="use $db_name; insert into objects_hist (obname,status,dt) values \
 ('$obname','off',now());"
#echo $sql
#/bin/echo $sql | /usr/local/bin/mysql -h$db_host -u$db_user -p$db_pass

sql="use $db_name; update objects set status='off', dtend=now() \ 
where obname='$obname';"
#/bin/echo $sql | /usr/local/bin/mysql -h$db_host -u$db_user -p$db_pass


#отправляем смс о том что нет электричества и ставим таймер на 60 сек
#по завершению которого скрипт 12_cycle вырубит компы

/usr/local/etc/lptmon/sms '220v OFF '`date +%m.%d-%H:%M:%S`
echo 60 > /usr/local/etc/lptmon/220v/timer

Эти скрипты выполняют по два Sql запроса к mysql. Запросы обновляют текущее состояие устройства с именем 220v в таблице objects и пишут лог в таблицу objects_hist. Дамп структуры таблиц dump_security.sql также лежит в архиве.
Помимо этого скрипты отправляют смс.
Скрипт 12_end записывает цифру 60 в файл /usr/local/etc/lptmon/220v/timer для того чтобы потом скрипт 12_cycle который будет срабатывай каждую секунду пока нет электричества, брал эту цифру и отнимал по единице. Когда станет 0 он запустит программу wudown которая вырубит по сети комп с windows (ip 192.168.97.52) и вырубит сервак коммандой shutdown -p now.
листинг 12_cycle
#!/bin/sh

path=/usr/local/etc/lptmon/220v/timer
timer=`cat $path`
timer=`expr $timer - 1`;
if [ $timer -gt 0 ]; then
echo $timer > $path
echo $timer
else
echo "shuttdowning..."
/usr/local/bin/wudown 192.168.97.52 1209 shutdown
shutdown -p now
fi




первоисточник



Ссылка на обсуждение: http://forum.lissyara.su/viewtopic.php?f=14&t=33284.

размещено: 2011-06-29,
последнее обновление: 2011-08-21,
автор: -ZG-

оценить статью:

Ытя, 2011-07-08 в 7:21:57

Очередной костыль.
Не вижу смысла в этом. Хотя, если просто поучиться, то может и есть толк.

Artem, 2011-12-17 в 22:18:04

Что делать в ситуации, когда сервак уже выключился, а бесперебойник не успел полностью розрядиться и включилось питание фитча "сервер врубается (через опцию в биосе)" не поможет?

-ZG-, 2011-12-25 в 18:59:22

2Artem такаяже ситуация, как вариант в момент пропажи электричества (или через минуту) скриптом быкапить настройки, вырубать соседние машины, корректно завершать демоны и базы и ждать пока сдохнет упсник и обесточит сервак.
А если вдруг электричество появилось - то запускать остановленное.
у меня так и настроено, только еще смски шлет в момент вырубания 220 и через минуту его отсутствия.

2ZG, 2012-02-29 в 11:07:00

2Artem & -ZG-
Если с ЮПС-ом разговаривать на его языке, то после пропадания напруги ЮПС посылает сигнал компу, комп сам решает на каком моменте издыхания батарей отключаться и шлет об этом сигнал ЮПСу, который запускает отчет давая компу шутдауниться и после этого отключает розетки до тех пор, пока не появится напруга.

Обучить комп общаться с ЮПСом можно этим:
networkupstools.org

-ZG-, 2012-03-01 в 8:45:29

Это конечно все правильно, если упс умеет разговаривать с пк, а если неумеет...

sergoff, 2012-06-25 в 14:42:51

) интересно товарищ выразился насчет силы тока в в оптроне))..

на самом деле сила тока зависит от нагрузки. а так как нагрузка блока питания - обычный светодиод ( вход оптрона) то расчет будет такой: Uвх=5В, Uled=1.5..2.5 В Iled=5..20 ( ток достаточный для работы любого индикаторного светодиода) откуда  Ur=Uвх - Uled= 5-2=3В, а так как Iled=Ir то находим сопротивление R=Ur/Iled =  3/0.005 = 600 Ом )) так что автор угадал


Оставьте свой комментарий:
Ваше имя:   *
e-mail:  
жирный
наклонный
подчёркнутый
ссылка
цвет
Нынешний год:   *
 


Хостинг HOST-FOOD

2014-07-27, lissyara
gmirror

Удалённое создание софтверного зеркала средствами gmirror, на диске разбитом с использованием gpart. Использование меток дисков для монтирования разделов.
2013-08-20, zentarim
Scan+Print server FreeBSD 9

Настройка сервера печати и сервера сканирования под управлением операционной системы FreebSD 9 для МФУ Canon PIXMA MP540
подписка

    вверх      
Статистика сайта
Сейчас на сайте находится: 12 чел.
За последние 30 мин было: 41 человек
За сегодня было
1303 показов,
252 уникальных IP
 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0475 секунд
Из них PHP: 26%; SQL: 74%; Число SQL-запросов: 83 шт.
У Вас отключено GZIP-сжатие в браузере. Размер страницы 113172