Найти в Дзене
Easy Linux - о Linux просто

Часть 3. Обновление и запуск основного приложения. Реализация собственного механизма доменных политик на отечественной системе «Альт Линукс»

Приветствую, авантюрист. Продолжаем реализовывать задуманное. Напомню, мы делаем свои GPO политики на Альт Линукс. Дисклеймер Я не могу сказать, что я эксперт в данном вопросе. Даже наоборот. Я всего лишь хочу поделиться своим опытом. Рассказать, что у меня получилось и как я к этому пришел. Безусловно, я не утверждаю, что способы и методы, которые я использовал, единственные верные или вообще верные. Наверняка среди комментаторов найдутся истинные профессионалы и поделятся ссылками на правильные и верные методы решения затронутого мной вопроса. Я всегда приветствую диалог Статьи: Необходимый уровень знаний Для качественного понимания материала тебе потребуется хорошее понимание доменных политик и принципов их функционирования. Также необходим опыт написания скриптов на bash и знание основ работы домен-контроллеров. Рекомендуется, хотя и не обязательно, иметь навыки программирования на C++ с использованием фреймворков QT или Python. Кроме того, необходимо уверенно работать с сетевыми д

Приветствую, авантюрист. Продолжаем реализовывать задуманное. Напомню, мы делаем свои GPO политики на Альт Линукс.

Дисклеймер

Я не могу сказать, что я эксперт в данном вопросе. Даже наоборот. Я всего лишь хочу поделиться своим опытом. Рассказать, что у меня получилось и как я к этому пришел. Безусловно, я не утверждаю, что способы и методы, которые я использовал, единственные верные или вообще верные. Наверняка среди комментаторов найдутся истинные профессионалы и поделятся ссылками на правильные и верные методы решения затронутого мной вопроса. Я всегда приветствую диалог

Статьи:

Необходимый уровень знаний

Для качественного понимания материала тебе потребуется хорошее понимание доменных политик и принципов их функционирования. Также необходим опыт написания скриптов на bash и знание основ работы домен-контроллеров. Рекомендуется, хотя и не обязательно, иметь навыки программирования на C++ с использованием фреймворков QT или Python. Кроме того, необходимо уверенно работать с сетевыми дисками в среде Linux.

Постановка задачи

В предыдущих этапах мы реализовали инструментарий, который обеспечит автозапуск нашего основного приложения. Но нам нужно реализовать кое-что еще. Перед тем как запустить основное приложение, которое будет выполнять основную задачу, мы должны проверить новые версии этого самого приложения, ведь наверняка в основном приложении будут изменения. И не хотелось бы каждый раз вручную его заменять на всех компьютерах. Итак, у нас создается ярлык в автозапуске. Данный ярлык будет запускать скрипт, который проверит обновления и, если нужно, обновит основное приложение. Ну и после всего запустит.

Общая схема на текущем этапе выглядит примерно так:

  1. Чистый компьютера
  2. Устанавливаем ALT Linux, обновляем
  3. Вводим в доменFree IPA
  4. Заменяем файл /etc/pam.d/common-login, его задача запустить скрипт check_autorun.sh при входе любого пользователя в систему
  5. Копируем ярлык в /opt/my_app/update_run_my_app.sh.desktop. Отсюда будет брать этот ярлык скрипт check_autorun.sh.
  6. Копируем файл /usr/bin/check_autorun.sh. Его задача — проверить наличие ярлыка в автозапуске на скрипт update_run_my_app.sh
  7. Копируем файл /usr/bin/update_run_my_app.sh, его задача — проверить обновления основной программы и запустить ее.

При входе пользователя выполнится скрипт check_autorun.sh, он проверит наличие у текущего пользователя автозапуска, если нет, то сделает. Дальше отработает автозапуск и выполнится скрипт update_run_my_app.sh. Теперь надо написать скрипт update_run_my_app.sh.

Реализация update_run_my_app.sh

Порассуждаем, что мы должны тут сделать. Первое — проверить доступность сервера, на котором у нас лежит основное приложение. Делаем это при помощи команды ping и делаем бесконечно, пока сервер не станет доступен. Код примерно такой:

# Ждем наличия сети
while :; do
if ping -c1 АДРЕС_СЕРВЕРА_С_ОСНОВНЫМ ПРИЛОЖЕНИЕМ >/dev/null; then
echo "Сервер доступен"

# Завершаем бесконечный цикл и продолжаем выполнение
break
else
echo "Сервер НЕ доступен"
fi
done

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

sudo mount -t cifs //АДРЕС_СЕРВЕРА_С_ОСНОВНЫМ ПРИЛОЖЕНИЕМ/КАТАЛОГ_С_ПРИЛОЖЕНИЕМ /tmp/my_app -o user=user,password=password

Обрати внимание, что я пишу sudo mount. Надо понимать, что из коробки в Альт Линукс sudo отключен. И тут я много думал, как же мне быть. В итоге я решил все-таки дать права на mount и umount всем пользователям.

И да, тут хорошо бы делать монтирование только на чтение, так как нам не нужны другие права.

Отлично, теперь у нас примонтированный каталог, в котором лежит наше основное приложение. Я не стал сильно мудрить с проверкой версий и просто поместил текущую версию в файл version. Нужно сравнить файл version, который лежит на сервере, с файлом version, который лежит в каталоге нашего основного приложения, делаем так.

# Сравниваем файлы версий
remoteVersion="$(head -n 1 /tmp/my_app/version)"
localVersion="$(head -n 1 /opt/my_app/version)"

if [ $remoteVersion == $localVersion ] ; then
echo "Равны, обновление не требуется"
else
echo "Не Равны, необходимо обновление"

Если обновление не требуется, идем дальше, если файлы разные, то нужно просто удалить содержимое каталога /opt/my_app и скопировать все с сервера. Ну и теперь нужно просто запустить наше основное приложение.

/opt/my_app/my_app

Готово. Итоговый скрипт будет выглядеть так:

#!/bin/bash
#version: 1.0.0

# Ждем наличия сети
while :; do

if ping -c1 АДРЕС_СЕРВЕРА_С_ОСНОВНЫМ ПРИЛОЖЕНИЕМ >/dev/null; then

echo "Сервер доступен"

sleep 2

mkdir /tmp/my_app

# Монтируем каталог с программой.
sudo mount -t cifs //АДРЕС_СЕРВЕРА_С_ОСНОВНЫМ ПРИЛОЖЕНИЕМ/КАТАЛОГ_С_ПРИЛОЖЕНИЕМ /tmp/my_app -o user=user,password=password

sleep 2

# Проверим примонтирвоалось ли если нет заново
isMount=`mount | grep АДРЕС_СЕРВЕРА_С_ОСНОВНЫМ ПРИЛОЖЕНИЕМ/КАТАЛОГ_С_ПРИЛОЖЕНИЕМ`

if [ "$isMount" == "" ]
then
echo "не удалось смонтирвоать ждем и пробуем снова "
sleep 5
else
break
fi

fi

echo "Сервер не дсотупен»

sleep 5

done


# Сравниваем файлы версий
remoteVersion="$(head -n 1 /tmp/my_app/version)"
localVersion="$(head -n 1 /opt/my_app/version)"

if [ $remoteVersion == $localVersion ] ; then
echo "Равны, обновление не требуется"
else
echo "Не Равны, необходимо обновление"
# Обновляем
rm -rf /opt/my_app/*
cp -r /tmp/my_app/* /opt/my_app
fi

# отмонтируем инит
sudo umount /tmp/my_app

# Запускаем
/opt/my_app/my_app

exit

Итог

Ну что ж, дело осталось за малым. Сделать то самое основное приложение, ну и написать пару политик для примера. Мы уже близко к завершению. Ну а пока удачи, авантюрист.