ИВАН КОРОБКО
Управление файловыми серверами
В данной статье будет рассмотрен круг вопросов, связанный с управлением файловыми серверами в сетях Windows 2000. На всех серверах – контроллерах домена, файловых, почтовых серверах и прочих операционной системой является Microsoft Windows 2000. В любой крупной сети, построенной на основе домена Windows, существует один или несколько файловых серверов, предназначенных для хранения дистрибутивов различного программного обеспечения, технической документации, драйверов, архивов, аудио-, видео-записей, других ресурсов.
Размер массива одного файлового сервера, собранного из жестких дисков, может достигать от нескольких сотен гигабайт до нескольких терабайт. Количество файловых серверов может варьироваться в зависимости от потребностей.
Поддержка серверов является трудоемкой задачей, требующей пристального внимания системного администратора, поскольку осуществляется постоянное обновление ресурсов.
Эта статья посвящена автоматизации администрирования файловых серверов с помощью стандартных средств Microsoft Windows. Решением поставленной задачи является инструмент, созданный на основе VBScript, позволяющий абстрагироваться от файловой системы и автоматизировать администрирование файловых серверов.
Выбор варианта
Создание сервера является нетривиальной задачей, состоящей из нескольких основных этапов.
Первым этапом во время планирования сервера является определение списка услуг, которые будут предоставлены, и количество одновременно обслуживаемых пользователей, максимальное количество которых будет варьироваться в зависимости от типа ресурсов, хранимых на сервере. Например, нагрузка на файловый сервер, на котором хранится коллекция фильмов, и на файловый сервер, на котором хранятся дистрибутивы программ, различна. Исходя из нагрузки на сервер будут определены его аппаратные характеристики. Вторым фактором, влияющим на аппаратные характеристики сервера, является язык программирования, на основе которого создан инструмент. В качестве такового выбран VBScript по следующим критериям:
- Язык программирования VBScript входит в поставку Microsoft Windows, поэтому перенос инструмента с одного Windows-сервера на другой не представляет труда.
- Синтаксис языка достаточно прост.
- VBScript является объектно-базированным языком и имеет встроенную поддержку объектов.
Одним из недостатков VBScript является низкая скорость работы сценария, поскольку VBScript является интерпретируемым языком.
Увеличить его скорость работы можно за счет наращивания аппаратных ресурсов, поскольку язык требователен к этому фактору.
Вторым этапом создания файлового сервера является планирование файловой структуры сервера, необходимо дать ответы на следующие вопросы:
- По каким критериям должна осуществляться сортировка программного обеспечения: по названию продукта, по названию фирмы-производителя приложения (Microsoft, Adobe, Symantec и др), по назначению приложения (папка, содержащая архиваторы, такие как Zip, Rar, называется Arc; программы для тестирования аппаратных средств – SysInfo и т. д.) или предпочесть смешанный вариант. Каждый системный администратор решает самостоятельно, какой из вариантов сортировки ресурсов ему удобнее использовать.
- Как осуществлять сортировку ресурсов по языковому признаку (имеется в виду язык интерфейса)?
- Какое место в файловой структуре займет раздел драйверов, документации и т. д.
- По какому принципу будет осуществляться сортировка драйверов – по названию фирмы-производителя (HP, Canon, Intel, Asus, Maxtor) или по назначению устройств (Video, Audio, Chipset, Printer)?
- Как будут учитываться версия операционной системы, для которой создан драйвер устройства?
Создавая файловый сервер, системный администратор должен дать ответ на огромное количество вопросов. Приведенные вопросы – лишь малая их часть. Создание файловой структуры (иерархии директорий, подчиняющихся некоторому принципу) на файловом сервере является сложной задачей даже для опытного системного администратора. Род деятельности фирмы вносит свои коррективы в окончательный вид структуры. Исправление ошибок, допущенных при ее создании, по прикладываемым усилиям эквивалентно созданию новой файловой структуры.
Предлагаемый инструмент позволяет полностью абстрагироваться от файловой структуры, однако это не значит, что она может быть хаотичной.
Поскольку объем файлового сервера огромен, то обработка структуры каталогов при загрузке страницы занимает много времени, поэтому загрузка html-страницы будет длиться десятки минут. Для увеличения скорости работы приложения его разделяют на 2 части.
Первая часть представляет собой сценарий на VBScript, который создает промежуточный файл с данными – кэш-файл. Сценарий запускается планировщиком задач через определенные промежутки времени. В том случае если размер файлового сервера велик, то нагрузку по созданию кэш-файла можно распределить между несколькими серверами.
Вторая часть представляет собой сайт (см. рис. 1а, 1б), созданный на основе ASP-страниц (для функционирования ASP-страниц требуется установка Internet Information Server (IIS). IIS является приложением, входящим в комплект поставки Microsoft Windows). С помощью ASP осуществляется отображение информации, поиск по различным критериям.
Рисунок 1а
Рисунок 1б
VBScript: работа с массивами
При создании данного комплекса активно использовались массивы. О некоторых особенностях работы с массивами необходимо рассказать отдельно, чтобы впоследствии не отвлекаться на подобные разъяснения.
Немного теории: массивы бывают одномерные и многомерные. Могут быть статическими и динамическими. Для статического массива память выделяется один раз в полном объеме, а динамический растет или уменьшается в зависимости от надобности и записанных в него данных.
Объявление массивов
Рассмотрим общий случай – многомерный массив. Массивы объявляются с помощью оператора Dim. После имени многомерного массива в круглых скобках через запятую указывают границы каждого измерения массива.
Особенности объявления массивов:
- индексация элементов массивов начинается с нуля;
- в многомерном массиве может быть до 60 измерений;
- динамические одномерные и многомерные массивы объявляются одинаково.
Приведем пример объявления многомерного и одномерного массивов. Одномерный массив является частным случаем многомерного (см. таблицу 1).
Таблица 1
|
Одномерный массив
|
Многомерный массив
|
Статический
|
Dim Array(9)
|
Dim Array(9,19,5)
|
Динамический
|
Dim Array()
|
Dim Array()
|
Переопределение размеров массива
Размер массива может быть переопределен только в том случае, если он является динамическим. Эта процедура осуществляется с помощью команды ReDim, имеющей следующий синтаксис:
ReDim [Preserve] array_name(subscripts) [, varname(subscripts)] ...
- Preserve – переопределяет размер, сохраняя существующие данные в массиве, если параметр не указан, то все ячейки массива обнуляются;
- Array_name – название массива;
- Subscripts – количество элементов в массиве.
При изменении размера многомерного массива корректировке поддается только размер последнего измерения.
Определение границ массива
Определение размера выделенной памяти для массива осуществляется с помощью команд lbound(array_name) и ubound(array_name), где array_name – название массива, границы которого необходимо определить. С помощью команды lbound определяется нижняя граница массива, с помощью ubound – верхняя граница.
Данный прием часто используется для чтения всех элементов динамического массива:
Пример1:
For i=Lbound(Array_) to Ubound(Array_)
Msgbox Array_(i)
Next
Упорядочивание элементов массивов
Наиболее простым, хотя и неэффективным, методом упорядочивания массивов является пузырьковый метод. Суть метода заключается в том, что при несоблюдении условия упорядочивания массива смежные элементы меняются местами. Затем происходит переход к следующему элементу. В результате элементы массива становятся друг за другом в заданном порядке – происходит упорядочивание. В том случае, если читатель хочет использовать более производительный метод упорядочивания массивов, то ему необходимо переписать часть кода, касающегося сортировки массива.
Пример 2:
Dim Array(100)
……………………
For j=0 to 100
For i=0 to 100
If StrComp(Array_sort(i),Array_sort(i+1),0)=1 Then
temp=Array(i)
Array (i)=Array(i+1)
Array(i+1)=temp
End if
Next
Next
Первая часть: создание кэш-файла
Создание кэш-файла осуществляется с помощью сценария, написанного на VBScript, который запускается через заданные промежутки времени стандартным планировщиком задач Microsoft Windows. По ходу выполнения сценария осуществляется чтение структуры подкаталогов в указанном родительском каталоге. Анализируется содержимое подкаталогов. Если в подкаталоге обнаружена метка – файл !meta.txt, – путь к этой папке записывается в массив.
Файл !meta.txt является идентификационно-параметрическим. Для удобства файл будем называть файлом параметров, или параметрическим. Он содержит в себе три параметра, по одному в каждой строке.
Первая строка включает в себя информацию о названии раздела, в котором будет размещена ссылка на дистрибутив данного приложения. Названием раздела может быть либо название фирмы-производителя продукта, либо жанр, к которому относится приложение. Вторая строка содержит название продукта. Третья – его описание.
Создаваемый кэш-файл представляет собой текстовый файл. Каждая строка файла включает в себя четыре параметра, содержащие название фирмы производителя, путь к каталогу, название приложения и его версию, комментарий. Параметры отделены символом-разделителем, который описывается в конфигурационном файле.
VBScript-сценарий состоит из нескольких частей:
- чтение исходных параметров из конфигурационного файла;
- чтение структуры подкаталогов;
- обработка считанной структуры подкаталогов;
- формирование кэш-файла.
Чтение исходных параметров из конфигурационного файла
Все исходные параметры для скрипта содержатся в отдельном конфигурационном файле, например, cache.ini. Он представляет собой текстовый файл и содержит следующие параметры:
- Имя и путь создаваемого кэш-файла, например, cache.dat.
- Путь к корневому каталогу, структура подкаталогов которого подлежит обработке, например serversoftware.
- Определение флага, по которому определяется необходимая парапка. Флагом является имя параметрического файла, например, meta.txt.
- Метка предназначеная для разделения параметров при формировании кэш-файла.
Рассмотрим структуры файла cache.ini. Файл содержит следующие поля и соответствующие им характеристики:
Таблица 2
Параметр
|
Описание
|
Пример
|
Symbol
|
Метка-разделитель
|
Symbol=;
|
Path_To_Root
|
Путь к корневому каталогу
|
Path_To_Root=serversoftware
|
Label_FileName
|
Путь к параметрическому файлу
|
Label_FileName=!meta.txt
|
Cache_FileName
|
Путь к создаваемому кэш-файлу
|
Cache_FileNAme= Cache.Dat
|
Чтение данных из параметрического файла осуществляется с помощью Windows Scripting Host (WSH), поддерживаемого VBScript.
Данные считываются в массив, элементами которого являются строки, содержащиеся в файле, по следующему шаблону:
Пример 3:
Text=""
i=0
Dim Array()
FileName="cache.ini"
If fso.FileExists(filename) Then
Set Fline = fso.OpenTextFile(FileName)
Do While Not (Fline.atEndOfStream)
redim preserve array(i)
Array(i)= Fline.ReadLine
i=i+1
Loop
Else
Text="File Not Found"
End If
For i=lbound(array) to ubound(array)
Text=Text+cstr(array(i))+vbCrLf ‘ vbCrLf=chr(13)+chr(10)=ENTER
Next
MsgBox Text
После того как сформирован массив, содержащий строки параметрического файла, осуществляется анализ его элементов и распознавание значений параметров по следующему алгоритму:
- Чтение элементов массива.
- Поиск в строке символа «=» с помощью функции instr().
- Сравнение строк до знака равенства с названиями параметров, перечисленных в таблице 1.
- В случае совпадения названия параметра и части строки до знака равенства осуществляется чтение строки за знаком равенства и присвоение прочитанных значений параметрам.
В программном коде реализация описанного алгоритма выглядит следующим образом:
Пример 4:
For i=lbound(array) to ubound(array)
len1=instr(cstr(array(i)),"=")
msgbox "len1: "&len1
if len(cstr(array(i)))<>0 then
value=left(cstr(array(i)), len1-1)
msgbox "value: "& value
Select Case value
Case "Symbol" path1=right(cstr(array(i)), len(cstr(array(i)))-len1)
Case "Path_To_Root" path2=right(cstr(array(i)), len(cstr(array(i)))-len1)
Case "Label_FileName" path3=right(cstr(array(i)), len(cstr(array(i)))-len1)
Case "Cache_FileName" path4=right(cstr(array(i)), len(cstr(array(i)))-len1)
End Select
End if
Next
MsgBox path1+chr(13)+ path2+chr(13)+ path3+chr(13)+ path4+chr(13)
Чтение структуры подкаталогов
Чтение структуры подкаталогов осуществляется с помощью объекта Scrpting.FileSystemObject WSH, который создается функцией CreateObject. После создания объекта необходимо получить доступ к подкаталогу, элементы которого (файлы и каталоги) должны быть обработаны. Последовательно перебирая все элементы массива, осуществляется считывание имен папок.
Пример 5:
Path=”C:RootFolder”
Temp=””
Set oFolder=fso.GetFolder(path)
Set oFolders=oFolder.SubFolders
For Each oF In oFolders
Temp=Temp+cstr(oF.Path)+chr(13)+chr(10)
Next
MsgBox Temp
Как уже говорилось, данный фрагмент считывает все подкаталоги в заданном каталоге. Для чтения всей структуры подкаталогов необходимо этот механизм поместить в функцию, а ее сделать рекурсивной. Функция будет иметь два параметра – путь к абсолютному подкаталогу (PATH) и уровень вложенности подкаталогов (IDX).
Данные, содержащие абсолютные пути к подкаталогам, разумно записывать в динамический одномерный массив. Приведем пример создания и заполнения элементов динамического массива на примере чтения структуры подкаталогов (основа – предыдущий пример), затем шаблон рекурсивной функции. Листинг рекурсивной функции см. в приложении, листинг файла service.vbs.
Пример 6:
Path=”C:RootFolder”
i=0
Dim Array() "Объявление динамического массива
Set oFolder=fso.GetFolder(path)
Set oFolders=oFolder.SubFolders
" Изменение размера динамического массива
Redim Preserve Array(oFolders.count)
For Each of In oFolders
Array(i)=cstr(oF.Path) " Запись элементов в массив
i=i+1
Next
"Чтение элементов массива
Temp=””
For i=Lbound(Array) to Ubound(Array)
Temp=Temp+cstr(Array(i))+chr(13)+chr(10)
Next
MsgBox Temp
Пример 7: Шаблон рекурсивной функции
………..
" Вызов функции RecFolder в теле сценария
RecFolder index, path
………..
Function Recfolder (idx, path)
………..
………..
………..
Call Recfolder (idx+1, path)
………..
End Function
Обработка структуры подкаталогов
После завершения процесса считывания подкаталогов в многомерный массив осуществляется упорядочивание элементов массива по первому полю (по названию фирмы). Впоследствии, во второй части инструмента, созданной на основе ASP, осуществляется упорядочивание названий продуктов каждой фирмы. Таким образом, список будет упорядочен и по разделам, и по названиям продуктов в каждом из разделов.
Пример упорядочивания одномерного массива – см. пример 2; многомерных массивов см. в приложении, листинги файлов service.vbs и soft.asp.
Формирование кэш-файла
После завершения процесса сортировки многомерного массива по названию фирмы-производителя продукта осуществляется запись данных в кэш-файл, который представляет собой текстовый файл.
Параметры в файле разделены спецсимволом, в качестве которого рекомендуется один из символов таблицы ASCII-II (см. рис. 2),выбор которого обусловлен тем, что ни один из них не может быть использован в описании параметров файла !meta.txt.
Рисунок 2
Запись в файл ведется построчно: каждая строка файла содержит четыре параметра, разделенных спецсимволом. Параметры записываются в файл в следующем порядке: название фирмы-производителя продукта; путь к дистрибутиву приложения; название приложения; краткое описание приложения. Запись данных в текстовый файл осуществляется в соответствии со следующим шаблоном:
Пример 8:
text= “____________”
set MyFile = fso.CreateTextFile(strFileName, True, TRUE)
‘ В текстовый файл записывается значение переменной «text»
MyFile.WriteLine(text)
MyFile.Close
Пример файла cache.dat см. в приложении.
В случае необходимости нагрузка по считыванию и обработке структуры подкаталогов может быть распределена между несколькими серверами. На каждом сервере необходимо запустить самостоятельного агента, который будет генерировать кэш-файл с уникальным именем. Файлы, полученные от разных агентов, должны быть сохранены в одной папке на сервере.
Внедрение агента
Внедрение агента не представляет собой никакой сложности: в файле-скрипте указывается путь к конфигурационному файлу. На основе данных, прочитанных из этого файла, будут определены параметры формируемого кэш-файла и его местоположение.
Подключение к файловому серверу необходимо осуществлять с помощью сетевого диска, например, диска S (см. приложение файл cache.ini). Подключение к сетевому диску в данном примере осуществляется при помощи команды:
net use s: serversoftware
Для обеспечения регулярного обновления кэш-файла можно использовать команду AT или стандартный планировщик задач. Синтаксис команды в данном случае будет следующим:
AT Server 20:00 /interactive /every:M,T,W,Th,F,S,Su C:InetPubSoftDataService.vbs
Данная команда запускает сценарий Service.vbs каждый день в 8 часов вечера на сервере под именем «Server».
Обработка кэш-файла
Файловая структура проекта на основе ASP
Инструмент представляет сайт, точкой входа в который является страница на языке HTML. Сайт создан на основе окон (Frame): файл default.htm делит окно браузера на два столбца.
Пример 9: Листинг файла default.htm
<html>
<head>
<title>Программное обеспечение </title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<FONT FACE="Arial" size="3"></FONT>
</head>
<!-- Левый столбец составляет 20% от ширины всего окна.
Левое окно имеет идентификатор «SortSearch», второе «Product». -->
<frameset cols="25%,*" FRAMEBORDER="5" BORDER="yes" FRAMESPACING="5" >
<frame src="sortsearch.asp" name="sortsearch" scrolling="yes" МАRGINHEIGHT=1 >
<frame src="soft.asp?Search_Text=&radGrp=1" name="product">
</frameset>
</html>
В разделе описываются таблицы стилей; исходная кодировка документа; способ взаимодействия страниц, основанный на передаче форм; поиск по заданным критериям.
Таблица стилей и выбор исходной кодировки документа
Обе ASP-страницы используют таблицу стилей. Текстовая информация изначально выводится в кодировке WIN-1251. Стили описываются в подключаемом файле style.css (см. приложение).
Файл стилей описывается в разделе , необходимая кодировка – в разделе (HTML):
Пример 10:
<HEAD>
<LINK HREF="style.css" TYPE=text/css REL=stylesheet>
<META HTTP-EQUIV ="Content-Type" CONTENT="text/html; CHARSET=windows-1251">
</HEAD>
Значение параметра CHARSET определяет исходную кодировку документа. Клиент, загрузив страницу, может конвертировать ее для наилучшего отображения в любую другую удобную для него кодировку.
Остальные страницы, отображающиеся в 2 фреймах, см. рис. 1, взаимосвязаны друг с другом и являются рекурсивными. Обе страницы создаются с помощью скриптов ASP.
Взаимодействие страниц
Взаимодействие страниц основано на передаче данных, которая осуществляется с помощью двух методов: прямого и косвенного.
Прямой метод: в исходной странице создается форма, содержащая поля для ввода информации, кнопку для отправки информации:
Пример 11:
<FORM ACTION="printer_adsi.asp" TARGET="main" METHOD="get">
<INPUT TYPE="submit" VALUE="Поиск"></INPUT>
<INPUT NAME="Search_Text"></INPUT>
</FORM>
В разделе FORM присутствуют следующие параметры: ACTION, TARGET, METHOD. В параметре ACTION указывается имя файла, который содержит сценарий. Сценарию будут передаваться данные после нажатия на кнопку.
Подразделом, который обязательно присутствует в разделе
<% <A HREF="http://имя_страница.asp(htm)?П1=З1&П2=З2&...Пn=Зn"
target=" & chr(34) &"var"& chr(34) & " > <IMG SRC =imagespr1.jpg BORDER=0> </A> %>
<FORM ACTION="printer_adsi.asp" TARGET="main" METHOD="get">
<INPUT TYPE="submit" VALUE="Поиск"></INPUT>
<INPUT NAME="Search_Text"></INPUT>
<BR>
<INPUT CHECKED TYPE="radio" VALUE="1" NAME="radGrp">Название
< INPUT TYPE="radio" VALUE="2" NAME="radGrp">Описание
< INPUT TYPE ="radio" VALUE="3" NAME="radGrp">Размещение
</FORM>
Вторая часть поисковой системы – «приемник» информации находится в ASP-файле.
Считывание значений параметров осуществляется следующим образом:
Пример 14:
set radio_=Request.QueryString("radGrp")
set search_= Request.QueryString("Search_Text")
после того как считаны параметры, указывающие, где искать (radio_) и что искать (Search_), выполняется процедура поиска:
Пример 15:
Select case radio_
Case "1"
If instr(ucase(cstr(array_(i,0))), ucase(search_)) then
T=T+cstr(array_data(i,0)))+…
End If
Case "2"
If instr(ucase(cstr(array_data(i,1))), ucase(search_)) then
T=T+cstr(array_data(i,0)))+…
End If
……
End Select
Отображение результатов: файл soft.asp
Файл soft.asp является по своей сути сердцем проекта. Все остальные файлы являются вспомогательными. Функция рождения страницы, содержащей всю необходимую информацию, возложена на сценарий, содержащийся в этом файле. Рассмотрим алгоритм работы данного сценария.
На первом этапе осуществляется чтение информации, переданной прямым методом из HTML-файла. Из конфигурационного файла soft.ini считываются параметры, определяющие символ «разделить» и местоположение кэш-файла. На этом подготовительный этап завершен.
В результате работы функции чтения кэш-файла временный массив заполняется прочитанными строками. В массив заносятся только те строки, в которых встречается символ «разделить». Это означает, что считанная строка записана в нужном формате.
Затем каждая строка временного массива делится на параметры, разграниченные спецсимволом. Полученные данные заносятся в многомерный массив.
Следующий шаг – сортировка многомерного массива. Сортировка осуществляется по следующему алгоритму. Данные читаются из кэш-файла в многомерный массив. Элементами первого измерения массива являются названия фирмы-производителя продукта. Эти данные уже отсортированы по алфавиту. Элементы второго измерения массива требуют сортировки. Ими являются названия приложений.
Весь html-код, получаемый в результате обработки массива, записывается в текстовую переменную.
Переменная формируется по следующему алгоритму: с помощью процедуры select case и полученного из другого файла параметра определяют поля массива, в которых следует осуществлять поиск. Затем выполняется процедура поиска и запись в переменную. Результат выводится на экран.
Внедрение визуальной части
В качестве месторасположения инструмента можно выбрать любой из серверов, на котором должен быть установлен IIS. При установке IIS будет создана стандартная папка C:InetPub, в которой предлагается сделать подпапку Soft. В ней расположить файлы – defalt.htm, style.css, softsearch.asp, soft.asp.
В следующей статье будет рассказано о том, как сделать мастер, позволяющий пополнять коллекцию программ и вносить изменения в метафайлы.