ืืื ืืืจ! ืื ื ืืฆืื ืืชืฉืืืช ืืื ืืช ืืชืจืืื ืฉื ืืืืืจ
ืื ื ืืืืื ืฉืื ืื ืืืงืกืืืืจืื"
ืคืจืืืืืืช ืชืื ืืช ืืื ืื ืขืฆืืื ืืคืื ืงืฆืืื ืืืืช ืขืฉืืืืช ืืืืจืืืช ืื ืืืืืช ืื ืืื, ืื ืฉืชืืื ื ืชืืืืช ืืืืชื ืืืื ื- Powershell. ืืืขื ืืื ืฉืคืืช ืืชืื ืืช, ืคืื ืงืฆืืื ืืืืช ืื ืื, ืืฉ ืืชืงื ืื ืืงืฉืืจืช ืฉื-ืขืจื ืืืจืืืช; ืฉืืขืืจืื, ืืื ืืื ืื ืืฉืืืื, ืื ืจืง ืืืฉื ืืืช. ืื ื ืืืื ืืช ืืฉืืืืฉ ืฉืื ื ื-Class ืืงืฉืืจืช ืฉืืืช ืืขืจืืื, ืื ืืื ืข ืืืืฉืื ืชืื ืืช ืืืืื ืืื ืื ืขืฆืืื ืืื ืืจืืฉื, ืคืืืืืืจืคืืื ืื ืฉืื ืื, ื ืืื ืื ืฆื ืืช ืืืชืจืื ืืช ืฉืืื ืืืื ืืกืื ืืช ืืงืื ืฉืื ื. ืืชืจ ืขื ืื, ืขื ืืื ืืืกืคืช ืฉืืืืช ืืืจื ืืกืืืื ืืืชื ื ืืชื ืื ืืฉืื ืื, ืื ื ืืืืืื ืืืขืฉืืจ ืืช ืืงืื ืืคืื ืงืฆืืื ืื ืฉืื ื ืขื Classes.
ืืงืกื ืฉื ืืงืกืืืช
ืงืืกืืืช ืื ืืืช ืืชืืื ืืช ืืืืงืืช ืืืืชืจ ื- Powershell. ืืืฉืจ ืืชื ืืืื ืขืจื, ืืชื ืืกืชืื ืขื ืืืืืืช ืืืชืืื ืืืืืืืช ืืืจืืืืื ืฉืืกืืืื ืืืกืืคื ืืืืฉืื ืฉืื. ืืืืืื, ืคืฉืื ืืฆืืงืช ืืืจืืืช ื-[xml] ืชืคืขืื ืืืชื ืืจื ืงืื ืืื ืชื ืืชืืฆืืจ ืขืฅ xml ืฉืื. ืื ืื ื ืืืืืื ืืืฉืชืืฉ ืืฉืืขืืจืื ืืงืื ืฉืื ื ืืืืชื ืืืจื.
ืืืืืืช hashtables
ืื ืืื ืื ืื ืื, ืืชื ืืืื ืืืืฉืื ืืื ืืื ืขื ืืื ืืฆืืงืช hashtable ืืกืื ืืืืชื ืฉืื. ืื ืชืฉืื ืืืฉืชืืฉ ืืชืืื ืืช ืืืืืืช ืืื ืื ืฆื ืืช ืืืื ืืืชืจืื ืืช ืฉื ืืคืืก ืื. ืืื ืขื ืืืช, ืื ื ืืืืืื ืืืฉืชืืฉ ืืืืคืืื ืื ืืืืงืืืื ืฉื ืืืืืงื ืืื ืืืคืขืื ืืืืืงืืช ืืชืืื ืืืืืืช ืขืืืง ืขืื ืืืชืจ.
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
}
ืื ืืกืฃ, ืืืืืืง ืขืืืจ ืืงืื ืชืคืืงื ื ืงืืื. ืืฉืืื ืืช ืืคืื ืฉื ืืขืจื ื-hashtable ืฉื Cluster ืืืืขืืจ ื-Format-Table ืขื ืื ืฉืืชื ืืงืื ืื ืืชื ืืืื ืืจืืฉืื ื ืืช ืืืืืืืช ื-hashtable ืืืื ืืืืืงื. ืืืืคืืื ืื ืฉื ืืืืงื ืืืคืืขืื ืชืืื ืืกืืจ ืฉืื ืื ืืืืืจืื ืฉื. ืื ืชืฉืื ืืืืกืืฃ ืืช ืืืืช ืืืคืชื ืื ืกืชืจืช ืืคื ื ืื ืืืชื ืืืคืืื ืื ืฉืืชื ืื ืจืืฆื ืฉืืืฆืื ืืชืืฆืืืช.
ืืฆืืง ืฉื ืืฉืืขืืืืช
ืื ืืฉ ืื ืื ืื ืขื ืืจืืืื ื ืืื, ืืฆืืงืช ืขืจื ืืกืื ืืืืืงื ืฉืื ืชืขืืืจ ืืช ืืขืจื ืืื ืื ืฉืื, ืฉื ืชืืื ืืืชืื ืืืคืข ืฉื ืืืืืงื ืฉืื
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 ืืืคืขืื ืืกืืืจื
Cast ืืืคืฉืจ ืื-ืกืจืืืืืืฆืื ืืืืื. ืืืืืืืืช ืฉืืืื ืืืืฉืื ืื ืื ืชืื ืื ืื ืขืืืืื ืืืคืจื ืฉืื ื ื-Cluster
# ะะฐะปะธะดะฐัะธั ัะตัะธะฐะปะธะทะพะฒะฐะฝะฝัั
ะดะฐะฝะฝัั
[Cluster]$cluster = Get-Content "./my-cluster.json" | ConvertFrom-Json
[Cluster[]]$clusters = Import-Csv "./my-clusters.csv"
ืืืื ืืช ืืงืื ืืคืื ืงืฆืืื ืื ืฉืื
ืชืืื ืืืช ืคืื ืงืฆืืื ืืืืช ืืืืืจืืช ืชืืืื ืืื ื ื ืชืื ืื, ืืืืืจ ืืื ืืืืฉืืืช ืืช ืืชืืื ืืช ืืจืฆืฃ ืฉื ืืจื ืกืคืืจืืฆืืืช ืขื ืคื ื ืืื ื ื ืชืื ืื ืืืชื ื ืืชื ืื ืืฉืื ืื. ืืืจืืช ืืจืืฉื ืืกืืชืจ, ืฉืืขืืจืื ืืืืช ืขืืืจืื ืื ืืืชืื ืงืื ืคืื ืงืฆืืื ืื ืืืืืช ืืฉืืืืช ืืืจื ืืกืื.
ืืื ื- Powershell ืฉืื ื ืืืชื ืคืื ืงืฆืืื ืื?
ืืจืื ืื ืฉืื ืฉืืืืขืื ืืจืงืข C# ืื ืืืื ืืืชืืื Powershell, ืฉืืืื ื-C#. ืขื ืืื ืื, ืืชื ืืชืจืืง ืืฉืืืืฉ ืืืืฉืื ืชืื ืืช ืคืื ืงืฆืืื ืืืื ืืกืืืจ ืืื ืื ืฉืชืคืืง ืชืืขืืช ืืฆืืืื ืจืื ืืชืื ืืช ืืื ืื ืขืฆืืื ื- Powershell ืื ืืืืื ืขืื ืขื ืชืื ืืช ืคืื ืงืฆืืื ืื.
ืื ืืชื ืืกืชืื ืืืืื ืจืื ืขื ืืืจืช ื ืชืื ืื ืืืชื ื ืืชื ืื ืืฉืื ืื ืืืืฆืขืืช ืฆืื ืืจืืช (|), Where-Object, ForEach-Object, Select-Object, Group-Object, Sort-Object ืืื' - ืืฉ ืื ืกืื ืื ืคืื ืงืฆืืื ืื ืืืชืจ ืืชืจืืืื ืืืฉืืืืฉ ื- Powershell ืฉืืขืืจืื ืืกืื ืื ืคืื ืงืฆืืื ืื.
ืฉืืืืฉ ืคืื ืงืฆืืื ืื ืืฉืืขืืจืื
ืงืืกืืืช, ืืืจืืช ืฉืื ืืฉืชืืฉืืช ืืชืืืืจ ืืืืคื, ืื ืจืง ืืืคืื ืืื ืฉื ื ืชืืืืื. ืืฆืื ืืจ, ืืชื ืืืื ืืืคืืช ืืขืจื ืฉื ืขืจืืื ืืืืฆืขืืช ForEach-Object.
ืืืืืื ืืืื, ืื ืื ื-Node ืืืืฆืข ืืื ืคืขื ืฉ-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