Установка локального WindowsUpdate сервера под Unix

В статье рассматривается установка сервера, совместимого с MS Windows Software Update Service, на платформе Unix. Предполагается, что Apache 1.3.x и Python 2.x уже установлены

[Кирил Малеванов (cyrill at malevanov.spb.ru)]

Установка локального WindowsUpdate сервера под Unix

В статье рассматривается установка сервера, совместимого с MS WindowsTM Software Update Service. Заранее предполагается, что уже установлены веб-сервер Apache 1.3.x и Python 2.x.

Disclaimer

Я ни в коем разе не претендую, что установка сделана правильно, корректно, "так как надо" и прочая. Я описываю только что, что у меня работает. Кроме того, я не обещаю, что это будет работать у всех, что это будет работать именно так, как задумано и т.д. и т.п.

Мысли вслух

Любимая софтверная компания для установки локального WindowsUpdate сервера предполагает наличие выделенного сервера под управлением одной из любимых операционных систем. На них сверху надо накатить любимый веб-сервер любимой софтверной компании, скачать до 200 мб дистрибутива, поставить все это, а потом ловить баги. Описываемый же способ предлагает скачать 20 килобайт исходного кода и все запустить и настроить на имеющемся Unix/Linux/*x-сервере.

Подготовка

Для работы всего этого нам понадобятся:

  • Apache 1.3.x
  • Python 2.x (проверено на 2.3)
  • cabextract
  • wget

SUSfL

Настройка Apache

Сначала необходимо настроить виртуальный хост в Apache. Настройки такие:

<VirtualHost 192.168.1.1>
    ServerAdmin admin@mydomain.ru
    DocumentRoot /mnt/www/winupdate.mydomain.ru/data
    ServerName winupdate.mydomain.ru
    ServerAlias winupdate.localnet.mydomain.ru
    ErrorLog /mnt/www/winupdate.mydomain.ru/logs/error_log
    CustomLog /mnt/www/winupdate.mydomain.ru/logs/access_log combined

    <Directory "/mnt/www/winupdate.mydomain.ru/data">
        AllowOverride All
        Options FollowSymLinks
        Order allow,deny
        Allow from all
    </Directory>
    <Directory "/mnt/www/winupdate.mydomain.ru/data/autoupdate">
	AddHandler cgi-script .asp
        AllowOverride All
        Options FollowSymLinks +ExecCGI
        Order allow,deny
        Allow from all
    </Directory>

    DirectoryIndex index.htm index.html index.shtm index.shtml index.php index.php3
</VirtualHost>

Выставьте кодировку по умолчанию в windows-1251. Для пользователей русского апача: выключите механизм перекодировки.

Настройка собственно SUSfL

Потом в заданный каталоге надо установить и настроить SUSfL (альт. ссылка) - "A free set of Python scripts to replace MS SUS in your LAN" от Владимира Умнова

В файле autoupdate\sus_consts.py выставляем

susdebug = False
#prefix is path with trailing slash to your virtual host folder
prefix = "/mnt/www/winupdate.mydomain.ru/data/"
#localCabPool is path with trailing slash to your pool, where updates will be stored
localCabPool = "/mnt/www/winupdate.mydomain.ru/data/selfupdate/"
#UseWUServer = [True|False] if set to True all updates will be downloaded from local 
UseWUServer = False
и указываем, какие продукты и каких версий нам нужны:
#sus_update_locales = None
sus_update_locales = { \
    "ie55x": ('en','ru'), \
    "ie60x": ('en','ru'), \
    "netserver": ('en','ru'), \
    "win2k": ('en','ru'), \
    "winxp": ('en','ru')  \
}
NetServer - это Win2003 Server.

Не забываем сделать chmod a+x autoupdate/getmanifest.asp и проверить в нем шебанг (!#/usr/local/bin/python или ваш путь к python).

Потом надо установить, а что же качать-то. Первыми с сайта любимой компании качаются так называемые словари. Список словарей лежит в autoupdate\selfupdate.txt. Удаляем из него лишние строчки - например, те, которые содержат неиспользуемые в нашей сети языки. Будьте внимательны и аккуратны. Рекомендуется добавить туда строчки:

selfupdate/AU/x86/XP/en/wuaueng.cab
selfupdate/AU/x86/XP/en/wuaucomp.cab
selfupdate/AU/x86/XP/en/iuengine.cab
selfupdate/AU/x86/XP/en/wuauclt.cab
selfupdate/AU/x86/XP/en/iuctl.cab
selfupdate/AU/x86/XP/ru/wuaueng.cab
selfupdate/AU/x86/XP/ru/wuaucomp.cab
selfupdate/AU/x86/XP/ru/iuengine.cab
selfupdate/AU/x86/XP/ru/wuauclt.cab
selfupdate/AU/x86/XP/ru/iuctl.cab
selfupdate/AU/x86/XP/mui/wuauclt_ptbr.cab
selfupdate/AU/x86/XP/mui/wuauclt_zhcn.cab
selfupdate/AU/x86/XP/mui/wuaueng_ar.cab
selfupdate/AU/x86/XP/mui/wuaueng_da.cab
selfupdate/AU/x86/XP/mui/wuaueng_de.cab
selfupdate/AU/x86/XP/mui/wuaueng_cs.cab
selfupdate/AU/x86/XP/mui/wuaueng_el.cab
selfupdate/AU/x86/XP/mui/wuaueng_es.cab
selfupdate/AU/x86/XP/mui/wuaueng_fi.cab
selfupdate/AU/x86/XP/mui/wuaueng_fr.cab
selfupdate/AU/x86/XP/mui/wuaueng_he.cab
selfupdate/AU/x86/XP/mui/wuaueng_hu.cab
selfupdate/AU/x86/XP/mui/wuaueng_ja.cab
selfupdate/AU/x86/XP/mui/wuaueng_it.cab
selfupdate/AU/x86/XP/mui/wuaueng_ko.cab
selfupdate/AU/x86/XP/mui/wuaueng_ptbr.cab
selfupdate/AU/x86/XP/mui/wuaueng_nl.cab
selfupdate/AU/x86/XP/mui/wuaueng_no.cab
selfupdate/AU/x86/XP/mui/wuaueng_pl.cab
selfupdate/AU/x86/XP/mui/wuaueng_pt.cab
selfupdate/AU/x86/XP/mui/wuauclt_ar.cab
selfupdate/AU/x86/XP/mui/wuaueng_ru.cab
selfupdate/AU/x86/XP/mui/wuauclt_zhtw.cab
selfupdate/AU/x86/XP/mui/wuaueng_sv.cab
selfupdate/AU/x86/XP/mui/wuauclt_da.cab
selfupdate/AU/x86/XP/mui/wuaueng_tr.cab
selfupdate/AU/x86/XP/mui/wuauclt_de.cab
selfupdate/AU/x86/XP/mui/wuauclt_cs.cab
selfupdate/AU/x86/XP/mui/wuauclt_el.cab
selfupdate/AU/x86/XP/mui/wuauclt_es.cab
selfupdate/AU/x86/XP/mui/wuauclt_fi.cab
selfupdate/AU/x86/XP/mui/wuauclt_fr.cab
selfupdate/AU/x86/XP/mui/wuauclt_he.cab
selfupdate/AU/x86/XP/mui/wuauclt_hu.cab
selfupdate/AU/x86/XP/mui/wuauclt_ja.cab
selfupdate/AU/x86/XP/mui/wuauclt_it.cab
selfupdate/AU/x86/XP/mui/wuauclt_ko.cab
selfupdate/AU/x86/XP/mui/wuaueng_zhcn.cab
selfupdate/AU/x86/XP/mui/wuauclt_nl.cab
selfupdate/AU/x86/XP/mui/wuauclt_no.cab
selfupdate/AU/x86/XP/mui/wuauclt_pl.cab
selfupdate/AU/x86/XP/mui/wuauclt_pt.cab
selfupdate/AU/x86/XP/mui/wuauclt_ru.cab
selfupdate/AU/x86/XP/mui/wuauclt_sv.cab
selfupdate/AU/x86/XP/mui/wuauclt_tr.cab
selfupdate/AU/x86/XP/mui/wuaueng_zhtw.cab
selfupdate/AU/x86/W2K/en/wuaueng.cab
selfupdate/AU/x86/W2K/en/wuaucomp.cab
selfupdate/AU/x86/W2K/en/iuengine.cab
selfupdate/AU/x86/W2K/en/wuauclt.cab
selfupdate/AU/x86/W2K/en/wuaucpl.cab
selfupdate/AU/x86/W2K/en/iuctl.cab
selfupdate/AU/x86/W2K/ru/wuaueng.cab
selfupdate/AU/x86/W2K/ru/wuaucomp.cab
selfupdate/AU/x86/W2K/ru/iuengine.cab
selfupdate/AU/x86/W2K/ru/wuauclt.cab
selfupdate/AU/x86/W2K/ru/wuaucpl.cab
selfupdate/AU/x86/W2K/ru/iuctl.cab
selfupdate/AU/x86/W2K/mui/wuaucpl_ar.cab
selfupdate/AU/x86/W2K/mui/wuaucpl_zhcn.cab
selfupdate/AU/x86/W2K/mui/wuaucpl_da.cab
selfupdate/AU/x86/W2K/mui/wuaucpl_de.cab
selfupdate/AU/x86/W2K/mui/wuaucpl_cs.cab
selfupdate/AU/x86/W2K/mui/wuauclt_ptbr.cab
selfupdate/AU/x86/W2K/mui/wuaucpl_el.cab
selfupdate/AU/x86/W2K/mui/wuaucpl_es.cab
selfupdate/AU/x86/W2K/mui/wuaucpl_fi.cab
selfupdate/AU/x86/W2K/mui/wuaucpl_fr.cab
selfupdate/AU/x86/W2K/mui/wuaucpl_he.cab
selfupdate/AU/x86/W2K/mui/wuaucpl_hu.cab
selfupdate/AU/x86/W2K/mui/wuaucpl_ja.cab
selfupdate/AU/x86/W2K/mui/wuaucpl_it.cab
selfupdate/AU/x86/W2K/mui/wuaucpl_ko.cab
selfupdate/AU/x86/W2K/mui/wuaucpl_nl.cab
selfupdate/AU/x86/W2K/mui/wuaucpl_no.cab
selfupdate/AU/x86/W2K/mui/wuaucpl_pl.cab
selfupdate/AU/x86/W2K/mui/wuaucpl_pt.cab
selfupdate/AU/x86/W2K/mui/wuaucpl_ru.cab
selfupdate/AU/x86/W2K/mui/wuaucpl_sv.cab
selfupdate/AU/x86/W2K/mui/wuaucpl_zhtw.cab
selfupdate/AU/x86/W2K/mui/wuaucpl_tr.cab
selfupdate/AU/x86/W2K/mui/wuauclt_zhcn.cab
selfupdate/AU/x86/W2K/mui/wuaueng_ar.cab
selfupdate/AU/x86/W2K/mui/wuaueng_da.cab
selfupdate/AU/x86/W2K/mui/wuaueng_de.cab
selfupdate/AU/x86/W2K/mui/wuaueng_cs.cab
selfupdate/AU/x86/W2K/mui/wuaueng_el.cab
selfupdate/AU/x86/W2K/mui/wuaueng_es.cab
selfupdate/AU/x86/W2K/mui/wuaueng_fi.cab
selfupdate/AU/x86/W2K/mui/wuaueng_fr.cab
selfupdate/AU/x86/W2K/mui/wuaueng_he.cab
selfupdate/AU/x86/W2K/mui/wuaueng_hu.cab
selfupdate/AU/x86/W2K/mui/wuaueng_ja.cab
selfupdate/AU/x86/W2K/mui/wuaueng_it.cab
selfupdate/AU/x86/W2K/mui/wuaueng_ko.cab
selfupdate/AU/x86/W2K/mui/wuaueng_ptbr.cab
selfupdate/AU/x86/W2K/mui/wuaueng_nl.cab
selfupdate/AU/x86/W2K/mui/wuaueng_no.cab
selfupdate/AU/x86/W2K/mui/wuaueng_pl.cab
selfupdate/AU/x86/W2K/mui/wuaueng_pt.cab
selfupdate/AU/x86/W2K/mui/wuauclt_ar.cab
selfupdate/AU/x86/W2K/mui/wuaueng_ru.cab
selfupdate/AU/x86/W2K/mui/wuauclt_zhtw.cab
selfupdate/AU/x86/W2K/mui/wuaueng_sv.cab
selfupdate/AU/x86/W2K/mui/wuauclt_da.cab
selfupdate/AU/x86/W2K/mui/wuaueng_tr.cab
selfupdate/AU/x86/W2K/mui/wuauclt_de.cab
selfupdate/AU/x86/W2K/mui/wuauclt_cs.cab
selfupdate/AU/x86/W2K/mui/wuauclt_el.cab
selfupdate/AU/x86/W2K/mui/wuauclt_es.cab
selfupdate/AU/x86/W2K/mui/wuauclt_fi.cab
selfupdate/AU/x86/W2K/mui/wuauclt_fr.cab
selfupdate/AU/x86/W2K/mui/wuauclt_he.cab
selfupdate/AU/x86/W2K/mui/wuauclt_hu.cab
selfupdate/AU/x86/W2K/mui/wuauclt_ja.cab
selfupdate/AU/x86/W2K/mui/wuauclt_it.cab
selfupdate/AU/x86/W2K/mui/wuauclt_ko.cab
selfupdate/AU/x86/W2K/mui/wuaueng_zhcn.cab
selfupdate/AU/x86/W2K/mui/wuauclt_nl.cab
selfupdate/AU/x86/W2K/mui/wuauclt_no.cab
selfupdate/AU/x86/W2K/mui/wuauclt_pl.cab
selfupdate/AU/x86/W2K/mui/wuauclt_pt.cab
selfupdate/AU/x86/W2K/mui/wuauclt_ru.cab
selfupdate/AU/x86/W2K/mui/wuauclt_sv.cab
selfupdate/AU/x86/W2K/mui/wuauclt_tr.cab
selfupdate/AU/x86/W2K/mui/wuaucpl_ptbr.cab
selfupdate/AU/x86/W2K/mui/wuaueng_zhtw.cab
selfupdate/AU/x86/NetServer/en/wuaueng.cab
selfupdate/AU/x86/NetServer/en/wuaucomp.cab
selfupdate/AU/x86/NetServer/en/iuengine.cab
selfupdate/AU/x86/NetServer/en/wuauclt.cab
selfupdate/AU/x86/NetServer/en/iuctl.cab
selfupdate/AU/x86/NetServer/ru/wuaueng.cab
selfupdate/AU/x86/NetServer/ru/wuaucomp.cab
selfupdate/AU/x86/NetServer/ru/iuengine.cab
selfupdate/AU/x86/NetServer/ru/wuauclt.cab
selfupdate/AU/x86/NetServer/ru/iuctl.cab
selfupdate/AU/x86/NetServer/mui/wuauclt_ptbr.cab
selfupdate/AU/x86/NetServer/mui/wuauclt_zhcn.cab
selfupdate/AU/x86/NetServer/mui/wuaueng_ar.cab
selfupdate/AU/x86/NetServer/mui/wuaueng_da.cab
selfupdate/AU/x86/NetServer/mui/wuaueng_de.cab
selfupdate/AU/x86/NetServer/mui/wuaueng_cs.cab
selfupdate/AU/x86/NetServer/mui/wuaueng_el.cab
selfupdate/AU/x86/NetServer/mui/wuaueng_es.cab
selfupdate/AU/x86/NetServer/mui/wuaueng_fi.cab
selfupdate/AU/x86/NetServer/mui/wuaueng_fr.cab
selfupdate/AU/x86/NetServer/mui/wuaueng_he.cab
selfupdate/AU/x86/NetServer/mui/wuaueng_hu.cab
selfupdate/AU/x86/NetServer/mui/wuaueng_ja.cab
selfupdate/AU/x86/NetServer/mui/wuaueng_it.cab
selfupdate/AU/x86/NetServer/mui/wuaueng_ko.cab
selfupdate/AU/x86/NetServer/mui/wuaueng_ptbr.cab
selfupdate/AU/x86/NetServer/mui/wuaueng_nl.cab
selfupdate/AU/x86/NetServer/mui/wuaueng_no.cab
selfupdate/AU/x86/NetServer/mui/wuaueng_pl.cab
selfupdate/AU/x86/NetServer/mui/wuaueng_pt.cab
selfupdate/AU/x86/NetServer/mui/wuauclt_ar.cab
selfupdate/AU/x86/NetServer/mui/wuaueng_ru.cab
selfupdate/AU/x86/NetServer/mui/wuauclt_zhtw.cab
selfupdate/AU/x86/NetServer/mui/wuaueng_sv.cab
selfupdate/AU/x86/NetServer/mui/wuauclt_da.cab
selfupdate/AU/x86/NetServer/mui/wuaueng_tr.cab
selfupdate/AU/x86/NetServer/mui/wuauclt_de.cab
selfupdate/AU/x86/NetServer/mui/wuauclt_cs.cab
selfupdate/AU/x86/NetServer/mui/wuauclt_el.cab
selfupdate/AU/x86/NetServer/mui/wuauclt_es.cab
selfupdate/AU/x86/NetServer/mui/wuauclt_fi.cab
selfupdate/AU/x86/NetServer/mui/wuauclt_fr.cab
selfupdate/AU/x86/NetServer/mui/wuauclt_he.cab
selfupdate/AU/x86/NetServer/mui/wuauclt_hu.cab
selfupdate/AU/x86/NetServer/mui/wuauclt_ja.cab
selfupdate/AU/x86/NetServer/mui/wuauclt_it.cab
selfupdate/AU/x86/NetServer/mui/wuauclt_ko.cab
selfupdate/AU/x86/NetServer/mui/wuaueng_zhcn.cab
selfupdate/AU/x86/NetServer/mui/wuauclt_nl.cab
selfupdate/AU/x86/NetServer/mui/wuauclt_no.cab
selfupdate/AU/x86/NetServer/mui/wuauclt_pl.cab
selfupdate/AU/x86/NetServer/mui/wuauclt_pt.cab
selfupdate/AU/x86/NetServer/mui/wuauclt_ru.cab
selfupdate/AU/x86/NetServer/mui/wuauclt_sv.cab
selfupdate/AU/x86/NetServer/mui/wuauclt_tr.cab
selfupdate/AU/x86/NetServer/mui/wuaueng_zhtw.cab
selfupdate/CUN5_4/x86/nt5/en/ie5/actproto.cab
selfupdate/CUN5_4/x86/nt5/en/ie5/wuv3is.cab
selfupdate/CUN5_4/x86/nt5/ru/ie5/actproto.cab
selfupdate/CUN5_4/x86/nt5/ru/ie5/wuv3is.cab
selfupdate/CUN5_4/x86/nt5/engb/ie5/actproto.cab
selfupdate/CUN5_4/x86/nt5/engb/ie5/wuv3is.cab
selfupdate/CUN5_4/x86/nt5/enie/ie5/actproto.cab
selfupdate/CUN5_4/x86/nt5/enie/ie5/wuv3is.cab
selfupdate/CUN5_4/x86/nt5/ennz/ie5/actproto.cab
selfupdate/CUN5_4/x86/nt5/ennz/ie5/wuv3is.cab
selfupdate/CUN5_4/x86/nt5/enza/ie5/actproto.cab
selfupdate/CUN5_4/x86/nt5/enza/ie5/wuv3is.cab
selfupdate/CUN5_4/x86/nt5/en_thai/ie5/actproto.cab
selfupdate/CUN5_4/x86/nt5/en_thai/ie5/wuv3is.cab
selfupdate/CUN5_4/x86/nt5/el_ibm/ie5/actproto.cab
selfupdate/CUN5_4/x86/nt5/el_ibm/ie5/wuv3is.cab
selfupdate/CUN5_4/x86/nt5/en_arabic/ie5/actproto.cab
selfupdate/CUN5_4/x86/nt5/en_arabic/ie5/wuv3is.cab
selfupdate/CUN5_4/x86/nt5/en_hebrew/ie5/actproto.cab
selfupdate/CUN5_4/x86/nt5/en_hebrew/ie5/wuv3is.cab
selfupdate/CUN5_4/selfupd/ResKit/x86/en/cun.CAB
selfupdate/CUN5_4/selfupd/ResKit/x86/en/wulproto.CAB
selfupdate/CUN5_4/selfupd/ResKit/x86/en/cunprot2.CAB
selfupdate/CUN5_4/selfupd/ResKit/x86/ru/wulproto.CAB
selfupdate/CUN5_4/selfupd/ResKit/x86/ru/cunprot2.CAB
selfupdate/CUN5_4/selfupd.cab
selfupdate/AU/x86/XP/ru/wuauclt1.cab
selfupdate/AU/x86/XP/en/wuauclt1.cab
selfupdate/AU/x86/XP/mui/wuauclt1_ru.cab
selfupdate/AU/x86/XP/ru/wuapi.cab
selfupdate/AU/x86/XP/ru/wups.cab
selfupdate/AU/x86/W2K/ru/wuaucpl.cab
selfupdate/wuident.cab

Первый запуск

В шелле в каталоге autoupdate запустите python getselfupdate.py, скачаются словари (около 100мб для русской и английской версий указанных софтин). Если у вас cabextract установлена, то они распакуются и будет файлик providers.txt. Если cabextract установить забыли, то удалите *.cab из корня, установите cabextract и повторите python getselfupdate.py.

Теперь надо скачать сами апдейты - в шелле в каталоге autoupdate запустите python sus_sync.py - начнут качаться все апдейты для указанных систем и языков, это замет несколько дней (если у вас не 10мбит канал, конечно). Я лично в sus_sync.py и getselfupdate.py нашел строчку запуска wget и поставил лимит скорости скачивания. Я ПРЕДУПРЕДИЛ - КАЧАТЬСЯ БУДЕТ ОЧЕНЬ МНОГО!!! ДО 10 ГБ.
Практика показывает, что на сегодняшний день выкачивается по w2k+wxp+w2003 en+ru до 2х гигабайт.

Использование

Для использования системы необходимо поправить файл winupdate.reg, входящий в поставку SUSfL, выставить там ваш адрес сервера обновления, и ваше время обновления. Далее на всех машинах, которые должны будут обновляться с сервера, заносим этот файл в реестр и проверяем, чтобы служба Automatic Updates была запущена

Поддержка и докачка

Иногда проверяйте error.log на предмет ненайденных cab-файлов. Их добавляйте в autoupdate/selfupdate.txt, удалите cab-файлы в корне сервера, потом запускайте getselfupdate.py и sus_sync.py. Для проведения синхронизации с сервером обновлений любимой компании также запускайте sus_sync.py.

Статья взята с сайта OpenNet.

[ опубликовано 01/11/2004 ]

Кирил Малеванов (cyrill at malevanov.spb.ru) - Установка локального WindowsUpdate сервера под Unix   Версия для печати