Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Microsoft Windows 2000/XP (http://forum.oszone.net/forumdisplay.php?f=6)
-   -   Автоматизация ребута модема Intercross (http://forum.oszone.net/showthread.php?t=177541)

Ikari 06-06-2010 23:06 1428951

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

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

zonderz 06-06-2010 23:15 1428962

Ikari,

http://forum.oszone.net/thread-171856.html
http://forum.oszone.net/thread-147012.html

QRS 06-06-2010 23:41 1428982

Вложений: 1
Я для таких целей (только модем zyxel) накидал программу на PowerShell
Версия 0.0 так что не ругайте.

В фукнции execTelnet нужно указать адрес Вашего модема:
$remoteHost = 'modem IP'
там же в $currentInput нужно указать пароль для доступа на модем.

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

QRS 06-06-2010 23:53 1428990

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

- программу имеет смысл включить в планировщик, например, запуск с интервалом в 10 минут.
- программа регистрирует новый источник лог-сообщений для журнала Application - первый раз ее нужно запустить от имени местного Админа;
- при первом непрохождении ping до ya.ru и google программа создает сообщение в журнале (для мониторинга) - "Ping lost first time" и создает в реестре (в HKCU) запись о сбое;
- при втором подряд непрохождении ping (при втором запуске программы) программа делает запись в журнале и запускает процедуру перезагрузки модема... в диагностических целях попутно выводит в консоль ответ модема.

Ikari 07-06-2010 00:10 1428996

Хм... никак не могу объединить всю информацию в единое целое для Интеркросс.
Подумываю даже о перепрошивке в ДЛинк
Кстати файлы PS1 (т.е. повершел) не могу запускать из-за невозможности поставить PowerShell себе на WinXP x64
Вот так и сижу методом подбора...
==========
Поправка: повершел удалось присобачить, но результат все равно = 0 :)

QRS 07-06-2010 06:56 1429097

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

---
а в программе идея в том, что она скармливает по telnet определенный текст с символами "Enter", т.е. в строку $currentInput нужно внести все то, что Вы руками вводите при подключении в telnet.
Например,
если у модем пароль "123" (который модем сразу предлагаем ввести), а для перезагрузки zyxel нужно использовать код sys reboot, то эта строка выглядит так:


$currentInput = @"
123

sys reboot
"@

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

Ikari 07-06-2010 10:23 1429184

Вложений: 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!
}


QRS 07-06-2010 18:37 1429502

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

$currentInput = @"
admin
ЗДЕСЬ ПАРОЛЬ

8
1
1
1
"@

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

Насчет политики:
1. Нужно открыть powershell руками.
2. В открывшемся окне ввести: set-ExecutionPolicy RemoteSigned
и подтвердить что подтверждаешь изменение политики.

Ikari 07-06-2010 21:58 1429617

Вложений: 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!
}


QRS 07-06-2010 23:15 1429658

Вы пытаетесь запустить powershell с укзанием скрипта на исполнение.
К сожалению в пути к файлу есть пробел... Вам нужно путь к файлу указывать в двойных кавычках, например,

powershell.exe "D:\users\winroot\Desktop\Ребут модема\ping.ps1"

Ikari 08-06-2010 08:45 1429801

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

QRS 08-06-2010 12:08 1429885

снимок окна, который Вы выложили, говорит о том, что параметр в PS передается без кавычек.
Что PS пишет, когда Вы запускаете скрипт с путями без пробелов?
--
Кстати, можно открыть powershell и выполнить скрипт из командной строки - просто укажите полное имя (с путем) скрипта.

Ikari 08-06-2010 23:02 1430308

Вложений: 1
Да, конечно пробовал и вручную прописывать запуск через ПоверШелл

QRS 09-06-2010 02:12 1430422

Я не силен в PowerShell, но похоже, что у Вас версия 1.х стоит, а не вторая с SP и заплатками.

wester123 13-09-2011 15:14 1752093

Спасибо за эту тему, единственное что помогло для перезапуска модема, правда 2 дня ковырялся, и кстати ветки реестра самому создавать нужно(после их создания скрипт сразу заработал)


Время: 06:30.

Время: 06:30.
© OSzone.net 2001-