Pull to refresh

Установка, настройка и использование WPKG

Reading time 19 min
Views 37K
Ещё совсем недавно я наблюдал, как специалисты ИТ повсеместно пытались внедрить открытое ПО, а руководство сопротивлялось и требовало использовать продукты Microsoft. Нелицензионные продукты, но тем не менее. Сейчас же я всё чаще вижу обратное: руководство требует внедрения открытого ПО, а сотрудники ИТ отделов выбивают расширение бюджета для закупки лицензий. Причины изменившихся взглядов руководства понятны – это и регулярные рейды полиции, не позволяющие использовать ворованное, и успешные внедрения открытого ПО в других компаниях, и возможность экономить немалые суммы. Я говорю сейчас, прежде всего, о популярной замене Microsoft Office с Outlook’ом в комплекте на OpenOffice.org и Mozilla Thunderbird.

Но в чём же причина снижения интереса к открытому ПО со стороны ИТ специалистов? Сопровождение. Если руководство на планёрке за час до конца рабочего дня приняло решение, требующее смены настроек ПО на всех рабочих станциях к следующему утру, в однородной среде ПО от MS админу достаточно запустить оснастку «Управление групповыми политиками», сделать несколько кликов и идти домой. ПО не от Microsoft обычно политиками не настраивается… И админ «побежал» по сотне рабочих станций. А дома мама \ жена \ дети \ собака опять в угол нагадила (нужное подчеркнуть). Или вот, например, обновление Thunderbird. WSUS’ом не скачается, по рабочим станциям не раскидается и само не установится. При этом обновляется каждый месяц.

Хорошо, если админ любит изобретать велосипеды. Ещё лучше, если умеет. Тогда под всё необновляемое и ненастраиваемое городятся костыли и это всё шатко, но стоит. Пока админ не уволится. Тогда обычно с грохотом рушится.

Ещё здорово, когда есть боец. Молодой и с сильными ногами. Бойцу пишется регламентная задача, и боец её выполняет, заменяя собой и GPO, и WSUS, и множество других полезных штук.

Это не наши методы. Мы хотим рационального использования трудовых ресурсов, стандартизации инфраструктуры и прозрачных бизнес-процессов ИТ. Поэтому настройки и обновления будем распространять централизованно. С помощью WPKG. Странно, что на Хабре не нашлось ни одной статьи о нём.


WPKG – это WSH-скрипт, набор конфигурационных файлов в формате xml и клиентский сервис, периодически выполняющий этот самый скрипт. Можно и без клиентской части обойтись, но я опишу типовое решение.

Объект внедрения – компания с тремя офисами и 112-ю рабочими станциями. Из них 6 работают под управлением 64-ёх разрядной Windows 7, 4 под управлением Windows XP, 63 под управление Windows Vista и оставшиеся под управлением Windows 7. В каждом офисе есть сервер с WSUS на борту – SRV-1, SRV-2, SRV-3. Вот рядом с WSUS’ом-то и будем городить WPKG.

Первым делом создаём на каждом сервере каталог WPKG и соответствующую сетевую папку WPKG$ с доступом на чтение для всех. Скачиваем wpkg.org/files/stable/1.3.x/wpkg-1.3.0-bin.zip и распаковываем в вышеупомянутые каталоги. В этих же каталогах я создал подкаталоги software и client. Первый для дистрибутивов ПО, которое будем устанавливать и обновлять – UltraVNC, Thunderbird и OpenOffice. Второй для клиентской части WPKG.

Клиент WPKG

Клиентская часть WPKG – это служба Windows, запускающаяся при каждом загрузке компьютера и выполняющая wpkg.js с сетевой папки, указанной в настройках. Всё предельно просто.

Установочный пакет клиента скачиваем отсюда и кладём в соответствующий каталог — client. Туда же нужно положить файл конфигурации клиента — settings.xml. Но сначала его надо сделать. Для этого надо установить клиента, запустить C:\Program Files\wpkg\wpkginst.exe, заполнить поля и нажать кнопку «Export settings».

image

У меня получился примерно такой:
<?xml version="1.0" encoding="UTF-8" ?> 
<configuration>
<file>\\SRV-1\WPKG$\wpkg.js</file> 
<net-use-machine-account>YES</net-use-machine-account> 
<exec-user>SYSTEM</exec-user> 
<exec-password /> 
<parameters>/synchronize /nonotify /quiet</parameters> 
<silent>YES</silent> 
<pre-action /> 
<post-action /> 
<show-GUI>NO</show-GUI> 
<logon-delay>0</logon-delay> 
<logon-message-title>WPKG Software Deployment</logon-message-title> 
<logon-message-logo-picture /> 
<logon-message-1>WPKG is installing applications and applying settings...</logon-message-1> 
<logon-message-2>Please wait, don't restart or power off your computer...</logon-message-2> 
<script-variable name="SOFTWARE">\\SRV-1\WPKG$\software</script-variable> 
<priority>normal</priority> 
<stop-service-after-done>NO</stop-service-after-done> 
<laptop-mode>NO</laptop-mode> 
<server-connecting-method>standard</server-connecting-method> 
<server-connecting-ip /> 
<server-connecting-timeout>3</server-connecting-timeout> 
<server-connecting-script-timeout>3</server-connecting-script-timeout> 
<server-connecting-script-file /> 
<log-file /> 
<run-on-shutdown>NO</run-on-shutdown> 
<shutdown-delay>10</shutdown-delay> 
<logon-interrupt-password>OJzMGd0PqAMI2Vc=</logon-interrupt-password> 
<repeat-count-on-failure>0</repeat-count-on-failure> 
</configuration>
 


Интересны здесь параметры – file и script-variable. В первом указанно, что должна запускать клиентская часть. Второй — это переменная клиента, в нашем случае хранящая путь к репозиторию ПО. Она нам пригодится позже, при написании конфигурации для сервера WPKG. Пока же надо создать ещё две копии конфигурации, для SRV-2 и SRV-3 и исправить в них параметры file и script-variable соответствующим образом.

Клиентскую часть на рабочие станции будем устанавливать через GPO. Чтобы клиент устанавливался с нашими настройками, придётся создать трансформацию установочного пакета и добавить в таблицу Properties строку SETTINGSFILE со значением \\SRV-1\WPKG$\client\settings.xml. Сделать это можно с помощью Orca. Естественно, для каждого сервера надо сделать свой файл трансформации и положить туда же, в каталог client.

Дистрибутивы

Подготовим набор дистрибутивов. В каталоге software я создал такую структуру каталогов:
image

Thunderbird

В каталоге Thunderbird я создал ещё два подкаталога – configuration и extensions. В корень кладём Thunderbird Setup 9.0.1.exe. В configuration файлы all.js и autoconf.cfg (почитать об этом можно здесь). Расширения Thunderbird в extensions нужно класть распакованными. Можно архиватором распаковать xpi, но я не стал заморачиваться и просто скопировал папки из своего профиля — C:\Users\%USERNAME%\AppData\Roaming\Thunderbird\Profiles\abc1defg.default\extensions.

OpenOffice

Запускаем установку OpenOffice, ждём, пока установщик распакует файлы в software\Std\all\OpenOffice, завершаем установку. Нам опять пригодится Orca, чтобы отучить установочный пакет требовать запуска setup.exe. Открываем openofficeorg33.msi, находим таблицу LaunchCondition и удаляем в ней строку, содержащую условие SETUP_USED.

VNC

В software\Std\x86\VNC кладём 32-ух битную версию дистрибутива, в x64, соответственно, 64-ёх битную. В оба каталога кладём uvnc.inf и ultravnc.ini. Первый можно получить, запустив установку с ключом /saveinf, но он примитивен:

[Setup]
Lang=en
Dir=C:\Program Files\UltraVNC
Group=UltraVNC
NoIcons=0
SetupType=server_silent
Components=ultravnc_server_s
Tasks=installservice,startservice


Второй – результат настройки уже установленного UltraVNC, можно взять в C:\Program Files\UltraVNC.

Сервер WPKG

Теперь осталось настроить сам WPKG. Для этого есть три основных файла – host.xml, profiles.xml и packages.xml, описывающие кому устанавливать, что устанавливать и как устанавливать.

При запуске на клиентской стороне WPKG ищет имя рабочей станции, на которой запущен, в файле hosts.xml. В имени поддерживаются регулярные выражения. В моём случае в файле явно прописаны имена 64-ёх битных рабочих станций и шаблон для всех остальных.

<host name="WKS-088" profile-id="StdX64" />
<host name=".+" profile-id="StdX86" />


Найдя в host.xml имя рабочей станции, WPKG получает имя профиля установки для этой рабочей станции. Описания профилей хранятся в profiles.xml. В профиле перечисляются пакеты для установки и зависимости от других профилей. Например: Профиль для рабочей станции WKS-088 – StdX64. StdX64 зависит от профиля Std. Поэтому сначала на WKS-088 установятся все пакеты из профиля Std, а потом только из StdX64.

<profile id="Std">
<package package-id="Thunderbird" />
<package package-id="Lightning" />
<package package-id="MinTrayR" />
<package package-id="OpenOffice" />
</profile>
 
<profile id="StdX64">
 <depends profile-id="Std" />
<package package-id="VNCx64" />
</profile>


Пакеты описаны в packages.xml. Каждый пакет – это набор инструкций для проверки установлено ли ПО, для установки ПО, для обновления ПО и для удаления ПО. Возьмём для примера пакет Lightning, описывающий установку расширения для Thunderbird:

<package
    id="Lightning"
    name="Lightning"
    revision="2012.01.10"
    reboot="false"
    priority="0">
 
    <variable name="version" value="1.1" />
 
    <depends package-id="Thunderbird" />
 
    <check type="file" condition="exists" path="%PROGRAMFILES%\Mozilla Thunderbird\extensions\{e2fda1a4-762b-4020-b5ad-a41df1933103}\install.rdf" />
 
    <install cmd='%COMSPEC% /C xcopy /Q /I /E /Y /V /Z "%SOFTWARE%\Std\all\Thunderbird\extensions\{e2fda1a4-762b-4020-b5ad-a41df1933103}" "%PROGRAMFILES%\Mozilla Thunderbird\extensions\{e2fda1a4-762b-4020-b5ad-a41df1933103}"' />
 
    <upgrade cmd='%COMSPEC% /C xcopy /Q /I /E /Y /V /Z "%SOFTWARE%\Std\all\Thunderbird\extensions\{e2fda1a4-762b-4020-b5ad-a41df1933103}" "%PROGRAMFILES%\Mozilla Thunderbird\extensions\{e2fda1a4-762b-4020-b5ad-a41df1933103}"' />
 
    <remove cmd='%COMSPEC% /C rmdir /S /Q "%PROGRAMFILES%\Mozilla Thunderbird\extensions\{e2fda1a4-762b-4020-b5ad-a41df1933103}"' />
  </package>


Пакет имеет заголовок содержащий идентификатор пакета, имя, ревизию и приоритет. Идентификатор пакета используется в конфигурации WPKG, для связи пакета с профилем и указания зависимостей между пакетами. Имя пакета используется для вывода сообщений в журнал событий Windows. WPKG обрабатывает пакеты в порядке указанного приоритета. Приоритет использовать не рекомендуется, лучше использовать зависимости. Для указания ревизии пакета можно использовать несколько форматов: простой числовой формат – 1, 2, 3 и т.д., формат с точками – 1.1, 2.1.4, 3.200.3987 и т.д., формат цифробуквенный — 1.2RC1, 1.5I32, 2.73M24, 1.65.b и т.д., но я решил использовать дату в формате – YYYY.MM.DD. На мой взгляд, так проще и надёжнее. WPKG сверяет список пакетов для данного профиля со списком со своего прошлого запуска. Если в списке появился новый пакет, последовательно выполняются инструкции check этого пакета. Если ни одна из них не обнаружила установленного приложения, то также последовательно выполняются инструкции install. Если из списка исчез пакет, то выполняются инструкции remove этого пакета. Если изменилась ревизия, последовательно исполняются инструкции upgrade.

Пакеты, как и профили, могут зависеть друг от друга. Эта зависимость определяется директивой depends. В нашем примере пакет Lightning не будет устанавливаться, пока не установлен Thunderbird.

В инструкциях встречаются переменные, обрамлённые знаками процента (%). Это могут быть переменные окружения системы, переменные клиентской части WPKG (например, переменная %SOFTWARE% была определена нами в settings.xml) и переменные, описанные в файлах конфигурации. Последние описываются директивой variable.

Полные файлы конфигурации рабочей системы:

host.xml

<?xml version="1.0" encoding="UTF-8"?>
 
<hosts:wpkg xmlns:hosts="www.wpkg.org/hosts" xmlns:wpkg="www.wpkg.org/wpkg"
xmlns:xsi="www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="www.wpkg.org/hosts xsd/hosts.xsd ">
 
<host name="WKS-088" profile-id="StdX64" />
<host name="WKS-109" profile-id="StdX64" />
<host name="WKS-112" profile-id="StdX64" />
<host name="WKS-114" profile-id="StdX64" />
<host name="WKS-115" profile-id="StdX64" />
<host name="WKS-121" profile-id="StdX64" />
 
<host name=".+" profile-id="StdX86" />
 
</hosts:wpkg>
 

Скачать

profiles.xml

<?xml version="1.0" encoding="UTF-8"?>
<profiles:profiles xmlns:profiles="www.wpkg.org/profiles"
xmlns:wpkg="www.wpkg.org/wpkg" xmlns:xsi="www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="www.wpkg.org/profiles xsd/profiles.xsd ">
<profile id="Std">
<package package-id="Thunderbird" />
<package package-id="Lightning" />
<package package-id="MinTrayR" />
<package package-id="OpenOffice" />
</profile>
 
<profile id="StdX86">
        <depends profile-id="Std" />
        <package package-id="VNCx86" />
</profile>
 
<profile id="StdX64">
        <depends profile-id="Std" />
        <package package-id="VNCx64" />
</profile>
</profiles:profiles>
 

Скачать

packages.xml

<?xml version="1.0" encoding="UTF-8"?>
<packages:packages xmlns:packages="www.wpkg.org/packages"
xmlns:wpkg="www.wpkg.org/wpkg" xmlns:xsi="www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="www.wpkg.org/packages xsd/packages.xsd">
 
  <package
    id="Thunderbird"
    name="Mozilla Thunderbird"
    revision="2012.01.10"
    reboot="false"
    priority="0">
 
    <variable name="version" value="9.0.1" />
    <variable name="architecture" value="x86" />
    <variable name="locale" value="ru" />
 
    <check type="uninstall" condition="exists" path="Mozilla Thunderbird %version% (%architecture% %locale%)" />
 
    <install cmd='"%SOFTWARE%\Std\all\Thunderbird\Thunderbird Setup %version%.exe" -ms' />
 
    <install cmd='%COMSPEC% /C copy /v /y /z %SOFTWARE%\Std\all\Thunderbird\configuration\all.js  "%PROGRAMFILES%\Mozilla Thunderbird\defaults\pref\"' />
    <install cmd='%COMSPEC% /C copy /v /y /z %SOFTWARE%\Std\all\Thunderbird\configuration\autoconf.cfg  "%PROGRAMFILES%\Mozilla Thunderbird\"' />
 
    <upgrade cmd='taskkill /F /IM thunderbird.exe'>
      <exit code="0" />
      <exit code="128" />
    </upgrade>
 
    <upgrade cmd='"%SOFTWARE%\thunderbird\Thunderbird Setup %version%.exe" -ms' />
 
    <upgrade cmd='%COMSPEC% /C copy /v /y /z %SOFTWARE%\Std\all\Thunderbird\configuration\all.js  "%PROGRAMFILES%\Mozilla Thunderbird\defaults\pref\"' />
    <upgrade cmd='%COMSPEC% /C copy /v /y /z %SOFTWARE%\Std\all\Thunderbird\configuration\autoconf.cfg  "%PROGRAMFILES%\Mozilla Thunderbird\"' />
 
    <remove cmd='taskkill /F /IM thunderbird.exe'>
      <exit code="0" />
      <exit code="128" />
    </remove>
 
    <remove cmd='%COMSPEC% /C if exist "%PROGRAMFILES%\Mozilla Thunderbird\uninstall\helper.exe" "%PROGRAMFILES%\Mozilla Thunderbird\uninstall\helper.exe" -ms' />
  </package>
 
  <package
    id="Lightning"
    name="Lightning"
    revision="2012.01.10"
    reboot="false"
    priority="0">
 
    <variable name="version" value="1.1" />
 
    <depends package-id="Thunderbird" />
 
    <check type="file" condition="exists" path="%PROGRAMFILES%\Mozilla Thunderbird\extensions\{e2fda1a4-762b-4020-b5ad-a41df1933103}\install.rdf" />
 
    <install cmd='%COMSPEC% /C xcopy /Q /I /E /Y /V /Z "%SOFTWARE%\Std\all\Thunderbird\extensions\{e2fda1a4-762b-4020-b5ad-a41df1933103}" "%PROGRAMFILES%\Mozilla Thunderbird\extensions\{e2fda1a4-762b-4020-b5ad-a41df1933103}"' />
 
    <upgrade cmd='%COMSPEC% /C xcopy /Q /I /E /Y /V /Z "%SOFTWARE%\Std\all\Thunderbird\extensions\{e2fda1a4-762b-4020-b5ad-a41df1933103}" "%PROGRAMFILES%\Mozilla Thunderbird\extensions\{e2fda1a4-762b-4020-b5ad-a41df1933103}"' />
 
    <remove cmd='%COMSPEC% /C rmdir /S /Q "%PROGRAMFILES%\Mozilla Thunderbird\extensions\{e2fda1a4-762b-4020-b5ad-a41df1933103}"' />
  </package>
 
  <package
    id="MinTrayR"
    name="MinimizeToTray revived"
    revision="2012.01.10"
    reboot="false"
    priority="0">
 
    <variable name="version" value="1.0" />
 
    <depends package-id="Thunderbird" />
 
    <check type="file" condition="exists" path="%PROGRAMFILES%\Mozilla Thunderbird\extensions\mintrayr@tn123.ath.cx\install.rdf" />
 
    <install cmd='%COMSPEC% /C xcopy /Q /I /E /Y /V /Z "%SOFTWARE%\Std\all\Thunderbird\extensions\mintrayr@tn123.ath.cx" "%PROGRAMFILES%\Mozilla Thunderbird\extensions\mintrayr@tn123.ath.cx"' />
 
    <upgrade cmd='%COMSPEC% /C xcopy /Q /I /E /Y /V /Z "%SOFTWARE%\Std\all\Thunderbird\extensions\mintrayr@tn123.ath.cx" "%PROGRAMFILES%\Mozilla Thunderbird\extensions\mintrayr@tn123.ath.cx"' />
 
    <remove cmd='%COMSPEC% /C rmdir /S /Q "%PROGRAMFILES%\Mozilla Thunderbird\extensions\mintrayr@tn123.ath.cx"' />
  </package>
 
  <package
    id="OpenOffice"
    name="OpenOffice.org 3.3"
    revision="2012.01.11"
    reboot="false"
    priority="0">
 
    <variable name="version" value="3.3.9567.500" />
    <variable name="code" value="{4218E1CD-CDB6-448C-8036-2871403BDE57}" />
 
    <check type="file" condition="versionequalto" path="%PROGRAMFILES%\OpenOffice.org 3\program\soffice.exe" value="%version%" />
 
    <install cmd='%COMSPEC% /C if exist "%PROGRAMFILES%\OpenOffice.org 3\program\soffice.exe" msiexec /qn /x %code%' />
    <install cmd='msiexec /qn /i "%SOFTWARE%\Std\all\OpenOffice\openofficeorg33.msi" ALLUSERS=1 ADDLOCAL=ALL REMOVE=gm_o_Quickstart,gm_o_Onlineupdate' />
    <install cmd='%COMSPEC% /C copy /v /y /z %SOFTWARE%\Std\all\OpenOffice\bootstrap.ini  "%PROGRAMFILES%\OpenOffice.org 3\program\"' />
 
    <upgrade cmd='msiexec /qn /i "%SOFTWARE%\Std\all\OpenOffice\openofficeorg33.msi" ALLUSERS=1 ADDLOCAL=ALL REMOVE=gm_o_Quickstart,gm_o_Onlineupdate' />
    <upgrade cmd='%COMSPEC% /C copy /v /y /z %SOFTWARE%\Std\all\OpenOffice\bootstrap.ini  "%PROGRAMFILES%\OpenOffice.org 3\program\"' />
 
    <remove cmd='msiexec /qn /x %code%' />
  </package>
 
  <package id="VNCx86" name="Ultra VNC (x86)" revision="2012.01.11" priority="0">
    <variable name="version" value="1.0.9.6" />
 
    <check type="file" condition="versionequalto" path="%PROGRAMFILES%\UltraVNC\winvnc.exe" value="%version%" />
 
    <install cmd='%SOFTWARE%\Std\x86\vnc\UltraVNC_1.0.9.6.1_Setup.exe /verysilent /loadinf="%SOFTWARE%\Std\x86\vnc\uvnc.inf"' />
    <install cmd='%COMSPEC% /c copy /Y %SOFTWARE%\Std\x86\vnc\ultravnc.ini "%PROGRAMFILES%\UltraVNC\"' />
 
    <upgrade cmd='net stop uvnc_service'>
      <exit code='0' />
      <exit code='2' />
    </upgrade>
    <upgrade cmd='sc delete uvnc_service' />
    <upgrade cmd='%SOFTWARE%\Std\x86\vnc\UltraVNC_1.0.9.6.1_Setup.exe /verysilent /loadinf="%SOFTWARE%\Std\x86\vnc\uvnc.inf"' />
    <upgrade cmd='%COMSPEC% /c copy /Y %SOFTWARE%\Std\x86\vnc\ultravnc.ini "%PROGRAMFILES%\UltraVNC\"' />
 
    <remove cmd='net stop uvnc_service'>
      <exit code='0' />
      <exit code='2' />
    </remove>
    <remove cmd='sc delete uvnc_service' />
    <remove cmd='"%PROGRAMFILES%\UltraVNC\unins000.exe" /verysilent /norestart' />
    <remove cmd='%COMSPEC% /c rmdir /S /Q "%PROGRAMFILES%\UltraVNC"' />
  </package>
 
  <package id="VNCx64" name="Ultra VNC (x64)" revision="2012.01.11" priority="0">
    <variable name="version" value="1.0.9.6" />
 
    <check type="file" condition="versionequalto" path="%PROGRAMFILES%\UltraVNC\winvnc.exe" value="%version%" />
 
    <install cmd='%SOFTWARE%\Std\x64\vnc\UltraVNC_1.0.9.6.1_x64_Setup.exe /verysilent /loadinf="%SOFTWARE%\Std\x64\vnc\uvnc.inf"' />
    <install cmd='%COMSPEC% /c copy /Y %SOFTWARE%\Std\x64\vnc\ultravnc.ini "%PROGRAMFILES%\UltraVNC\"' />
 
    <upgrade cmd='net stop uvnc_service'>
      <exit code='0' />
      <exit code='2' />
    </upgrade>
    <upgrade cmd='sc delete uvnc_service' />
    <upgrade cmd='%SOFTWARE%\Std\x64\vnc\UltraVNC_1.0.9.6.1_x64_Setup.exe /verysilent /loadinf="%SOFTWARE%\Std\x64\vnc\uvnc.inf"' />
    <upgrade cmd='%COMSPEC% /c copy /Y %SOFTWARE%\Std\x64\vnc\ultravnc.ini "%PROGRAMFILES%\UltraVNC\"' />
 
    <remove cmd='net stop uvnc_service'>
      <exit code='0' />
      <exit code='2' />
    </remove>
    <remove cmd='sc delete uvnc_service' />
    <remove cmd='"%PROGRAMFILES%\UltraVNC\unins000.exe" /verysilent /norestart' />
    <remove cmd='%COMSPEC% /c rmdir /S /Q "%PROGRAMFILES%\UltraVNC"' />
  </package>
</packages:packages>

Скачать

Все пакеты были взяты мною с сайта wpkg.org. Но их легко и самостоятельно написать.

Также легко диагностируются и решаются проблемы, в случае их возникновения. В процессе работы WPKG регистрирует события в журнале событий Windows и ведёт лог в %SYSTEMROOT%\System32\wpkg.xml

Системному администратору остаётся только вовремя скачивать в каталог software свежие версии ПО и контролировать правильную работу пакетов.
Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
+6
Comments 8
Comments Comments 8

Articles