Автоматизация ребута модема Intercross
Проблема в след.: переодически стопорит модем (т.е. о разрыве связи ничего не говорит, но пинг отсутствует).
Помогает ребут компа или модема (что в данном случае равносильно); либо просто рестор сохраненных настроек.
Подробнее: модем Intercross ICxDSL-5633E. Есть функция сохранение/восстановление настроек. В GUI модема можно войти через 192.168.1.1 по дефолту со стандартными логином/пассом admin
Итого: можно ли написать скрипт или утилиту для устранения таких рутинных действий?
|
Вложений: 1
Я для таких целей (только модем zyxel) накидал программу на PowerShell
Версия 0.0 так что не ругайте.
В фукнции execTelnet нужно указать адрес Вашего модема:
$remoteHost = 'modem IP'
там же в $currentInput нужно указать пароль для доступа на модем.
Приведенный файл работает для модемов Zyxel... в принципе, если у кого можно проверить что спрашивает Dlink при telnet-входе и что нужно ввести для перезагрузки - могу доработать скрипт, чтобы и параметры можно было ввести и прочие удобства...
:)
|
Комментарии по софтине:
- программу имеет смысл включить в планировщик, например, запуск с интервалом в 10 минут.
- программа регистрирует новый источник лог-сообщений для журнала Application - первый раз ее нужно запустить от имени местного Админа;
- при первом непрохождении ping до ya.ru и google программа создает сообщение в журнале (для мониторинга) - "Ping lost first time" и создает в реестре (в HKCU) запись о сбое;
- при втором подряд непрохождении ping (при втором запуске программы) программа делает запись в журнале и запускает процедуру перезагрузки модема... в диагностических целях попутно выводит в консоль ответ модема.
|
Хм... никак не могу объединить всю информацию в единое целое для Интеркросс.
Подумываю даже о перепрошивке в ДЛинк
Кстати файлы PS1 (т.е. повершел) не могу запускать из-за невозможности поставить PowerShell себе на WinXP x64
Вот так и сижу методом подбора...
==========
Поправка: повершел удалось присобачить, но результат все равно = 0 :)
|
в Powershell для запуска файлов ps1 необходимо установить политику
set-ExecutionPolicy RemoteSigned
---
а в программе идея в том, что она скармливает по telnet определенный текст с символами "Enter", т.е. в строку $currentInput нужно внести все то, что Вы руками вводите при подключении в telnet.
Например,
если у модем пароль "123" (который модем сразу предлагаем ввести), а для перезагрузки zyxel нужно использовать код sys reboot, то эта строка выглядит так:
$currentInput = @"
123
sys reboot
"@
PS: если вы сможете выложить скриншот окна telnet, где будет виден диалог с модемом (в том числе команда перезагрузки), то я постараюсь Вам порекомендовать как подготовить такую строку.
|
Вложений: 6
Насчет политики не совсем понял: нужно только выполнить команду в консольном окне PS в %WINDIR%\system32\windowspowershell\v1.0\powershell.exe или %WINDIR%\SysWOW64\windowspowershell\v1.0\powershell.exe ?
=======
Вот что получилось у меня:
читать дальше »
Код:
#############################################################################
#Script to ping remote and reboot modem (zyxel)
#Original name: QRS_modemReboot.ps1
#
#Parameters: not required
#Version: 0.0
#
#Author: as QRS
##############################################################################
new-eventlog -source QRS_shutdown -logname Application -ea SilentlyContinue
function Ping-Address {
PROCESS {
$ping = $false
$results = Get-WmiObject -query `
"SELECT * FROM Win32_PingStatus WHERE Address = '$_'"
foreach ($result in $results) {
if ($results.StatusCode -eq 0) {
$ping = $true
}
}
if ($ping -eq $true) {
Write-Output $_
}
}
}
## Read output from a remote host
function GetOutput
{
## Create a buffer to receive the response
$buffer = new-object System.Byte[] 1024
$encoding = new-object System.Text.AsciiEncoding
$outputBuffer = ""
$foundMore = $false
## Read all the data available from the stream, writing it to the
## output buffer when done.
do
{
## Allow data to buffer for a bit
start-sleep -m 1000
## Read what data is available
$foundmore = $false
$stream.ReadTimeout = 1000
do
{
try
{
$read = $stream.Read($buffer, 0, 1024)
if($read -gt 0)
{
$foundmore = $true
$outputBuffer += ($encoding.GetString($buffer, 0, $read))
}
} catch { $foundMore = $false; $read = 0 }
} while($read -gt 0)
} while($foundmore)
$outputBuffer
}
function execTelnet{
[string] $output = ""
$remoteHost = '192.168.1.1'
$port = 23;
$currentInput = @"
admin
sys reboot
"@
$commandDelay = 500
write-host "Connecting to $remoteHost on port $port"
trap { Write-Error "Could not connect to remote computer: $_"; exit }
$socket = new-object System.Net.Sockets.TcpClient($remoteHost, $port)
$stream = $socket.GetStream()
$writer = new-object System.IO.StreamWriter $stream
## Receive the output that has buffered so far
$SCRIPT:output += GetOutput
foreach($line in $currentInput)
{
$writer.WriteLine($line)
$writer.Flush()
Start-Sleep -m $commandDelay
$SCRIPT:output += GetOutput
}
## Close the streams
$writer.Close()
$stream.Close()
$output
}
$ping = (('ya.ru','google.com') | Ping-Address)
if($ping -eq $null) {
$noping = (Get-ItemProperty -path "HKCU:\Software\QRS\ADSLrestart").noPing
if($noping -eq 1){
write-eventlog -logname Application -source QRS_shutdown -eventID 03 -entrytype Information -message "Ping lost." -category 1
. execTelnet
Set-ItemProperty -path "HKCU:\Software\QRS\ADSLrestart" -name "noPing" -value 0
}else{
Set-ItemProperty -path "HKCU:\Software\QRS\ADSLrestart" -name "noPing" -value 1
write-eventlog -logname Application -source QRS_shutdown -eventID 03 -entrytype Information -message "Ping lost first time." -category 1
}
}else{
New-Item -path "HKCU:\Software\" -name "QRS" -type directory -ea 0
New-Item -path "HKCU:\Software\QRS\" -name "ADSLrestart" -type directory -ea 0
Set-ItemProperty -path "HKCU:\Software\QRS\ADSLrestart" -name "noPing" -value 0
write-host Ping is ok!
}
|
В коде нужно подправить:
$currentInput = @"
admin
ЗДЕСЬ ПАРОЛЬ
8
1
1
1
"@
Может быть перед "8" не нужна пустая строка.
Насчет политики:
1. Нужно открыть powershell руками.
2. В открывшемся окне ввести: set-ExecutionPolicy RemoteSigned
и подтвердить что подтверждаешь изменение политики.
|
Вложений: 1
Гхм... на set-ExecutionPolicy RemoteSigned PS ничего не отвечал.
Скрипт поправил - ноль положительной реакции.
читать дальше »
#############################################################################
#Script to ping remote and reboot modem (zyxel)
#Original name: QRS_modemReboot.ps1
#
#Parameters: not required
#Version: 0.0
#
#Author: as QRS
##############################################################################
new-eventlog -source QRS_shutdown -logname Application -ea SilentlyContinue
function Ping-Address {
PROCESS {
$ping = $false
$results = Get-WmiObject -query `
"SELECT * FROM Win32_PingStatus WHERE Address = '$_'"
foreach ($result in $results) {
if ($results.StatusCode -eq 0) {
$ping = $true
}
}
if ($ping -eq $true) {
Write-Output $_
}
}
}
## Read output from a remote host
function GetOutput
{
## Create a buffer to receive the response
$buffer = new-object System.Byte[] 1024
$encoding = new-object System.Text.AsciiEncoding
$outputBuffer = ""
$foundMore = $false
## Read all the data available from the stream, writing it to the
## output buffer when done.
do
{
## Allow data to buffer for a bit
start-sleep -m 1000
## Read what data is available
$foundmore = $false
$stream.ReadTimeout = 1000
do
{
try
{
$read = $stream.Read($buffer, 0, 1024)
if($read -gt 0)
{
$foundmore = $true
$outputBuffer += ($encoding.GetString($buffer, 0, $read))
}
} catch { $foundMore = $false; $read = 0 }
} while($read -gt 0)
} while($foundmore)
$outputBuffer
}
function execTelnet{
[string] $output = ""
$remoteHost = '192.168.1.1'
$port = 23;
$currentInput = @"
admin
admin
8
1
1
1
"@
$commandDelay = 500
write-host "Connecting to $remoteHost on port $port"
trap { Write-Error "Could not connect to remote computer: $_"; exit }
$socket = new-object System.Net.Sockets.TcpClient($remoteHost, $port)
$stream = $socket.GetStream()
$writer = new-object System.IO.StreamWriter $stream
## Receive the output that has buffered so far
$SCRIPT:output += GetOutput
foreach($line in $currentInput)
{
$writer.WriteLine($line)
$writer.Flush()
Start-Sleep -m $commandDelay
$SCRIPT:output += GetOutput
}
## Close the streams
$writer.Close()
$stream.Close()
$output
}
$ping = (('ya.ru','google.com') | Ping-Address)
if($ping -eq $null) {
$noping = (Get-ItemProperty -path "HKCU:\Software\QRS\ADSLrestart").noPing
if($noping -eq 1){
write-eventlog -logname Application -source QRS_shutdown -eventID 03 -entrytype Information -message "Ping lost." -category 1
. execTelnet
Set-ItemProperty -path "HKCU:\Software\QRS\ADSLrestart" -name "noPing" -value 0
}else{
Set-ItemProperty -path "HKCU:\Software\QRS\ADSLrestart" -name "noPing" -value 1
write-eventlog -logname Application -source QRS_shutdown -eventID 03 -entrytype Information -message "Ping lost first time." -category 1
}
}else{
New-Item -path "HKCU:\Software\" -name "QRS" -type directory -ea 0
New-Item -path "HKCU:\Software\QRS\" -name "ADSLrestart" -type directory -ea 0
Set-ItemProperty -path "HKCU:\Software\QRS\ADSLrestart" -name "noPing" -value 0
write-host Ping is ok!
}
|
Вы пытаетесь запустить powershell с укзанием скрипта на исполнение.
К сожалению в пути к файлу есть пробел... Вам нужно путь к файлу указывать в двойных кавычках, например,
powershell.exe "D:\users\winroot\Desktop\Ребут модема\ping.ps1"
|
Бробел тут не играет никакого значения: разумеется, пытался и с путями без пробелов - результат не меняется.
А PS я запускаю не командой, а выполняя сам скрипт с рабочего стола (на файлы ps1 ассоциирован powershell)
|
снимок окна, который Вы выложили, говорит о том, что параметр в PS передается без кавычек.
Что PS пишет, когда Вы запускаете скрипт с путями без пробелов?
--
Кстати, можно открыть powershell и выполнить скрипт из командной строки - просто укажите полное имя (с путем) скрипта.
|
Вложений: 1
Да, конечно пробовал и вручную прописывать запуск через ПоверШелл
|
Я не силен в PowerShell, но похоже, что у Вас версия 1.х стоит, а не вторая с SP и заплатками.
|
Спасибо за эту тему, единственное что помогло для перезапуска модема, правда 2 дня ковырялся, и кстати ветки реестра самому создавать нужно(после их создания скрипт сразу заработал)
|
Время: 06:30.
© OSzone.net 2001-