SOAP nalog.ru и собеседование на админа

Меня сегодня на собеседовании попросили «Набросать скрипт на баше, которых ходит по ссылке http://fias.nalog.ru/WebServices/Public/DownloadService.asmx зырит версию выложенной базы, и в случае если у локальная версия устарела скачать новую версию». «Ага» подумал я, сейчас мы следаем
[cc lang=’bash’]VERSION=`curl -s $link | grep version | sed -e ‘s/version=//’
LINK=`curl -s $link | grep link | sed -e ‘s/link=//’
if [$VERSION -gt `cat base.version`]
then
wget -O base.rar $LINK
unrar x base.rar
echo $VERSION > base.version
echo «New version ($VERSION) DB is downloan»
else
echo «Local version ($VERSION) DB is actual»
fi[/cc]
Но! Его величество nalog.ru взял и сказал «Шли бы вы молодой человек отсюда с вашими скриптами, у нас тут SOAP во все поля». SOAP я раньше никогда не вилел (да и можно сказать не слышал). В общем за отведенные мне 15 минут (сам столько попросил, поскольку еще не был в курсе про SOAP) я судорожно прочитал теорию, нашел пару примеров на http://stackoverflow.com которые «в лоб» у меня не заработали и так и сдался.
Собственно примеры запросов которые работают.
Для «всех версий». Если нужны только дельты например, но не только «последние», но и «предпоследние»
[cc lang=’bash’]
curl —silent \
—data \
@- \
—header ‘POST /WebServices/Public/DownloadService.asmx HTTP/1.1’ \
—header ‘Host: fias.nalog.ru’ \
—header ‘Content-Type: text/xml’ \
—header ‘charset=utf-8’ \
—header ‘SOAPAction: «http://fias.nalog.ru/WebServices/Public/DownloadService.asmx/GetAllDownloadFileInfo»‘ \
—user-agent «» \
http://fias.nalog.ru/WebServices/Public/DownloadService.asmx <





EOF[/cc]

Для запроса информации только о последнем обновлении (например что бы забрать сразу всю базу, или если проверяете раз в 10 минут и уверены что с момента прошлой проверки не могло выйти пять промежуточных версий.
[cc lang=’bash’]
curl —silent \
—data \
@- \
—header ‘POST /WebServices/Public/DownloadService.asmx HTTP/1.1’ \
—header ‘Host: fias.nalog.ru’ \
—header ‘Content-Type: text/xml’ \
—header ‘charset=utf-8’ \
—header ‘SOAPAction: «http://fias.nalog.ru/WebServices/Public/DownloadService.asmx/GetLastDownloadFileInfo»‘ \
—user-agent «» \
http://fias.nalog.ru/WebServices/Public/DownloadService.asmx <





EOF[/cc]

А вот и готовый вариант:
[cc lang=’bash’]#!/bin/bash

set -o pipefail

DBType=Kladr47ZUrl #Тип БД, которую качаем, можно закоментить ‘rm $TmpFile’ внизу скрипта и посмотреть какие есть варианты
DBPatch=base #Путь в локальной ФС, куда качаем и потом распаковываем
DBPatchVersFile=$DBPatch/version.txt # Имя файла, в котором храним номер локальной БД
RAND=`head -c 100 /dev/urandom | base64 | sed ‘s/[+=/A-Z]//g’ | tail -c 20` #Имя временного файла, с результатами запроса
TmpFile=/tmp/$RAND
TmpFileDB=base.compress
SoapRequestFile=request.soap

if ! [ -d $DBPatch ]; then #Проверка существования директории для БД
echo «DB directory not found: $DBPatch»
exit 1
fi

if ! [ -f $DBPatchVersFile ]; then #Проверка существования файла версии
echo ‘DB directory its empty, create DBPatchVersFile’
echo 0 > $DBPatchVersFile || exit 1
fi

cat $SoapRequestFile | curl —silent —data @- —header ‘POST /WebServices/Public/DownloadService.asmx HTTP/1.1’ —header ‘Host: fias.nalog.ru’ —header ‘Content-Type: text/xml’ —header ‘charset=utf-8’ —user-agent » —header ‘SOAPAction: «http://fias.nalog.ru/WebServices/Public/DownloadService.asmx/GetLastDownloadFileInfo»‘ http://fias.nalog.ru/WebServices/Public/DownloadService.asmx | xmllint —format — > $TmpFile || exit 1

DBVers=`cat $TmpFile | grep VersionId | sed -e ‘s/\s*<\/*\w*>//g’` || exit 1
LocalDBVers=`cat $DBPatchVersFile` || exit 1

if [ $DBVers -gt $LocalDBVers ]
then
Link=`cat $TmpFile | grep $DBType | sed -e ‘s/\s*<\/*\w*>//g’` || exit 1
echo «Start download $Link to $TmpFileDB»
curl -s -o $TmpFileDB $Link || exit 1

echo «Start uncompress $TmpFileDB to $DBPatch»
7za x -aoa -o$DBPatch $TmpFileDB || exit 1 # Если изменить $DBType вероятнее всего нужно будет изменить и командку распаковки.

echo $DBVers > $DBPatchVersFile || exit 1
echo «New version ($DBVers) DB is downloan and uncompress to $DBPatch»

rm -r $TmpFileDB
rm $TmpFile # Comment me for see TmpFile or debug
# echo «TmpFile $TmpFile» # Uncomment this line if you comment previous line
else
echo «Local version ($LocalDBVers) DB is actual»
fi
[/cc]
И что бы это работало, нам нужен файл request.soap рядом со скриптом: [cc lang=’xml’]




[/cc]

You can leave a response, or trackback from your own site.

Leave a Reply

Subscribe to RSS Feed