Как стать автором
Обновить

Обновление продуктов Mozilla Foundation

Время на прочтение4 мин
Количество просмотров3.3K
Бесплатные решения Mozilla Foundation под Windows для электронной почты и интернета уже давно используются в нашей организации — функциональные, удобные и относительно стабильные.
И всё бы ничего — но рано или поздно встает вопрос об автоматизации обновления этих продуктов.
Пробороздив просторы интернета, удалось узнать, что существует несколько интересных способов обновлений.
Один из них — создание собственного сервера обновлений — в общем всем хороший способ, но с ходу не получилось с ним разобраться (если у кого-то есть опыт — делитесь!). Доступно по ссылке.
Я же расскажу про другой способ.

Итак, предполагаем что в наличии у нас WIN-домен (групповые политики нам в данном случае не нужны) и обновлять мы собрались на машинах в домене. Для определенности выберем Firefox (в случае с Thunderbird все идентично).
Изначально нам нужно зайти на сайт обновлений и скачать последний архив обновлений, например, для версии 3.6 скачать можно здесь. На сайте есть два вида обновлений — инкрементальные и полные. Мы будем использовать полные, т.к. инкрементальные подразумевают, что у нас стоит предыдущая версия программы (что в общем случае не так).
Далее, что нам предстоит сделать — это переименовать этот файл в update.mar, создать папку \\pdc\netlogon\packages\firefox, где pdc — наш контроллер домена. Также нужно будет создать пользователя installuser с полномочиями администратор домена.
К сожалению, у моего способа есть существенный минус — пароль этого пользователя будет храниться в открытом виде в коде .js файла.

Содержимое папки \\pdc\netlogon\packages\firefox будет таким:
update.bat
psexec.exe
updater.exe
updater.ini
update.mar
psexec.reg

Итак, по порядку
update.bat:
mkdir "%PROGRAMFILES%\Mozilla Firefox" >>nul 2>&1
cd "%PROGRAMFILES%\Mozilla Firefox"
%1\firefox-update\updater.exe %1\firefox-update 0


psexec.exe — тот самый psexec. Взять можете на официальном сайте.

updater.exe — берете в папке с Firefox (я использовал версию 1.8.1)

updater.ini — маленький конфиг для updater.exe:
; This file is in the UTF-8 encoding
[Strings]
Title=Обновление Firefox
Info=Идет обновление Firefox...
[PostUpdateWin]
ExeRelPath=uninstall\helper.exe
ExeArg=/PostUpdate


update.mar — тот самый файл обновлений.

psexec.reg:
REGEDIT4
[HKEY_CURRENT_USER\Software\SysInternals]
[HKEY_CURRENT_USER\Software\SysInternals\PsExec]
"EulaAccepted"=dword:00000001


Далее положим в netlogon файлик setup_firefox_36.js:
var WshShell = WScript.CreateObject("WScript.Shell");
FSO = new ActiveXObject("Scripting.FileSystemObject");
 
// получаем имя компьютера, имя пользователя, 
// расположение временной папки и папки Firefox
var WshProcEnv = WshShell.Environment("PROCESS");
var strTEMP = WshProcEnv("TEMP");
var un = WshProcEnv("USERNAME");
var compname = WshProcEnv("COMPUTERNAME");
var pf = WshProcEnv("PROGRAMFILES");
var firefox_path = pf+"\\Mozilla Firefox";

// переменные, содержащие IP контроллера домена
// и имя домена
var pdc = "192.168.1.200";
var domain = "OUR_DOMAIN";
 
// шаблон версии браузера - если тек. версия подпадает
// под этот шаблон, то обновления не будет - чтобы не обновлять
// браузер при каждом входе в систему
var version = /3\.6\./;
 
// описываем пользователей и компьютеры
// для которые обновления НЕ БУДЕТ
users = new Array();
// users.push('katsy');
comps = new Array();
// comps.push('bdc');
 
// для описанных компьютеров и пользователей - выход
for (i = 0; i < users.length; i++)
  if (users[i].toLowerCase() == un.toLowerCase())
    WScript.Quit();
for (i = 0; i < comps.length; i++)
  if (comps[i].toLowerCase() == compname.toLowerCase())
    WScript.Quit();
 
// запускаем в режиме отлова ошибок
try
{
  // читаем файл application.ini
  // если его нет, то значит версия <3

  var re = new RegExp("^Version=(.*)$","i");
  ForReading = 1;
 
  if (FSO.FileExists(firefox_path+"\\application.ini"))
  {
    f = FSO.OpenTextFile(firefox_path+"\\application.ini", ForReading);
    while (!f.AtEndOfStream)
    {
      str = f.ReadLine();
      if (re.exec(str))
      {
        if (version.exec(RegExp.$1))
          WScript.Quit();
      }
    }
    f.Close();
  }
}
catch(e) {}
 
// создаем папку firefox-update, затем импортируем EULA от psexec - без этого psexec работать не будет
// затем копируем файлы и производим привилегированный запуск
try
{
  FSO.CreateFolder(strTEMP+"\\firefox-update")
}
catch(e) {}
 
// for EULA-accept import
WshShell.Run("regedit -s \\\\"+pdc+"\\netlogon\\packages\\firefox\\psexec.reg",0,true);
 

WshShell.Run("cmd /C copy /Y \\\\"+pdc+"\\netlogon\\packages\\firefox\\psexec.exe "+strTEMP+"\\firefox-update",0,true);
WshShell.Run("cmd /C copy /Y \\\\"+pdc+"\\netlogon\\packages\\firefox\\updater.* "+strTEMP+"\\firefox-update",0,true);
WshShell.Run("cmd /C copy /Y \\\\"+pdc+"\\netlogon\\packages\\firefox\\update.* "+strTEMP+"\\firefox-update",0,true);
 
// строчку можно раскомментировать, если обновление нужно сделать только там, где Mozilla FireFox уже есть
// if (FSO.FolderExists(firefox_path))
{
  WshShell.CurrentDirectory = strTEMP+"\\firefox-update";
  WshShell.Run("psexec.exe -u "+domain+"\\installuser -p ПАРОЛЬ cmd /C "+strTEMP+"\\firefox-update\\update.bat "+strTEMP,0,false);
}


И самое последнее, что осталось сделать, это прописать в скрипте входа в систему для пользователей строку:
start wscript \\pdc\netlogon\setup_firefox_36.js
Теги:
Хабы:
Всего голосов 20: ↑17 и ↓3+14
Комментарии10

Публикации

Истории

Работа

Ближайшие события