Показаны сообщения с ярлыком incron. Показать все сообщения
Показаны сообщения с ярлыком incron. Показать все сообщения

30 июн. 2010 г.

Перекодировка выгрузок клиент-банка на лету (iconv + incrond)

Думал, что писал об этом, а оказалось, что думал о том, чтобы написать ;) Так или иначе, имеется небольшой скриптик, который в связке с когда-то упомянутым incron'ом занимается перекодировкой (практически "на лету") выгружаемой информации из клиент-банка из UTF-8 в CP-1251 для последующей загрузки оной в 1Сv8.1.
Создать его пришлось вследствие нежелания 1С-ки кушать выгруженные из клиент-банка (java-апплет ibank2, доступ через Firefox) данные, ибо они отдаются и сохраняются в UTF-8, тогда как 1C-ка (запущена под Wine@Etersoft) понимает только CP-1251.
Описанный костыль работает следующим образом: демоном incrond мониторится папочка:
incrontab -l
/exchange/банк/экспорт IN_CLOSE_WRITE /usr/local/bin/bank_tr_ex.sh $#
Как только в ней сохраняется файл (флаг IN_CLOSE_WRITE), запускается скрипт bank_tr_ex.sh:

#!/bin/bash

ICONV=/usr/bin/iconv
DIR=/home/exchange/банк/экспорт
OLDDIR=/home/exchange/банк/экспорт/old
FILE="$@"
ENC=`enca -i $DIR/$FILE`

if [ "$ENC" == "UTF-8" ]; then
        #echo $FILE
        sleep 1
        mv $DIR/$FILE $OLDDIR/$FILE.utf
        $ICONV -o $OLDDIR/$FILE -f UTF-8 -t CP1251 $OLDDIR/$FILE.utf
        mv $OLDDIR/$FILE $DIR/$FILE
fi
Задача скрипта: забекапить загруженный файл ($FILE.utf), транскодировать его в CP1251, подсунуть перекодированный файл вместо изначального.
После этого 1С-ка кушает выгрузку за милую душу ;)

3 сент. 2009 г.

inotifywait / incron - базовое использование


Часто требуется мониторить какой-то системный каталог на предмет создания/изменения/удаления файлов в нем и совершать в зависимости от произошедшего события некие действия: просканить на вирусы, изменить права доступа, послать сообщение, etc. 
Наиболее удобным средством для подобного мониторинга мне видится inotify - подсистема ядра Linux, занимающаяся слежением за событиями на уровне файловой системы. Ее возможности как раз соответствуют поставленным парой предложений выше задачам, а также оставляют немалый "запас прочности" на более широкий спектр вопросов. Для работы с inotify следует установить пакет inotify-tools. Это даст возможность воспользоваться в своих скриптах утилитами inotifywait и inotifywatch.
Первая утилита, inotifywait, ждет определенных изменений заданного файла (или файлов в каталоге) и при их возникновении завершает свою работу или пишет в STDOUT лог произошедших действий (если работает в режиме монитора -m). Идеальна для использования в скриптах. К примеру, 
#!/bin/bash
INF=/usr/bin/inotifywait
TARGET=/home/share/
$INF -mrqq --format '%w%f' -e close -e moved_to -e create -e modify $TARGET | while read file; do chmod -R 777 $file; done 
Сей скрипт будет давать права 777 файлу $file при его создании, модификации, перемещении в заданную $TARGET директорию.
inotifywatch, вторая утилита пакета, предназначена для мониторинга заданного файла/каталога на предмет определенных действий над оным за заданный промежуток времени с последующей выдачей статистики.  Ее выгодно применять для какого-нить дебага нибудь-чего.

Вместо использования inotifywait для мониторинга внутри скрипта, с последующим выполнением какого-то действия, очень удобно использовать демон incron (это отдельный пакет, использующий ту же подсистему inotify), который занимается по сути тем же самым, и при совершении заданного действия запускает указанный ему скрипт. Очень хороший русскоязычный док по работе с incron'ом можно поглядеть тут, имеются и примеры использования. Дабы не увеличивать степень энтропии интернетов, копировать сюда думаю излишне. В качестве примера, сейчас работает вот такой скрипт:
#: /home/interra# cat /etc/incron.d/temp
/home/share/ IN_CREATE,IN_ACCESS,IN_MODIFY /home/interra/temper.sh
#: /home/interra# cat /home/interra/temper.sh
#!/bin/bash

/bin/chmod -R 777 /home/share/
Также можно, аналогично работе с cron, использовать утилиту incrontab для записи правил срабатывания incron-a. "Внутрь" его записывается то же, что сохраняется в /etc/incron.d/.
А если в двух словах - работа с incron абсолютно идентична работе с cron. Вообще, incron = inotify cron.