среда, 10 февраля 2016 г.

USB-носители. Часть 2.


В продолжение темы отображения подключенных 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



Комментариев нет:

Отправить комментарий