Нашлось очень интересное решение (прочитайте его для лучшего понимания ниженаписанного), но оно не везде подходит:
1. В некоторых сетях нет виндового компьютера, постоянно включенного и подключенного к Интернету
2. Выделенную для сервера обновлений машину-рабочую станцию иногда отключают надолго (на время отпуска, бывает и так)
3. Мне не понравилось, что wget -timestamping иногда некорректно работает - качает все файлы подряд
Встречаются и решения типа этого, но они некрасивые и вообще я не хочу пользоваться такими костылями

Пришлось сесть и написать скрипт на обычном юниксовом шелле:
Код: Выделить всё
#!/bin/sh
dir='/usr/local/www/kav_update/'
server='http://dnl-ru2.kaspersky-labs.com/'
components="BLST AHI386 AVS"
xml="/usr/local/bin/xml"
subdir='index/6'
mkdir -p ${dir}${subdir}
cd ${dir}${subdir}
fetch ${server}${subdir}/u0607g.xml
grep -v "^;" u0607g.xml > u0607g.xml.temp
for component in $components
do
stt=${xml}" sel -t -m "//FileDescription[@ComponentID=\'${component}\']" -v @ServerFolder -n u0607g.xml.temp"
path2=`${stt}`
mkdir -p ${path2}
stt=${xml}" sel -t -m "//FileDescription[@ComponentID=\'${component}\']" -v @Filename -n u0607g.xml.temp"
fname=`${stt}`
cd ${path2}
fetch ${server}${subdir}/${path2}/${fname}
grep -v "^;" ${fname} > ${fname}.temp
stt=${xml}" sel -t -m "//FileDescription[@ComponentID=\'${component}\']" -v @Filename -n "${fname}.temp
files=`${stt}`
for file in $files
do
if [ -s ${file} ]
then
size=`ls -l ${file} | awk '{print $5}'`
stt=${xml}" sel -t -m "//FileDescription[@Filename=\'${file}\']" -v @FileSize -n "${fname}.temp
sizeneed=`${stt}`
if [ "${size}" != "${sizeneed}" ]
then
fetch ${server}${subdir}/${path2}/${file}
fi
else
fetch ${server}${subdir}/${path2}/${file}
fi
done
rm ${fname}.temp
cd -
done
rm u0607g.xml.temp
Установка веб-сервера - это отдельная тема для разговора, конечно он должен работать.
Путь к корневой папке сервера нужно указать в переменной скрипта dir
Переменная server указывает, с какого сервера Касперского нужно качать обновления.
Переменная components - список компонентов для скачивания, разделенный пробелами. index/6/u0607g.xml
Хотелось бы:
1. Переписать этот скрипт на Перле (там же есть встроенная поддержка xml?), чтобы не устанавливать xmlstarlet
2. Узнать, как fetch заставить качать только обновленные файлы (я хочу максимально обойтись встроенными средствами). Дело в том, что скрипт читает из xml атрибут или как там оно называется Filesize, но этот атрибут проставлен не во всех файлах. Следовательно, такие файлы будут качаться каждый раз полностью. Радует то, что в папке с собственно обновлениями размер файла указан - а это основной объем
3. Выслушать кучу дельных замечаний и комментариев.