αα½ααααΈ α αΆα! αααα»αααΌααααα αΆαααΌαα’αααααΌαααΆαααααααα’ααααα
αααα»αβαααααΆβααΆβααΆβαα·αβαααβααΆ oxymoron"
ααααΌααααΆαααααααααααα·ααΈαααααααα·αααααα» αα·ααα»αααΆαα’αΆα α αΆααααΌα ααΆααΆαααααααααααΆαα αα·ααα αα ααα»ααααααΆααααΈαααααΌαααΆαααΆααααααααΎααααΆαα αααα»α Powershell α ααααΎααααααααααΆααΆααααααααααα·ααΈααΆααα’αα ααΆααα»αααΆα α¬α’αα ααΆααααααααααααΆααααααΆααααααααααααααααααα ααααΆαα ααΌα ααΆαα ααΆαααααααα αα·ααααααααααΆ ααααΆααααααΆαα·ααΈααΆααααααα½αα ααααα·αααΎααΎααααααααΆαααααΎααααΆαα Classes ααααααΎααα ααΉαααΆαα αααααααα αα·αααααα α αΎααααααΆαααΆαααααααααααα·ααΈααααααααααα·αααααα»ααααααααΌα ααΆ inheritance, polymorphism α¬ mutability αααααΎαα’αΆα ααΆαααα’αααααααααααααΈα’αααααααααααααααααΆααααα·αααααΎα’ααααΌαααααααΎαααΆαααΆααααα»αααααΆαα ααΎαααΈααα ααΆααααααΆααααααααα·ααΈααΆααααααααααααααααααααααα·αα’αΆα ααααααααΆα ααΎαα’αΆα αααααΉαααΌααα»αααΆαααααααΎαααΆαα½αααΉα Classesα
αααααααααααααα
Castes ααΊααΆαα»αααΆαααααΆαα₯αααα·αααααα»ααα½ααα αααα»α Powershellα αα αααα’ααααααααααα α’ααααααα»αααΉαααα’ααααΎααΆαα αΆααααααΎα αα·ααααααααΆααααααΆαααααααααααααα αααααα·ααααΆααααααααα αααααα·ααΈααααα’αααα α§ααΆα ααα ααΆαβαααα αΌαβααααα’ααααβαααα»α [xml] ααΉαβααααΎαααΆαβααΆβααΆαβαααβααΌαβααα α αΎαβαααααΎαβαααααΆα xml ααααααα ααΎαα’αΆα ααααΎ Classes αααα»αααΌαααααααΎααααααΆαααααααααααΌα ααααΆα
ααΆα hashables
ααααα·αααΎα’ααααα·αααΆα constructor α’αααα’αΆα αααααααααααΆααα½ααααααΆαα hashable αα αααααα class ααααα’αααα αα»αααααα ααααΎαα»ααααααααα»ααααΆα ααΎααααΈααΆαααα’αααααααααααααααααααΈααααΌαααα αααα»ααααααΆαα½αααααΆααα ααΎαα’αΆα ααααΎααααααααααααα·αααααΆαααΆααααα αΌαααααααααΆαα ααΎααααΈααααΎαααΆαααΌααααΈααααΆαα αΆααααααΎα αα·ααααααα·ααααΆαα»ααααΆαααΆαααααααΈααααα α
class Cluster {
[ValidatePattern("^[A-z]+$")]
[string] $Service
[ValidateSet("TEST", "STAGE", "CANARY", "PROD")]
[string] $FlightingRing
[ValidateSet("EastUS", "WestUS", "NorthEurope")]
[string] $Region
[ValidateRange(0, 255)]
[int] $Index
}
[Cluster]@{
Service = "MyService"
FlightingRing = "PROD"
Region = "EastUS"
Index = 2
}
ααΎαααΈααααααααΆαααΆααα½αα±ααααα½αααΆαααααααααα’αΆαα αααααααααααααααα Cluster hashtable array αααααΆααααααΌααα ααΆαα Format-Table ααΆαα½αααΉαα’αααΈαααα’αααααα½αααΆα ααααα·αααΎα’αααααα hashtables ααΆαααααααΆααΎαααααΌααα αααα»αααααΆαααα½αα ααααααααααααα·ααααααΆαααααααααααΌαααΆαααΆααααα»αααααΆααααααα½αααΆααααΌαααΆαααααααα ααΈαααα αα»αααααα ααααααααΆααααααααΉααααααΆαααα»ααααααααααααααα·ααΆααα’αααααα’ααααα·αα ααααΎααα αααα»αααααααα
ααΆααααα ααα’αααααα
ααααα·αααΎα’αααααΆα constructor αααααΆαα’αΆαα»ααααααα½α ααΆααααααΌαααααααα αααααα class ααααα’αααααΉααααααΌαααααααα constructor ααααα’ααα αααααΆαααααααααα’αααα’αΆα α αΆααααααΎα instance αα class ααααα’αααα
class Cluster {
[ValidatePattern("^[A-z]+$")]
[string] $Service
[ValidateSet("TEST", "STAGE", "CANARY", "PROD")]
[string] $FlightingRing
[ValidateSet("EastUS", "WestUS", "NorthEurope")]
[string] $Region
[ValidateRange(0, 255)]
[int] $Index
Cluster([string] $id) {
$this.Service, $this.FlightingRing, $this.Region, $this.Index = $id -split "-"
}
}
[Cluster]"MyService-PROD-EastUS-2"
ααααα αααααΆαα
α’αααααα’αΆα ααα·ααααα·ααΈααΆαααααααααΆαα [string] ToString() ααΎααααΈααααααααααα·ααααΆαα ααΈαααααααΆαααααΆαααααα’ααααααααααααα» ααΌα ααΆααΆαααααΎααΆααααα αΌαααααα’ααααααΆααΎαα
class Cluster {
[ValidatePattern("^[A-z]+$")]
[string] $Service
[ValidateSet("TEST", "STAGE", "CANARY", "PROD")]
[string] $FlightingRing
[ValidateSet("EastUS", "WestUS", "NorthEurope")]
[string] $Region
[ValidateRange(0, 255)]
[int] $Index
[string] ToString() {
return $this.Service, $this.FlightingRing, $this.Region, $this.Index -join "-"
}
}
$cluster = [Cluster]@{
Service = "MyService"
FlightingRing = "PROD"
Region = "EastUS"
Index = 2
}
Write-Host "We just created a model for '$cluster'"
ααΆαααααΈαααααΆααααΆαααααΈ
Cast α’αα»ααααΆαα±ααααΆαααΆααααααΆαααααα»ααααα·ααΆαα α§ααΆα αααααΆααααααααΉααααΆααα ααααα·αααΎαα·αααααααα·ααααααααΆαααΆααααααΆααααααααΎααα αααα»α Cluster
# ΠΠ°Π»ΠΈΠ΄Π°ΡΠΈΡ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΡ
Π΄Π°Π½Π½ΡΡ
[Cluster]$cluster = Get-Content "./my-cluster.json" | ConvertFrom-Json
[Cluster[]]$clusters = Import-Csv "./my-clusters.csv"
Castes αα αααα»αααΌααα»αααΆαααααα’αααα
αααααα·ααΈαα»αααΆαααααΌαααααααα ααΆαααααααααα·αααααα αααααΆααααα’αα»αααααααααα·ααΈααΆααααΆααααααΆαααααΆααααααΌαααΎαα ααΆαααααααααα·ααααααααααα·αα’αΆα ααααΆααααααΌαααΆαα αααααΈααΆααΆαααΆαα αΆααα’αΆαααααααααα»αααααΆααααα ααααΆαααα·αααΆαα½αα’ααααααα»αααΆααααααααΌααα»αααΆα α’ααα»αα ααααααΆαααΆααααα αΌααα·ααΈααΆααααααααααααα
ααΎ Powershell ααααααα»ααααα»ααααααααΆααα»αααΆααα?
ααα»αααααΆα αααΎααααααααΈ C# α¬ααααααΆααααααααααααααααΆαααα»αααααα Powershell αααααααααααΉα C# α ααΆααααααΆαααααΎααΌα ααα α’ααααααα»αααΆαα ααααΈααΆαααααΎααααΆαααααα·ααααααα·ααΈαα»αααΆα α αΎαααααααΆααΉαααα½αααΆαα’αααααααααααααΈααΆαααααα»αααΉααααΆαααααΆαααα αααα»ααααααα·ααΈαααααααα·αααααα»αα αααα»α Powershell α¬ααααααααααααααα’αααΈααΆαααααααααααα·ααΈαα»αααΆαα
ααααα·αααΎα’αααααΉαααα’ααααααΆααααΎααΆαααααααααα·ααααααααααα·αα’αΆα ααααΆααααααΌαααΆααααααααΎααααα (|), Where-Object, ForEach-Object, Select-Object, Group-Object, Sort-Object ααα ααααΆαααα αααα»ααα ααΆααααααα»αααΆαα
ααΆαααααΎααααΆαααα»αααΆαααααααΆαα
ααααα αααααΈααΆαα½αααααααΎααΆααααααααααααααα½αααααα ααΊααααΆααααααΆααΆαααΌααααααΈαααΆααααααΈαααα»αααααα αα αααα»αααααααααα αΌα α’αααα’αΆα ααΌααααααΈα’αΆααααααααααααααααΎ ForEach-Object α
αααα»αα§ααΆα αααααΆαααααα Node constructor ααααΌαααΆαααααα·ααααα·ααΆαααααααα Datum ααααΌαααΆαααα α αΎαααααααααα±ααααΎαααΌαα±ααΆαααΎααααΈαααααΆαααΆααααααααΌαα ααα½αααααααα ααΆαααααα ααααααααα αΌααααααααααααΎααααααααΎααΆαααΆααα½ααα·αααααα αα·αααΆααααααΌααααα»αααααααααΆα ααααααααααΆααααααααΎαααα α·ααααα»αααΆααααΎααΆααα·ααΆααα·αααααα αα·ααα»ααααΆαα
# ΠΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΊΠ»Π°ΡΡΠΎΠ² Ρ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ°ΠΌΠΈ Π΄Π»Ρ separation of concerns Π² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ°Ρ
class Node {
[ValidateLength(3, 7)]
[string] $Name
[ValidateSet("INT", "PPE", "PROD")]
[string] $FlightingRing
[ValidateSet("EastUS", "WestUS", "NorthEurope", "WestEurope")]
[string] $Region
Node([string] $Name) {
$Name -match "([a-z]+)(INT|PPE|PROD)([a-z]+)"
$_, $this.Service, $this.FlightingRing, $this.Region = $Matches
$this.Name = $Name
}
}
class Datum {
[string] $Name
[int] $Value
[Node] $Computer
[int] Severity() {
$this.Name -match "[0-9]+$"
return $Matches[0]
}
}
Write-Host "Urgent Security Audit Issues:"
Import-Csv "./audit-results.csv" `
| ForEach-Object {[Datum]$_} `
| Where-Object Value -gt 0 `
| Group-Object {$_.Severity()} `
| Where-Object Name -lt 2 `
| ForEach-Object Group `
| ForEach-Object Computer `
| Where-Object FlightingRing -eq "PROD" `
| Sort-Object Name, Region -Unique
ααααΆααααα ααα αααααααΆααααααΎα‘αΎααα·α
ααααΆαα’αααΈααα’ααΌα αααααΆα αΆααααΌα ααΆαααααα
ααΆα’αα»αα ααααΆαααα·αα’αΆα ααΆαα ααααααααΌαα»αααΆαααααααΌα ααααΆααΉααα»αααΆα α¬α’αααα ααα»ααααααΆααααα·α αα½αα ααα½αα α αΌααα·ααΆαααΆααααΆααααααα’αααααααΌαααΆαααααααα αααα»αα―αααΆα ./my-classes.ps1
-
α’αααα’αΆα dotsource α―αααΆαααΆαα½αααααΆααα. ./my-classes.ps1. ααΆααΉαααααΎαααΆα my-classes.ps1 αα αααα»ααα·ααΆαααΆααα αα α»ααααααααααα’ααα α αΎααααααααααΆααααΆααα’ααααΈα―αααΆααα ααΈαααα
-
α’αααα’αΆα αααααΎααααΌαα»α Powershell αααααΆαα αα API ααααΆαααααα½αααααα’αααααΆααα’αα (cmdlets) α αΎααααααα’ααα ScriptsToProcess = "./my-classes.ps1" αα αααα»αααΆααααα αΆααααΌαα»αααααα’ααα ααΆαα½αααΉαααααααααΌα ααααΆα ./my-classes.ps1 ααΉαααααα·ααααα·αααα»α ααα·ααααΆαααααα’αααα
αααααΎαααΆαα½ααααα’αααααααΎαααΎα ααΌαα
αΆαααΆαααααααααααααααααα Powershell αα·αα’αΆα
αααααααΆααααααααααααααααΌα
ααααΆαααααΆααααα»αααΈαααααααααααααααΆαααααα
αααααΈααΆα’ααααααα»αααααΆααααΌα
ααααΆααΈααααααΆααααααααααααααα·ααΌα
ααααΆααΈαααααααααααααααΆααααα α’αααααΆαα αΆαα·ααααααα»αααΆαααααααα»αααΉααααα αΆα
ααααΌαααααααα αα»α
αααααααΆαααααα’αααα»αααΎααααΈαααααΆααααα αΆαααααααααΆαααααααααΊαα»ααααα αΆαααααΆααααααα’ααααααα’αααααααΎααααΆααα αααα½αα±ααααΆαααααΉαααΆα’αααααααΎααααΆααααΉαααΆαα αΌαααααααααααααααααααΆαα ααΆαα αααα»αααΆαααΈαααΌαα»αααααα’αααααααα»αααααΆαααααααΌαααΆααααα»αααΆαα αΌαααααΎααααΆαααααααααΆααα αααααΆαα Cluster ααΎαβα’αΆα βααΆαα ααβαα»αααΆα New-Cluster αααβααΉαβααΆααααβααΆαβαααααβαααΆαααΆααααααβαααβααΆαβαααα½αβααααΎβα αΎαβαααα‘ααβ Cluster αα·αα
class Cluster {
[ValidatePattern("^[A-z]+$")]
[string] $Service
[ValidateSet("TEST", "STAGE", "CANARY", "PROD")]
[string] $FlightingRing
[ValidateSet("EastUS", "WestUS", "NorthEurope")]
[string] $Region
[ValidateRange(0, 255)]
[int] $Index
}
function New-Cluster {
[OutputType([Cluster])]
Param(
[Parameter(Mandatory, ParameterSetName = "Id", Position = 0)]
[ValidateNotNullOrEmpty()]
[string] $Id,
[Parameter(Mandatory, ParameterSetName = "Components")]
[string] $Service,
[Parameter(Mandatory, ParameterSetName = "Components")]
[string] $FlightingRing,
[Parameter(Mandatory, ParameterSetName = "Components")]
[string] $Region,
[Parameter(Mandatory, ParameterSetName = "Components")]
[int] $Index
)
if ($Id) {
$Service, $FlightingRing, $Region, $Index = $Id -split "-"
}
[Cluster]@{
Service = $Service
FlightingRing = $FlightingRing
Region = $Region
Index = $Index
}
}
Export-ModuleMember New-Cluster
ααΎααΆαα’αααΈααααααααααΌαα’αΆα
ααααα: www.habr.com