Fixing pwsh to wsl docker setup

This commit is contained in:
Zackarias Montell
2026-08-11 10:48:01 +02:00
parent e850b16df6
commit 4ac2428755
2 changed files with 201 additions and 50 deletions

View File

@@ -1,45 +1,97 @@
{
"$schema": "https://raw.githubusercontent.com/JanDeDobbeleer/oh-my-posh/main/themes/schema.json",
"palette": {
"os": "#ACB0BE",
"closer": "p:os",
"pink": "#F4B8E4",
"lavender": "#BABBF1",
"blue": "#8CAAEE"
"base": "#1E1E2E",
"blue": "#89B4FA",
"crust": "#11111B",
"false": "p:red",
"flamingo": "#F2CDCD",
"git": "p:lavender",
"go": "p:mauve",
"green": "#A6E3A1",
"haskell": "p:mauve",
"julia": "p:mauve",
"lavender": "#B4BEFE",
"lua": "p:mauve",
"mantle": "#181825",
"maroon": "#EBA0AC",
"mauve": "#CBA6F7",
"os-bg": "p:base",
"os-fg": "p:green",
"overlay0": "#6C7086",
"overlay1": "#7F849C",
"overlay2": "#9399B2",
"path": "p:green",
"peach": "#FAB387",
"pink": "#F5C2E7",
"python": "p:mauve",
"red": "#F38BA8",
"root-bg": "p:yellow",
"root-fg": "p:base",
"rosewater": "#F5E0DC",
"rust": "p:mauve",
"sapphire": "#74C7EC",
"sky": "#89DCEB",
"subtext0": "#A6ADC8",
"subtext1": "#BAC2DE",
"surface0": "#313244",
"surface1": "#45475A",
"surface2": "#585B70",
"teal": "#94E2D5",
"text": "#CDD6F4",
"time": "p:overlay1",
"true": "p:green",
"yellow": "#F9E2AF",
"docker": "p:peach",
"k8s": "p:red"
},
"transient_prompt": {
"template": "{{ now | date \"15:04:05\" }} {{ if gt .Code 0 }}<p:false></>{{ else }}<p:true></>{{ end }} ",
"foreground": "p:time"
},
"console_title_template": "{{ .Shell }} in {{ .PWD }}",
"blocks": [
{
"type": "prompt",
"alignment": "left",
"segments": [
{
"foreground": "p:os",
"style": "plain",
"template": "{{.Icon}} ",
"type": "os"
},
{
"foreground": "p:blue",
"style": "plain",
"template": "{{ .UserName }}@{{ .HostName }} ",
"type": "session"
},
{
"foreground": "p:pink",
"properties": {
"folder_icon": "..\ue5fe..",
"home_icon": "~",
"style": "agnoster_short"
"cache_duration": "none",
"windows": "\ue70f",
"ubuntu": "\udb80\udf3d"
},
"template": "{{ .Icon }}",
"foreground": "p:os-fg",
"background": "p:os-bg",
"type": "os",
"style": "plain",
"template": "{{ .Path }} ",
"type": "path"
"foreground_templates": [
"{{ if .Root }}p:root-fg{{ end }}"
],
"background_templates": [
"{{ if .Root }}p:root-bg{{ end }}"
]
},
{
"properties": {
"cache_duration": "none",
"folder_icon": "..",
"home_icon": "~",
"style": "folder"
},
"template": " {{ .Path }} ",
"foreground": "p:path",
"type": "path",
"style": "powerline"
},
{
"foreground": "p:lavender",
"properties": {
"branch_icon": "\ue725 ",
"cache_duration": "none",
"cherry_pick_icon": "\ue29b ",
"commit_icon": "\uf417 ",
"fetch_stash_count": false,
"fetch_status": false,
"fetch_upstream_icon": false,
"merge_icon": "\ue727 ",
@@ -49,39 +101,120 @@
"tag_icon": "\uf412 "
},
"template": "{{ .HEAD }} ",
"style": "plain",
"type": "git"
"foreground": "p:git",
"type": "git",
"style": "plain"
},
{
"background": "#FFDE57",
"foreground": "#111111",
"powerline_symbol": "\ue0b0",
"properties": {
"display_mode": "environment",
"fetch_virtual_env": true,
"home_enabled": true
"cache_duration": "none"
},
"template": "\uf308 {{if matchP \"unix:///run/user/1000//docker.sock\" .Context }}Local{{ else }}{{.Context}}{{ end }} ",
"foreground": "p:docker",
"type": "docker",
"style": "plain"
},
{
"type": "kubectl",
"style": "powerline",
"foreground": "p:k8s",
"template": "󱃾 {{.Context}}{{if .Namespace}} :: {{.Namespace}}{{end}} ",
"options": {}
},
{
"properties": {
"cache_duration": "none"
},
"template": "\ue627 {{ if not .Error }}{{ .Full }}{{ end }} ",
"foreground": "p:go",
"type": "go",
"style": "plain"
},
{
"properties": {
"cache_duration": "none"
},
"template": "\ue61f {{ if not .Error }}{{ .Full }}{{ end }} ",
"foreground": "p:haskell",
"type": "haskell",
"style": "plain"
},
{
"properties": {
"cache_duration": "none"
},
"template": "\ue624 {{ if not .Error }}{{ .Full }}{{ end }} ",
"foreground": "p:julia",
"type": "julia",
"style": "plain"
},
{
"properties": {
"cache_duration": "none"
},
"template": "\ue620 {{ if not .Error }}{{ .Full }}{{ end }} ",
"foreground": "p:lua",
"type": "lua",
"style": "plain"
},
{
"properties": {
"cache_duration": "none",
"display_default": false,
"display_mode": "context"
},
"template": " \ue73c {{ if not .Error }}{{ if .Venv }}venv/{{ end }}{{ .Full }}{{ end }}",
"foreground": "p:python",
"type": "python",
"style": "plain"
},
{
"properties": {
"cache_duration": "none"
},
"template": "\ue7a8 {{ if not .Error }}{{ .Full }}{{ end }} ",
"foreground": "p:rust",
"type": "rust",
"style": "plain"
},
{
"properties": {
"cache_duration": "none",
"style": "austin",
"threshold": 500
},
"template": " \udb81\udd1f {{ .FormattedMs }} ",
"foreground": "p:true",
"type": "executiontime",
"style": "plain",
"template": " \ue235 {{ if .Venv }}({{ .Venv }}){{ end }} ",
"type": "python"
"foreground_templates": [
"{{ if .Code }}p:false{{ end }}"
]
}
],
"type": "prompt"
"newline": true
},
{
"type": "prompt",
"alignment": "left",
"segments": [
{
"properties": {
"always_enabled": true,
"cache_duration": "none"
},
"template": " ",
"foreground": "p:true",
"type": "status",
"style": "plain",
"foreground": "p:closer",
"template": "\uf105",
"type": "text"
"foreground_templates": [
"{{ if gt .Code 0 }}p:false{{ end }}"
]
}
],
"type": "prompt",
"newline": true
}
],
"final_space": true,
"version": 3
"version": 3,
"shell_integration": true
}

View File

@@ -3,13 +3,20 @@
# Usage: . .\Update-WSLDockerProxy.ps1 (dot-source to import the function)
# Update-WSLDockerProxy (then call it)
# Or just run the script directly and it will execute automatically.
function Update-WSLDockerProxy {
[CmdletBinding()]
param(
[int]$Port = 2375
[int]$Port = 2375,
[string]$LogPath = "$env:TEMP\Update-WSLDockerProxy.log"
)
function Write-Log {
param([string]$Message)
$line = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') $Message"
Write-Host $Message
Add-Content -Path $LogPath -Value $line
}
# Self-elevate if not running as admin
if (-not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
Write-Host "Not running as admin, re-launching elevated..." -ForegroundColor Yellow
@@ -22,27 +29,38 @@ function Update-WSLDockerProxy {
return
}
# Get current WSL IP
$WSL_IP = (wsl hostname -I 2>$null).Split(" ")[0].Trim()
# --- Get current WSL IP ---
# wsl.exe emits UTF-16 output with embedded null bytes when its stdout isn't
# attached to a real console (hidden window, scheduled task, self-elevated
# relaunch, etc). That corrupts naive string parsing (e.g. results in "W"
# instead of an IP). Strip null chars before parsing, and validate the
# result looks like an actual IPv4 address before using it.
$rawOutput = (wsl.exe hostname -I 2>$null) -join ' '
$cleaned = ($rawOutput -replace "`0", '').Trim()
$WSL_IP = $null
if ($cleaned) {
$candidates = $cleaned -split '\s+' | Where-Object { $_ -match '^\d{1,3}(\.\d{1,3}){3}$' }
$WSL_IP = $candidates | Select-Object -First 1
}
if (-not $WSL_IP) {
Write-Error "Could not get WSL IP. Is WSL running?"
Write-Log "ERROR: Could not get a valid WSL IP. Raw output was: '$rawOutput'"
return
}
Write-Host "WSL IP: $WSL_IP" -ForegroundColor Cyan
Write-Log "WSL IP: $WSL_IP"
# Remove existing rule if present
$existing = netsh interface portproxy show v4tov4 | Select-String ":$Port"
if ($existing) {
Write-Host "Removing existing portproxy rule on port $Port..." -ForegroundColor Gray
Write-Log "Removing existing portproxy rule on port $Port..."
netsh interface portproxy delete v4tov4 listenport=$Port listenaddress=127.0.0.1 | Out-Null
}
# Add new rule
netsh interface portproxy add v4tov4 listenport=$Port listenaddress=127.0.0.1 connectport=$Port connectaddress=$WSL_IP | Out-Null
Write-Host "Portproxy updated: 127.0.0.1:$Port -> ${WSL_IP}:$Port" -ForegroundColor Green
Write-Log "Portproxy updated: 127.0.0.1:$Port -> ${WSL_IP}:$Port"
}
# Run automatically if script is executed directly (not dot-sourced)