Skip to content

Instantly share code, notes, and snippets.

View JohnLBevan's full-sized avatar
🏠
Working from home

John Bevan JohnLBevan

🏠
Working from home
View GitHub Profile
@JohnLBevan
JohnLBevan / Convert-StringToValidateSetParameterCase.ps1
Last active April 22, 2024 08:05
Ensures values match the case given in validateset by correcting to match instead of throwing exceptions. Trick thanks to MKlement: https://stackoverflow.com/a/42699260/361842
Function Convert-StringToValidateSetParameterCase {
Param (
[Parameter(Mandatory)]
[System.Management.Automation.InvocationInfo]$InvocationInfo
,
[Parameter(Mandatory)]
[string]$ParameterName
,
[Parameter(Mandatory)]
[AllowEmptyString()]
@JohnLBevan
JohnLBevan / Get-AllCombos.ps1
Created April 6, 2024 07:41
Script to produce all combos (including empty) of a set of items. A bit clunky since PS tries to be helpful, but that doesn't play well when returning lists of lists.
function Get-AllCombos {
[CmdletBinding()]
[OutputType("System.Collections.Generic.List[System.Object]")]
Param (
[Parameter(Mandatory)]
[AllowEmptyCollection()]
#[System.Collections.Generic.List[System.Object]]$arr
[System.Collections.Generic.List[System.Object]]$arr
)
$ErrorActionPreference = [System.Management.Automation.ActionPreference]::Stop
@JohnLBevan
JohnLBevan / ListIPGroupsContainingCIDR.kql
Created April 3, 2024 13:09
Azure: Kusto (KQL): Network Related Queries
// Specify a value for `testCidr` (must be a valid CIDR; so if just looking for a specific IPv4 IP, append /32 on the end).
// Run this and you'll see all IP Groups which contain CIDRs or IPs which overlap in any way with the given value.
resourcecontainers | where type == "microsoft.resources/subscriptions" | limit 1 // this is a hack to give us a single row
| project testCidr = "123.123.123.123/32" // update this value to the CIDR you're interested in
| extend testCidrSplit = array_concat(split(split(testCidr, '/')[0],'.'), split(split(testCidr, '/')[1],'x'))
| extend testCidrFirstIp = toint(testCidrSplit[0]) * 16777216 + toint(testCidrSplit[1]) * 65536 + toint(testCidrSplit[2]) * 256 + toint(testCidrSplit[3])
| extend testCidrLastIp = testCidrFirstIp + pow(2,32-testCidrSplit[4])-1
| extend joinhack = 1
| join kind = inner
@JohnLBevan
JohnLBevan / ConvertAwsR53RecordSetChange.ps1
Created February 7, 2024 12:56
AWS Route53 Zone Migration
<#
.SYNOPSIS
Used to help migrate R53 zones by converting the JSON obtained by
extracting all record sets from a zone to the JSON required to upload
these recordsets to another zone.
.DESCRIPTION
Covers those tasks described in step 4 of [Migrating an AWS Zone](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zones-migrating.html#hosted-zones-migrating-create-file)
i.e. to convert the output of `aws route53 list-resource-record-sets --hosted-zone-id <hosted-zone-id>`
... to the input of `aws route53 change-resource-record-sets --hosted-zone-id id-of-new-hosted-zone --change-batch file://path-to-file-that-contains-records`
@JohnLBevan
JohnLBevan / Copy-FtpItem.ps1
Created October 27, 2023 16:22
FTP Upload using PowerShell
Function Copy-FtpItem {
[CmdletBinding()]
Param (
[Parameter(Mandatory, ValueFromPipeline)]
[string[]]$Path
,
[Parameter(Mandatory)]
[string]$FtpHost
@JohnLBevan
JohnLBevan / demo.tf
Created October 27, 2023 14:16
Terraform Validate CIDR. Checks that the format is correct, and that the prefix matches the first IP in the range (thus it's a valid prefix)
variable "demoIpv4Cidr" {
type = string
default = "10.0.0.1/16" # try "10.0.0.0/16" for a valid value or "10.0.0.x/16" for an invalidly formatted cidr
validation {
condition = (
can(cidrhost(var.demoIpv4Cidr, 0)) &&
try(cidrhost(var.demoIpv4Cidr, 0), null) == split("/", var.demoIpv4Cidr)[0]
)
# the above could be simplified to:
@JohnLBevan
JohnLBevan / ConvertTo-RootDomain.ps1
Last active October 16, 2023 13:59
Get the root domain from a given subdomain; i.e. the first level under a public suffix / "top level domain" (TLD). So given the string "test.example.co.uk" this would return "example.co.uk", whilst "example.com" would return itself unchanged..
function ConvertTo-RootDomain {
[CmdletBinding()]
Param (
[Parameter(Mandatory)]
[string]$Domain
)
if ($null -eq $Global:CachedPublicDomainSuffixList) {
$publicDomainSuffixList = Invoke-WebRequest -Method GET -Uri 'https://publicsuffix.org/list/public_suffix_list.dat' -ContentType 'text/plain' -ErrorAction Stop
$tempSet = [System.Collections.Generic.HashSet[string]]::new()
foreach ($suffix in @($publicDomainSuffixList.Content -split '\s*[\r\n]+')) {
@JohnLBevan
JohnLBevan / PowershellParallelForeach.ps1
Created September 30, 2023 06:12
Powershell parallel foreach reference demo code
# some function we want available in our parallel runspace
function Get-DummyItem {
[CmdletBinding()]
Param (
[Parameter(Mandatory)]
[string]$Name
)
$myIp = Invoke-WebRequest -Method Get -Uri 'https://api.my-ip.io/ip'
"[$Name] was processed by [$myIp]"
@JohnLBevan
JohnLBevan / Repair-AzureDevOpsConnection.ps1
Created June 22, 2023 08:08
Renew ARM service connection secrets for Azure DevOps / convert them to manual. Note: once they're amended to be manual, you can manage secrets via the UI going forwards. This script is based on the initial script and info from https://rlevchenko.com/2022/03/04/azure-devops-update-service-connection-expired-secret/; thanks rlevchenko for this.
Function Repair-AzureDevOpsConnection {
[CmdletBinding()]
Param (
[Parameter(Mandatory)]
[string]$AzureDevOpsPAT # bad practice to pass secrests as strings, but this is a quick and dirty
,
[Parameter(Mandatory)]
[string]$Org
,
[Parameter(Mandatory)]
@JohnLBevan
JohnLBevan / Get-AzVmPageFileInfo.ps1
Created March 24, 2023 10:54
After doing a lift & shift of VMs into Azue, their page file may still be on the C drive (or whatever its original location), rather than on the temporary storage available to the new AZ VM (giving better perfromance). This script scans all VMs to help flag such issues.
Login-AzAccount # opens browser for interactive login
$subscriptions = Get-AzSubscription |
Where-Object {$_.State -eq 'Enabled'} |
Select-Object -ExpandProperty 'Id'
$script = @'
$driveInfo = Get-PSDrive -PSProvider FileSystem | Select-Object Root, Description
$pageFileDrive = Get-WmiObject Win32_Pagefile | Select-Object -ExpandProperty Drive
([PSCustomObject]@{
DriveInfo = ($driveInfo | %{"$($_.Root) = $($_.Description)"}) -join '; '