Автоматическая установка и обновление 2gis под nix'ами


Возникла необходимость у людей в использовании 2gis. Он поддерживает установку в сетевую папку и использование без установки чего либо на каждом компьютере. Одна беда, для обновления требуется запускать отдельную службу, которая работает или под Windows или под Wine.

Сервер у меня под FreeBSD без Xов и прочего, соответственно, Wine отстутствует. А все настраивать под Windows очень не хочется.

Пришлось придумывать скрипт, который бы полностью установил 2gis со всеми плагинами и городами в определенную папочку на сервере.

Задача разделилась несколько подзадач:

  1. Получение и установка оболочки 2GisShell
  2. Получение и установка плагинов. Т.к. часть плагинов в архивах zip, а часть в виде MSI файликов задача разделилась на:
    1. Получение zip архивов плагинов и распаковка их в нужный каталог
    2. Получение MSI файлов плагинов, их распаковка, переименование файлов и копирование в нужный каталог
  3. Выбор, получение и установка карт городов.

Из-за того, что несколько подзадач, скрипт получился несколько больше чем расчитывал, но надеюсь, достаточно полный и надежный. Т.к. нужно было выдергивать файлы из MSI, как архиватор решил использовать 7zip, т.к. он справляется и с архивами и с MSI.

Пробовал использовать cabextract и unshield, но ни тот ни другой не смогли нормально распаковать MSI - получались какие-то невнятные файлы.

Вылезла фишка, через DNS выдаются разные сервера, с которых у меня качается с разной скоростью от 60 Кбайт/сек до 5 Мбайт/сек. С этим разбираться не стал, т.к. обновление требуется не часто и время, которое на это потрати сервер, не имеет значения.

Писалось на sh под FreeBsd, но по идее, должно отработать и на всяких Ubuntu и т.д. Скорее всего, можно было сделать все несколько оптимальнее, но успокоился на таком варианте.

Используются: sh, 7zip, wget, sed, awk, xargs, tr

Далее сам скрит. Запускать нужно с параметром, куда установить все это безобразие.

#!/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin

if [ -z "$1" ]
then
        echo Path for install not found. Usage: $0 path_for_install
        exit
fi

INSTALL_PATH="$1"
INSTALL_PATH_PLUGINS="${INSTALL_PATH}/Plugins/"
DOWNLOAD_FILE="2GISShell.msi"
DOWNLOAD_FILE_BASE="2GISBase.zip"
# DownLoad city list "nizhniy-novgorod|moscow|..."
# For all usage "."
DOWNLOAD_CITY="nizhniy-novgorod|moscow"
URL="http://www.2gis.ru/how-get/linux/"
TMP_PATH="/tmp/2gis_update/"
WGET_CMD="wget -q -O "
_7Z_CMD="7z x -y -x!MarkInstall"

#Create work dir
mkdir -p ${TMP_PATH}

echo Get 2gis shell
${WGET_CMD} - ${URL}\
| tr ',' '\n' | grep -E '2GISShell.*.msi' \
| grep url | sed 's/.*:"/"/' | uniq |\
xargs ${WGET_CMD} ${TMP_PATH}${DOWNLOAD_FILE}
 ${_7Z_CMD} -o${TMP_PATH} ${TMP_PATH}${DOWNLOAD_FILE}

FILE_LIST=`ls ${TMP_PATH}/ | grep -v -E '\.zip|\.msi|plugin'`
for FILE in ${FILE_LIST}
do
        FILE_OUT=`echo ${FILE}| sed 's/Sgn$/\.dgxpi/;s/Dll$/\.dll/;s/Chm$/.chm/;s/EXE$/.exe/;s/.*\///g'`
        cp "${TMP_PATH}${FILE}" "${INSTALL_PATH}${FILE_OUT}"
done

echo Get plugins zip
URL_PLUGIN=`wget -q -O - ${URL}| tr ',' '\n' |\
 grep -E '^"url"' | grep -E 'MapNote|GoTo|ComputeAreaPlugin2|Plugin'\
| sed 's/.*:"\(.*\)".*/\1/' |\
 grep '^http' | sort | uniq | grep \.zip`

for URL_CUR in ${URL_PLUGIN}
do
        mkdir -p ${INSTALL_PATH_PLUGINS}
        NAME_PLUGIN=`echo ${URL_CUR}|sed 's/.*\///g;s/"//'`
        ${WGET_CMD} ${TMP_PATH}${NAME_PLUGIN} ${URL_CUR}
        ${_7Z_CMD} -o${INSTALL_PATH_PLUGINS} ${TMP_PATH}${NAME_PLUGIN}
done

echo Get plugins msi
URL_PLUGIN=`wget -q -O - ${URL} | tr ',' '\n' |\
 grep -E '^"url"' | grep -E 'MapNote|GoTo|ComputeAreaPlugin2|Plugin'\
| sed 's/.*:"\(.*\)".*/\1/' |\
 grep '^http' | sort | uniq | grep \.msi`

mkdir -p ${INSTALL_PATH_PLUGINS}
for URL_CUR in ${URL_PLUGIN}
do
        NAME_PLUGIN=`echo ${URL_CUR}|sed 's/.*\///g;s/"//'`
        ${WGET_CMD} ${TMP_PATH}${NAME_PLUGIN} ${URL_CUR}
        mkdir -p ${TMP_PATH}/plugin
        ${_7Z_CMD} -o${TMP_PATH}/plugin ${TMP_PATH}${NAME_PLUGIN}

        PLUGIN_NAME_FILE=`cat ${TMP_PATH}/plugin/*Sgn | grep path\
 | sed 's/.*\"\(.*\)\..*/\1/'`
        FILE_LIST=`ls ${TMP_PATH}/plugin/ | grep -v -E '\.zip|\.msi'`
        for FILE in ${FILE_LIST}
        do
                FILE_OUT=`echo ${FILE}| sed 's/Sgn$/\.dgxpi/;s/Dll$/\.dll/;s/Chm$/.chm/;s/.*\.//g'`
                mv "${TMP_PATH}/plugin/${FILE}" "${INSTALL_PATH_PLUGINS}${PLUGIN_NAME_FILE}.${FILE_OUT}"
        done
done

echo "Get database CITY (${DOWNLOAD_CITY})"
ALL_CITY_URL=`${WGET_CMD} - ${URL}| tr ',' '\n' |\
 grep -E 'info.2gis.ru/.*/products/download' | sed 's/.*:"\(.*\)".*/\1/' |\
 grep '^http' | sort | uniq | grep -E ${DOWNLOAD_CITY}`
for URL_CUR in ${ALL_CITY_URL}
do
        rm ${TMP_PATH}${DOWNLOAD_FILE_BASE}
        ${WGET_CMD} - ${URL_CUR} \
| tr ',' '\n' | grep -E '2GISData.*orig.zip' | grep url | sed 's/.*:"/"/' |sort | uniq |\
 xargs ${WGET_CMD} ${TMP_PATH}${DOWNLOAD_FILE_BASE}
        ${_7Z_CMD} -o${TMP_PATH} ${TMP_PATH}${DOWNLOAD_FILE_BASE}
        mv -f -R ${TMP_PATH}2gis/3.0/* ${INSTALL_PATH}
done

rm -r ${TMP_PATH}