cat /opt/bin/NetworkParamUpdater.ps1
# NetworkParamUpdater.ps1' -Auto 将当前连接设置为自动分配 ip
# NetworkParamUpdater.ps1' -Ip '192.168.1.1' 将当前连接设置为指定 ip
[CmdletBinding()]
param (
# 是否设置为自动获取 IP
[Parameter(Mandatory = $false)]
[switch]$Auto ,
[string]$Ip = '' # 使用的 ip 地址
)
$ErrorActionPreference = 'Stop'
class IpConfig {
[string] $cidrIp
[string] $gateway
[string] $dns
}
class DevicItem {
[string] $device
[string] $type
[string] $state
[string] $conntion
[bool] isActive() {
return $this.state -eq '已连接'
}
}
class NmcliManager {
[DevicItem[]]getDevices() {
$lines = (nmcli device status) | Select-Object -Skip 1
$this.throwIfError()
$items = @()
foreach ($line in $lines) {
# 使用正则拆分字段,保留中文等多字节字符
$columns = ($line -replace '\s{2,}', '|').Split('|')
$item = [DevicItem]::new()
$item.device = $columns[0].Trim()
$item.type = $columns[1].Trim()
$item.state = $columns[2].Trim()
$item.conntion = $columns[3].Trim()
$items += $item
}
return $items
}
[DevicItem] getActiveDevice() {
$item = $this.getDevices() | Where-Object { $_.isActive() } | Select-Object -First 1
return $item
}
setAuto([string]$conntion) {
nmcli connection modify $conntion ipv4.dns '' ipv4.method auto
$this.throwIfError()
}
setManual([string]$conntion, [IpConfig]$ipConfig) {
if (-not $ipConfig.cidrIp) {
throw "ip 地址未设置"
}
nmcli connection modify $conntion ipv4.addresses $ipConfig.cidrIp ipv4.gateway $ipConfig.gateway ipv4.dns $ipConfig.dns ipv4.method manual
$this.throwIfError()
}
reset([string]$conntion) {
nmcli connection down $conntion
$this.throwIfError()
nmcli connection up $conntion
$this.throwIfError()
}
throwIfError() {
$errorCode = $LASTEXITCODE
if ($errorCode -ne 0) {
throw "错误码: $errorCode"
}
}
[IpConfig] getDefaultIpConfig([string]$conntion, [string]$ip) {
if ([string]::IsNullOrWhiteSpace($ip )) {
switch ($conntion.ToLower()) {
"xxx1" { $ip = "192.168.0.98" }
"xxx2" { $ip = "192.168.0.97" }
"xxx3" { $ip = "192.168.0.96" }
Default { $ip = "192.168.0.99" }
}
}
[IpConfig]$ipConfig = [IpConfig]::new()
$ipConfig.cidrIp = "$($ip)/24"
$ipConfig.gateway = "192.168.0.60"
$ipConfig.dns = "192.168.0.60"
return $ipConfig
}
}
$manager = [NmcliManager]::new()
$device = $manager.getActiveDevice()
Write-Output "活动链接: $($device | ConvertTo-Json)"
if (-not $device) {
Write-Output "没有活动链接"
return
}
Write-Output "设置自动模式 $Auto"
if ($Auto) {
$manager.setAuto($device.conntion)
}
else {
[IpConfig]$ipConfig = $manager.getDefaultIpConfig($device.conntion, $Ip)
Write-Output "IP 配置: $($ipConfig | ConvertTo-Json)"
$manager.setManual($device.conntion, $ipConfig)
}
$manager.reset($device.conntion)
Write-Output "完成设置"