В продолжение темы отображения подключенных
USB-носителей, сегодня мы дополним числовые идентификаторы устройств
человеческим описанием и посмотрим что получилось. Для этого воспользуемся
файлом эталонов, которые немного переделаем под свои нужды
Как уже
говорилось ранее, описание числовых идентификаторов конкретного вендора и
устройства приведено тут - http://www.linux-usb.org/usb.ids.
Выглядит,
конечно, читаемо, но в промышленных масштабах особо не попользуешь J Первое что приходит в голову – распарсить это дело и сложить в удобную
для дальнейшего использования структуру. Так и поступим, но сначала скопируем
содержимое страницы в файлик (например, в 'C:\Temp\usb.txt'). Нас будет
интересовать всё содержимое до следующей строки:
# List of known device classes, subclasses and protocols
Таким
образом, последний вендор и устройство будет:
ffee FNK Tech
0100 Card Reader Controller RTS5101/RTS5111/RTS5116
Как вы,
наверное, успели заметить, в файлике есть описание структуры:
# Syntax:
# vendor vendor_name
# device device_name <-- single tab
# interface interface_name <-- two tabs
Т.е.:
Без табуляции – вендор.
Один таб – устройство.
Два таба – интерфейс.
Сделаю одно
допущение, меня не будут интересовать идентификаторы вендоров, для которых не зарегистрирован
хотя бы один девайс. Скрипт, представленный ниже, разбирает текстовый файл
эталонов и получает csv-файлик следующей структуры:
“Код
вендора”, “Название вендора”, “Код устройства”, “Название устройства”
$Device_fin = 'C:\Temp\Device.csv'
$usbids = Get-Content('C:\Temp\usb.txt')
'"USBVendorId","USBVendorName","USBDeviceId","USBDeviceName"' | out-file -Append -Filepath $Device_fin -encoding
"UTF8"
foreach ($usb in $usbids) {
switch(($usb -match "\t") -and
($usb -notmatch
"#")) {
'True' {
$vendor
= $vendor
-split " "
$usb
= $usb
-replace("\t"
,""
) -replace( " " ,
'","')
$to_export
= '"{0}","{1}","{2}"'
-f $vendor[0], $vendor[1], $usb | out-file -Append -Filepath $Device_fin -encoding
"UTF8"
}
'False' {
if
(($usb.remove(4) -notmatch "\s") -and
($usb -notmatch
"BIAS")) {
$vendor = $usb
}
}
}
}
Результирующий
файлик будет тут - C:\Temp\Device.csv.
Теперь
настало время связать между собой список подключенных usb-устройств и
полученный файл-описание. Для связывания будем использовать Splunk, куда же
без него :)
Первое,
необходимо поместить файл-описание на Splunk-сервер в директорию /opt/splunk/var/run/splunk.
Почему именно туда? Для получения данных из файла мы будем использовать
оператор inputcsv, который позволяет подключить в запрос файлы из этой директории.
Для
проверки работоспособности вбейте в строку поиска следующее:
| inputcsv
Device.csv
Результат
должен получиться как на скрине ниже.
Второе,
необходимо связать между собой 2 запроса, базовый запрос получает данные из sourcetype=USB, а
уточняющий запрос из файла-описания дополняет полями конечный результат.
Естественно, необходимо указать поле, по которому будет осуществлена связь (примерно
как в SQL).
Для связи
будем использовать 2 поля – USBVendor (код вендора) и USBProduct (код продукта).
Текст
общего запроса ниже:
sourcetype=usb Hostname=Host
| join type=inner USBVendor USBProduct [|
inputcsv Device.csv
| eval USBVendor = upper(USBVendorId) |
eval USBProduct = upper(USBDeviceId)
| table USBVendor,USBVendorName,USBProduct,USBDeviceName]
| table
CollectTime, Hostname, USBVendor, USBProduct, USBVendorName, USBDeviceName
| dedup USBVendorName
Для
связывания воспользуемся оператором join, который по
возможностям почти аналогичен SQL-оператору join, и для
подключения второго запроса необходимо указать:
1) Тип связывания
– inner или left.
2) Поля для
связи запросов. Важно чтобы эти поля были в обоих sourcetype,
если поля называются немного иначе, то можно с помощью eval переименовать их.
3) Запрос
получающий данные из другого источника. Всегда указывается в квадратных скобках
и может начинаться или с pipe или с оператора search. В конце дополняющего запроса всегда
должен быть оператор table или stats, с перечислением полей, которые мы выносим в основной запрос.
Если всё
прошло успешно, в splunk вы увидите:
На этом пока всё J
Комментариев нет:
Отправить комментарий