ScorpioSar
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Обновил версию, теперь выводится список обновлений с описаниями PS Скрипт для WSUS 3 и базы SUSDB на Windows Internal, но легко перенастраивается под другие варианты. Тем кто предпочитает ASP (а не PHP) думаю не составит особого труда переписать сей скрипт на ASP. index.php Код: <? include_once("inc/func.php"); // Настраиваемые параметры подключения $wsusdir = "D:/WSUS/WsusContent/"; $wsusurl = "http://wsus:8530/Content/"; $connectionInfo = array("Database"=>"SUSDB"); $server = '\\\\.\\pipe\\mssql$microsoft##ssee\\sql\\query'; $find=""; $file=""; $ord=""; $act=""; $field="FileName"; $lang="1049"; $FIELDS = array("FileName"=>"Имя файла","Title"=>"Название","Description"=>"Описание"); $LANGS = array("1033"=>"английской","1049"=>"русской"); // Подключение к серверу $conn = sqlsrv_connect($server, $connectionInfo); if($conn === false) { echo "Ошибка подключения к SUSDB!</br>"; echo "<pre>"; die(print_r(sqlsrv_errors(),true)); echo "</pre>\n"; exit; } if(isset($_POST['field'])) $field = norm($_POST['field']); if(isset($_POST['find'])) $find = norm($_POST['find']); elseif(isset($_GET['find'])) $find = base64_decode(norm($_GET['find'])); if(isset($_POST['lang'])) $lang = norm($_POST['lang']); if(isset($_GET['file'])) $file = norm($_GET['file']); if(isset($_GET['act'])) $act = norm($_GET['act']); if(isset($_GET['ord'])) $ord = norm($_GET['ord']); if(strlen($file)>4) { $sql = "SELECT TOP 100 sys.fn_varbintohexstr(F.FileDigest) AS Digest "; $sql.= "FROM tbFile F, tbFileOnServer S "; $sql.= "WHERE F.FileDigest=S.FileDigest AND ActualState<>1 AND IsEula=0 AND FileName='".$file."'"; $res = sqlsrv_query($conn, $sql); if(sqlsrv_fetch($res)) { $hash = strtoupper(substr(sqlsrv_get_field($res,0,SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_CHAR)),2)); $farr = explode(".",$file); $fext = $farr[count($farr)-1]; $source = $wsusdir.substr($hash,-2)."/".$hash.".".$fext; if(file_exists($source)) DownloadFile($source, $file); } exit; } ?> <html> <head> <meta http-equiv="Content-Type" CONTENT="text/html; charset=Windows-1251"> <meta http-equiv="pragma" content="nocache"> <title>Windows Server Update Services</title> </head> <body> <? // Информация о сервере $server_info = sqlsrv_server_info($conn); if($server_info) { echo "<pre>"; print_r($server_info); echo "</pre>\n"; } if($act=="") { // Сейчас закачиваются в общем $sql = "SELECT COUNT(1), SUM(BytesDownloaded), SUM(TotalBytesForDownload) FROM tbFileDownloadProgress "; $sql.= "WHERE BytesDownloaded <> TotalBytesForDownload"; $res = sqlsrv_query($conn, $sql); if(sqlsrv_fetch($res)) { $cnt = sqlsrv_get_field($res,0)+0; $downed = sqlsrv_get_field($res,1)+0; $full = sqlsrv_get_field($res,2)+0; $remain = $full - $downed; if($cnt>0) { echo "<p><a href='?act=downed'>Сейчас закачивается $cnt обновлений,"; echo " скачано ".showsize($downed)." из ".showsize($full).", осталось ".showsize($remain).".</a></p>"; }} } // Список в закачке if($act=="downed") { $sql = "SELECT FileName, Modified, BytesDownloaded, TotalBytesForDownload "; $sql.= "FROM tbFileDownloadProgress INNER JOIN "; $sql.= " tbFileOnServer ON tbFileDownloadProgress.RowID = tbFileOnServer.RowID INNER JOIN "; $sql.= " tbFile ON tbFileOnServer.FileDigest = tbFile.FileDigest "; $sql.= "WHERE BytesDownloaded <> TotalBytesForDownload "; $sql.= "ORDER BY BytesDownloaded DESC, TotalBytesForDownload DESC"; $res = sqlsrv_query($conn, $sql); $down = false; $summ=0; while(sqlsrv_fetch($res)) { if(!$down) { $down = true; echo "<table cellpadding='3' cellspacing='0' border='1'>\n"; echo "<tr><th>Имя файла</th><th>Дата</th><th>Скачано</th><th>Осталось</th><th>Всего</th></tr>\n"; } $fname = sqlsrv_get_field($res,0).""; $fdate = substr(sqlsrv_get_field($res,1,SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_CHAR)),0,10); $downed = sqlsrv_get_field($res,2)+0; $fsize = sqlsrv_get_field($res,3)+0; $summ = $summ + $fsize - $downed; echo "<tr><td nowrap>".$fname."</td><td>".$fdate."</td>"; echo "<td align='right'>".showsize($downed)."</td>"; echo "<td align='right'>".showsize($fsize-$downed)."</td>"; echo "<td align='right'>".showsize($fsize)."</td></tr>\n"; } if($down) { echo "</table>\n"; echo "<p><b>Всего осталось скачать: ".showsize($summ)."</b></p>"; }} ?> <form name="frmfind" action="index.php" method="post"> <p><b><? ComboBox("field",$FIELDS,$field,true); ?> содержит <input type="text" name="find" value="<?= $find ?>" size="25" maxlength="50"> для <? ComboBox("lang",$LANGS,$lang,true); ?> версии <input type="submit" value="Искать"></b><br> <font size="2">Можно указать несколько ключевых слов через пробел, например: <b>XP x86</b><br> Для того чтобы скачать нужный файл - кликните мышью по его имени в таблице.</font></p> </form> <? if($act=="") { ?> <script language="javascript"> document.all("find").focus(); document.all("find").select(); </script> <? } // Поиск обновлений по шаблону (описание в таблице tbPreComputedLocalizedProperty) if(strlen($find)>1) { $find = ereg_replace(" +"," ",$find); $arr = explode(" ",$find); $cnt = count($arr); $table = " FROM tbFile F, tbFileOnServer S, tbFileForRevision FR, tbRevision R, tbBundleDependency B, tbRevision BR, tbUpdate U, tbPreComputedLocalizedProperty L, tbRevisionLanguage RL WHERE F.FileDigest = S.FileDigest AND S.ActualState<>1 AND F.FileDigest = FR.FileDigest AND IsEula=0 AND R.RevisionID = FR.RevisionID AND R.IsLatestRevision = 1 AND B.BundledRevisionID = FR.RevisionID AND BR.RevisionID = B.RevisionID AND U.LocalUpdateID = BR.LocalUpdateID AND L.UpdateID = U.UpdateID AND L.ShortLanguage = 'ru' AND RL.RevisionID = R.RevisionID AND RL.LanguageID IN(0,$lang) AND RL.Expanded = 0 AND $field LIKE '%".$arr[0]."%'"; if($cnt>0) { for($i=1;$i<$cnt;$i++) { $table.= " AND $field LIKE '%".$arr[$i]."%'"; }} $sql = "SELECT COUNT(1), SUM(F.Size)".$table; $res = sqlsrv_query($conn, $sql); if(sqlsrv_fetch($res)) { $updates = sqlsrv_get_field($res,0)+0; $fullsize = sqlsrv_get_field($res,1)+0; } $sql = "SET DATEFORMAT ymd; SELECT TOP 100 sys.fn_varbintohexstr(F.FileDigest) AS Digest, FileName, Modified, Size, L.Title, L.Description"; $sql.= $table; if($ord!="") $sql.= " ORDER BY ".$ord; $res = sqlsrv_query($conn, $sql); $find64 = base64_encode($find); if($updates>100) echo "<b>Показано 1-100 из ".$updates." обновлений (всего ".showsize($fullsize).")</b>\n"; else echo "<b>Найдено ".$updates." обновлений (".showsize($fullsize).")</b>\n"; echo "<table cellpadding='3' cellspacing='0' border='1'>\n"; echo "<tr bgcolor='#CCCCCC'><th><a href='?find=$find64&ord=FileName%20asc'>Описание обновления</a></th>"; echo "<th><a href='?find=$find64&ord=Modified%20desc'>Дата</a></th>"; echo "</tr>\n"; while(sqlsrv_fetch($res)) { $hash = strtoupper(substr(sqlsrv_get_field($res,0,SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_CHAR)),2)); $fname = sqlsrv_get_field($res,1).""; $fdate = substr(sqlsrv_get_field($res,2,SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_CHAR)),0,10); $fsize = sqlsrv_get_field($res,3)+0; $title = sqlsrv_get_field($res,4).""; $desc = sqlsrv_get_field($res,5).""; $farr = explode(".",$fname); $fext = $farr[count($farr)-1]; $source = $wsusdir.substr($hash,-2)."/".$hash.".".$fext; $url = $wsusurl.substr($hash,-2)."/".$hash.".".$fext; if(file_exists($source)) { echo "<tr><td><font size='2'><b>$title</b><br>$desc<br><i>Скачать:</i> "; echo "<a href='?file=$fname'>$fname</a> (".showsize($fsize)."), "; echo "<i>в WsusContent:</i> <a href='$url'>".basename($source)."</a></font></td>"; echo "<td>".$fdate."</td>"; echo "</tr>\n"; }} echo "</table>\n"; sqlsrv_free_stmt($res); } sqlsrv_close($conn); ?> </body> </html> | func.php Код: <? function norm($value) { if(get_magic_quotes_gpc()) $value = stripslashes($value); $value = ereg_replace("<","<",$value); $value = ereg_replace(">",">",$value); $value = trim(strip_tags($value)); return $value; } function showsize($size) { if(empty($size)) { $size=0; } if(is_numeric($size)) { $bytes = $size; } else { list($bytes,$def) = explode(" ",$size); } if(!is_numeric($bytes)) { $bytes = 0; } if($bytes<pow(2,10)) { $val = $bytes; $pow = "Б"; } elseif($bytes<pow(2,20)) { $val = $bytes/pow(2,10); $pow = "КБ";} elseif($bytes<pow(2,30)) { $val = $bytes/pow(2,20); $pow = "МБ"; } elseif($bytes<pow(2,40)) { $val = $bytes/pow(2,30); $pow = "ГБ"; } else { $val = $bytes/pow(2,40); $pow = "ТБ"; } if($val>=10) { $val = Round($val); } else { $val = Round($val*10)/10; } return ($val." ".$pow); } function name_encode($val) { $agent = $_SERVER['HTTP_USER_AGENT']; if(strpos($agent,"Opera")!==false) $val = iconv("CP1251","UTF-8",$val); if(strpos($agent,"MSIE")!==false) $val = ereg_replace(" ","%20",$val); return $val; } function ComboBox($name,$arr,$cur,$submit=false) { echo "<select name='$name'"; if($submit) echo " onchange='this.form.submit()'"; echo ">\n"; reset($arr); while(list($key,$val) = each($arr)) { echo "<option value='".$key."'"; if($key==$cur) echo " selected"; echo ">".$val." </option>\n"; } echo "</select>"; return true; } function DownloadFile($filename,$realname) { if(!file_exists($filename)) return false; $from=$to=0; $cr=NULL; $mimetype = 'application/octet-stream'; // Диапазон для загрузки if(isset($_SERVER['HTTP_RANGE'])) { $range = substr($_SERVER['HTTP_RANGE'],strpos($_SERVER['HTTP_RANGE'],'=')+1); $from = strtok($range,'-'); $to = strtok('/'); if($to>0) $to++; if($to) $to-=$from; header('HTTP/1.1 206 Partial Content'); $cr = 'Content-Range: bytes '.$from.'-'.(($to)?($to.'/'.$to+1):filesize($filename)); } else header('HTTP/1.1 200 Ok'); $etag = md5($filename); $etag = substr($etag,0,8).'-'.substr($etag,8,7).'-'.substr($etag,15,8); header('ETag: "'.$etag.'"'); header('Accept-Ranges: bytes'); header('Content-Length: '.(filesize($filename)-$to+$from)); if($cr) header($cr); header('Connection: close'); header('Content-Type: '.$mimetype); header('Last-Modified: '.gmdate('r', filemtime($filename))); $f = fopen($filename,'r'); header('Content-Disposition: attachment; filename="'.name_encode($realname).'";'); if($from) fseek($f,$from,SEEK_SET); if(!isset($to) or empty($to)) { $size = filesize($filename)-$from; } else $size = $to; $downloaded=0; while(!feof($f) and !connection_status() and ($downloaded<$size)) { echo fread($f, 512000); $downloaded+=512000; flush(); } fclose($f); return true; } ?> |
| Всего записей: 3 | Зарегистр. 13-01-2007 | Отправлено: 13:13 23-01-2009 | Исправлено: ScorpioSar, 15:49 23-01-2009 |
|