Enter any website URL to analyze its complete technology stack

Executive Summary for joshsinclair.com

1379 Response Time (ms)
200 HTTP Status
15 Scripts
61 Images
20 Links
HTTP/1.1 Protocol

SEO & Content Analysis

Basic Information
Page Title
Josh Sinclair | Technologist
Meta Description
Not detected
HTML Language
en-US
Robots.txt Not found
Sitemap Not found
SEO Meta Tags
content-type: text/html; charset=UTF-8
Page Content

Josh Sinclair | Technologist

# THIS SCRIPT REQUIRES THE NUTANIX POWERSHELL MODULES AND POWERSHELL VERSION 4.0# Interface of Windows VMs needs to be named "Ethernet"# VMs must be powered on# 1.  Get list of VMs and IPs from a VMware Folder# 2.  Check that all VMs are in the Protection Domain# 3.  Change the IPs of the VMs and shut them down# 4.  Change the static DNS entries### DECLARE CONSTANTS ####Source Domain Controller$dnsServer="dc01.test.com"#Establish PSSession to target Domain Controller$s=new-PSSession-Computer$dnsServerImport-PSSession-Session$s-Module DNSServer# Need to load PowerCLI and Nutanix modulesAdd-PSSnapin NutanixCmdletsPSSnapin#Make sure that any previous Nutanix or vCenter sessions are disconnectedDisconnect-NTNXCluster *Disconnect-VIServer *-Confirm:$false#Name of target VMware folder$folder="DRTest"#Name of the Protection Domain$protectionDomain="Test"#Destination Network - 10.XXX.XXX.0$destinationNet="10.0.1.0"$destinationNet=$destinationNet.Split(".")#Destination DNS 01$destinationDNS01="10.0.1.11"$destinationDNS02="10.0.1.12"#Nutanix Cluster IP$nutanixClusterIP="10.0.0.51"#Source vCenter$vCenter="vc01.test.com"### BEGIN SCRIPT ####Clear Powershell Consoleclear#Connect to vCenterConnect-VIServer$vcenter#Connect to the Nutanix ClusterConnect-NutanixCluster-Server$nutanixClusterIP-UserName admin-Password admin-AcceptInvalidSSLCerts|Out-Null#Get the names of the VMs in the target Folder#Initialize an array to hold the names of the VMs in the folder$folderVMs=@()#Add the names of the VMs in the folder to the arrayForeach($vm in(get-vm-Location$folder)){$folderVMs=$folderVMs+$vm.Name}#Initialize an array to hold the names of the VMs in the protection domain$protectedVMs=@()#Add the names of the VMs in the protection domain to the arrayForeach($vm in(Get-NTNXVM|Where{$_.protectionDomainName-eq$protectionDomain}|Select vmName)){$protectedVMs=$protectedVMs+$vm.vmName}#compare the arrays of VMs to check if there are any missing VMs and add them to $missingVMs$missingVMs=Compare-Object$folderVMs$protectedVMs#Initialize an array to contain VMs that are in the folder but not in the protection domain$pdMissing=@()#Initialize an array to contain VMs that are in the protection domain but not in the folder$folderMissing=@()#Initialize an array to contain the DNS Updates$dnsupdates=@()#Iterate through $missingVMs and notify the user which VMs are missingif($missingVMs.Count-ne0){foreach($vm in$missingVMs) {if($vm.SideIndicator-eq"<=") {$pdMissing=$pdMissing+$vm}if($vm.SideIndicator-eq"=>") {$folderMissing=$folderMissing+$vm}}echo"These VMs are in the $folder VMware Folder but not in the $protectionDomain protection domain."foreach($pdvm in$pdMissing) {echo$pdvm.InputObject}echo`necho"These VMs are in the $protectionDomain protection domain but not in the $folder VMware Folder."foreach($foldervm in$folderMissing) {echo$foldervm.InputObject}echo`n#If there are missing VMs then end the scriptbreak}#Pop up a dialog box to get the linux username and password and test that the linux credential actually works with a linux VM to prevent an epic fail#if the credential fails then prompt for the password again$crTest="echo test"do{$linuxCredential=Get-Credential-Username"root"-Message"Type the ROOT username and password for Linux machines"}Until(Invoke-VMScript-VM(get-vm-Location$folder|where{$_.Guest.OSFullName.Contains("Linux")}|Sort)[0]-ScriptText$crTest-GuestCredential$linuxCredential)#Get the IP Address of the VM, convert it into an array, and replace the source network with the destination networkForeach($vm in(get-vm-Location$folder|Sort)) {$oldip=$vm.Guest.IPAddress[0]$octets=$vm.Guest.IPAddress[0].Split(".")#Create the new IP address from the destination network$octets[0]=$destinationNet[0]$octets[1]=$destinationNet[1]$octets[2]=$destinationNet[2]$newip=[string]::Join(".",$octets)#Create the DNS Update$dnsupdates+=@{"OldIP"=$oldip;"NewIP"=$newip}#Change the last octet to .1 for the gateway IP$octets[3]="1"$vmgateway=[string]::Join(".",$octets)#Check if the Guest OS is Windows and update the IP Addressif($vm.Guest.OSFullName.Contains("Windows")){$chNet="netsh interface ip delete dnsservers Ethernet all; netsh interface ip add dnsservers Ethernet $destinationDNS01; netsh interface ip add dnsservers Ethernet $destinationDNS02 index=2; netsh interface ip set address name=Ethernet static $newip 255.255.255.0 $vmgateway"Invoke-VMScript-VM$vm-ScriptText$chNet}#Check if the Guest OS is Linux and update the IP Addressif($vm.Guest.OSFullName.Contains("Linux")){$chNet="/root/failover"Invoke-VMScript-VM$vm-ScriptText$chNet-GuestCredential$linuxCredential}}#Shutdown the VMsForeach($vm in(get-vm-Location$folder)) {Shutdown-VMGuest-VM$vm-Confirm:$false}#Update the static DNS A record for each VMforeach($dnsupdate in$dnsupdates) {$oldIP=[string]$dnsupdate.OldIP$newIP=[string]$dnsupdate.NewIPecho"Changing DNS Record $oldIP to $newIP"$oldDNS=Get-DnsServerResourceRecord-zonename test.com-RRTypeA|where{$_.RecordData.IPv4Address-eq$oldip}$newDNS=$oldDNS.Clone()$newDNS.RecordData.IPv4Address=[ipaddress]$newipSet-DnsServerResourceRecord-ZoneName"test.com"-OldInputObject$oldDNS-NewInputObject$newDNS}Remove-PSSession$sDisconnect-NTNXCluster *Disconnect-VIServer *-Confirm:$false#Wait for the VMs to shut downSleep60;

Network & Infrastructure

DNS & Hosting
IP Address
192.186.212.230
Reverse DNS
230.212.186.192.host.secureserver.net
SSL/TLS Certificate
Issuer
Protocol
Expires In 0 days

Technology Stack

Content Management Systems
WordPress
JavaScript Frameworks
jQuery
Build Tools
Vite
Server Technologies
Generator: WordPress 4.7.29 PHP (inferred from WordPress)

Services & Integrations

Analytics & Tracking
Google Analytics GA4
E-commerce Platforms
PrestaShop

CDN & Media Providers

Media Providers
YouTube
Web Fonts
Google Fonts

Dynamic Analysis & Security

Dynamic JavaScript Analysis
Angular (Data Attributes) ES6+ JavaScript Features jQuery (CDN Detection) jQuery (script Resource) Web Server: Apache
Server Headers
Apache

Resource Analysis

External Resource Hosts
fonts.googleapis.com
gmpg.org
joshsinclair.com
s.w.org
UI Frameworks & Libraries
Angular Material (Class Names) Slate Vuetify (Class Names)
Analysis Complete

Analyzed joshsinclair.com with 3 technologies detected across 8 categories

Analysis completed in 1379 ms • 2026-03-23 11:03:50 UTC