Разное - Автоматизация ребута модема Intercross

Аватара пользователя
Ikari

Разное - Автоматизация ребута модема Intercross

Сообщение Ikari »

Проблема в след.: переодически стопорит модем (т.е. о разрыве связи ничего не говорит, но пинг отсутствует).

Помогает ребут компа или модема (что в данном случае равносильно); либо просто рестор сохраненных настроек.

Подробнее: модем Intercross ICxDSL-5633E. Есть функция сохранение/восстановление настроек. В GUI модема можно войти через 192.168.1.1 по дефолту со стандартными логином/пассом admin



Итого: можно ли написать скрипт или утилиту для устранения таких рутинных действий?
Аватара пользователя
Ikari

Re: Разное - Автоматизация ребута модема Intercross

Сообщение Ikari »

Бробел тут не играет никакого значения: разумеется, пытался и с путями без пробелов - результат не меняется.

А PS я запускаю не командой, а выполняя сам скрипт с рабочего стола (на файлы ps1 ассоциирован powershell)
Аватара пользователя
QRS

Re: Разное - Автоматизация ребута модема Intercross

Сообщение QRS »

Я для таких целей (только модем zyxel) накидал программу на PowerShell

Версия 0.0 так что не ругайте.



В фукнции execTelnet нужно указать адрес Вашего модема:

$remoteHost = 'modem IP'

там же в $currentInput нужно указать пароль для доступа на модем.



Приведенный файл работает для модемов Zyxel... в принципе, если у кого можно проверить что спрашивает Dlink при telnet-входе и что нужно ввести для перезагрузки - могу доработать скрипт, чтобы и параметры можно было ввести и прочие удобства...

Изображение
Вложения
ping.zip
(1.4 КБ) 0 скачиваний
ping.zip
(1.4 КБ) 0 скачиваний
Аватара пользователя
QRS

Re: Разное - Автоматизация ребута модема Intercross

Сообщение QRS »

Комментарии по софтине:

- программу имеет смысл включить в планировщик, например, запуск с интервалом в 10 минут.

- программа регистрирует новый источник лог-сообщений для журнала Application - первый раз ее нужно запустить от имени местного Админа;

- при первом непрохождении ping до ya.ru и google программа создает сообщение в журнале (для мониторинга) - "Ping lost first time" и создает в реестре (в HKCU) запись о сбое;

- при втором подряд непрохождении ping (при втором запуске программы) программа делает запись в журнале и запускает процедуру перезагрузки модема... в диагностических целях попутно выводит в консоль ответ модема.
Аватара пользователя
Ikari

Re: Разное - Автоматизация ребута модема Intercross

Сообщение Ikari »

Хм... никак не могу объединить всю информацию в единое целое для Интеркросс.

Подумываю даже о перепрошивке в ДЛинк

Кстати файлы PS1 (т.е. повершел) не могу запускать из-за невозможности поставить PowerShell себе на WinXP x64

Вот так и сижу методом подбора...

==========

Поправка: повершел удалось присобачить, но результат все равно = 0 Изображение
Аватара пользователя
QRS

Re: Разное - Автоматизация ребута модема Intercross

Сообщение QRS »

в Powershell для запуска файлов ps1 необходимо установить политику

set-ExecutionPolicy RemoteSigned

---

а в программе идея в том, что она скармливает по telnet определенный текст с символами "Enter", т.е. в строку $currentInput нужно внести все то, что Вы руками вводите при подключении в telnet.

Например,

если у модем пароль "123" (который модем сразу предлагаем ввести), а для перезагрузки zyxel нужно использовать код sys reboot, то эта строка выглядит так:

$currentInput = @"

123

sys reboot

"@

PS: если вы сможете выложить скриншот окна telnet, где будет виден диалог с модемом (в том числе команда перезагрузки), то я постараюсь Вам порекомендовать как подготовить такую строку.
Аватара пользователя
Ikari

Re: Разное - Автоматизация ребута модема Intercross

Сообщение Ikari »

Насчет политики не совсем понял: нужно только выполнить команду в консольном окне 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!
}
Вложения

[Расширение jpg было запрещено, вложение больше недоступно.]

Вложения

[Расширение jpg было запрещено, вложение больше недоступно.]

Вложения

[Расширение jpg было запрещено, вложение больше недоступно.]

Вложения

[Расширение jpg было запрещено, вложение больше недоступно.]

Вложения

[Расширение jpg было запрещено, вложение больше недоступно.]

Вложения

[Расширение jpg было запрещено, вложение больше недоступно.]

Аватара пользователя
QRS

Re: Разное - Автоматизация ребута модема Intercross

Сообщение QRS »

В коде нужно подправить:

$currentInput = @"

admin

ЗДЕСЬ ПАРОЛЬ

8

1

1

1

"@

Может быть перед "8" не нужна пустая строка.

Насчет политики:

1. Нужно открыть powershell руками.

2. В открывшемся окне ввести: set-ExecutionPolicy RemoteSigned

и подтвердить что подтверждаешь изменение политики.
Аватара пользователя
Ikari

Re: Разное - Автоматизация ребута модема Intercross

Сообщение Ikari »

Гхм... на 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Изображениеutput += GetOutput

foreach($line in $currentInput)

{

$writer.WriteLine($line)

$writer.Flush()

Start-Sleep -m $commandDelay

$SCRIPTИзображениеutput += 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!

}
Вложения
Вложение Снимок16.JPG больше недоступно
Вложения

[Расширение jpg было запрещено, вложение больше недоступно.]

Ответить

Вернуться в «Microsoft Windows 2000/XP»