Enterprise IT Solutions/Microsoft

[PowerShell] 간이 네트워크 모니터링 도구

iseop 2024. 11. 30. 13:30

$computers = @('www.google.com', 'www.naver.com', 'www.google.com', 'www.google.com', '1.1.1.1', '1.1.1.1', '1.1.1.1', '1.1.1.1', '1.1.1.1', '1.1.1.1', '1.1.1.1')
$switches = @('www.google.com', 'www.naver.com')
$servers = @('www.google.com', 'www.naver.com')

$timeout = 1000

$task = $computers | % {
    [Net.NetworkInformation.Ping]::new().SendPingAsync($_, $timeout)
}

$task2 = $switches | % {
    [Net.NetworkInformation.Ping]::new().SendPingAsync($_, $timeout)
}

$task3 = $servers | % {
    [Net.NetworkInformation.Ping]::new().SendPingAsync($_, $timeout)
}

Function GetStatus($task) {
    $width = (Get-Host).UI.RawUI.MaxWindowSize.Width
    $cols = [Math]::Floor($width/27)

    [System.Collections.ArrayList]$online = @()
    [System.Collections.ArrayList]$offline = @()

    [Threading.Tasks.Task]::WaitAll($task)

    $task.Result | % {
        $addr = $_.Address.IPAddressToString
        if($_.Status -eq 'Success') {
            $online += "[$($addr): Online]".PadRight(26, ' ')
        } else {
            $offline += "[$($addr): Offline]".PadRight(26, ' ')
        }
    }

    if($online.Count*27 -gt $cols*27) {
        for($i=$cols; $i -lt $online.Count; $i+=$cols+1) {
            $online.Insert($i, "`n")
        }
    }
    
    if($offline.Count*27 -gt $cols*27) {
        for($i=$cols; $i -lt $offline.Count; $i+=$cols+1) {
            $offline.Insert($i, "`n")
        }
    }

    Write-Host ' ' -NoNewline
    Write-Host $online -ForegroundColor Green
    Write-Host ' ' -NoNewline
    Write-Host $offline -ForegroundColor Red
}

while(1) {
    clear

    Get-Date
    Write-Host ''

    # Computers
    Write-Host 'Computer Status'
    GetStatus($task)

    # Switches
    Write-Host ' '
    Write-Host 'Network Switch Status'
    GetStatus($task2)

    # Servers
    Write-Host ' '
    Write-Host 'Server Status'
    GetStatus($task3)

    sleep 2
}

 

비동기 ping 스크립트의 응용 버전입니다.

https://iseop.tistory.com/184

 

[PowerShell] 비동기 PING 스크립트

$net = "192.168.75"$ips = 1..254$timeout = 2000$online = @()$ips = $ips | % { "$($net).$_" }$task = $ips | % { [Net.NetworkInformation.Ping]::new().SendPingAsync($_, $timeout)}[Threading.Tasks.Task]::WaitAll($task)$task.Result | where Status -eq 'Success'

iseop.tistory.com

 

똑같이 SendPingAsync()와 WaitAll()을 사용합니다.

호스트 종류별로 세 가지의 태스크를 만들고, 함수 매개변수에 전달해서 화면을 출력합니다.

String.PadRight()를 통해서 문자열을 일정한 길이로 만들고, 화면 너비에 비례하여 ArrayList의 정해진 위치에 라인 피드 문자를 넣습니다.

 

끝.