Главная Файлы Форум Галерея Гостевая книга Обратная связь Карта сайта Поиск
 

 

Моё место работы

СитиСервис
  • Заправка и ремонт лазерных картриджей
  • Ремонт любых принтеров и копиров
  • Оригинальные и совместимые картриджи
  • Доставка бесплатно (от 2-х картриджей)
  • Накопительная система расчётов для корпоративных клиентов
Телефон
+7 (4722) 373-983
8-980-326-01-23
Адрес E-mail
mybelpost@gmail.com

Привет, Гость

Войти
Идентификация
Я забыл свой пароль
Регистрация

Разделы -> Статьи -> Linux - разное -> Экономим трафик на п...

Экономим трафик на примере обновлений приложений от mozilla

Случилось так, что пришлось дома перейти на мобильный интернет.
LTE - не до 4G-модем с тарифом имеющем ограниченный по объёму трафик.
Пересев на него с безлимита я понял, что мегабайты утекают рекой.
Решил покончить с расточительством.
Здесь приведу пример на обновлениях приложений от mozilla.
Реальная выгода от моего примера будет извлечена только если у Вас за модемом находится домашняя локальная сеть из нескольких ПК.
У меня, к примеру, 2 ПК с Debian-8 Jessie (x86_64), 1 ПК с Debian-8 Jessie (i686) и 2 ПК с Debian-7 Wheezy (i686).
Т.е. обновления были не централизованы - выполнялись то с флешки, то выкачивались на каждый ПК отдельно, что стало приносить заметную утечку трафика с переходом на лимитируемое по объёму соединение.

Смысл решения проблемы не новый - качаем один раз и раздаём всем желающим из локалки по http.

По секрету скажу, что на работе (в школе), где компьютеров чуть больше 50, я организовал обновления таким же образом.

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

Любой компьютер работающий под управлением Debian GNU/Linux (я больше, чем уверен, что в других дистрибутивах Linux подобная процедура мало, чем будет оличаться).
Этот компьютер должен иметь подключение к сети интернет и к локальной сети (интерфейс может быть один, лишь бы он был доступен из локалки), т.к. он будет выполнять функции сервера.

Установки, настройки.

Создаём на ПК выполняющем функции сервера, у обычного пользователя каталог, в котором будет репозиторий mozilla и он же будет корневым каталогом для локального web-сервера.
Это можно осуществить скомандовав из консоли с правами обычного пользователя вот так:

mkdir $HOME/www

или

mkdir ~/www

Т.е. создадим в домашнем каталоге пользователя каталог с именем www.

Установка и настройка micro-httpd

Для таких маленьких сетей нет смысла устанавливать серьёзный веб-сервер для раздачи.
Более, чем достаточно поднять micro-httpd.
Для этого запускаем на компьютере выполняющем функции сервера терминал.
Получаем права root и командуем:

apt-get update
apt-get install inetutils-inetd micro-httpd curl

Настройка сводится к правке одного файла (/etc/inetd.conf) исправив в нём одну строку.
Открываем его на редактирование от имени root
Можно вот так (если установлен midnight):

mcedit /etc/inetd.conf

В этом файле нужно исправить путь к корневому каталогу веб-сервера из, которого будут раздаваться обновления / установки.

Ищем строку

www    stream    tcp    nowait nobody:www-data    /usr/sbin/tcpd /usr/sbin/micro-httpd /var/www

Здесь: /var/www - это путь к корню веб-сервера по умолчанию.
В моём примере путь будет изменён на домашний каталог обычного пользователя и каталог в нём с именем www, для того, чтобы можно было загружать приложения из интернет с не административными правами.
Т.е. меняем /var/www на, что-то вроде /home/user/www
После правки строка принимает вот такой вид:

www    stream    tcp    nowait nobody:www-data    /usr/sbin/tcpd /usr/sbin/micro-httpd /home/user/www

Где user нужно заменить на имя реального каталога пользователя.

Сохраняем изменения.

Перезагружаем inetd командой от root:

/etc/init.d/inetutils-inetd restart

Теперь если в локальном браузере набрать

http://localhost

то попадём в указанный корневой каталог сервиса, т.е. в /home/user/www

Для входа на этот сервис из локалки нужно в барузере пробивать ip-адрес этого сервера.

Всё! Простейший веб-сервер у нас работает. Он умеет автоматически отдавать index.html (при его наличии), отображает в виде ссылки другие файлы и умеет перемещаться по каталогам в рамках www.
Нам больше и не нужно.

Теперь переходим к настройке самого репозитория

Структура его каталогов такова: см. рис. ниже.



Т.е. в корне репозитория находятся 4 каталога: linux-i686, linux-x86_64, scripts и version.
Их можно создать скомандовав из консоли обычного пользователя вот так:

mkdir $HOME/www/{linux-i686,linux-x86_64,scripts,version}

Далее, необходимо скачать последние версии всех приложений, которые намечено обновлять и разложить их в каталоги по архитектуре, т.е. в linux-i686 и linux-x86_64.

В каталоге version должны лежать файлы имеющие имя соответствующего приложения, т.е. firefox, seamonkey и thunderbird. Содержимое этих файлов соответствует числовой версии приложения, т.е. для примера, файл firefox должен содержать только версию в виде: 44.0.2

Разложив скачанные файлы в нужные каталоги мы уже можем их забрать по сети.
Т.е. набрав, в любом браузере на ПК из локалки, адрес сервера в таком виде: http://192.168.0.2/linux-i686/firefox-44.0.2.tar.bz2 мы получим соответствующий архив с приложением, который можно распаковать и использовать.

Но это всё выполняется вручную, что мало отличается от разноса обновлений на флешке.
Потому я написал некий скрипт для сервера, который можно отдать cron-у на еженедельное или ежесуточное или на еже Вам будет угодно выполнение.
Или отдать его на выполнение anacron-у, ведь домашний ПК не всегда включен.
А так же его можно выполнять запустив из консоли вручную или включив в автостарт рабочего окружения.

При первом запуске мой сценарий сам сформирует все необходимые для работы репозитория каталоги и файлы.

В скрипте используются переменные, которые необходимо перед запуском проверить и изменить под Ваш репозиторий!

rpath - содержит путь к репозиторию. По умолчанию - $(dirname $(readlink -e "$0")), т.е. каталог из, которого запущен скрипт;
soft - в столбик список приложений подлежащих скачиванию. (не всем же нужно качать и firefox, и seamonkey, и thunderbird);
architectura - в столбик перечисление архитектур, для которых будет осуществляться скачивание. По умолчанию - linux-i686 и linux-x86_64;
tmp - каталог для временного хранения файлов. По умолчанию - /tmp;
logfile - путь к файлу журнала работы скрипта. По умолчанию - $tmp/mozrepupd.log.

Так же в скрипте используются переменные, которые можно не менять если домен mozilla доступен и Вас устраивает.

domain - домен, с которого будет производиться скачивание приложений. По умолчанию - download.cdn.mozilla.net;
mozurl - общая часть URL, с которого будем качать приложения. По умолчанию - http://download.cdn.mozilla.net/pub
useragent - содержит маскировку под Firefox для curl и wget, которые используются в скрипте.

И переменные, которые содержат код для цветного вывода сообщений от скрипта в консоль.
Их можно вообще не трогать.

RED='\033[1;31m';
GREEN='\033[1;32m';
NORMAL='\033[0m';

Сам же bash-скрипт я расположил в корневом каталоге репозитория, т.е. в /home/user/www

Скачать готовый сценарий можно здесь.

Ниже листинг mozrepupd.sh:
#!/bin/bash
#
# Скрипт предназначен для обновления архивов с приложениями firefox, thunderbird и seamonkey
# для сервера обновлений.
#
# Так же данный сценарий проверяет и формирует при необходимости дерево каталогов локального репозитория
# Проверяет и скачивает при необходимости скрипты применяемые на клиентских ПК
# Сохраняет их в каталоге scripts локального репозитория
#
IFS=$'\t\n'; # Переназначение разделителей ком. строки для путей с пробелами

rpath="$(dirname $(readlink -e "$0"))"; # Путь к локальному репозиторию mozilla, по умолчанию - каталог из, которого зопущен данный сценарий.
domain="download.cdn.mozilla.net"; # Домен mozilla, с которого будем качать

# Список приложений от moziila, которые будем обновлять. Именно в столбик, т.к. в скрипте изменён разделитель полей.
soft="firefox
seamonkey
thunderbird";

# Архитектруры под, которые будем выкачивать приложения. Именно в столбик, т.к. в скрипте изменён разделитель полей.
architectura="linux-i686
linux-x86_64";

tmp="/tmp"; # Каталог временного хранения файлов.
logfile="$tmp/mozrepupd.log"; # Путь к файлу журнала данного скрипта
mozurl="http://download.cdn.mozilla.net/pub"; # Общая часть URL для скачивания firefox, thunderbird и seamonkey

useragent="Mozilla/5.0 (X11; Linux i686; rv:42.0) Gecko/20100101 Firefox/42.0"; # Маскировка curl под Firefox

# Переменные для расцветки вывода консоли
RED='\033[1;31m';
GREEN='\033[1;32m';
NORMAL='\033[0m';

echo -e "\n${GREEN}$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Сообщение: запущен${NORMAL}\n";
echo "$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Сообщение: запущен" >> $logfile;

if ! [[ -f $(which curl) ]]; then
    echo -e "\n${RED}$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Ошибка: не обнаружено приложение curl. Сценарий аварийно завершил работу.${NORMAL}\n";
    echo "$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Ошибка: не обнаружено приложение curl. Сценарий аварийно завершил работу" >> $logfile;
    exit 0;
fi

if ! [[ -f $(which wget) ]]; then
    echo -e "\n${RED}$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Ошибка: не обнаружено приложение wget. Сценарий аварийно завершил работу.${NORMAL}\n";
    echo "$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Ошибка: не обнаружено приложение wget. Сценарий аварийно завершил работу" >> $logfile;
    exit 0;
fi

if [[ $(curl -s --connect-timeout 30 --max-time 30 -A "$useragent" -L -I "http://$domain" | grep "HTTP" | tail -n 1 | awk '{ print $2 }') != 200 ]]; then
    echo -e "${RED}$(date +%d-%m-%Y" "%H:%M:%S) Ошибка: $domain не доступен. $(basename $0) завершил работу.${NORMAL}";
    echo "$(date +%d-%m-%Y" "%H:%M:%S) Ошибка: $domain не доступен. $(basename $0) завершил работу." >> $logfile;
    exit 0;
else

    for rdir in $architectura version; do
        if ! [[ -d "$rpath/$rdir" ]]; then
            mkdir -p "$rpath/$rdir";
        fi
    done

    for moz in $soft; do
        if ! [[ -f "$rpath/version/$moz" ]]; then touch "$rpath/version/$verf"; fi
        release=$(curl -s -A "$useragent" $mozurl/$moz/releases/ | sed -e :a -e 's/<[^>]*>//g;/</N;//ba' | sed '/[a-z].*/d' | grep -Eo '[0-9]+\.[0-9]+\.*[0-9]*' | sort -n -t . -k 1,1 -k 2,2 -k 3,3 | tail -n 1);
        if [[ -f "$rpath/version/$moz" ]]; then version=$(/bin/cat "$rpath/version/$moz"); fi
        if [[ "$version" != "$release" ]]; then
            if [[ -e "$tmp/$moz-$release.tar.bz2" ]]; then
                rm $tmp/$moz-$release.tar.bz2;
            fi
            if [[ -e "$tmp/$moz-$release.en-US.linux-x86_linux-x86_64.tar.bz2" ]]; then
                rm "$tmp/$moz-$release.en-US.linux-x86_linux-x86_64.tar.bz2";
            fi
            echo -e "\n${GREEN}$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Сообщение: загружаю $moz${NORMAL}\n";
            echo "$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Сообщение: начало загрузки $moz$" >> $logfile;
            for arch in $architectura; do
                if [[ "$moz" = "seamonkey" ]] && [[ "$arch" = "linux-x86_64" ]]; then
                    wget -c --user-agent="$useragent" "$mozurl/$moz/releases/$release/contrib/$moz-$release.en-US.linux-x86_64.tar.bz2" -P $tmp;
                    if [[ -e "$rpath/$arch/$moz-$release.en-US.linux-x86_64.tar.bz2" ]]; then rm "$rpath/$arch/$moz-$release.en-US.linux-x86_64.tar.bz2"; fi
                    mv "$tmp/$moz-$release.en-US.linux-x86_64.tar.bz2" "$rpath/$arch";
                else
                    wget -c --user-agent="$useragent" "$mozurl/$moz/releases/$release/$arch/ru/$moz-$release.tar.bz2" -P $tmp;
                    if [[ -f "$rpath/$arch/$moz-$release.tar.bz2" ]]; then rm "$rpath/$arch/$moz-$release.tar.bz2"; fi
                    mv "$tmp/$moz-$release.tar.bz2" "$rpath/$arch";
                fi
            done
            if [[ "$moz" = "seamonkey" ]]; then
                if [[ -f "$rpath/linux-i686/$moz-$version.tar.bz2" ]] && [[ -f "$rpath/linux-x86_64/$moz-$version.en-US.linux-x86_64.tar.bz2" ]]; then
                    echo "$version" > $rpath/version/$moz-old;
                fi
                if [[ -f "$rpath/linux-i686/$moz-$release.tar.bz2" ]] && [[ -f "$rpath/linux-x86_64/$moz-$release.en-US.linux-x86_64.tar.bz2" ]]; then
                    echo "$release" > $rpath/version/$moz;
                fi
            else
                if [[ -f "$rpath/linux-i686/$moz-$version.tar.bz2" ]] && [[ -f "$rpath/linux-x86_64/$moz-$version.tar.bz2" ]]; then
                    echo "$version" > $rpath/version/$moz-old;
                fi
                if [[ -f "$rpath/linux-i686/$moz-$release.tar.bz2" ]] && [[ -f "$rpath/linux-x86_64/$moz-$release.tar.bz2" ]]; then
                    echo "$release" > $rpath/version/$moz;
                fi
            fi
        else
            echo -e "\n${GREEN}$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Сообщение: $moz-$version в обновлении не нуждается${NORMAL}\n";
            echo "$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Сообщение:  $moz-$version в обновлении не нуждается" >> $logfile;
        fi
    done

    echo -e "\n${GREEN}$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Сообщение: удаление очень старых архивов${NORMAL}\n";
    echo "$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Сообщение: удаление очень старых архивов" >> $logfile;

    if [[ -f "$rpath/version/firefox" ]]; then fvernew=$(/bin/cat $rpath/version/firefox); fi
    if [[ -f "$rpath/version/firefox-old" ]]; then fverold=$(/bin/cat $rpath/version/firefox-old); fi
    if [[ -f "$rpath/version/seamonkey" ]]; then svernew=$(/bin/cat $rpath/version/seamonkey); fi
    if [[ -f "$rpath/version/seamonkey-old" ]]; then sverold=$(/bin/cat $rpath/version/seamonkey-old); fi
    if [[ -f "$rpath/version/thunderbird" ]]; then tvernew=$(/bin/cat $rpath/version/thunderbird); fi
    if [[ -f "$rpath/version/thunderbird-old" ]]; then tverold=$(/bin/cat $rpath/version/thunderbird-old); fi

    cd "$rpath/linux-i686";
    find ! -path "." -a ! -path ".." -a ! -path "./firefox-$fvernew.tar.bz2" -a ! -path "./firefox-$fverold.tar.bz2" -a ! -path "./seamonkey-$svernew.tar.bz2" -a ! -path "./seamonkey-$sverold.tar.bz2" -a ! -path "./thunderbird-$tvernew.tar.bz2" -a ! -path "./thunderbird-$tverold.tar.bz2" -exec rm -r {} \;
    cd $rpath/linux-x86_64;
    find ! -path "." -a ! -path ".." -a ! -path "./firefox-$fvernew.tar.bz2" -a ! -path "./firefox-$fverold.tar.bz2" -a ! -path "./seamonkey-$svernew.en-US.linux-x86_64.tar.bz2" -a ! -path "./seamonkey-$sverold.en-US.linux-x86_64.tar.bz2" -a ! -path "./thunderbird-$tvernew.tar.bz2" -a ! -path "./thunderbird-$tverold.tar.bz2" -exec rm -r {} \;

fi

# Выкачивание моих скриптов для клиентских ПК.
# Эта часть сценария выполняется единожды при первом запуске и формировании репозитория.
# В дальнейшем лишь проверяется наличие клиентских скриптов в репозитории и только при их отсутствии будет осуществлено повторное скачивание.
skvdom="http://www.sakryukin.ru";
skvurl="$skvdom/uploads/bash";

if ! [[ -d "$rpath/scripts" ]]; then mkdir $rpath/scripts; fi
for skv in ffinstall seamonkey-install thunderbird-install mozuserupd.sh userscriptinstall.sh; do
    if ! [[ -f "$rpath/scripts/$skv" ]]; then
        if [[ $(curl -s --connect-timeout 30 --max-time 30 -A "$useragent" -L -I "$skvdom" | grep "HTTP" | tail -n 1 | awk '{ print $2 }') != 200 ]]; then
            echo -e "${RED}$(date +%d-%m-%Y" "%H:%M:%S) Ошибка: $skvdom не доступен.${NORMAL}";
            echo "$(date +%d-%m-%Y" "%H:%M:%S) Ошибка: $skvdom не доступен" >> $logfile;
        else
            echo -e "${GREEN}$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Сообщение: скачивается $skv ${NORMAL}";
            echo "$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Сообщение: скачивается $skv" >> $logfile;
            wget -c --user-agent="$useragent" "$skvurl/$skv.tar.bz2" -P $tmp;
            if [[ -f "$tmp/$skv.tar.bz2" ]]; then
                cd $tmp;
                tar xjf ./$skv.tar.bz2;
                if [[ -f "./$skv" ]]; then
                    mv "./$skv" "$rpath/scripts";
                fi
                rm -Rf "$tmp/$skv.tar.bz2";
            else
                echo -e "${RED}$(date +%d-%m-%Y" "%H:%M:%S) Ошибка: $skv.tar.bz2 почему-то не скачался${NORMAL}";
                echo "$(date +%d-%m-%Y" "%H:%M:%S) Ошибка: $skv.tar.bz2 почему-то не скачался" >> $logfile;
            fi
        fi
    else
        echo -e "${GREEN}$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Сообщение: скрипт $skv уже имеется - пропускаю ${NORMAL}";
        echo "$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Сообщение: скрипт $skv уже имеется - пропускаю" >> $logfile;
    fi

done
echo -e "\n${GREEN}$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Сообщение: завершил работу${NORMAL}\n";
echo "$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Сообщение: завершил работу" >> $logfile;
exit 0;

Созаём файл с любым доступным именем.
Можно скомандовав из консоли вот так:

touch $HOME/www/mozrepupd.sh

И наполняем его вышеприведённым содержимым.

Даём созданному или скачанному скрипту права на выполнение скомандовав в консоли вот так:

chmod 755 $HOME/www/mozrepupd.sh

И, для примера, отдадим этот скрипт на еженедельное выполнение cron-у.
Для этого нужно скомандовать в консоли от root вот так:

/bin/cat >> /etc/cron.weekly/repoupd.sh<<EOF
#! /bin/bash
if [[ -f "/home/www/mozrepupd.sh" ]]; then
    /home/www/mozrepupd.sh;
    chown user:user -R /home/www;
fi
exit 0;
EOF

Где /home/www/mozrepupd.sh - это полный путь к файлу, который нужно запускать,
/home/www - путь к корню репозитория и
user:user - имя пользователя и группа пользователя (у которого лежит репозиторий) для изменения прав на скачанные файлы (обычно имя пользователя и группа совпадают).

Не забываем сделать файл исполнимым скомандовав:

chmod 755 /etc/cron.weekly/repoupd.sh

После отработки bash-скрипта mozrepupd.sh
Необходимо внести изменения в скрипты mozuserupd.sh и userscriptinstall.sh
настроив их на свой репозиторий. Описание переменных подлежащих правке смотрите ниже в этой статье.

Всё! Сервер обновлений готов!

Далее нужно настраивать пользовательские ПК для автоматического скачивания и обновления приложений.

Для того, чтобы вручную ничего не скачивать и не устанавливать.
Я придумал bash-скрипт (userscriptinstall.sh), который при запуске с правами root скачает все необходимые сценарии из репозитория в локальной сети, разложит их в нужные места, раздаст права на выполнение и сформирует задание для cron на ежедневную проверку обновлений.

Запускать сценарий userscriptinstall.sh можно из любого каталога, где разрешены права на выполнение.

Консольная команда от имени root может выглядеть вот так:

./userscriptinstall.sh

или

bash ./userscriptinstall.sh

В этом bash-скрипте использованы переменные, которые перед запуском обязательно нужно проверить и изменить под свой репозиторий!

Лучше это сделать один раз на сервере содержащем репозиторий.

Переменные подлежащие редактированию в скрипте userscriptinstall.sh:
url - содержит общую часть URL, с которого будем качать скрипты. По умолчанию http://192.168.8.100/mozrepo/scripts - это мой домашний URL!
scripts - в столбик вписаны имена скриптов, которые нужно скачать. По умолчанию - ffinstall, seamonkey-install, thunderbird-install, что соответствует дальнейшему обновлению или установке Firefox, Seamonkey и Thunderbird. Меняйте - не всем же нужны все три приложения.
soft_path - переменная содержит путь по которому должны будут размещены все скачанные скрипты. По умолчанию - /usr/bin
cron_path - путь к каталогу заданий cron. По умолчанию - /etc/cron.daily, что соответствует ежедневному выполнению
tmp_path - путь к каталогу временного хранения файлов
Готовый скрипт userscriptinstall.sh можно скачать здесь.

Листинг userscriptinstall.sh

#!/bin/bash
IFS=$'\t\n';
url="http://192.168.8.100/mozrepo/scripts"; # Общая часть URL, с которого будем качать скрипты
# На сервере скрипты ffinstall, seamonkey-install, thunderbird-install и mozuserupd.sh должны лежать по пути указанному в переменной $url

# В столбик имена скриптов, которые будут скачаны и установлены. Скрипт mozuserupd.sh здесь указывать не нужно.
# Именно в столбик, т.к. скрипт использует изменёный набор разделителей.
scripts="ffinstall
seamonkey-install
thunderbird-install";

soft_path="/usr/bin"; # Путь в системе, по которому должны лежать исполнимые файлы (наши скрипты)
cron_path="/etc/cron.daily" # Путь к каталогу для сценариев заданий крона. По умолчанию - путь к ежедневным заданиям
tmp_path="/tmp"; # Путь к каталогу временного хранения (в него будем загружать скрипты)

# Расцветка вывода консоли для этого скрипта
RED='\033[1;31m';
GREEN='\033[1;32m';
NORMAL='\033[0m';
# Маскировка curl и wget под Firefox (никогда заранее не знаешь как воспримет чужой сайт эти приложения)
useragent="Mozilla/5.0 (X11; Linux i686; rv:42.0) Gecko/20100101 Firefox/42.0";

if [[ "$USER" != "root" ]]; then
    echo -e "\n${RED}$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Ошибка: для работы требуются права root${NORMAL}";
else
    echo -e "\n${GREEN}$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Сообщение: работаю${NORMAL}";
    if ! [[ -f $(which curl) ]] || ! [[ -f $(which wget) ]]; then
        echo -e "\n${RED}$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Ошибка: не обнаружено приложение curl или wget${NORMAL}";
    else
        echo -e "\n${GREEN}$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Сообщение: подключение к $url ${NORMAL}";
        httpcode=$(curl -s --connect-timeout 15 --max-time 15 -A "$useragent" -L -I "$url" | grep "HTTP" | tail -n 1 | awk '{ print $2 }');
        if [[ "$httpcode" != 200 ]] && [[ "$httpcode" != 501 ]]; then
            echo -e "\n${RED}$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Ошибка: $url не доступен${NORMAL}";
        else
            for scr in $scripts mozuserupd.sh; do
                echo -e "\n${GREEN}$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Сообщение: скачивание скрипта $scr ${NORMAL}";
                wget --user-agent="$useragent" "$url/$scr" -P $tmp_path;
                echo -e "\n${GREEN}$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Сообщение: установка скрипта $scr ${NORMAL}";
                if [[ -f "$soft_path/$scr" ]]; then rm "$soft_path/$scr"; fi
                mv $tmp_path/$scr $soft_path;
                chmod 755 $soft_path/$scr;
            done
            echo -e "\n${GREEN}$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Сообщение: создание задания для cron ${NORMAL}";
cat > $cron_path/mozuserupd.sh<<EOF
#! /bin/bash
if [[ -f "$soft_path/mozuserupd.sh" ]]; then $soft_path/mozuserupd.sh; fi
exit 0;
EOF
            chmod 755 $cron_path/mozuserupd.sh;
            echo -e "${GREEN}$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Сообщение: запуск установки или обновления указанных приложений от mozilla ${NORMAL}";
            $cron_path/mozuserupd.sh;
            echo -e "\n${GREEN}$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Сообщение: вроде бы всё получилось ${NORMAL}";
        fi
    fi
fi
echo -e "\n${GREEN}$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Сообщение: завершил работу${NORMAL}\n";

Вышеприведённый bash-скрипт только упрощает настройку обновлений приложений от mozilla на пользовательских ПК, но сам он не занимается обновлениями.

Ниже приведу описание сценария mozuserupd.sh автоматизирующего процедуры сверки версий, скачивания и установки / обновления (работает только с репозиторием настроенным по вышеприведённой схеме для сервера). Этот сценарий в свою очередь использует для установки / обновления скрипты ffinstall, seamonkey-install и thunderbird-install. Страница с описанием этих вояний находится здесь.

Если какого-то из скриптов (ffinstall, seamonkey-install или thunderbird-install) не будет в системе, то сценарий не будет проверять наличие обновлений соответствующего приложения.

Сценарий mozuserupd.sh нужно запускать с правами root вручную по необходимости или отдать на выполнение cron-у.
Расположение скрипта значения не имеет - лишь бы в каталоге, где он находится было разрешено выполнение программ и сам скрипт должен иметь права на выполнение.
Ручной запуск из консоли от имени root может выглядеть вот так:

/usr/bin/mozuserupd.sh

или просто

mozuserupd.sh

В зависимости от того, где расположен mozuserupd.sh. Если Вы пользовались инсталлятором userscriptinstall.sh, то mozuserupd.sh будет лежать в /usr/bin

В bash-скрипте  используются переменные, которые перед запуском обязательно нужно изменить под Ваш репозиторий!

Лучше это сделать один раз на сервере содержащем репозиторий.

Переменные подлежащие редактированию в скрипте mozuserupd.sh:
domain - содержит общую часть URL, с которого будут скачиваться firefox, thunderbird, seamonkey и, где будут проверяться обновления. По умолчанию - http://192.168.8.100/mozrepo
tmp - каталог временного хранения файлов. По умолчанию - /tmp
Готовый скрипт mozrepupd.sh можно скачать здесь.
Если Вы настроили сервер и если Вы использовали скрипт userscriptinstall.sh, то mozrepupd.sh уже есть в /usr/bin

Листинг mozuserupd.sh
#!/bin/bash
# Сценарий предназначен для обновления Firefox Seamonkey и Thunderbird из репозитория в локальной сети
# Данный скрипт работает совместно со сценариеми установки: ffinstall, seamonkey-install, thunderbird-install
# Если какого-то из скриптов установки в системе нет, то архив с соответствующим приложением скачан не будет.
# Старт с правами обычного пользователя и при наличии скрипта установки - архив с приложением будет только скачан и размещён в каталоге указанном в переменной tmp
# Запуск этого сценария с правами root и при наличии скрипта установки - пиложение будет скачано и установлено / обновлено.
#

IFS=$'\t\n';

domain="http://192.168.8.100/mozrepo"; # Общая часть URL для всех скачиваемых архивов
tmp="/tmp"; # Каталог временного хранения файлов.
useragent="Mozilla/5.0 (X11; Linux i686; rv:42.0) Gecko/20100101 Firefox/42.0"; # Маскировка curl и wget под Firefox

arch=$(arch);
# Расцветка вывода консоли
RED='\033[1;31m';
GREEN='\033[1;32m';
NORMAL='\033[0m';

echo -e "\n${GREEN}$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Сообщение: стартовал${NORMAL}\n";
if ! [[ -f $(which curl) ]]; then
    echo -e "\n${RED}$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Ошибка: не установлено приложение curl${NORMAL}\n";
else
    if [[ "$arch" = "i686" ]]; then
        arch="linux-i686";
    elif [[ "$arch" = "x86_64" ]]; then
        arch="linux-x86_64";
    else
    arch="";
    echo -e "\n${RED}$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Ошибка: архитектура $arch не поддерживается${NORMAL}\n";
    fi
    if [[ "$arch" != "" ]]; then
        httpcode=$(curl -s --connect-timeout 30 --max-time 30 -A "$useragent" -L -I "$domain" | grep "HTTP" | tail -n 1 | awk '{ print $2 }');
        if [[ "$httpcode" != 200 ]] && [[ "$httpcode" != 501 ]]; then
            echo -e "${RED}$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Ошибка: $domain не доступен${NORMAL}";
        else
            for moz in firefox seamonkey thunderbird; do
                echo -e "${GREEN}$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Сообщение: проверка версии $moz на $domain ${NORMAL}";
                sver=$(curl -s -A "$useragent" $domain/version/$moz | sed -e :a -e 's/<[^>]*>//g;/</N;//ba' | grep -Eo '[0-9]+\.[0-9]+\.*[0-9]*' | sort -n -t . -k 1,1 -k 2,2 -k 3,3 | tail -n 1);
                if [[ "$moz" != "thunderbird" ]] && [[ -f $(which $moz) ]]; then
                    lver=$($moz -v | awk '{ print $3 }');
                elif [[ "$moz" = "thunderbird" ]] && [[ -f $(which $moz) ]]; then
                    lver=$($moz -v | awk '{ print $2 }');
                else
                    lver="";
                fi
                if [[ "$sver" != "$lver" ]]; then
                    if [[ "$arch" = "linux-x86_64" ]] && [[ "$moz" = "seamonkey" ]]; then
                        if [[ -f $(which seamonkey-install) ]]; then
                            if [[ -f "$tmp/$moz-$sver.en-US.$arch.tar.bz2" ]]; then rm -Rf $tmp/$moz-$sver.en-US.$arch.tar.bz2; fi
                            echo -e "${GREEN}$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Сообщение: загрузка $moz-$sver.en-US.$arch.tar.bz ${NORMAL}";
                            wget -c -U "$useragent" $domain/$arch/$moz-$sver.en-US.$arch.tar.bz2 -P $tmp;
                            echo -e "${GREEN}$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Сообщение: установка $moz-$sver.en-US.$arch.tar.bz2${NORMAL}";
                            $(which seamonkey-install) $tmp/$moz-$sver.en-US.$arch.tar.bz2
                        else
                            echo -e "${GREEN}$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Сообщение: скрипт seamonkey-install не обнаружен. Загрузка $moz пропущена${NORMAL}";
                        fi      
                    else
                        if [[ -f $(which $moz-install) ]]; then
                            if [[ -f "$tmp/$moz-$sver.tar.bz2" ]]; then rm -Rf $tmp/$moz-$sver.tar.bz2; fi
                            echo -e "${GREEN}$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Сообщение: загрузка $moz-$sver${NORMAL}";
                            wget -c -U "$useragent" $domain/$arch/$moz-$sver.tar.bz2 -P $tmp;
                            echo -e "${GREEN}$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Сообщение: установка $moz-$sver${NORMAL}";
                            if [[ "$moz" = "seamonkey" ]]; then $(which seamonkey-install) $tmp/$moz-$sver.tar.bz2 ; fi
                            if [[ "$moz" = "thunderbird" ]]; then $(which thunderbird-install) $tmp/$moz-$sver.tar.bz2 ; fi
                        elif [[ -f $(which ffinstall) ]] && [[ "$moz" = "firefox" ]]; then
                            if [[ -f "$tmp/$moz-$sver.tar.bz2" ]]; then rm -Rf $tmp/$moz-$sver.tar.bz2; fi
                            echo -e "${GREEN}$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Сообщение: загрузка $moz-$sver${NORMAL}";
                            wget -c -U "$useragent" $domain/$arch/$moz-$sver.tar.bz2 -P $tmp;
                            echo -e "${GREEN}$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Сообщение: установка $moz-$sver${NORMAL}";
                            $(which ffinstall) $tmp/$moz-$sver.tar.bz2
                        else
                            echo -e "${GREEN}$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Сообщение: скрипт установки $moz не обнаружен. Загрузка $moz пропущена${NORMAL}";
                        fi
                    fi
                else
                    echo -e "${GREEN}$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Сообщение: $moz-$sver в обновлении не нуждается${NORMAL}";
                fi
            done
        fi
    fi
fi
echo -e "\n${GREEN}$(date +%d-%m-%Y" "%H:%M:%S) Скрипт $(basename $0) Сообщение: завершил работу${NORMAL}\n";
exit 0;




Опубликовано: Константин, Автор/источник: Сакрюкин К.В. 14 Февраль 2016 01:52:46

Комментировать

Вы не залогинены! Регистрация

Афоризмы, мысли

На каком этапе у Вас возникают затруднения при работе с Linux?
-На этапе включения компьютера!

/Реалии информатизации школ/

Счётчик

Сейчас на сайте - 1 (0 зарег.)
Всего хитов7819 
Сегодня хитов7819 
Сегодня хостов1032 

Откуда гости наши?

 
Powered by ReloadCMS 1.5.0.
© 2004-2012 ReloadCMS Team
RSS AggregationPHP powered
Генерация страницы: 0.37
  Яндекс.Метрика
    Сакрюкин К.В.   Яндекс цитирования    
 
Здесь всё можно копировать и цитировать, но рабочая ссылка на мой сайт обязательна!