Ответы на вопросы
15.02.2017

Загрузка файла конфигурации устройства NetPing из командной строки

Загрузка файла конфигурации устройства NetPing из командной строки

В последних версиях встроенного ПО для устройств NetPing был внедрён функционал по сохранению и восстановлению конфигурации устройства из бинарного файла с целью облегчённого клонирования настроек у группы устройств в сети. По умолчанию данный функционал доступен на странице «НАСТРОЙКИ» web-интерфейса.

Сохранение, Восстановление и Клонирование настроек устройства NetPing

Более подробную информацию по использованию этого функционала через web-интерфейс можно прочитать в описании встроенного ПО: https://goo.gl/KvVnCf.

Недостатком клонирования настроек через web-интерфейс является отсутствие одновременного распространения файла конфигурации на группу устройств в сети. Чтобы обойти этот недостаток, следует воспользоваться скриптом, который будет запускаться, например, в командной строке для загрузки бинарного файла конфигурации.

Скрипт на PowerShell

Скрипт на PowerShell для загрузки файла конфигурации можно скачать по ссылке: Script_PowerShell.zip.

Код скрипта на PowerShell

param(
[Parameter(Mandatory=$True)]
[string]$List
)

Write-Host $Async

Function Error($errMessage, $errState)
{
Write-Host "[ERROR]" $errMessage $errState -ForegroundColor Red
}

Function Info($infoMessage, $infoState)
{
Write-Host '[INFO]' $infoMessage $infoState -ForegroundColor Green
}

Function CreateWebClient($Hostname, $Username, $Password)
{
$WebClient = New-Object System.Net.WebClient

$WebClient.BaseAddress = $Hostname
$WebClient.Credentials = New-Object System.Net.NetworkCredential($Username, $Password)

# Try to access
$TryDownload = $WebClient.DownloadString('/index.html')

Return $WebClient
}

Function CreateBinaryStream($FullPath) {
$Bytes = [System.IO.File]::ReadAllBytes($FullPath)
Return $Bytes
}

Function GetHardwareVersion($WebClient, $StringID)
{
$Result = $false

$DevnameString = $WebClient.DownloadString('/devname.cgi')
foreach ($line in $DevnameString -Split ';') {
if ($line -like $StringID) {
$RegexMatch = $line -match "'(v.*)'"
if (($RegexMatch -eq $true) -and ($matches.Count -gt 1)) {
$Result = $matches[1]
break;
}
}
}

Return $Result
}

Function GetBinaryVersion($BinaryStream)
{
$b = $BinaryStream[16..23]

$ByteString = (($b[0] -bor $b[1]), ($b[2] -bor $b[3]), ($b[4] -bor $b[5]))
$ProcString = ($ByteString -Join '.') + '.*-' + $b[7]

$ResultString = 'v' + $ProcString

Return $ResultString
}

Function UploadEEPROM($WebClient, $BinaryStream)
{
$curr = 0;
$iter = 1;
$step = 1024;

While (($curr + 24) -lt $BinaryStream.Length) {
$next = ($step * $iter) - 1

# Bytes transform
$HeaderBytes = @(0xFA, 0xDE, 0x00, 0x00, ($curr -band 0XFF), (($curr -shr 8) -band 0XFF), (($curr -shr 16) -band 0XFF), 0x00)
$BinaryPayload = $HeaderBytes + $BinaryStream[($curr + 24)..($next + 24)]

# Print progress
$p = [math]::Round(($curr/$BinaryStream.Length) * 100)
$t = [math]::Round(($BinaryStream.Length - 24) / 1024)
Write-Progress -Status "$p% Complete ($iter of $t)" -Activity "Uploading.." -PercentComplete $p

$Upload = $WebClient.UploadData('/eeprom_clone_set.cgi', $BinaryPayload)

$curr = $next + 1
$iter = $iter + 1

}
}

Function Processing ($Hostname, $Username, $Password, $BinaryFile) {

Info "Remote hardware URL:" $Hostname

# Normalize path
$FullPath = [IO.Path]::GetFullPath($BinaryFile)

# Check file exists
if (-not (Test-Path $FullPath)) {
return Error "Specified binary file not found:" $FullPath
}

# Create WebClient or fails if credentions are not valid
try {
$WebClient = CreateWebClient $Hostname $Username $Password
} catch [Net.WebException] {
return Error "[HTTP]" $_
}

Info "Remote hardware is online, auth success"

# Open binary file as byte array
$BinaryStream = CreateBinaryStream $FullPath

if (($BinaryStream[0..15] -Join '') -ne $BINARY_VERIFICATION_CODE) {
return Error "Specified binary file doesn't contains useful settings:" $FullPath
}

Info "Binary file is verified successful:" $FullPath

# Get binary file version
$BinaryVersion = GetBinaryVersion $BinaryStream
Info "Binary file version received:" $BinaryVersion

# Get remote hardware version
try {
$HardwareVersion = GetHardwareVersion $WebClient "*fwver*"
if ($HardwareVersion -eq $false) {
return Error "Failed to parse remote hardware version"
}
} catch [Net.WebException] {
return Error "[HTTP] Failed connection on remote hardware:" $_
}

Info "Remote hardware version received:" $HardwareVersion

# Compare both versions
if (-not ($HardwareVersion -like $BinaryVersion)) {
return Error "Remote hardware and binary file versions are not matching"
}

try {
UploadEEPROM $WebClient $BinaryStream
Info "Binary upload has finished successful"

# $Params = New-Object System.Collections.Specialized.NameValueCollection
# $Params.Add('reboot', '%21')

# $WebClient = CreateWebClient $Hostname $Username $Password
# $Upload = $WebClient.UploadValues('/reboot.cgi', $Params)

# Write-Host 'Rebooting remote hardware..'

# Info 'Upload complete'

} catch [Net.WebException] {
return Error '[HTTP] Failed to upload binaries:' $_.Exception.Message
}
}

$BINARY_VERIFICATION_CODE = '5471107106488311010949995710965995353'

$HostList = Import-Csv $List

ForEach ($item in $HostList) {
try {
Processing $item.Hostname $item.Username $item.Password $item.File
} catch [Exception] {
Write-Error $_
}
}

Запуск скрипта на PowerShell

По умолчанию выполнение сценариев PowerShell в системе запрещено, так как в скриптах может находится вредоносный код, который может нанести вред системе. На время загрузки конфигурации следует отключить проверку выполнения локальных скриптов. Для этого запустить консоль PowerShell от имени администратора и ввести команду:

Set-ExecutionPolicy RemoteSigned

Подробнее здесь: http://did5.ru/it/windows/powershell/powershell-vypolnenie-skriptov-zapreshheno-dlya-dannoj-sistemy.html

Для успешного запуска скрипта необходимо обновить PowerShell до версии 3.0 или выше: https://www.microsoft.com/en-us/download/details.aspx?id=50395.

Перед запуском скрипта необходимо в файле list.txt прописать IP адрес/DNS имя устройства NetPing, имя пользователя и пароль для авторизации, путь до бинарного файла конфигурации (по одной строке на устройство) в формате:

Hostname,Username,Password,File

Пример файла list.txt:

Загрузка файла конфигурации устройства NetPing из командной строки

После этого открыть консоль Windows PowerShell при помощи команды выполнить (сочетание клавиш Windows+R), ввести в строку «Открыть:» powershell и нажать кнопку «OK»:

PowerShell

В консоли PowerShell прописать команду:

%ПУТЬ_ДО_СКРИПТА%\eeprom-upload-lbs.ps1 -List %ПУТЬ_ДО_ФАЙЛА%\list.txt

Пример:

Загрузка файла конфигурации устройства NetPing из командной строки

В результате скрипт запустится и начнёт загрузку конфигурации на группу устройств NetPing в сети.

Ошибки, возникающие при выполнении скрипта на PowerShell

Скрипт выполняется успешно, когда в отчёте нет ни одной ошибки (красной строки):

Загрузка файла конфигурации устройства NetPing из командной строки

Ошибка «[ERROR] [HTTP] Невозможно соединиться с удалённым сервером» означает то, что скорее всего неправильно введён IP адрес/DNS имя устройства, либо устройство недоступно в сети по какой-то причине:

Загрузка файла конфигурации устройства NetPing из командной строки

Ошибка «[ERROR] [HTTP] Удалённый сервер возвратил ошибку: (401) Несанкционированный.» означает, что неправильно указаны имя пользователя или пароль для авторизации на устройство:

Загрузка файла конфигурации устройства NetPing из командной строки

Ошибка «[ERROR] Specified binary file not found: C:\temp1\conf\USSv3-SMS_setup_v70.6.6.A-1.bin» означает, что неправильно задан путь до бинарного файла конфигурации:

Загрузка файла конфигурации устройства NetPing из командной строки

Ошибка «Путь имеет недопустимую форму.» означает, что в файле list.txt не задан путь до бинарного файла конфигурации:

Загрузка файла конфигурации устройства NetPing из командной строки

Ошибка «[ERROR] Remote hardware and binary file versions are not matching» означает, что указанный файл конфигурации не подходит к версии прошивки, установленной на устройстве NetPing.

Перед загрузкой конфигурации в EEPROM автоматически проверяется идентичность версий «донора» и «акцептора» настроек. Если версия «донора» не подходит, загрузка не производится, выводится сообщение об ошибке.

Загрузка файла конфигурации устройства NetPing из командной строки

Скрипт на Python

Скрипт на Python для загрузки файла конфигурации можно скачать по ссылке: Script_Python.zip.

Код скрипта на Python

#!python
# -*- coding: cp1251 -*-

from sys import argv, stderr, exit
import struct # for packing-unpacing of binary headers
import urllib2 # HTTP client
import base64 # for Http Basic Auth
import re

with open(argv[1], mode='rb') as file: # b is mandatory! it's binary file!
data = file.read()

# parse file header with signature and version
hdr = struct.unpack_from("<16sHHHcB", data)
if hdr[0] != '6Gkj0Snm1c9mAc55':
stderr.write('\nWrong file content! It\'s not NetPing EEPROM image: ' + argv[1] + '\n\n')
exit(1)
ee_file_ver = 'v%u.%u.%u' % hdr[1:4] + '.*-%u' % hdr[5];

# skip file header, remainder is binary EEPROM image
data = data[24:]

if(argv[2]) == '-f':
# read and split targets list file
try:
with open(argv[3], mode='r') as file:
targets = file.read()
except:
stderr.write('\nWrong target list file!\n\n')
exit(2)
targets = targets.splitlines()
# filter out comments (; at line start)
targets = [k for k in targets if not k.startswith(';')]
else:
# make single-item list for single target from cmd-line args
if len(argv) < 5:
stderr.write('\nInsufficient arguments!\n\n')
exit(2)
targets = [' '.join(argv[2:5])]

def add_basic_authorization_header(req, uname, passwd):
b64pass = base64.encodestring(uname + ':' + passwd)
b64pass = b64pass.replace('\n', '') # strip CR at the end added by encodestring()
req.add_header('Authorization', 'Basic ' + b64pass)

# define procedure for EEPROM image upload
def upload(data, target):
try:
address, uname, passwd = target.split()
except:
return 'wrong target list string, must be \'address username password\''
# check compatibility of EEPROM image
http_req = urllib2.Request('http://' + address + '/devname.cgi')
add_basic_authorization_header(http_req, uname, passwd)
try:
devname_data = urllib2.urlopen(http_req).read()
except Exception, e:
return 'HTTP error: ' + str(e)
devname_data = re.sub(r'\.[A-Z]\-', '.*-', devname_data)
if "var fwver='" + ee_file_ver + "';" not in devname_data:
return 'EEPROM image is not appropriate'
# upload image with consecutive HTTP POST calls
offset = 0
while offset < len(data):
data_header = struct.pack("<II", 0xDEFA, offset)
data_block = data[offset : offset + 1024]
offset += 1024
http_req = urllib2.Request('http://' + address + '/eeprom_clone_set.cgi', data_header + data_block)
http_req.add_header('Content-Type', 'application/octet-stream')
add_basic_authorization_header(http_req, uname, passwd)
try:
urllib2.urlopen(http_req).read()
except Exception, e:
return 'HTTP Client error: ' + str(e) + '\n' +\
'Attention! Setup of host ' + address + ' has damaged! It must be manually initialized\n'+\
' to the default factory setup with Reset button!'
return 'success'

# process list of targets (or 1-item list made from program arguments in command line)
for t in targets:
address = t.split()[0]
stderr.write('Uploading to ' + address + '... ')
stderr.flush()
result = upload(data, t)
stderr.write(result + '\n')
exit(0)

Запуск скрипта на Python в ОС Windows

Перед запуском скрипта необходимо установить компонент Python 2.x с официального сайта.

После установки Python 2.x следует в файле targets.txt прописать IP адрес/DNS имя устройства NetPing, имя пользователя и пароль для авторизации (по одной строке на устройство) в формате:

; Description

Hostname Username Password

Пример файла targets.txt:

Загрузка файла конфигурации устройства NetPing из командной строки

После этого открыть командную строку при помощи команды выполнить (сочетание клавиш Windows+R), ввести в строку «Открыть:» cmd и нажать кнопку «OK»:

cmd

В командной строке Windows прописать команду:

python %ПУТЬ_ДО_СКРИПТА%\ee-upload.py %ПУТЬ_ДО_ФАЙЛА_КОНФИГУРАЦИИ%\file.bin -f %ПУТЬ_ДО_ФАЙЛА%\targets.txt

Пример:

Загрузка файла конфигурации устройства NetPing из командной строки

В результате скрипт запустится и начнёт загрузку конфигурации на группу устройств NetPing в сети.

Запуск скрипта на Python в ОС CentOS 6.5

Скрипт в ОС CentOS 6.5 запускается аналогичным образом с ОС Windows, только для этого не требуется устанавливать дополнительные компоненты.

В первую очередь следует сконфигурировать файл targets.txt (см. раздел «Запуск скрипта на Python в ОС Windows») и после этого запустить в командной строке скрипт:

python %ПУТЬ_ДО_СКРИПТА%\ee-upload.py %ПУТЬ_ДО_ФАЙЛА_КОНФИГУРАЦИИ%\file.bin -f %ПУТЬ_ДО_ФАЙЛА%\targets.txt

Пример:

Загрузка файла конфигурации устройства NetPing из командной строки

Ошибки, возникающие при выполнении скрипта на Python

Скрипт выполняется успешно, когда в отчёте отображается сообщение «Uploading to 192.168.0.21... success»:

Загрузка файла конфигурации устройства NetPing из командной строки

Ошибка «HTTP error: <urlopen error [Errno 110] Connection limed out>» означает, что, скорее всего, неправильно введён IP адрес/DNS имя устройства, либо устройство недоступно в сети по какой-то причине:

Загрузка файла конфигурации устройства NetPing из командной строки

Ошибка «Uploading to 192.168.0.21... HTTP error: HTTP Error 401: Unauthorized» означает, что неправильно указаны имя пользователя или пароль для авторизации на устройство:

Загрузка файла конфигурации устройства NetPing из командной строки

Ошибка «IOError: [Errno 2] No such file or directory: '/tmp/python1/USSv3-SMS_setup_v70.6.6.A-1.bin'» означает, что неправильно задан путь до бинарного файла конфигурации:

Загрузка файла конфигурации устройства NetPing из командной строки

Ошибка «Uploading to 192.168.0.21... EEPROM image is not appropriate» означает, что указанный файл конфигурации не подходит к версии прошивки, установленной на устройстве NetPing.

Перед загрузкой конфигурации в EEPROM автоматически проверяется идентичность версий «донора» и «акцептора» настроек. Если версия «донора» не подходит, загрузка не производится, выводится сообщение об ошибке.

Загрузка файла конфигурации устройства NetPing из командной строки


  • Все устройства

Основные теги


Каталог устойств мониторинг серверных комнат и шкафов
Все устройства
Устройство UniPing v3
Устройство NetPing 2/PWR-220 v1/SMS
Устройство NetPing 2/PWR-220 v3/ETH
Устройство NetPing /PWR-220 v3/ETH
Устройство UniPing server solution
Устройство UniPing server solution v3/SMS
Устройство NetPing IO v2
Устройства NetPing
Каталог датчиков для устройств NetPing
Устройство NetPing 8/PWR-220 v3/SMS
Устройство NetPing 2/PWR-220 v2/SMS
Устройство NetPing 4/PWR-220 v3/SMS
Устройство NetPing SMS
Адаптер WiFi VAP11N
Коммутатор PS104GT
Устройство NetPing Mini-UPS
Коммутатор NP-SM4
Сплиттер POE 12В (стандарта 802.3af)
IRC-TR v2 (ИК модуль расширения)
Каталог устройств удалённого управления и распределения электропитания NetPing
Устройство UniPing server solution v3
Датчик разбития стекла (Стекло-3 ИО 329-4), 2м
Переходник для NetPing IO v2
Устройство NetPing PWR68-01
Датчик мониторинга 220В 1-wire
Адаптер DKST910.8
Устройство NetPing DKST61-01
Блок питания 48В 1,5А (мод.HRS20005)
Датчик температуры TS, 1м
Датчик температуры, (T811), 2м
Датчик температуры WT, 1м
Датчик протечки, модель 2605, 2м
Датчик протечки H2О
Датчик температуры 1-wire, (THS), 2м
МАЯК-12-СТ
Датчик движения (PYRONIX COLT QUAD PI ПИК детектор), 2м
Датчик движения (SWAN-QUAD ИК детектор квадросенсор), (2м)
BM8070D Силовое реле 16А/250В на DIN-рейку
MP701 Исполнительный элемент (4 независимых канала по 2 кВт 10А)
Датчик дыма комбинированный (дым/тепло) ИП 212/101-2М-A10R с базой Е412NL
МОЛЛЮСК-12/1,5
Внешний ИБП SKAT-12DC-1.0 Li-ion
ИКС-1 извещатель охранный инфракрасный активный однолучевой
Готовое решение для мониторинга серверной комнаты на основе UniPing server solution v3/SMS
▼ Все теги
Новинки
Датчик воздушного потока LCF013
Датчик воздушного потока позволяет контролировать наличие или отсутствие напора воздушного потока. Содержит подробнее...

Цена: 2 587 руб.

ИКС-1 извещатель охранный инфракрасный активный однолучевой
Извещатель предназначен для регистрации пересечения нарушителями контролируемой зоны, образованной оптическим подробнее...

Цена: 3 854 руб.

Внешний ИБП SKAT-12DC-1.0 Li-ion
Малогабаритный источник бесперебойного питания (ИБП) со встроенной Li-Ion АКБ. Для питания устройств подробнее...

Цена: 3 200 руб.

МОЛЛЮСК-12/1,5
Малогабаритный блок питания с выходным напряженим 12 В. Имеет уникальный корпус, который позволяет осуществить подробнее...

Цена: 950 руб.

Датчик дыма комбинированный (дым/тепло) ИП 212/101-2М-A10R с базой Е412NL
Комбинированный извещатель предназначен для обнаружения возгораний в помещениях различных зданий и сооружений подробнее...

Цена: 2 098 руб.

MP701 Исполнительный элемент (4 независимых канала по 2 кВт 10А)
Силовой модуль коммутации предназначен для обеспечения управления при помощи устройств NetPing силовыми подробнее...

Цена: 1 400 руб.

BM8070D Силовое реле 16А/250В на DIN-рейку
Блок реле для удалённой коммутации мощной нагрузки при помощи устройств NetPing. Изготавливается в корпусе подробнее...

Цена: 1 350 руб.

Датчик движения (SWAN-QUAD ИК детектор квадросенсор), (2м)
Пассивный инфракрасный детектор движения позволяет регистрировать любое движение в зоне до 18 метров. подробнее...

Цена: 1 516 руб.

МАЯК-12-СТ
Оповещатель охранно-пожарный световой стробоскопический предназначен для выдачи световых стробоскопических подробнее...

Цена: 385 руб.

Датчик протечки H2О
Датчик протечки позволяет определить наличие воды в точке установки датчика. Устанавливается в нескольких подробнее...

Цена: 1 450 руб.

-+ руб. руб.
Итого руб.

Данные о заказе