Написал свой скрипт, правда не на sh, но с большей функциональностью Запрос на обновления происходит с одного сервера за раз, выбор сервера случайный. При устаревании ключиков, скрипт сам их обновляет.
Для работы нужны пакеты wget, unrar и php. Перед началом работы создать подпапку temp - mkdir temp и выставить права на выполнение скрипта chmod +x nod32upd.php, теперь можно запускать его напрямую - ./nod32upd.php. В cron сделать сначала переход в папку со скриптом, затем уже выполнение, т.е. cd /opt/.../nod32updates && ./nod32upd.php
PHP Code:
#!/opt/bin/php
<?php
$server="http://update.eset.com";
$v2="nod_upd";
$v3="eset_upd";
function check()
{
$kkeys = 14; // количество проверяемых ключей
$site = ""; // здесь впишите сайт с ключами или локальный файл с ключами.
$file = file_get_contents($site);
$eav="http://download.eset.com/download/win/eav/eav_nt32_enu.msi";
$ess="http://download.eset.com/download/win/ess/ess_nt32_enu.msi";
preg_match_all("/(EAV-[0-9]{8}).*?([a-z0-9]{10})/",$file,$match);
$fk=fopen("temp/keys","w");
for ($i=0; $i<$kkeys; $i++)
{
$f=exec ('/opt/bin/wget -q --spider --http-user='.$match[1][$i].' --password='.$match[2][$i].' '.$eav.'&&echo 1||echo 0');
if ($f) $f=exec ('/opt/bin/wget -q --spider --http-user='.$match[1][$i].' --password='.$match[2][$i].' '.$ess.'&&echo 1||echo 0');
if ($f) fwrite ($fk,$match[1][$i]." ".$match[2][$i]."\n");
}
fclose($fk);
}
function parce ($update)
{
$vp=explode("[",$update);
foreach ($vp as $f=>$k)
{
list($name,$data)=explode("]",$k);
if (ereg("(Expire|SETUP|REVERSE_ENGINE0|COMPATLIST|CONTINUOUS|NOD32MOD_WINNT_[^E]+|NOD32MOD_WIN98_[^E]+)",$name)) continue;
preg_match_all('/([a-zA-Z-]+)=(.*)/',$data,$match);
foreach ($match[1] as $ff=>$kk) $M[$name][$kk]=trim($match[2][$ff]);
}
return $M;
}
function downloader($urls, $domain)
{
$keyf="temp/keys";
preg_match_all("/,? ?[1|2]0@([^,]+)\/(nod|eset)_upd/",$domain,$servers);
$domain=$servers[1][rand(0,count($servers[1]))];
$flag=2;
$keys=file($keyf);
foreach ($keys as $f=>$k)
{
list($user,$pass)=explode(" ",$k);
foreach ($urls as $ff=>$kk)
{
$flag=exec("/opt/bin/wget -q -cPtemp --http-user=".trim($user)." --http-password=".trim($pass)." ".$domain.$kk."&&echo 0||echo 1");
if ($flag) break;
}
if (!$flag) return 0;
else
{
$oostr=str_replace($keys[$f],"",file_get_contents($keyf));
$oo=fopen($keyf,"w");
fwrite($oo,$oostr);
fclose($oo);
}
}
return $flag;
}
function compare ($old,$new)
{
foreach ($new as $f=>$k) if ($new[$f]["build"]!=$old[$f]["build"]) $urls[]=$new[$f]["file"];
if (count($urls)!=0) return $urls; else return 0;
}
function generate ($urls, $new, $dir)
{
if ($urls)
{
$zz=0;
if (!file_exists("temp/keys")) check();
$zz=downloader($urls,$new["HOSTS"]["Other"]);
if ($zz) {check(); $zz=downloader($urls,$new["HOSTS"]["Other"]);}
if (!$zz)
{
$r=fopen("temp/update.ver","w+");
foreach ($new as $f=>$k)
{
if ($f=="HOSTS") continue;
fwrite($r,"[".$f."]\r\n");
foreach ($k as $ff=>$kk)
{
if ($ff=="file") $kk=basename($kk);
fwrite($r, $ff."=".$kk."\r\n");
}
}
fclose($r);
exec("cd temp&&mv -f *.nup update.ver ../".$dir);
}
return $zz;
}
return 0;
}
//Версия 2
exec ("/opt/bin/wget -q -Otemp/update2.rar \"".$server."/".$v2."/update.ver\"&&cd temp&&unrar e -o+ -inul update2.rar&&mv -f update.ver update2new.ver");
$M2new = parce (file_get_contents("temp/update2new.ver"));
generate(compare (parce (@file_get_contents($v2."/update.ver")), $M2new), $M2new, $v2);
//Версия 3
exec ("/opt/bin/wget -q -Otemp/update3.rar \"".$server."/".$v3."/update.ver\"&&cd temp&&unrar e -o+ -inul update3.rar&&mv -f update.ver update3new.ver");
$M3new = parce (file_get_contents("temp/update3new.ver"));
generate(compare (parce (@file_get_contents($v3."/update.ver")), $M3new), $M3new, $v3);
?>
Логику работы взял из NОD32viеw.