Введение


image
Очень часто пользователи просят установить ДубльГИС (не сочтите за рекламу) справочник, особенно если пользователь ездит в командировки, общается с людьми из других городов.

И как у любого системного администратора у меня возникла идея автоматически и централизованно обновлять ДубльГИС для всех городов.

По ряду причин решено было сделать это средствами Linux.
Одной из причин являлось отсутствия решения для централизованного обновления под данную операционную систему.
Еще одной — отсутствие файла на сайте со всеми базами и оболочкой в одном архиве для пользователей Linux.

В данной статье я расскажу как можно обновить ДубльГИС для всех городов, консольными средствами Linux.

Что понадобится?


  • Linux сервер (у меня работает под Fedora 15)
  • wget
  • sed,grep
  • unzip
  • Ваш любимый текстовый редактор


Пишем скрипт


Вот какой скрипт получился у меня.

Качаем Web страницу со ссылками на города.
wget --no-proxy --html-extension -P/root/2gis 'http://www.2gis.ru/how-get/linux/'

Выдираем из всех html файлов, что скачались, все строки со ссылками, сортируем, удаляем дубликаты и записываем их во временный файл index.tmp.
cat /root/2gis/*.html | grep http:\/\/ |sort |uniq >/root/2gis/index.tmp

Удаляем web-страницу — она больше не нужна.
rm -f /root/2gis/*.html

Этой жуткой командой мы обработали Index.tmp на предмет вытаскивания всех ссылок со строкой how-get и сразу закачали web-страницы по этим ссылкам.
cat /root/2gis/index.tmp | grep -o [\'\"\ ]*http:\/\/[^\"\'\ \>]*[\'\"\ \>] | sed s/[\"\'\ \>]//g | grep how-get | xargs wget --no-proxy -r -p -np -l1 -P/root/2gis --tries=10 --html-extension --no-directories --span-hosts --dot-style=mega

Удалили index.tmp — только мешается.
rm -f /root/2gis/index.tmp

Склеили все файлы с расширением html в один index2.tmp.
cat /root/2gis/*.html >/root/2gis/index2.tmp

Удаляем скаченные Web-страницы.
rm -f /root/2gis/*.html

Теперь самое интересное — нужно выдернуть ссылки на обновления и скачать файлы по ним.

Обрабатываем index2.tmp на предмет ссылок со строкой "/last/linux/", сортируем, удаляем дубликаты и сразу качаем в папку 2gis.arch только новые файлы
cat /root/2gis/index2.tmp | grep -o [\'\"\ ]*http:\/\/[^\"\'\ \>]*[\'\"\ \>] | sed s/[\"\'\ \>]//g | grep "/last/linux/" | sort | uniq | xargs wget --no-proxy -nc -P/root/2gis.arch --tries=3 --html-extension --no-directories --span-hosts --dot-style=mega

Удаляем все временные файлы.
rm -fr /root/2gis/index*

Распаковываем из папки с архивами все zip файлы в нашу целевую папку /root/2gis/
unzip -o /root/2gis.arch/\*.zip -d /root/2gis/
Удаляем архивы старше 20 дней, чтобы не было дубликатов
find /root/2gis.arch/ -name * -mtime +20 |xargs rm -fr

Теперь в папке /root/2gis лежит распакованный ДубльГИС для всех городов, а в папке /root/2gis.arch архивы для пользователей Linux, скачанные с сайта.
Ставим скрипт на выполнение по cron'у.
Я поставил на каждый день, скрипт не скачает лишних файлов.

Заключение


Структура сайта Дубл��ГИС постоянно меняется, не исключено, что скрипт может не скачать обновления. Рекомендую периодически это контроллировать.

UPDATED 31.12.2011

Отредактировал скрипт. Убрал все лишнее.

Новый вариант.
wget -O - 'http://www.2gis.ru/how-get/linux/' 2>/dev/null | sed "s/^.*\(http:\/\/[^\"\'\ ]*\/how-get\/linux\/\).*$/\1/g" |\
grep "how-get\/linux"|sort|uniq|xargs wget -p -O - 2>/dev/null |sed "s/^.*\(http:\/\/[^\"\'\ ]*\/last\/linux\/\).*$/\1/g"|grep "last\/linux"| sort|uniq|\
xargs wget -N -P/root/2gis.arch
unzip -o /root/2gis.arch/\*.zip -d /root/2gis/


PS Спасибо kriomant за конструктивную критику.
Всех с новым годом!