# Copyright (c) 2018, Oracle and/or its affiliates. # The Universal Permissive License (UPL), Version 1.0 # # Oracle OCI Virtual Cloud Networks IP configuration script # # 2018-05-11 initial release param ( [Parameter(Mandatory=$false)][string]$vnicOcid ) function PromptYesNo() { param( [parameter(Mandatory=$true)][String]$title, [parameter(Mandatory=$true)][String]$message, [parameter(Mandatory=$true)][String]$yesHelp, [parameter(Mandatory=$true)][String]$noHelp ) $yesOption = New-Object System.Management.Automation.Host.ChoiceDescription "&Yes", $yesHelp $noOption = New-Object System.Management.Automation.Host.ChoiceDescription "&No", $noHelp $options = [System.Management.Automation.Host.ChoiceDescription[]]($yesOption, $noOption) $choice = $Host.UI.PromptForChoice($title, $message, $options, 1) if ($choice -eq 1) { Exit 0 } } # # Constants # $metadataServiceVnicsUrl = "http://169.254.169.254/opc/v1/vnics/" $dnsIPAddress = "169.254.169.254" # # Query Metadata Service # $wc = New-Object system.Net.WebClient -ErrorAction Stop; $allVnicsMetadata = ($wc.downloadString($metadataServiceVnicsUrl) | ConvertFrom-Json -ErrorAction Stop); # # List available Secondary VNICs if OCID was not provided # if (!$vnicOcid) { if ($allVnicsMetadata.Length -le 1) { Write-Error "Couldn't find any secondary VNICs attached to this instance." Exit 1 } while ($true) { for ($vnicCounter = 1; $vnicCounter -lt $allVnicsMetadata.Length; $vnicCounter++) { Write-Host $vnicCounter ") Private IP:" $vnic.privateIp "Subnet:" $vnic.subnetCidrBlock "MAC:" $vnic.macAddr "VLAN Tag:" $vnic.vlanTag; } Write-Host "0 ) Exit" try { [int16]$vnicIndex = Read-Host -Prompt "VNIC to be configured" if ($vnicIndex -eq 0) { Exit 0 } if ($vnicIndex -le 0 -or $vnicIndex -ge $allVnicsMetadata.Length) { throw [System.Exception] "Invalid VNIC index." } $vnicOcid = $allVnicsMetadata[$vnicIndex].vnicId break } catch { Write-Error "INVALID VNIC! Please enter a valid number." } } } Write-Host "+ Specified VNIC: $vnicOcid" # # Obtain the metadata for the specified VNIC # $secondaryVnicMetadata = ($allVnicsMetadata | Where-Object {$_.vnicId -eq $vnicOcid}); if (!$secondaryVnicMetadata) { Write-Error "Couldn't find a VNIC attahced to this instance with the specified OCID." Exit 1 } $subnetPrefix = ([int]($secondaryVnicMetadata.subnetCidrBlock.split("/")[1])); Write-Host "+ Found VNIC Settings: " (ConvertTo-Json $secondaryVnicMetadata) # # Find the network adapter to be configured # $secondaryVnicAdapter = (Get-NetAdapter -ErrorAction Stop | Where-Object {$_.MacAddress -eq $secondaryVnicMetadata.macAddr.Replace(":", "-")}) if( @($secondaryVnicAdapter).Count -ne 1) { $secondaryVnicAdapter = (Get-NetAdapter -ErrorAction Stop | Where-Object {$_.Vlanid -eq $secondaryVnicMetadata.vlanTag -and $_.InterfaceDescription -like "Microsoft Network Adapter Multiplexor Driver #*"}) } if (!$secondaryVnicAdapter) { Write-Error "Couldn't find a Network Interface for the specified VNIC." Exit 1 } Write-Host "+ Found Network Interface: " $secondaryVnicAdapter.Name # # Configure the Network Interface # $mac = Get-NetAdapter -Name $secondaryVnicAdapter.Name | select -expand MacAddress if ($mac -ne $secondaryVnicMetadata.macAddr.Replace(":", "-")) { PromptYesNo -title "WARNING!" -message "The Network Interface for the specified VNIC already has a different MAC Address. The current settings will be overwritten. Proceed?" -yesHelp "Overwrite current settings." -noHelp "Do not change existing settings and exit." Set-NetAdapter -Name $secondaryVnicAdapter.Name -MacAddress $secondaryVnicMetadata.macAddr.Replace(":", "-") } $secondaryVnicAdapterIPConfig = (Get-NetIPAddress -InterfaceAlias $secondaryVnicAdapter.InterfaceAlias -AddressFamily IPv4 -ErrorAction SilentlyContinue); if ($secondaryVnicAdapterIPConfig) { PromptYesNo -title "WARNING!" -message "The Network Interface for the specified VNIC already has an IP Address. The current settings will be overwritten. Proceed?" -yesHelp "Overwrite current settings." -noHelp "Do not change existing settings and exit." Remove-NetIPAddress -InterfaceAlias $secondaryVnicAdapter.InterfaceAlias -AddressFamily IPv4 } New-NetIPAddress -InterfaceAlias $secondaryVnicAdapter.InterfaceAlias -AddressFamily IPv4 -IPAddress $secondaryVnicMetadata.privateIp -PrefixLength $subnetPrefix -ErrorAction Stop Write-Host "Assigned a static IP Address to the Network Interface." -ForegroundColor Green Set-DnsClientServerAddress -InterfaceAlias $secondaryVnicAdapter.InterfaceAlias -ServerAddresses $dnsIPAddress -ErrorAction Stop Write-Host "Set the DNS server IP Address." -ForegroundColor Green $secondaryVnicAdapterDefaultRoute = (Get-NetRoute -InterfaceAlias $secondaryVnicAdapter.InterfaceAlias -DestinationPrefix 0.0.0.0/0 -ErrorAction SilentlyContinue); if ($secondaryVnicAdapterDefaultRoute) { PromptYesNo -title "WARNING!" -message "The Network Interface for the specified VNIC already has default gateway. The current settings will be overwritten. Proceed?" -yesHelp "Overwrite current settings." -noHelp "Do not change existing settings and exit." Remove-NetRoute -InterfaceAlias $secondaryVnicAdapter.InterfaceAlias -DestinationPrefix 0.0.0.0/0 -ErrorAction Stop } New-NetRoute -InterfaceAlias $secondaryVnicAdapter.InterfaceAlias -DestinationPrefix 0.0.0.0/0 -NextHop $secondaryVnicMetadata.virtualRouterIp -ErrorAction Stop | Out-Null Write-Host "Created a default route for the Network Interface." -ForegroundColor Green Write-Host "The Network Interface was successfully configured." -ForegroundColor Green