Поиск по этому блогу

понедельник, 18 апреля 2011 г.

СУФД: Альтернативное решение транспорта между СУФД УФК и СУФД ОФФЛАЙН на основе ПО с открытым кодом (lftp)

Предлагаю Вашему вниманию организацию передачи данных между СУФД ОФК и СУФД УФК на основе протокола FTP.


В УФК установлен и настроен FTP сервер, с ним и предполагается работать, для работы с ним необходимо выбрать программное обеспечение способное осуществлять автоматическую доставку данных на ftp сервер и их получение с него.

В качестве такой программы предлагаю использовать универсальный ftp-клиент LFTP. Неомного о нём из wikipedia:
lftp — консольный FTP-клиент для UNIX и UNIX-подобных операционных систем. Программа написана Александром Лукьяновым и распространяется по лицензии GNU GPL.
Кроме FTP программа также поддерживает протоколы FTPS, HTTP, HTTPS, HFTP, FISH и SFTP, используемый протокол автоматически определяется из URL-ссылки. Одно из достоинств программы Lftp - поддержка протокола FXP: передачи данных между двумя FTP-серверами без участия компьютера клиента.
С помощью команды torrent можно задействовать BitTorrent-клиент.

Lftp относится к мощ 085;ым FTP-клиентам, он имеет такие фукнции как рекурсивное зеркальное копирование дерева каталогов, автоматическое возобновление прервавшейся загрузки или приостановка вручную, выставление закладок для файлов и каталогов, и многое другое. Загрузка файлов в назначенное время, ограничение скорости загрузки, очереди загрузки. Контроль процесса загрузки в UNIX-подобной командной оболочке, либо автоматизация процесса скриптами.





Что мы имеем? Консольный открытый и бесплатный ftp-клиент пришедший к нам из мира *NIX. В данном случае будем использовать клиент специально скомпилированный под WINDOWS.

Для удобства работы в файле C:\WINDOWS\system32\drivers\etc\hosts обозначим FTP сервер УФК как ftpufk

10.XX.6.2 ftpufk

Для работы с lftp необходимо скачать его дистрибутив, он представляет из себя исполняемый файл lftp.exe и библиотеки в к нему, дистрибутив не требует инсталяции с сразу готов к работе. Дистрибутив необходимо разместить по следующему пути C:\ftas01\prod\lftp причем в папке lftp должны лежать библиотеки и исполняемый файл lftp.exe


Настройка lftp

Схему работы организуем в два потока для обеспечения распараллеливания процессов получения и отправки. Для обеспечения наилучшего восприятия и удобочитаемости вынесем эти два процесса в отдельные исполняемые скрипты.

Исходные данные

При авторизации на FTP сервере будут расположены следующие папки:
9500.4700 - входящая папка УФК (сюда необходимо отправлять свои исходящие данные)
9500.4700.47XX - исходящая папка УФК (отсюда необходимо получать данные для своего ОФК, где XX - номер Вашего отделения)

В ОФК на сервере СУФД мы имеем следующее расположение папок:
C:\ftas01\prod\sufd\exchange\9500.4700 - исходящая папка ОФК, данные из этой папки необходимо доставить на ftp сервер УФК ftp://47XX:47XX@ftpufk/9500.4700
C:\ftas01\prod\sufd\exchange\9500.4700\9500.4700.47XX - входящая папка ОФК, сюда необходимо складывать все входящие данные в том числе и из папки 9500.4700.47XX на FTP сервере УФК ftp://47XX:47XX@ftpufk/9500.4700.47XX

Получение данных

Для получения данных с УФК используем следующую схему:
lftp получает данные с ftp сервера и складывает их в буфферную папку, после получения всех данных скрипт перекладывает данные из буферной папки во входящую папку СУФД C:\ftas01\prod\sufd\exchange\9500.4700\9500.4700.47XX

Для реализации такой l9;хемы необходимо создать:
Каталог C:\ftas01\prod\lftp\9500.4700.47XX
Файл download.bat

В файл download.bat необходимо внести следующее:
:1
lftp -u 47XX,47XX -e 'lcd /cygdrive/c/ftas01/prod/lftp/9500.4700.47XX;mget -E /9500.4700.47XX/*.*;sleep 3m;bye' ftpufk
move C:\ftas01\prod\lftp\9500.4700.47XX\*.shipment C:\ftas01\prod\sufd\exchange\9500.4700.47XX\
move C:\ftas01\prod\lftp\9500.4700.47XX\*.revising C:\ftas01\prod\sufd\exchange\9500.4700.47XX\
goto 1

Где:
:1 и goto1 - бесконечный цикл
lftp -u 47XX,47XX -e 'lcd /cygdrive/c/ftas01/prod/lftp/9500.4700.47XX;mget -E /9500.4700.47XX/*.*;sleep 3m;bye' ftpufk

lftp -u 47XX,47XX -e '...' ftpufk - подкючение к FTP с учетной записью 47XX,47XX и выполнение произвольного сценария -e '...'

lcd /cygdrive/c/ftas01/prod/lftp/9500.4700.47XX - переход в каталог C:\ftas01\prod\lftp\9500.4700.47XX на локальной машине, так как программа изначально создавалась под *NIX системы обратите внимание на своеобразный способ указывания каталога.

mget -E /9500.4700.47XX/*.* - забирать файлы с FTP сервера из каталога 9500.4700.47XX по маске *.* при успешном завершении исходные файлы с ftp автоматически удаляются.

sleep 3m - задаём интервал в 3 минуты

bye - разрыв соединения с FTP сервером

move C:\ftas01\prod\lftp\9500.4700.47XX\*.shipment C:\ftas01\prod\sufd\exchange\9500.4700.47XX\ - переброска полученных данных из буфферной папки во входящу папку СУФД, выбрана строго определённая маска по типам файлов намеренно, чтоб исключить попадания в СУФД сторонних данных, например при использовании канала для переброски обновлений СУФД.


Доставка данных

Для доставки данных в УФК используем следующую схему:
Скрипт переносит данные подлежащие отправке из C:\ftas01\prod\sufd\exchange\9500.4700 в буфферную папку C:\ftas01\prod\lftp\9500.4700, lftp перемещает содержимое буферной папки на FTP сервер УФК в папку 9500.4700

Для реализации такой схемы необходимо создать:
Каталог C:\ftas01\prod\lftp\9500.4700
Файл upload.bat

В файл upload.bat необходимо внести следующее:

:1
move C:\ftas01\prod\sufd\exchange\9500.4700\*.shipment C:\ftas01\prod\lftp\9500.4700\
move C:\ftas01\prod\sufd\exchange\9500.4700\*.revising C:\ftas01\prod\lftp\9500.4700\
lftp -u 47XX,47XX -e 'lcd /cygdrive/c/ftas01/prod/lftp/9500.4700;cd 9500.4700;mput -E *.*;sleep 3m;bye' ftpufk
goto 1

Где:

:1 и goto1 - бесконечный цикл
lftp -u 47XX,47XX -e 'lcd /cygdrive/c/ftas01/prod/lftp/9500.4700;cd 9500.4700;mput -E *.*;sleep 3m;bye' ftpufk

lftp -u 47XX,47XX -e '...' ftpufk - подкючение к FTP с учетной записью 47XX,47XX и выполнение произвольного сценария -e '...'

lcd /cygdrive/c/ftas01/prod/lftp/9500.4700 - переход в каталог C:\ftas01\prod\lftp\9500.4700 на локальной машине, так как программа изначально создавалась под *NIX системы обратите внимание на своеобразный способ указывания каталога.

cd 9500.4700 - переход в каталог 9500.4700 на FTP сервере UFK

mput -E *.* - доставлять файлы на FTP сервер по маске *.* при успешном завершении доставки исходные файлы на локальной машине автоматически удаляются.

sleep 3m - задаём интервал в 3 минуты

bye - разрыв соединения с FTP сервером


Итог

Настройка закончена, настала пора всё это проверить в деле. Технология достаточно отработана, при разрыве канала связи данные будут докачены автоматически. Lftp сам по себе очень гибок и позволяет реализовывать очень интересные сценарии.

В предложеной схеме существует один потенциальный недостаток при отработке сценария описанный в файле upload.bat возможен обрыв канала связи, файл доставляемый в это время будет доставлен не полностью, в таком положении он и останется на FTP сервере УФК, СУФД УФК такой файл попробует обработать, но неуспешно потому что он окажется битым. При восстановлении канала связи этот файл успешно будет доставлен на FTP сервер УФК повторно, СУФД УФК в этом случае обработает его
91;спешно. Ситуация в целом не критичная, но создаст некоторый "мусор" в СУФД УФК.

Получить дистрибутив lftp можно здесь

P.S.:

Копируем у СУФД папку transformpackets со всем его содержимым, причем исходные файлы остаются на AIX, на всякий случай для разбора конфликтных ситуаций.

transformpackets.bat
lftp -u passufd,password_passufd -e 'repeat -d 5m source /cygdrive/c/ftas01/lftp/transformpackets.conf' aXX00p01


Подключаемся к серверу aXX00p01 с учётной записью passufd и паролем password_passufd выполняем сценарий С:\ftas01\lftp\transformpackets.conf c периодичностью в 5 минут.


transformpackets.conf
mirror --only-newer --verbose /../../ftas01/prod/sufd/stand/transformpackets /cygdrive/z/PROD;bye

Создаем зеркало папки transformpackets со всеми подпапками полностью сохраняя иерархию по следующему пути Z:\PROD





Переносим банковские выписки с локального каталога на AIX и забираем исходящие с AIXa

allbanks.bat
lftp -u pdboebs,pdboebs_password -e 'repeat -d 5m source /cygdrive/c/ftas01/lftp/allbanks.conf' aXX00p04

Подключаемся к серверу aXX00p04 с учётной записью pdboebs и паролем password_pdboebs выполняем сценарий С:\ftas01\lftp\allbanks.conf c периодичностью в 5 минут.

allbanks.conf
mirror --only-newer --verbose --Remove-source-files /../../ftas01/prod/oebs/temp/OUT /cygdrive/c/SUFD/bankout
mirror -R --only-newer --verbose --Remove-source-files /cygdrive/c/SUFD/bank /../../ftas01/prod/oebs/temp/IN/BANKS/044442001


В первой строке мы забираем (с удалением) выписки с AIX в локальный каталог C:\SUFD\bankout
Во второй строке мы переносим выписки с локального каталога (с последующим удалением) из каталога С:\SUFD\bank на AIX в каталог /ftas01/prod/oebs/temp/IN/BANKS/044442001

4 комментария:

  1. @echo off
    set kofk=4716
    color 0e && Title FTP script`s %kofk% && prompt -
    set kofk_c=9500.4700.%kofk%
    set lftp_dir=C:\ftas01\prod\lftp\%kofk_c%\
    set exch_dir=C:\ftas01\prod\sufd\exchange\%kofk_c%\
    if not exist "%lftp_dir%nul" goto end
    if not exist "%exch_dir%nul" goto end
    set dir_1=/cygdrive/c/ftas01/prod/lftp/%kofk_c%
    :run
    lftp -u %kofk%,%kofk% -e 'lcd %dir_1%;mget -E /%kofk_c%/*.*;sleep 3m;bye' ftpufk
    move %lftp_dir%*.shipment %exch_dir%
    move %lftp_dir%*.revising %exch_dir%
    goto run
    :end
    echo No direction "%lftp_dir%"
    echo or "%exch_dir%"
    pause > nul

    А если вот так?
    причем:
    1) в скрипте нужно всего лиш раз ввести данные по коду офк остальное проставит сам скрипт
    2) используются сим ссылки.
    3) две строчки с move необязательно тк в этой папки по сути должны лежать только шипманты и ревизии а значит можно одну с *.* или тупо *
    4) скрипт проверяет существование директорий C:\ftas01\prod\sufd\exchange\9500.4700.47XX и C:\ftas01\prod\lftp\9500.4700
    5) не выводит на экран что нам не нужно @echo off
    6) дополнение color 0e && Title FTP script`s %kofk% && prompt - устанавливает стиль форматирования

    также моно сделать вывод в лог файл допустим так lftp -u %kofk%,%kofk% -e 'lcd %dir_1%;mget -E /%kofk_c%/*.*;sleep 3m;bye' ftpufk >> c:\log.txt где c:\log.txt место куда будет сохранятся лог закачки... поидеи долно сработать скрипт не проверял тк не имею lftp на руках

    ОтветитьУдалить
  2. Спасибо за предложенное готовое решение, Ваш скрипт я проверил, он работает. Единственный момент пришлось убрать значение nul из проверки существования каталогов обмена.
    Насчёт предложенного логирования, такой метод работает.

    Предлагаю заменить строку: lftp -u %kofk%,%kofk% -e 'lcd %dir_1%;mget -E /%kofk_c%/*.*;sleep 3m;bye' ftpufk
    на : lftp -u %kofk%,%kofk% -e "mirror --verbose=3 --Remove-source-files --continue --log=/cygdrive/c/log.txt /%kofk_c% %dir_1%;sleep 1m;bye" ftpufk
    Механизм зеркалирования данных с фтп, какие здесь плюсы?
    1. Возможность организации одновременной загрузки нескольких файлов, ключ: -P, --parallel[=N] download N files in parallel
    2. Возможность писать лог штатными средствами lftp, ключ --log=FILE write lftp commands being executed to FILE

    Пройдусь по остальным ключам:

    --verbose=3 - уровень логирования (вывода на экран оталодочной информации)
    Verbosity level can be selected using --verbose=level option or by several -v options, e.g. -vvv. Levels are:
    0 - no output (default)
    1 - print actions
    2 - +print not deleted file names (when -e is not specified)
    3 - +print directory names which are mirrored

    --Remove-source-files - удаление файлов с фтп после их гарантированной закачки

    --continue - продолжение закачки с места остановки после потери связи, если это возможно.

    ОтветитьУдалить
  3. P.S. Ссылка на дистрибутив есть в самой статье "Получить дистрибутив lftp можно здесь"
    https://docs.google.com/leaf?id=0B6sq7Sp7O0HlN2E0ODdjNTQtMzY1Ni00MzA5LThhYTYtNWRlMTg5MDhlMDFl&hl=ru

    ОтветитьУдалить