рдЖрд░ред рд╕рдорд╛рдирд╛рдВрддрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ, рдЧреНрд░рд╛рдлрд╝, xlsx, рдИрдореЗрд▓ рдФрд░ рдЗрд╕ рд╕рдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднрдВрдбрд╛рд░рдг рдХреА рд╕реНрдерд┐рддрд┐ рдкрд░ рд░рд┐рдкреЛрд░реНрдЯ

рд▓реЗрдЦ рд╡реИрдХрд▓реНрдкрд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдФрд░ рдирд┐рд░реНрдорд╛рдг рдЗрддрд┐рд╣рд╛рд╕ рдХреЗ рд╕рд╛рде EMC VNX рд╕реНрдЯреЛрд░реЗрдЬ рдбреНрд░рд╛рдЗрд╡ рдХреА рд╕реНрдерд┐рддрд┐ рдкрд░ рдирд┐рдпрдорд┐рдд рд░рд┐рдкреЛрд░реНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред


рдореИрдВрдиреЗ рд╕рдмрд╕реЗ рд╡рд┐рд╕реНрддреГрдд рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдФрд░ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рдкрд╛рд╕рд╡рд░реНрдб рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдХрд░реЗрдВред рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рдХрд╛ рдкреНрд░рд╛рд░реВрдк рднреА рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЦреБрд╢реА рд╣реЛрдЧреА рдЕрдЧрд░ рдХреЛрдИ рдЗрд╕реЗ рдШрд░ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред


рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдЙрдкрд╕реНрдерд┐рддрд┐


рдкреНрд░рд╛рдЧрд┐рддрд┐рд╣рд╛рд╕


рдпрджрд┐ рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИ рддреЛ рдЖрдк рдЗрд╕реЗ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╕реЗ "рдкреИрд░ рдмрдврд╝рддреЗ рд╣реИрдВ"ред
рд╣рдорд╛рд░рд╛ рдПрдХ рдбреЗрдЯрд╛ рд╕реЗрдВрдЯрд░ рд╣реИред рдмрд╣реБрдд рддрд╛рдЬрд╝рд╛ рднрдВрдбрд╛рд░рдг рдкреНрд░рдгрд╛рд▓рд┐рдпрд╛рдБ рдирд╣реАрдВ рд╣реИрдВред рдХрдИ рд╕реНрдЯреЛрд░реЗрдЬ рд╕рд┐рд╕реНрдЯрдо, рдбрд┐рд╕реНрдХ рд╡рд┐рдлрд▓рддрд╛рдПрдВ рднреА рд╣реИрдВред рд╕рдкреНрддрд╛рд╣ рдореЗрдВ рдХрдИ рдмрд╛рд░ рд▓реЛрдЧ рдбреЗрдЯрд╛ рд╕реЗрдВрдЯрд░ рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рд╕реНрдЯреЛрд░реЗрдЬ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдбреНрд░рд╛рдЗрд╡ рдмрджрд▓рддреЗ рд╣реИрдВред рдбрд┐рд╕реНрдХ рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп " рдЕрдиреБрд╢рдВрд╕рд┐рдд рдбрд┐рд╕реНрдХ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди " рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдЕрд▓рд╛рд░реНрдо рдХреЗ рдмрд╛рдж рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рд╕рд╛рдзрд╛рд░рдг рд╕реЗ рдмрд╛рд╣рд░ рдХреБрдЫ рднреА рдирд╣реАрдВред


рдпрд╣ рдареАрдХ рд╣реИ


рд▓реЗрдХрд┐рди рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рд╡реНрдпрдХреНрддрд┐рдЧрдд рдПрд▓рдпреВрдПрди рдиреЗ рдЗрди рднрдВрдбрд╛рд░рдг рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдкрд░ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдФрд░ рд╡рд░реНрдЪреБрдЕрд▓ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬреЛ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рдиреАрдЪрд╛ рджрд┐рдЦрд╛рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред рд╡рд┐рдХреНрд░реЗрддрд╛ рдХреЗ рддрдХрдиреАрдХреА рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рдХрд┐ рдбрд┐рд╕реНрдХ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рди рдХреЗрд╡рд▓ рдЬрдм рдЙрдкрд░реЛрдХреНрдд рдЕрд▓рд╛рд░реНрдо рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рднреА рдЬрдм рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЕрдиреНрдп рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рддреНрд░реБрдЯрд┐рдпреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред


рдЗрди рднрдВрдбрд╛рд░рдг рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдПрд╕рдПрдирдПрдордкреА рдирд┐рдЧрд░рд╛рдиреА рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред рдЖрдкрдХреЛ рдорд╣рдВрдЧреЗ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд╡рд╛рд▓реЗ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ (рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рдирд╣реАрдВ рд╣реИ) рдпрд╛ NaviSECCli рдХрдВрд╕реЛрд▓ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рднрдВрдбрд╛рд░рдг рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рдпрдВрддреНрд░рдХ (рдЙрдирдореЗрдВ рд╕реЗ рджреЛ рд╣реИрдВ) рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рд╡рд╛рдВрдЫрдиреАрдп рдирд╣реАрдВ рдерд╛ред


рд▓реЙрдЧ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдФрд░ рдЙрдирдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ред рдФрд░ рдбрд┐рд╕реНрдХ рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЬрд┐рдореНрдореЗрджрд╛рд░ рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рдкрд░ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред


рдкрд╣рд▓рд╛ рдХрджрдо


рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдореЗрд░реЗ рдПрдХ рд╕рд╣рдХрд░реНрдореА рдиреЗ PowerShell рдХреЛрдб рд▓рд┐рдЦрд╛ рдерд╛ рдЬреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд░рддрд╛ рдерд╛:


  • рдПрдХ рдЗрдирдкреБрдЯ рддрд╛рд▓рд┐рдХрд╛ рд▓реА рдЬрд┐рд╕рдореЗрдВ рд╕реНрдЯреЛрд░реЗрдЬ рдХрдВрдЯреНрд░реЛрд▓рд░реЛрдВ рдХреЗ рдЖрдИрдкреА рдкрддреЗ рдереЗ;
  • рдЪрдХреНрд░ рдирд┐рдпрдВрддреНрд░рдХ рдП рдХреЗ рдЖрдИрдкреА рдкрддреЗ рдкрд░ рдЧрдпрд╛, рдлрд┐рд░ рдирд┐рдпрдВрддреНрд░рдХ рдмреА рдХреЗ рдЖрдИрдкреА рдкрддреЗ рдкрд░;
  • рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдбрд┐рд╕реНрдХ рдХреЗ рд╕реАрд░рд┐рдпрд▓ рдирдВрдмрд░ рдХреЗ рд▓рд┐рдП рдЙрдирдХрд╛ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рд▓рд┐рдпрд╛;
  • рд▓реЙрдЧ рдХреА рд╕рднреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдФрд░ рдорд╛рдВрдЧреЗ рдЧрдП рд╕рдВрджреЗрд╢реЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд┐рдпрд╛;
  • рдПрдХ PowerShell рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдФрд░ рдЗрд╕рдХреЗ рдЧреБрдгреЛрдВ рдореЗрдВ рдКрдкрд░ рдкреНрд░рд╛рдкреНрдд рд▓рд╛рдЗрдиреЛрдВ рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛;
  • рд╕рднреА рдкрд░рд┐рдгрд╛рдореА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╡рд┐рд▓рдп рдХрд░ рджрд┐рдпрд╛ рдЬреЛ рд╕реАрдПрд╕рд╡реА рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдХреЛрдб рдиреАрдЪреЗ рд╣реИред рддреБрд░рдВрдд рдПрдХ рдЖрд░рдХреНрд╖рдг рдХрд░реЗрдВ рдХрд┐ рд╡рд╣ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдордиреЗ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдорд╛рдзрд╛рди рдкреЗрд╢ рдХрд┐рдпрд╛ рд╣реИред


рдкреЙрд╡рд░рд╢реЗрд▓ рд╕реЛрд░реНрд╕
cd 'd:\Navisphere CLI\' $csv = "D:\VNX-IP.csv" $Filter1 = "name1" $Filter2 = "name2" $Filter3 = "name3" $Data = import-csv $csv -Delimiter ';' | Where {$_.cl -EQ $Filter1 -Or $_.cl -EQ $Filter2 -Or $_.cl -EQ $Filter3} | Sort-Object -Property @{Expression={$_.cl}; Ascending=$true}, @{Expression={$_.Name} ;Ascending=$true} #$Filter1 = "nameOfcl" #$Data = import-csv $csv -Delimiter ';' | Where {$_.Name -EQ $Filter1} $Data | select Name,IP,cl $yStart = (Get-Date).AddDays(-30).ToString('yyyy') $yEnd = (Get-Date).ToString('yyyy') $mStart = (Get-Date).AddDays(-30).ToString('MM') $mEnd = (Get-Date).ToString('MM') $dStart = (Get-Date).AddDays(-30).ToString('dd') $dEnd = (Get-Date).ToString('dd') #$start = (Get-Date).AddDays(-3).ToString('MM\/dd\/yy') #$end = (Get-Date).ToString('MM\/dd\/yy') $i = 1 $table = ForEach ($row in $Data) { Write-Host $row.Name -ForegroundColor "Yellow" Write-Host "SP A" Write-Host (Get-Date).ToString('HH:mm:ss') $txt = .\NaviSECCli.exe -scope 0 -h $row.newA -user myusername -password mypassword getlog -date $mStart/$dStart/$yStart $mEnd/$dEnd/$yEnd | Select-String -Pattern "\(820\)","\(803\)","\(801\)","\(920\)","\(901\)" ForEach ($n in $txt) { $x = $n -Split(' ') $disk = $x[3] + "_" + $x[5] + "_" + $x[7].Split("(")[0] $sn = (.\NaviSECCli.exe -scope 0 -h $row.newA -user myusername -password mypassword getdisk $disk -serial)[1] | %{$_ -replace "Serial Number: ",""} | %{$_ -replace "State: ",""} | %{$_ -replace " ",""} New-Object PSObject -Property @{ i = $i cl = $row.cl Storage = $row.Name SP = "A" Date = $x[0] Time = $x[1] Disk = $disk Error = (($n -Split('\['))[0] -Split('\)'))[1].Trim() eCode = (($n -Split('\('))[1] -Split('\)'))[0] SN = $sn } $i = $i + 1 } Write-Host "SP B" Write-Host (Get-Date).ToString('HH:mm:ss') $txt = .\NaviSECCli.exe -scope 0 -h $row.newB -user myusername -password mypassword getlog -date $mStart/$dStart/$yStart $mEnd/$dEnd/$yEnd | Select-String -Pattern "\(820\)","\(803\)","\(801\)","\(920\)","\(901\)" ForEach ($n in $txt) { $x = $n -Split(' ') $disk = $x[3] + "_" + $x[5] + "_" + $x[7].Split("(")[0] $sn = (.\NaviSECCli.exe -scope 0 -h $row.newA -user myusername -password mypassword getdisk $disk -serial)[1] | %{$_ -replace "Serial Number: ",""} | %{$_ -replace "State: ",""} | %{$_ -replace " ",""} New-Object PSObject -Property @{ i = $i cl = $row.cl Storage = $row.Name SP = "B" Date = $x[0] Time = $x[1] Disk = $disk Error = (($n -Split('\['))[0] -Split('\)'))[1].Trim() eCode = (($n -Split('\('))[1] -Split('\)'))[0] SN = $sn } $i = $i + 1 } Write-Host " " } $table | select i,cl,Storage,SP,Date,Time,Disk,Error,eCode,SN | Export-Csv -Path 'd:\VNX-Errors.csv' -NoTypeInformation -UseCulture -Encoding UTF8 

рд╕рдм рдХреБрдЫ рдареАрдХ рдерд╛, рдЬреЛ рдХреБрдЫ рднреА рдерд╛ рд╡рд╣ рдЗрдЪреНрдЫреБрдХ рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рдХреЛ рдПрдХ рдкрддреНрд░ рдХреЗ рд╕реНрд╡рдд: рднреЗрдЬрдиреЗ рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕реАрдПрд╕рд╡реА рдХреЗ рдиреНрдпреВрдирддрдо рд╕реНрд╡рд░реВрдкрдг рдХреЗ рд░реВрдк рдореЗрдВ "рдЪрдордХ" рдЬреЛрдбрд╝рдирд╛ рдерд╛ред рд▓реЗрдХрд┐рди (!) рдЗрд╕ рд╕рд╛рд░реА рдкрд░реЗрд╢рд╛рдиреА рдиреЗ рдмрд╣реБрдд рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдХрд╛рдо рдХрд┐рдпрд╛ред рдПрдХ рдорд╣реАрдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓рдЧрднрдЧ 45 рдорд┐рдирдЯ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдмрд╣реБрдд рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдирд┐рдпрдорд┐рдд рд░рд┐рдкреЛрд░реНрдЯреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рд╡рд░реНрддрдорд╛рди рд╡рд░реНрд╖ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЬреЛ рдмрд╣реБрдд рд▓рдВрдмрд╛ рд╕рдордп рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди "рдЕрд╕реНрд╡реАрдХрд╛рд░ - рдкреНрд░рд╕реНрддрд╛рд╡ред" рд╡реЗ рд╕реЛрдЪрдиреЗ рд▓рдЧреЗред



рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЖрдкрдХреЛ рдХреЛрдб рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рдФрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред PowerShell рдореЗрдВ , рд╣рдо рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП 5 рд╕реЗ рдЕрдзрд┐рдХ рдПрдХ рд╕рд╛рде рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рд╕рдлрд▓ рдирд╣реАрдВ рд╣реБрдП, рдФрд░ рд╣рдордиреЗ рдЕрднреА рддрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реАрдХреЛрдВ рдХреЛ "рд╕реНрдореЛрдХреНрдб" рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рддрд░реНрдХ рдХреЛ рдЖрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ ред NaviSECCli рдЙрдкрдпреЛрдЧрд┐рддрд╛, рдЬрд┐рд╕реЗ рдЖрд░ рдХреЗ рддрд╣рдд рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рднрдВрдбрд╛рд░рдг рдХрд╛ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рдорд╛рдзрд╛рди рдХрд╛рдлреА рдЙрдкрдпреБрдХреНрдд рд╣реИред
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ - рдПрдХ рджреЛ рджрд┐рди - рд╣реЛ рдЧрдпрд╛!


рд╣рдордиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рдореИрдВ рдПрдХ рджреИрдирд┐рдХ рд╕рдорд╛рдЪрд╛рд░ рдкрддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдкрддреНрд░ рдХреА рдкрд╛рда рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ , рджреБрд░реНрдШрдЯрдирд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реЗрдбреНрдпреВрд▓ (рддрд╛рдХрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдерд╛), рдФрд░ рдПрдХ xlsx рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд▓рдЧрд╛рд╡ рднреАред рд╣рдордиреЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдХрд┐ рдореИрдВ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ 3 рдЯреИрдм рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:


  • рдбрд┐рд╕реНрдХ рдФрд░ рджреБрд░реНрдШрдЯрдирд╛ рдкреНрд░рдХрд╛рд░ рд╕реЗ 3 рджрд┐рдиреЛрдВ рдХреЗ рд▓рд┐рдП рджреБрд░реНрдШрдЯрдирд╛ рдбреЗрдЯрд╛
  • рдПрдХ рд╕рдорд╛рди рдЯреИрдм, рд▓реЗрдХрд┐рди 30 рджрд┐рдиреЛрдВ рдХреЗ рд▓рд┐рдП
  • рдХрдЪреНрдЪрд╛ рдбреЗрдЯрд╛ (рдпрджрд┐ рдХреЛрдИ рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡рдпрдВ рдПрдХреНрд╕реЗрд▓ рдореЗрдВ рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ)

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо


1. рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдкрд░ рдЙрдкрд▓рдмреНрдз рдбреЗрдЯрд╛ рд╕реАрдПрд╕рд╡реА рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ;
2. рдЖрд╡рд╢реНрдпрдХ рдЕрд▓рд╛рд░реНрдо рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд░рд┐рдХреЙрд░реНрдб рдХреА рдЦреЛрдЬ рдХреЗ рд╕рд╛рде рд╕рднреА рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪрдХреНрд░ рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛рдПрдВ;
3. рдПрдХ рдбреЗрдЯрд╛ рдлреНрд░реЗрдо рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдЧрдардмрдВрдзрди;
4. рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдФрд░ рд░реВрдкрд╛рдВрддрд░рдг рдХрд░рдирд╛;
5. xlsx рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ;
6. рд╣рдо рд╢реЗрдбреНрдпреВрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдо png рдореЗрдВ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ;
7. рдПрдХрддреНрд░рд┐рдд рдбреЗрдЯрд╛ рд╡рд╛рд▓рд╛ рдПрдХ рдкрддреНрд░ рдмрдирд╛рдПрдВ;
8. рдПрдХ рдкрддреНрд░ рднреЗрдЬреЗрдВред


рдЖрдЗрдП рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ


1. рд╕реАрдПрд╕рд╡реА рд╕реЗ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдкрд░ рдЙрдкрд▓рдмреНрдз рдбреЗрдЯрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ


рд╡реАрдПрдирдПрдХреНрд╕ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрд░реЛрдд рддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рд╛рд░реВрдк
 # A tibble: 83 x 9 Name IP cl type newA newB oldA oldB cntIP <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> 1 XXX 10.***.**~ XclNam~ 5300-1 10.201.1~ 10.201.1~ 10.***.*~ 10.***.*~ 10.***.*~ 2 XXX 10.***.**~ XclNam~ 5300-1 10.201.1~ 10.201.1~ 10.***.*~ 10.***.*~ 10.***.*~ 3 XXX 10.***.**~ XclNam~ 5300-1 10.201.1~ 10.201.1~ 10.***.*~ 10.***.*~ 10.***.*~ 4 XXX 10.***.**~ XclNam~ 5300-1 10.201.1~ 10.201.1~ 10.***.*~ 10.***.*~ 10.***.*~ 5 XXX 10.***.**~ XclNam~ 5300-1 10.201.1~ 10.201.1~ 10.***.*~ 10.***.*~ 10.***.*~ 6 XXX 10.***.**~ XclNam~ 5300-1 10.201.1~ 10.201.1~ 10.***.*~ 10.***.*~ 10.***.*~ 7 XXX 10.***.**~ XclNam~ 5300-1 10.201.1~ 10.201.1~ 10.***.*~ 10.***.*~ 10.***.*~ 8 XXX 10.***.**~ XclNam~ 5300-1 10.201.1~ 10.201.1~ 10.***.*~ 10.***.*~ 10.***.*~ 9 XXX 10.***.**~ XclNam~ 5300-1 10.201.1~ 10.201.1~ 10.***.*~ 10.***.*~ 10.***.*~ 10 XXX 10.***.**~ XclNam~ 5300-1 10.201.1~ 10.201.1~ 10.***.*~ 10.***.*~ 10.***.*~ # ... with 73 more rows 

рдЖрдкрд╛рддрдХрд╛рд▓реАрди рдЬрд╛рдирдХрд╛рд░реА рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреБрдЫ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реЗрд╖ EMC рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ - NaviCLI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреЛрдиреЛрдВ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ ( newA рдФрд░ newB рдХреЙрд▓рдо ) рд╕реЗ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЬреБрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдкрд░рд┐рдгрд╛рдореА рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╕реБрдзрд╛рд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рджреЛрдиреЛрдВ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рдЖрдИрдкреА рдкрддреЗ рдПрдХ рд╣реА рдХреЙрд▓рдо рдореЗрдВ рд╣реЛрдВ, рддрд╛рдХрд┐ рдЖрдк рдкреВрд░реА рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдЪрдХреНрд░ рдмрдирд╛ рд╕рдХреЗрдВ, рдФрд░ рд▓рдЧрд╛рддрд╛рд░ рджреЛ рдирд╣реАрдВред рд╣рдо рдЗрд╕реЗ рдЗрдХрдЯреНрдард╛ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ ред "рд▓рдВрдмрд╡рдд" рдпрд╛ "рдХреНрд╖реИрддрд┐рдЬ" рдбреЗрдЯрд╛ рд╕реНрд╡рд░реВрдкреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдореБрджреНрджреЗ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ tidyverse рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИрдВред рдЖрдк рдЗрд╕реЗ рдпрд╣рд╛рдБ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред


рд╣рдо read_csv2 рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рдкрдврд╝рддреЗ рд╣реИрдВ, рд╣рдо рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрд░рд╛рдореАрдЯрд░ col_types рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрд▓рдо рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдмрд╣реБрдд рддреЗрдЬреА рд╕реЗ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЗрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореВрд▓ рд╕реАрдПрд╕рд╡реА рдореЗрдВ 100 рд╕реЗ рдХрдо рд▓рд╛рдЗрдиреЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрджрдд рд╣реИред


 #   IP VNX. #         , #   ip        . VNX_ip <- vnxIPfilePath %>% read_csv2( col_types = cols( Name = col_character(), IP = col_character(), cl = col_character(), type = col_character(), newA = col_character(), newB = col_character(), oldA = col_character(), oldB = col_character() ) ) %>% filter(cl %in% productCls) %>% gather(key = "cntName", value = "cntIP", 5:6) 

рдЖрдЙрдЯрдкреБрдЯ рдкрд░, рд╣рдореЗрдВ рдРрд╕рд╛ рдбреЗрдЯрд╛ рдлреНрд░реЗрдо рдорд┐рд▓рддрд╛ рд╣реИ (рдирдП рдХреЙрд▓рдо cntName рдФрд░ cntIP рд╣реИрдВ ):


 # A tibble: 30 x 8 Name IP cl type oldA oldB cntName cntIP <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> 1 XXX 10.***.***.*~ XclNameX 5300~ 10.***.***.~ 10.***.***.~ newA 10.***.***.~ 2 XXX 10.***.***.*~ XclNameX 5300~ 10.***.***.~ 10.***.***.~ newA 10.***.***.~ 3 XXX 10.***.***.*~ XclNameX 5300~ 10.***.***.~ 10.***.***.~ newA 10.***.***.~ 4 XXX 10.***.***.*~ XclNameX 5300~ 10.***.***.~ 10.***.***.~ newA 10.***.***.~ 5 XXX 10.***.***.*~ XclNameX 5300~ 10.***.***.~ 10.***.***.~ newA 10.***.***.~ 6 XXX 10.***.***.*~ XclNameX 5300~ 10.***.***.~ 10.***.***.~ newA 10.***.***.~ 7 XXX 10.***.***.*~ XclNameX 5300~ 10.***.***.~ 10.***.***.~ newA 10.***.***.~ 8 XXX 10.***.***.*~ XclNameX 5300~ 10.***.***.~ 10.***.***.~ newA 10.***.***.~ 9 XXX 10.***.***.*~ XclNameX 5300~ 10.***.***.~ 10.***.***.~ newA 10.***.***.~ 10 XXX 10.***.***.*~ XclNameX 5300~ 10.***.***.~ 10.***.***.~ newA 10.***.***.~ # ... with 20 more rows 

2-3ред рд╣рдо рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рдирд╛рдВрддрд░ рдЧрдгрдирд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреМрдбрд╝рддреЗ рд╣реИрдВ, рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рдЕрд▓рд╛рд░реНрдо рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд░рд┐рдХреЙрд░реНрдб рдХреА рдЦреЛрдЬ рдХрд░рддреЗ рд╣реИрдВред рдбреЗрдЯрд╛-рдлрд╝реНрд░реЗрдо рдореЗрдВ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░реЗрдВ


рдЕрдЧрд▓рд╛ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рд╕рдорд╛рдирд╛рдВрддрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ ред


рдЖрд░ рдореЗрдВ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрдИ (рдмрд▓реНрдХрд┐, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХрдИ) рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред рдореБрдЭреЗ рдлреЙрд░реНрдЪреНрдпреВрдирд░ рдФрд░ doParbrid рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ рдХрд╛ рд▓рд┐рдВрдХ рдЕрдзрд┐рдХ рдкрд╕рдВрдж рдЖрдпрд╛ред рдЖрдк рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЕрдиреНрдп рд╕рдорд╛рдирд╛рдВрддрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣рд╛рдВ рдЖрд░ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред


рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╣рдо рдХреЗрд╡рд▓ 3 рдЪрд░рдг рд▓реЗрддреЗ рд╣реИрдВ:
рдЪрд░рдг 1 рдЧреБрдард▓реА рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░реЗрдВ рд╢реБрджреНрдз рдкрдиреНрдирд╛ CPU рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдирд╛рдВрддрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП registerDoParallel (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЛрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ)


рд╕реАрдкреАрдпреВ рдХреЛрд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░реЗрдВ
 numCores <- detectCores() registerDoParallel(numCores) 

рдЪрд░рдг 2 рд╣рдо рдлреЙрд░рдЪ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрдХреНрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ ( % dopar% рдСрдкрд░реЗрдЯрд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ рддрд╛рдХрд┐ рдЪрдХреНрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдЪрд▓рддрд╛ рд░рд╣реЗ рдФрд░ .combine рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ , рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╣рдо рдкрд░рд┐рдгрд╛рдо рдПрдХрддреНрд░ рдХрд░реЗрдВрдЧреЗ)ред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ .combine = rbind , рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд▓реВрдк рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдбреЗрдЯрд╛ рдлреНрд░реЗрдо рд╣реЛрдЧрд╛ ред


рддреНрд░реБрдЯрд┐ рддрд╛рд▓рд┐рдХрд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдХреЛрдб
 #      VNX   ip   . #      ,      #   ,      dataframe #  %dopar%   . #    ,   system.time   , #    %dopar%  %do%.      4-5. # system.time({ errors_df <- foreach(i = 1:nrow(VNX_ip), .combine = rbind, .packages = "tidyverse") %dopar% { errors_raw <- system( paste( "NaviSECCli.exe -scope 0 -h", VNX_ip$cntIP[i], "-user myusername -password mypassword getlog -date", bigPeriodForm, currDateForm ), intern = TRUE ) %>% str_subset(pattern = regex(paste0(errorNumbers, collapse = "|"))) #      ,       if (length(errors_raw) > 0) { #     #       , #     , #       . errorsDescr <- errors_raw %>% gsub("(.*\\) )(.*)(\\s+\\[.*)", "\\2", x = .) %>% trimws() %>% gsub('([[:punct:]])|\\s+', '_', .) #           errors <- errors_raw %>% str_split(pattern = "\\s+", simplify = T) %>% as_tibble() %>% mutate(Disk = paste0(V4, "_", V6, "_", V8) %>% gsub( pattern = "\\([0-9]{3}\\)", replacement = "", x = .) ) #  dataframe    data_frame(cl = VNX_ip$cl[i], Storage = VNX_ip$Name[i], Date = errors$V1 %>% as.Date(format = "%m/%d/%Y"), Time = errors$V2, Disk = errors$Disk, Error = errorsDescr, eCode = errors$V8 %>% str_extract(paste0(errorNumbers, collapse = "|")) %>% str_extract("[0-9]+")) %>% mutate(DateTime = as.POSIXct(paste(Date, Time), format = "%Y-%m-%d %H:%M:%S")) } } # }) 

рдЪрд░рдг 3 рд╣рдо stopImplicitCluster () рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдирд╛рдП рдЧрдП рд╕рдорд╛рдирд╛рдВрддрд░рд╡рд╛рдж рдХреНрд▓рд╕реНрдЯрд░ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рддреЗ рд╣реИрдВ


рдХрдЪреНрдЪреА рддреНрд░реБрдЯрд┐ рдкрд╛рда рд╕реЗ рдкрдардиреАрдп рддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдкрд░ рдереЛрдбрд╝рд╛ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░


рдкрд╛рда рдХреЗ рд░реВрдк рдореЗрдВ, рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:


 head(errors_raw) [1] "07/13/2019 00:01:46 Bus 0 Enclosure 3 Disk 9(801) Soft SCSI Bus Error [0x00] 841d1080 10006 " [2] "07/13/2019 00:01:46 Bus 0 Enclosure 3 Disk 9(801) Soft SCSI Bus Error [0x00] 841e1a00 10006 " [3] "07/13/2019 00:01:46 Bus 0 Enclosure 3 Disk 9(801) Soft SCSI Bus Error [0x00] 8420b600 10006 " [4] "07/13/2019 00:01:46 Bus 0 Enclosure 3 Disk 9(801) Soft SCSI Bus Error [0x00] 84206900 10006 " [5] "07/13/2019 00:01:46 Bus 0 Enclosure 3 Disk 9(801) Soft SCSI Bus Error [0x00] 841fc900 10006 " [6] "07/13/2019 00:01:46 Bus 0 Enclosure 3 Disk 9(801) Soft SCSI Bus Error [0x00] 841fc000 10006 

рдпрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕реНрдерд╛рди рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдП рдЧрдП рдорд╛рди рд╣реИрдВ, рдЬреЛ рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕реАрдПрд╕рд╡реА рдореЗрдВ рднреА рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдбрд╛рд▓реЗ рдЬрд╛рдПрдВрдЧреЗ ред рд▓реЗрдХрд┐рди рдпрд╣ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред рдпрд╣рд╛рдБ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдпрд╣ рд╣реИ рдХрд┐:


  • рджрд┐рдирд╛рдВрдХ рдФрд░ рд╕рдордп рдХреЛ рдПрдХ рд╕реНрдерд╛рди (рд╕рдмрд╕реЗ рдЫреЛрдЯреА рдмреБрд░рд╛рдЗрдпреЛрдВ) рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ;
  • рддреНрд░реБрдЯрд┐ рдкрд╛рда рдореЗрдВ "рд╢рдмреНрдж" рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд рдПрдХ рд╕реНрдерд╛рди рд╕реЗ рдЕрд▓рдЧ рднреА;
  • рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдбрд┐рд╕реНрдХ рд╕рдВрдЦреНрдпрд╛ рдФрд░ рддреНрд░реБрдЯрд┐ рдХреЛрдб (рдЬреЛ рдХреЛрд╖реНрдардХ рдореЗрдВ рд╣реИ) рдХреЗ рдмреАрдЪ рдХреЛрдИ рд╕реНрдерд╛рди рдирд╣реАрдВ рд╣реИред
    рд╕рдм рд╕рдм рдореЗрдВ, рдПрдХ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреНрд░реЗрдореА рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡рд░реНрдЧ :)

рдмреАрдорд╛рд░ рдХрдореАрдиреЗ


рдореИрдВ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реНрд╡рд╛рдж рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд╕реНрдкрд╖реНрдЯ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рддреНрд░реБрдЯрд┐ рдкрд╛рда рдХреЛ рддреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рддреНрд░реБрдЯрд┐ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рдорд╛рдкрди рдХреЛрд╖реНрдардХ рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рдореВрд▓реНрдп рдХреЗ рдЙрджреНрдШрд╛рдЯрди рд╡рд░реНрдЧ рдмреНрд░реИрдХреЗрдЯ рдХреЗ рдмреАрдЪ рд╕реНрдерд┐рдд рдорд╛рдиред рд▓реВрдк рдореЗрдВ, рдпрд╣ рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдЪрд░ рд╣реИред


рдпрд╣ рднреА рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдмрд┐рдВрджреБ рд╣реИ рдХрд┐, рдЕрдВрддрд┐рдо рдбреЗрдЯрд╛ рдлреНрд░реЗрдо рдмрдирд╛рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо, рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рдЖрдИрдкреА рдкрддреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реВрдк рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЕрдиреБрдХреНрд░рдо рдХреЛ рдХреЙрд▓рдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд╣реАрдВ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рдЖрдИрдкреА рдкрддреЗ рдХреЗ рд╕рд╛рде (рдпрд╛рдиреА = = VNN_ip $ cntIP ), рд▓реЗрдХрд┐рди рд▓рд╛рдЗрди рдирдВрдмрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ (i.e. eред i = 1: nrow (VNX_ip) )ред рдпрд╣ рд╣рдореЗрдВ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрдм рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд╛рд░реНрд╕ рдХреА рдЧрдИ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдбреЗрдЯрд╛ рдлреНрд░реЗрдо рдмрдирд╛рддреЗ рд╣реИрдВ, рдХреНрд░рдорд╢рдГ рдХреНрд▓рд╕реНрдЯрд░ рд╕рдВрдЦреНрдпрд╛ рдФрд░ рднрдВрдбрд╛рд░рдг рдирд╛рдо рдХреЛ VNX_ip $ cl [i] рдФрд░ VNX_ip $ Name [i] рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдПред рдЗрд╕рдХреЗ рдмрд┐рдирд╛, рдЬреЙрдЗрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдХреЛрдб рдореЗрдВ рдзреАрдорд╛ рдФрд░ рдЦрд░рд╛рдм рдкрдврд╝рд╛ рдЬрд╛рдПрдЧрд╛ред


рдЕрдВрдд рдореЗрдВ, рд╣рдо рдПрдХ рдбреЗрдЯрд╛ рдлреНрд░реЗрдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ (рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд┐рд░ рддрд┐рдЧреБрдирд╛ , рд▓реЗрдХрд┐рди рдЕрдВрддрд░ рд▓реЗрдЦ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдкрд░реЗ рд╣реИ), рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдбреЗрдЯрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпрд╛рдиреА рдХрд┐рд╕ рд╕реНрдЯреЛрд░реЗрдЬ рд╕рд┐рд╕реНрдЯрдо рдкрд░, рдХрд┐рд╕ рдбрд┐рд╕реНрдХ рдкрд░, рдХрдм рдХреНрдпрд╛ рддреНрд░реБрдЯрд┐ рд╣реБрдИред


рдЕрдВрддрд┐рдо рджреГрд╢реНрдп рдбреЗрдЯрд╛ рдлрд╝реНрд░реЗрдо
 > errors_df # A tibble: 2,705 x 8 cl Storage Date Time Disk Error eCode DateTime <chr> <chr> <date> <chr> <chr> <chr> <chr> <dttm> 1 XclNam~ XStorageN~ 2019-07-18 12:09:~ 0_1_3 Soft_SCSI_~ 801 2019-07-18 12:09:55 2 XclNam~ XStorageN~ 2019-07-18 15:09:~ 0_1_3 Soft_SCSI_~ 801 2019-07-18 15:09:56 3 XclNam~ XStorageN~ 2019-07-18 16:28:~ 0_1_3 Soft_SCSI_~ 801 2019-07-18 16:28:50 4 XclNam~ XStorageN~ 2019-07-19 06:36:~ 0_1_6 Soft_SCSI_~ 801 2019-07-19 06:36:39 5 XclNam~ XStorageN~ 2019-07-19 20:57:~ 0_1_6 Soft_Media~ 820 2019-07-19 20:57:35 6 XclNam~ XStorageN~ 2019-07-22 11:00:~ 0_2_~ Soft_SCSI_~ 801 2019-07-22 11:00:43 7 XclNam~ XStorageN~ 2019-07-22 11:00:~ 0_2_~ Soft_SCSI_~ 801 2019-07-22 11:00:44 8 XclNam~ XStorageN~ 2019-07-22 12:02:~ 0_2_~ Soft_SCSI_~ 801 2019-07-22 12:02:31 9 XclNam~ XStorageN~ 2019-07-23 23:29:~ 0_3_8 Soft_SCSI_~ 801 2019-07-23 23:29:49 10 XclNam~ XStorageN~ 2019-07-13 00:01:~ 0_3_9 Soft_SCSI_~ 801 2019-07-13 00:01:46 # ... with 2,695 more rows 

рд╕рдмрд╕реЗ рдЪрддреБрд░ рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╕рднреА рднрдВрдбрд╛рд░рдг рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдорддрджрд╛рди рдХрд╛ рдкреВрд░рд╛ рдЪрдХреНрд░ 30 рдорд┐рдирдЯ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ 30 рд╕реЗрдХрдВрдб рдХрд╛ рд╣реЛрддрд╛ рд╣реИ ред


рднрдЧрд╡рд╛рди рдХрд╛ рд╢реБрдХреНрд░ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдЬрдм 30 рд╕реЗрдХрдВрдб рдмрд╣реБрдд рддреЗрдЬ рд╣реИред
рдПрдХ рдордЬрд╛рдХ


рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдкрд╛рд╡рд░рд╢реЗрд▓ рдХреЛрдб рдиреЗ рдПрдХ рдЪрдХреНрд░ рдореЗрдВ рд╕рднреА рднрдВрдбрд╛рд░рдг рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рд╕реЗ рдбрд┐рд╕реНрдХ рдХреЗ рд╕реАрд░рд┐рдпрд▓ рдирдВрдмрд░ рднреА рдПрдХрддреНрд░ рдХрд┐рдП, рдФрд░ рдЖрд░ рдкрд░ рдХреЛрдб рдХреЛ рдкреБрди: рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдордп , рдпрд╣ рдбреЗрдЯрд╛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдерд╛ред рдЗрд╕рд▓рд┐рдП рд░рдирдЯрд╛рдЗрдо рддреБрд▓рдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдИрдорд╛рдирджрд╛рд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рд╣реИред


4-5ред рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рдбреЗрдЯрд╛ рд░реВрдкрд╛рдВрддрд░рдгред рдПрдХ xlsx рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдмрдирд╛рдирд╛


рдкрд┐рдЫрд▓реЗ 3 рджрд┐рдиреЛрдВ рдФрд░ рд╕рд╛рде рд╣реА рдкрд┐рдЫрд▓реЗ рдорд╣реАрдиреЗ рдкрд░ рд╕реНрд░реЛрдд рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП xlsx рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд░реВрдкрд╛рдВрддрд░рдг рдХрдо рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рддреНрд░реБрдЯрд┐ рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдХреЙрд▓рдо рдХреЛ "рдХреНрд╖реИрддрд┐рдЬ" рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддрд╛рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рдПрдХ рдЕрд▓рдЧ рдХреЙрд▓рдо рдореЗрдВ рд╣реЛред рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ (рдЗрд╕рд▓рд┐рдП 2 рдмрд╛рд░ рдПрдХ рд╣реА рдЪрд░рдг рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ)


рд╕реНрд░реЛрдд рдЫрд╛рдирдиреЗ рдХрд╛ рдХрд╛рд░реНрдп
 myErrorStats <- function(data, period, orderColname = quo(Soft_Media_Error)) { data %>% filter(Date > period) %>% group_by(cl, Storage, Disk, Error) %>% summarise(count = n()) %>% spread(Error, count, fill = 0) %>% arrange(desc(!!orderColname)) } 

рдПрдХ рдЕрд▓рдЧ рдХреЙрд▓рдо рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рд╕рд╛рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреБрдВрдЬреА рднрд░рдг = 0 рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд▓рд╛рдкрддрд╛ рдорд╛рди 0 рд╕реЗ рднрд░реЗ рдЧрдП рдереЗред рдЗрд╕ рдХреБрдВрдЬреА рдХреЗ рдмрд┐рдирд╛, рдпрджрд┐ рдХрд┐рд╕реА рджрд┐рди рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рддреЛ рд╕рдВрдмрдВрдзрд┐рдд рдХреЙрд▓рдо рдореЗрдВ NA рдорд╛рди рд╣реЛрдВрдЧреЗред


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рдореИрдВ рдПрдХ рдЪрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЙрд▓рдо рдирд╛рдо рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА рдЗрд╕ рдЪрд░ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рднреА рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдЕрдЬреАрдмреЛрдЧрд░реАрдм рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдк рдпрд╣рд╛рдВ рдФрд░ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред


рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрдм рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕реЗ рдЙрджреНрдзреГрдд рдХрд░рддреЗ рд╣реИрдВ ( рдЖрджреЗрд╢Colname = quo (Soft_Media_Error) ), рдФрд░ рдлрд┐рд░, рдЬрдм рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрд╕рдХреЗ рд╕рд╛рдордиреЗ рд╡рд░реНрдг рдбрд╛рд▓реЗрдВ !! рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (desc (!! orderColname)) ред


рдорд╣реАрдиреЗ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рддрд╛рд▓рд┐рдХрд╛ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐
 > errorsBigPeriod # A tibble: 77 x 7 cl Storage Disk Hard_SCSI_Bus_E~ Recommend_Disk_~ Soft_Media_Error <chr> <chr> <chr> <dbl> <dbl> <dbl> 1 XclN~ XStora~ 1_1_~ 0 1 64 2 XclN~ XStora~ 0_2_5 0 0 29 3 XclN~ XStora~ 1_1_~ 0 1 29 4 XclN~ XStora~ 0_3_2 0 0 27 5 XclN~ XStora~ 0_3_~ 1 0 25 6 XclN~ XStora~ 1_3_5 0 1 23 7 XclN~ XStora~ 0_2_9 0 0 21 8 XclN~ XStora~ 0_3_4 0 0 14 9 XclN~ XStora~ 0_1_~ 0 0 14 10 XclN~ XStora~ 1_0_1 0 0 12 # ... with 67 more rows, and 1 more variable: Soft_SCSI_Bus_Error <dbl> 

рдореИрдВрдиреЗ рд╡реАрдПрдо рдХреА рд╕реНрдерд┐рддрд┐ рдкрд░ рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рд▓реЗрдЦ рдореЗрдВ xlsx рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рдЧрдарди рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдирд╣реАрдВ рдмрддрд╛рдКрдВрдЧрд╛ред рд╕рднреА рдХреЛрдб рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рджрд┐рдП рдЧрдП рд╣реИрдВред



рдпрд╣рд╛рдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рд░рд┐рдкреЛрд░реНрдЯ рдХреА рдкрдардиреАрдпрддрд╛ рдХреЛ рдмрдврд╝рд╛рддреА рд╣реИрдВ:


  • рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдЯреИрдм (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдЦреБрд▓рд╛ рд╣реИ);
  • рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдП рдЧрдП рд╕реНрддрдВрдн рдирд╛рдо
  • рд╕рднреА рд╕реНрддрдВрднреЛрдВ рдХреЛ рд╕реНрд╡рдд: рд╕реНрд╡рд░реВрдкрд┐рдд рдХрд░рдирд╛ рддрд╛рдХрд┐ рд╕рднреА рдкрд╛рда рд╕реНрддрдВрднреЛрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдП рдмрд┐рдирд╛ рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рд╣реЛред

6. рдПрдХ рд╢реЗрдбреНрдпреВрд▓ рдмрдирд╛рдПрдВ рдЬрд┐рд╕реЗ рд╣рдо png рдореЗрдВ рд╕реЗрд╡ рдХрд░рддреЗ рд╣реИрдВ


рдЧреНрд░рд╛рдл рдкрд░, рдореИрдВ рд╕рднреА рднрдВрдбрд╛рд░рдг рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐ рджрд┐рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдбреНрд░рд╛рдЗрдВрдЧ рдЯреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ, рдорд╛рдирдХ ggplot2 рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ред


рдЧреНрд░рд╛рдл рдХреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдиреЗ рдПрдХ рдЧреНрд░рд╛рдл рдкрд░ рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рджрд┐рдЦрд╛рдпрд╛ рдФрд░ рдЗрд╕ рддрд░рд╣ рджреЗрдЦрд╛:



рд╕рд╣рдХрд░реНрдорд┐рдпреЛрдВ рдиреЗ рдХрд╣рд╛ рдХрд┐ рдпрд╣ рдЕрдкрдардиреАрдп рд╣реИред
рд╡реЗ рдХреНрдпрд╛ рд╕рдордЭреЗрдВрдЧреЗ? !!!!
рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рдФрд░ facet_grid рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдорд╛рдирдХ рдХреЙрд▓рдо ( geom_bar ) рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рддрд╛рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдХреЛ рддреНрд░реБрдЯрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЕрд▓рдЧ рд░реЗрдЦрд╛рдВрдХрди рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рд╕рднреА рдХреЗ рдЕрдиреБрдХреВрд▓ рдерд╛ред


рд╕рд╛рд░рд╛рдВрд╢ рдЕрдиреБрд╕реВрдЪреА


рдбреЗрдЯрд╛ рдХреА рддреИрдпрд╛рд░реА, рд░реЗрдЦрд╛рдВрдХрди, рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╣реЗрдЬрдирд╛
 ####   #### #       errorsTotal <- errors_df %>% group_by(Date, Error) %>% summarise(count = n()) %>% # spread(Error, count, fill = 0) %>% arrange(desc(Date)) #        . #       ,   . plot <- errorsTotal %>% ggplot(aes(x = Date, y = count, fill = Error)) + geom_bar(stat = "identity", width = 0.5, color = "grey") + theme_minimal() + # theme(legend.position="top") + scale_color_grey() + labs(title = "  EMC VNX", subtitle = "        ", fill = " ") + xlab("") + ylab("   ") + scale_fill_brewer(palette = "Spectral") + facet_grid(rows = vars(factor( Error, levels = c( "Soft_SCSI_Bus_Error", "Soft_Media_Error", "Hard_SCSI_Bus_Error", "Recommend_Disk_Replacement" ) ))) # #   # plot #   png,     plot_filePath <- file.path("results", "plot.png") #    png     ggsave(filename = plot_filePath, plot = plot) 

рдЕрдиреБрд╕реВрдЪреА рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рд╕реЗред


рдореИрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдЪрд╛рд░реНрдЯ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХреНрд░рдо рдореЗрдВ рд╣реЛрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, facet_grid рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдПрдХ рдХрд╛рд░рдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдЖрджреЗрд╢рд┐рдд рдХрд╛рд░рдХ рднреА ред рдлреИрдХреНрдЯрд░ рдЖрд░ рдореЗрдВ рдПрдХ рдЪрд╛рд▓рд╛рдХ рдбреЗрдЯрд╛ рдкреНрд░рд╛рд░реВрдк рд╣реИ, рдЬреЛ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рддрд╛рд░, рдпрд╛рдиреА рдЪрд░рд┐рддреНрд░- s), рдФрд░ рдЗрди рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕реЗрдЯ рдХреЛ рдХрдбрд╝рд╛рдИ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдХрд╛рд░рдХ рд╕реНрддрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ), рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрди рд╕реНрддрд░реЛрдВ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЬрдЯрд┐рд▓ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рдорд╣реАрдиреЗ рдореЗрдВ рдЧрд┐рд░ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдСрд░реНрдбрд░ рдХрд┐рдП рдЧрдП рдХрд╛рд░рдХ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдпрд╛рдиреА рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдорд╣реАрдиреЛрдВ рдХреЗ рдирд╛рдо рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдпрд╣ рднреА рдЬрд╛рдирддреЗ рд╣реИрдВ (рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ) рдХрд┐ рдкрд╣рд▓реЗ рдЬрдирд╡рд░реА рдЖрддрд╛ рд╣реИ, рдлрд┐рд░ рдлрд░рд╡рд░реА, рдлрд┐рд░ рдорд╛рд░реНрдЪ, рдЖрджрд┐ред рдпрд╣ рдЙрд╕реА рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░ рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рдХрд╛рд░рдХ рдмрдирд╛рддреЗ рд╣реИрдВред


7-8ред рд╣рдо рдПрдХрддреНрд░рд┐рдд рдбреЗрдЯрд╛ рдпреБрдХреНрдд рдПрдХ рдкрддреНрд░ рдмрдирд╛рддреЗ рд╣реИрдВред рдПрдХ рдкрддреНрд░ рднреЗрдЬреЗрдВ


рд╡реАрдПрдо рдХреА рд╕реНрдерд┐рддрд┐ рдкрд░ рд░рд┐рдкреЛрд░реНрдЯреЛрдВ рдкрд░ рд▓реЗрдЦреЛрдВ рдХреЗ рдЧрдарди рдФрд░ рднреЗрдЬрдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╡рд┐рдВрдбреЛрдЬ рд╢реЗрдбреНрдпреВрд▓рд░ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЧрдарди рдкрд░ рднреА рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ред рд╣рдо рдмрд╕ рдкрд╛рда рдореЗрдВ рдХреБрдЫ рдЪрд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд▓рдЧрд╛рд╡ рдХреЛ рди рднреВрд▓реЗрдВред


рдкрддреНрд░ рдХрд╛ рдЕрдВрддрд┐рдо рд░реВрдк


рдирд┐рд╖реНрдХрд░реНрд╖


рд░реЛрдЬрдорд░реНрд░рд╛ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд░рдиреЗ рдФрд░ рдЙрдирдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд░ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдЙрдкрдХрд░рдг рд╕рд╛рдмрд┐рдд рд╣реБрдЖред рдФрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде, рдпрд╣ рдЙрдкрдХрд░рдг рднреА рддреЗрдЬ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрднреНрдпрд╛рд╕ рд╕реЗ рдпрд╣ рднреА рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдкрд╛рд╡рд░рд╢реЗрд▓ рд▓реЙрдЧ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдореЗрдВ рдмреЗрд╣рдж рдзреАрдорд╛ рд╣реИред
рдЕрдВрдд рддрдХ рдЗрддрдиреЗ рд╕рд╛рд░реЗ рдкрддреНрд░ рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдХреЛ рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред


рдкреВрд░реНрдг рдЖрд╡реЗрджрди рдХреЛрдб


рдлреБрд▓ рдЖрд░ рдПрдкреНрд▓реАрдХреЗрд╢рди рдХреЛрдб
 #### ENV #### #         (    system32) setwd("C:\\Scripts\\VNX_disks_check/") #   library(tidyverse) library(lubridate) library(zoo) library(stringi) library(xlsx) library(mailR) library(foreach) library(doParallel) #### CONST #### #            vnxIPfilePath <- file.path("data", "VNX-IP.csv") #     bigPeriod <- Sys.Date() - 30 #     smallPeriod <- Sys.Date() - 3 #    productCls <- c("name1", "name2", "name3") #   IP VNX. #         , #   ip        . VNX_ip <- vnxIPfilePath %>% read_csv2( col_types = cols( Name = col_character(), IP = col_character(), cl = col_character(), type = col_character(), newA = col_character(), newB = col_character(), oldA = col_character(), oldB = col_character() ) ) %>% filter(cl %in% productCls) %>% gather(key = "cntName", value = "cntIP", 5:6) ####    VNX #### #         (      ) # NaviSECCli.exe -scope 0 -h 10.201.16.15 -user root -password Secrt4yo getlog -date 07/16/2019 07/17/2019 #   ,   . #      ,       errorNumbers <- c("\\(820\\)", "\\(803\\)", "\\(801\\)", "\\(920\\)", "\\(901\\)") ##   ## #         numCores <- detectCores() registerDoParallel(numCores) #    ,   NaviCLI #  1    ,     "" , # ..   ,      ,     . bigPeriodForm <- bigPeriod %>% format(format = "%m/%d/%Y") currDateForm <- (Sys.Date() + 1) %>% format(format = "%m/%d/%Y") #    . #      VNX   ip   . #      ,      #   ,      dataframe #  %dopar%   . #    ,   system.time   , #    %dopar%  %do%.      4-5. # system.time({ errors_df <- foreach(i = 1:nrow(VNX_ip), .combine = rbind, .packages = "tidyverse") %dopar% { errors_raw <- system( paste( "NaviSECCli.exe -scope 0 -h", VNX_ip$cntIP[i], "-user myusername -password mypassword getlog -date", bigPeriodForm, currDateForm ), intern = TRUE ) %>% str_subset(pattern = regex(paste0(errorNumbers, collapse = "|"))) #      ,       if (length(errors_raw) > 0) { #       , #     , #       . errorsDescr <- errors_raw %>% gsub("(.*\\) )(.*)(\\s+\\[.*)", "\\2", x = .) %>% trimws() %>% gsub('([[:punct:]])|\\s+', '_', .) #           errors <- errors_raw %>% str_split(pattern = "\\s+", simplify = T) %>% as_tibble() %>% mutate(Disk = paste0(V4, "_", V6, "_", V8) %>% gsub( pattern = "\\([0-9]{3}\\)", replacement = "", x = .) ) #  dataframe    data_frame(cl = VNX_ip$cl[i], Storage = VNX_ip$Name[i], Date = errors$V1 %>% as.Date(format = "%m/%d/%Y"), Time = errors$V2, Disk = errors$Disk, Error = errorsDescr, eCode = errors$V8 %>% str_extract(paste0(errorNumbers, collapse = "|")) %>% str_extract("[0-9]+")) %>% mutate(DateTime = as.POSIXct(paste(Date, Time), format = "%Y-%m-%d %H:%M:%S")) } } # }) #     .      ,    . stopImplicitCluster() ####  #### #    .    ,     .  . # https://dplyr.tidyverse.org/articles/programming.html myErrorStats <- function(data, period, orderColname = quo(Soft_Media_Error)) { data %>% filter(Date > period) %>% group_by(cl, Storage, Disk, Error) %>% summarise(count = n()) %>% spread(Error, count, fill = 0) %>% arrange(desc(!!orderColname)) } #           .  . errorsBigPeriod <- errors_df %>% myErrorStats(bigPeriod) #             errorsSmallPeriod <- errors_df %>% myErrorStats(smallPeriod) #   ,     errors_filePath <- file.path("results", "VNX_Errors.xlsx") ####  xlsx  #### #    wb<-createWorkbook(type="xlsx") #         TABLE_ROWNAMES_STYLE <- CellStyle(wb) + Font(wb, isBold=TRUE) TABLE_COLNAMES_STYLE <- CellStyle(wb) + Font(wb, isBold=TRUE) + Alignment(wrapText=TRUE, horizontal="ALIGN_CENTER") + Border(color="black", position=c("TOP", "BOTTOM"), pen=c("BORDER_THIN", "BORDER_THICK")) #  t s sheetSmall <- createSheet(wb, sheetName = " 3 ") sheetBig <- createSheet(wb, sheetName = " ") sheetRaw <- createSheet(wb, sheetName = " ") ##   addDataFrame( errorsSmallPeriod %>% as.data.frame(), sheetSmall, startRow = 1, startColumn = 1, row.names = FALSE, byrow = FALSE, colnamesStyle = TABLE_COLNAMES_STYLE, rownamesStyle = TABLE_ROWNAMES_STYLE ) addDataFrame( errorsBigPeriod %>% as.data.frame(), sheetBig, startRow = 1, startColumn = 1, row.names = FALSE, byrow = FALSE, colnamesStyle = TABLE_COLNAMES_STYLE, rownamesStyle = TABLE_ROWNAMES_STYLE ) #          DateTime     addDataFrame( errors_df %>% as.data.frame() %>% arrange(desc(DateTime)), sheetRaw, startRow = 1, startColumn = 1, row.names = FALSE, byrow = FALSE, colnamesStyle = TABLE_COLNAMES_STYLE, rownamesStyle = TABLE_ROWNAMES_STYLE ) #  ,     autoSizeColumn(sheet = sheetSmall, colIndex=c(1:ncol(errorsSmallPeriod))) autoSizeColumn(sheet = sheetBig, colIndex=c(1:ncol(errorsBigPeriod))) autoSizeColumn(sheet = sheetRaw, colIndex=c(1:ncol(errors_df))) #     .   - . if (file.exists(errors_filePath)) {file.remove(errors_filePath)} #  xlsx  saveWorkbook(wb, errors_filePath) ####   #### #       errorsTotal <- errors_df %>% group_by(Date, Error) %>% summarise(count = n()) %>% # spread(Error, count, fill = 0) %>% arrange(desc(Date)) #         plot <- errorsTotal %>% ggplot(aes(x = Date, y = count, fill = Error)) + geom_bar(stat = "identity", width = 0.5, color = "grey") + theme_minimal() + # theme(legend.position="top") + scale_color_grey() + labs(title = "  EMC VNX", subtitle = "        ", fill = " ") + xlab("") + ylab("   ") + scale_fill_brewer(palette = "Spectral") + facet_grid(rows = vars(factor( Error, levels = c( "Soft_SCSI_Bus_Error", "Soft_Media_Error", "Hard_SCSI_Bus_Error", "Recommend_Disk_Replacement" ) ))) # #   # plot #   png,     plot_filePath <- file.path("results", "plot.png") #    png     ggsave(filename = plot_filePath, plot = plot) ####    #### #    emailRecepientsList <- c("sendall-tech@domain.ru") #      emailParams <- list( from = "login@domain.ru", to = emailRecepientsList, smtpParams = list( host.name = "10.10.10.1", port = 25, user.name = "login@domain.ru", passwd = "mypassword", ssl = FALSE ) ) #     (    ). #     ,          ,     . errorsTotal <- errorsSmallPeriod[-c(1,2,3)] %>% sum() #    emailBody <- paste0( '<html> <h3> ,  .</h3> <p>  3    <strong>', errorsTotal, '</strong>    EMC VNX</p> <p>       ,      .</p> <p>  3 : <ul> <li>   3 .   <strong>Soft_Media_Error</strong>.</li> <li>  30 .   <strong>Soft_Media_Error</strong>.</li> <li> .   <strong></strong>.</li> </ul>          .   .</p> <p><img src="', plot_filePath, '"></p> </html>' ) ####      #### send.mail(from = emailParams$from, to = emailParams$to, subject = "     EMC VNX", body = emailBody, encoding = "utf-8", html = TRUE, inline = TRUE, smtp = emailParams$smtpParams, authenticate = TRUE, send = TRUE, attach.files = c(errors_filePath), debug = FALSE) 


  • : EMC VNX 5300
  • : NaviCLI-Win-32-x86-en_US-7.31.25.1.29-1
  • , : 4*2 CPU, 8 Gb RAM

R
 > sessionInfo() R version 3.5.3 (2019-03-11) Platform: x86_64-w64-mingw32/x64 (64-bit) Running under: Windows Server 2012 R2 x64 (build 9600) Matrix products: default locale: [1] LC_COLLATE=Russian_Russia.1251 LC_CTYPE=Russian_Russia.1251 LC_MONETARY=Russian_Russia.1251 [4] LC_NUMERIC=C LC_TIME=Russian_Russia.1251 attached base packages: [1] parallel stats graphics grDevices utils datasets methods base other attached packages: [1] taskscheduleR_1.4 pander_0.6.3 doParallel_1.0.14 iterators_1.0.10 foreach_1.4.4 mailR_0.4.1 [7] xlsx_0.6.1 stringi_1.4.3 zoo_1.8-6 lubridate_1.7.4 wesanderson_0.3.6 forcats_0.4.0 [13] stringr_1.4.0 dplyr_0.8.3 purrr_0.3.2 readr_1.3.1 tidyr_0.8.3 tibble_2.1.3 [19] ggplot2_3.2.0 tidyverse_1.2.1 loaded via a namespace (and not attached): [1] tidyselect_0.2.5 reshape2_1.4.3 rJava_0.9-11 haven_2.1.1 lattice_0.20-38 colorspace_1.4-1 [7] vctrs_0.2.0 generics_0.0.2 utf8_1.1.4 rlang_0.4.0 R.oo_1.22.0 pillar_1.4.2 [13] glue_1.3.1 withr_2.1.2 R.utils_2.9.0 RColorBrewer_1.1-2 modelr_0.1.4 readxl_1.3.1 [19] plyr_1.8.4 munsell_0.5.0 gtable_0.3.0 cellranger_1.1.0 rvest_0.3.4 R.methodsS3_1.7.1 [25] codetools_0.2-16 labeling_0.3 fansi_0.4.0 xlsxjars_0.6.1 broom_0.5.2 Rcpp_1.0.1 [31] scales_1.0.0 backports_1.1.4 jsonlite_1.6 digest_0.6.20 hms_0.5.0 grid_3.5.3 [37] cli_1.1.0 tools_3.5.3 magrittr_1.5 lazyeval_0.2.2 crayon_1.3.4 pkgconfig_2.0.2 [43] zeallot_0.1.0 data.table_1.12.2 xml2_1.2.0 assertthat_0.2.1 httr_1.4.0 rstudioapi_0.10 [49] R6_2.4.0 nlme_3.1-137 compiler_3.5.3 

Source: https://habr.com/ru/post/hi461441/


All Articles