[16:46:48.707] Log Level: 2
[16:46:48.717] [email protected]
[16:46:48.717] win32 x64
[16:46:48.721] SSH Resolver called for "ssh-remote+xxx", attempt 1
[16:46:48.722] SSH Resolver called for host: xxx
[16:46:48.722] Setting up SSH remote "xxx"
[16:46:48.765] Using commit id "e5c0007ce0e9a3816679cba674d03376c03726e3" and quality "insider" for server
[16:46:48.770] Install and start server if needed
[16:46:48.781] Checking ssh with "ssh -V"
[16:46:48.880] > OpenSSH_for_Windows_8.1p1, LibreSSL 2.9.2
[16:46:48.888] Remote command length: 8168/8192 characters
[16:46:48.890] Running script with connection command: ssh -T -D 3898 xxxpowershell -ExecutionPolicy Unrestricted -NoLogo -NoProfile -NonInteractive -Command "powershell -ExecutionPolicy Unrestricted -NoLogo -NoProfile -NonInteractive -EncodedCommand $([Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes([Text.Encoding]::UTF8.GetString([Convert]::FromBase64String('CmVjaG8gIjhkZGNiYmJhOGU3OTogcnVubmluZyIKJFByb2dyZXNzUHJlZmVyZW5jZT0nU2lsZW50bHlDb250aW51ZScKJGNvbW1pdElkPSdlNWMwMDA3Y2UwZTlhMzgxNjY3OWNiYTY3NGQwMzM3NmMwMzcyNmUzJwokcD0kZW52OlBST0NFU1NPUl9BUkNISVRFQ1RVUkUKJGFyY2g9aWYgKCgkcCAtZXEgJ0FNRDY0JykgLW9yICgkcCAtZXEgJ0lBNjQnKSkgeyAneDY0JyB9IGVsc2UgeyAnaWEzMicgfQokc2VydmVyUm9vdD0oSm9pbi1QYXRoIChSZXNvbHZlLVBhdGggfikgJy52c2NvZGUtc2VydmVyLWluc2lkZXJzJykKJGVudjpWU0NPREVfQUdFTlRfRk9MREVSPSRzZXJ2ZXJSb290CiRsb2c9IiRzZXJ2ZXJSb290XC4kY29tbWl0SWQubG9nIgokc0Rpcj0iJHNlcnZlclJvb3RcYmluXCRjb21taXRJZCIKJHF1YWxpdHk9J2luc2lkZXInCiR0ZWxlbWV0cnk9IiIKJGV4dHM9Ii0taW5zdGFsbC1leHRlbnNpb24gbXMtdnNjb2RlLnBvd2Vyc2hlbGwtcHJldmlldyAtLWluc3RhbGwtZXh0ZW5zaW9uIG9kZXJ3YXQuaW5kZW50LXJhaW5ib3cgLS1mb3JjZSIKZnVuY3Rpb24gZGV0YWlscyB7CmVjaG8gImxpc3RlbmluZ09uPT0kcG9ydD09IgplY2hvICJvc1JlbGVhc2VJZD09d2luZG93cz09IgplY2hvICJvc1ZlcnNpb249PSR3aW5WZXJzaW9uPT0iCmVjaG8gImFyY2g9PSRhcmNoPT0iCmVjaG8gInBsYXRmb3JtPT13aW5kb3dzPT0iCn0KZnVuY3Rpb24gcSgkY29kZSkgewplY2hvICI4ZGRjYmJiYThlNzk6IHN0YXJ0IgplY2hvICJleGl0Q29kZT09JGNvZGU9PSIKZGV0YWlscwplY2hvICI4ZGRjYmJiYThlNzk6IGVuZCIKfQpmdW5jdGlvbiBnZXRTc2hkUGFyZW50UGlkIHsKJGN1cnJlbnRQSUQ9JFBJRAp3aGlsZSAoJFRydWUpIHsKJHBhcmVudFBJRD0oR2V0LUNpbUluc3RhbmNlIHdpbjMyX3Byb2Nlc3MgfCA/IHByb2Nlc3NpZCAtZXEgJGN1cnJlbnRQSUQpLnBhcmVudHByb2Nlc3NpZAppZiAoISRwYXJlbnRQSUQpIHsKZWNobyAibm8gc3NoZCBwYXJlbnQgcHJvYyIKZXhpdCAwCn0KaWYgKChncHMgLUlkICRwYXJlbnRQSUQpLk5hbWUgLWVxICdzc2hkJykgewpyZXR1cm4gJHBhcmVudFBJRAp9CiRjdXJyZW50UElEPSRwYXJlbnRQSUQKfQp9CmZ1bmN0aW9uIGV4aXRJZk5lZWRlZCB7CmlmICgkbGF1bmNoZWRTZXJ2ZXJQaWQpIHsKaWYgKCEoZ3BzIC1JZCAkbGF1bmNoZWRTZXJ2ZXJQaWQpKSB7CmVjaG8gIlRoZSBsYXVuY2hlZCBzZXJ2ZXIgZGllZCwgZXhpdGluZyIKZXhpdCAwCn0KfSBlbHNlIHsKaWYgKCEoZ3BzIC1JZCAkc3NoZFBJRCkpIHsKZWNobyAiVGhlIHNzaGQgcGFyZW50IGRpZWQsIGV4aXRpbmciCmV4aXQgMAp9Cn0KfQpmdW5jdGlvbiBEb3dubG9hZFNlcnZlciB7CmVjaG8gIkRvd25sb2FkaW5nIFZTIENvZGUgU2VydmVyIgplY2hvICc4ZGRjYmJiYThlNzklJTElJScKJHdlYlBhcnQ9IiIKJGFyY2hQYXJ0PWlmICgkYXJjaCAtZXEgJ3g2NCcpIHsgIi0kYXJjaCIgfSBlbHNlIHsgIiIgfQokc2VydmVyTmFtZT0ic2VydmVyLXdpbjMyJGFyY2hQYXJ0IiArICR3ZWJQYXJ0CiRzcGxhdD1AewpVcmk9Imh0dHBzOi8vdXBkYXRlLmNvZGUudmlzdWFsc3R1ZGlvLmNvbS9jb21taXQ6JGNvbW1pdElkLyRzZXJ2ZXJOYW1lLyRxdWFsaXR5IgpUaW1lb3V0U2VjPTIwCk91dEZpbGU9InZzY29kZS1zZXJ2ZXIuemlwIgpVc2VCYXNpY1BhcnNpbmc9JFRydWUKfQpbTmV0LlNlcnZpY2VQb2ludE1hbmFnZXJdOjpTZWN1cml0eVByb3RvY29sID0gW05ldC5TZXJ2aWNlUG9pbnRNYW5hZ2VyXTo6U2VjdXJpdHlQcm90b2NvbCAtYm9yIFtOZXQuU2VjdXJpdHlQcm90b2NvbFR5cGVdOjpUbHMxMgpJbnZva2UtUmVzdE1ldGhvZCBAc3BsYXQKfQpmdW5jdGlvbiBJbnN0YWxsU2VydmVyIHsKJHJhbmRvbURpck5hbWU9W1N5c3RlbS5JTy5QYXRoXTo6R2V0UmFuZG9tRmlsZU5hbWUoKQokdG1wRGVzdD0iJGVudjpURU1QXCRyYW5kb21EaXJOYW1lIgplY2hvICJFeHBhbmRpbmcgc2VydmVyIGludG8gJHRtcERlc3QiCmVjaG8gJzhkZGNiYmJhOGU3OSUlMiUlJwpFeHBhbmQtQXJjaGl2ZSAidnNjb2RlLXNlcnZlci56aXAiIC1EZXN0aW5hdGlvblBhdGggIiR0bXBEZXN0IgptdiAiJHRtcERlc3RcdnNjb2RlLSpcKiIgLURlc3RpbmF0aW9uIC4KfQpmdW5jdGlvbiBEb0NsaWVudERvd25sb2FkIHsKZWNobyAiVHJpZ2dlciBjbGllbnQgc2VydmVyIGRvd25sb2FkIgplY2hvIDhkZGNiYmJhOGU3OTp0cmlnZ2VyX3NlcnZlcl9kb3dubG9hZAplY2hvIHBsYXRmb3JtPT13aW5kb3dzPT0KZWNobyB2c2NvZGVBcmNoPT0kYXJjaD09CmVjaG8gZGVzdEZvbGRlcj09JHNEaXI9PQplY2hvIDhkZGNiYmJhOGU3OTp0cmlnZ2VyX3NlcnZlcl9kb3dubG9hZF9lbmQKZWNobyAiV2FpdGluZyBmb3IgY2xpZW50IHRvIHRyYW5zZmVyIHNlcnZlciBhcmNoaXZlLi4uIgplY2hvICJXYWl0aW5nIGZvciAkc0Rpclx2c2NvZGUtc2NwLWRvbmUuZmxhZyBhbmQgdnNjb2RlLXNlcnZlci56aXAgdG8gZXhpc3QiCndoaWxlKCRUcnVlKSB7CmlmKFRlc3QtUGF0aCAiJHNEaXJcdnNjb2RlLXNjcC1kb25lLmZsYWciKSB7CmlmKCEoVGVzdC1QYXRoICIkc0Rpclx2c2NvZGUtc2VydmVyLnppcCIpKSB7CmVjaG8gIkZvdW5kIGZsYWcgYnV0IG5vdCBzZXJ2ZXIgdGFyIC0gc2VydmVyIHRyYW5zZmVyIGZhaWxlZCIKcSAzMQp9CmVjaG8gIkZvdW5kIGZsYWcgYW5kIHNlcnZlciBvbiBob3N0IgpkZWwgJHNEaXJcdnNjb2RlLXNjcC1kb25lLmZsYWcKYnJlYWsKfSBlbHNlIHsKU3RhcnQtU2xlZXAgLVNlY29uZHMgMwpleGl0SWZOZWVkZWQKfQp9Cn0KJHNzaGRQSUQ9Z2V0U3NoZFBhcmVudFBpZAppZighKFRlc3QtUGF0aCAkc0RpcikpIHsKdHJ5IHsKJG51bGw9bmkgLUl0ZW1UeXBlIERpcmVjdG9yeSAkc0RpciAtRm9yY2UgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUKfSBjYXRjaCB7CmVjaG8gIkNvdWxkIG5vdCBjcmVhdGUgc2VydmVyIGRpcmVjdG9yeS4gLSAkKCRfLlRvU3RyaW5nKCkpIgpyZXR1cm4KfQppZighKFRlc3QtUGF0aCAkc0RpcikpIHsKZWNobyAiQ291bGQgbm90IGNyZWF0ZSBzZXJ2ZXIgZGlyZWN0b3J5LiIKcmV0dXJuCn0KfQpjZCAkc0RpcgokbG9ja0ZpbGVQYXRoPShKb2luLVBhdGggIiRzRGlyIiAidnNjb2RlLXJlbW90ZS1sb2NrLiRjb21taXRJZCIpCnRyeSB7CiRudWxsPW5pICRsb2NrRmlsZVBhdGggLUl0ZW1UeXBlIEZpbGUgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUKfSBjYXRjaCB7CmVjaG8gIkNvdWxkIG5vdCBjcmVhdGUgc2VydmVyIGxvY2sgZmlsZS4gLSAkKCRfLlRvU3RyaW5nKCkpIgpyZXR1cm4KfQp0cnkgewplY2hvICJBY3F1aXJpbmcgbG9jayBvbiAkbG9ja0ZpbGVQYXRoIgokZmlsZT1bU3lzdGVtLmlvLkZpbGVdOjpPcGVuKCRsb2NrRmlsZVBhdGgsICdPcGVuJywgJ1JlYWQnLCAnTm9uZScpCn0gY2F0Y2ggewplY2hvICJJbnN0YWxsYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcy4uLiAtICQoJF8uVG9TdHJpbmcoKSkiCnEgMjQKfQp0cnkgewplY2hvICJMb29raW5nIGZvciBleGlzdGluZyBzZXJ2ZXIgaW4gJHNEaXIiCmlmKFRlc3QtUGF0aCAiJHNEaXJcc2VydmVyLmNtZCIpIHsKZWNobyAidnNjb2RlLXNlcnZlciBhbHJlYWR5IGluc3RhbGxlZC4gU2tpcHBpbmcgZG93bmxvYWQuLi4iCn0gZWxzZSB7CnRyeSB7CkRvd25sb2FkU2VydmVyCn0gY2F0Y2ggewplY2hvICJGYWlsZWQgdG8gZG93bmxvYWQgJiBleHRyYWN0IHZzY29kZS1zZXJ2ZXIuIC0gJCgkXy5Ub1N0cmluZygpKSIKRG9DbGllbnREb3dubG9hZAp9Ckluc3RhbGxTZXJ2ZXIKaWYoIShUZXN0LVBhdGggIiRzRGlyXHNlcnZlci5jbWQiKSkgewplY2hvICJGYWlsZWQgdG8gZG93bmxvYWQgJiBleHRyYWN0IHZzY29kZS1zZXJ2ZXIuIgpxIDI1Cn0KfQppZiAoJGV4dHMgLW5lICIiKSB7CmVjaG8gIkluc3RhbGxpbmcgZXh0ZW5zaW9ucy4uLiIKJiAiJHNEaXJcc2VydmVyLmNtZCIgJHRlbGVtZXRyeSAtLWluc3RhbGwtZXh0ZW5zaW9uIG1zLXZzY29kZS5wb3dlcnNoZWxsLXByZXZpZXcgLS1pbnN0YWxsLWV4dGVuc2lvbiBvZGVyd2F0LmluZGVudC1yYWluYm93IC0tZm9yY2UgIyA/Pwp9CmlmKCEoR2V0LVByb2Nlc3Mgbm9kZSAtRXJyb3JBY3Rpb24gU2lsZW50bHlDb250aW51ZSB8IFdoZXJlLU9iamVjdCBQYXRoIC1tYXRjaCAkY29tbWl0SWQpKSB7CmlmKFRlc3QtUGF0aCAkbG9nKSB7CmRlbCAkbG9nCn0KJGVzY2FwZWRTZXJ2ZXJEaXI9JHNEaXIgLXJlcGxhY2UgJyAnLCAnYCAnCiRhcmdzPSItLWhvc3Q9MTI3LjAuMC4xIC0tZW5hYmxlLXJlbW90ZS1hdXRvLXNodXRkb3duIC0tcG9ydD0wICR0ZWxlbWV0cnkgKj4gJyRsb2cnIgokc3BsYXQ9QHsKRmlsZVBhdGggPSAicG93ZXJzaGVsbC5leGUiCldpbmRvd1N0eWxlID0gImhpZGRlbiIKQXJndW1lbnRMaXN0ID0gQCgKIi1FeGVjdXRpb25Qb2xpY3kiLCAiVW5yZXN0cmljdGVkIiwgIi1Ob0xvZ28iLCAiLU5vUHJvZmlsZSIsICItTm9uSW50ZXJhY3RpdmUiLCAiLWMiLCAiJGVzY2FwZWRTZXJ2ZXJEaXJcc2VydmVyLmNtZCAkYXJncyIKKQpQYXNzVGhydSA9ICRUcnVlCn0KZWNobyAiU3RhcnRpbmcgc2VydmVyIHdpdGggY29tbWFuZC4uLiAmICckc0RpclxzZXJ2ZXIuY21kJyAkYXJncyIKJGxhdW5jaGVkU2VydmVyUGlkPShTdGFydC1Qcm9jZXNzIEBzcGxhdCkuSUQKfSBlbHNlIHsKZWNobyAidnNjb2RlLXNlcnZlciB3aXRoICRjb21taXRJZCBpcyBhbHJlYWR5IHJ1bm5pbmcuIgp9CiRsaXN0ZW5pbmdQPUB7ClBhdGggPSAkbG9nClBhdHRlcm4gPSAiRXh0ZW5zaW9uIGhvc3QgYWdlbnQgbGlzdGVuaW5nIG9uIChcZCspIgp9CiRmYWlsZWRQPUB7ClBhdGggPSAkbG9nClBhdHRlcm4gPSAiISEhISBTZXJ2ZXIgdGVybWluYXRlZCBkdWUgdG8gcHJlc2VuY2Ugb2YgQ1ZFLTIwMjAtMTQxNiAhISEhIgp9CiR0aW1lb3V0RGF0ZT0oR2V0LURhdGUpLkFkZFNlY29uZHMoNCkKd2hpbGUgKChHZXQtRGF0ZSkgLWx0ICR0aW1lb3V0RGF0ZSkgewppZihUZXN0LVBhdGggJGxvZykgewokbGlzdGVuaW5nPShzbHMgQGxpc3RlbmluZ1ApLk1hdGNoZXMuR3JvdXBzCmlmKCRsaXN0ZW5pbmcpIHsKJHBvcnQ9JGxpc3RlbmluZ1sxXS5WYWx1ZQpicmVhawp9CiRmYWlsZWQ9KHNscyBAZmFpbGVkUCkuTWF0Y2hlcy5Hcm91cHMKaWYoJGZhaWxlZCkgewplY2hvICJTZXJ2ZXIgZGlkIG5vdCBzdGFydCBzdWNjZXNzZnVsbHkuIEZ1bGwgc2VydmVyIGxvZyBhdCAkbG9nID4+PiIKY2F0ICRsb2cKZWNobyAiPDw8IEVuZCBvZiBzZXJ2ZXIgbG9nIgpxIDM2Cn0KfQpzbGVlcCAtTWlsbGlzZWNvbmRzIDUwMAp9CmlmICghJHBvcnQpIHsKZWNobyAiU2VydmVyIGRpZCBub3Qgc3RhcnQgc3VjY2Vzc2Z1bGx5LiBGdWxsIHNlcnZlciBsb2cgYXQgJGxvZyA+Pj4iCmNhdCAkbG9nCmVjaG8gIjw8PCBFbmQgb2Ygc2VydmVyIGxvZyIKcSAzMgp9Cn0gY2F0Y2ggewplY2hvICJ2c2NvZGUtc2VydmVyIGZhaWxlZCB0byBzdGFydC4gLSAkKCRfLlRvU3RyaW5nKCkpIgp9IGZpbmFsbHkgewokZmlsZS5DbG9zZSgpCn0KdHJ5IHsKJHdpblZlcnNpb249KEdldC1DaW1JbnN0YW5jZSBXaW4zMl9PcGVyYXRpbmdTeXN0ZW0pLlZlcnNpb24KfSBjYXRjaCB7CmVjaG8gIkZhaWxlZCB0byBmaW5kIFdpbmRvd3MgdmVyc2lvbiAtICQoJF8uVG9TdHJpbmcoKSkiCiR3aW5WZXJzaW9uPSJ1bmtub3duIgp9CmVjaG8gIjhkZGNiYmJhOGU3OTogc3RhcnQiCmVjaG8gInNzaEF1dGhTb2NrPT0kZW52OlNTSF9BVVRIX1NPQ0s9PSIKZGV0YWlscwplY2hvICI4ZGRjYmJiYThlNzk6IGVuZCIKZWNobyAiSW5zdGFsbCBzY3JpcHQgaXMgJHBpZCwgd2F0Y2hpbmcgc3NoZCBwYXJlbnQgJHNzaGRQSUQiCndoaWxlICgkVHJ1ZSkgewpleGl0SWZOZWVkZWQKc2xlZXAgMzAKfQo=')))))" # RemoteSSHConfigurationScript
[16:46:48.893] Terminal shell path: C:\WINDOWS\System32\cmd.exe
[16:46:49.061] > The command line is too long.
> ]0;C:\WINDOWS\System32\cmd.exe
[16:46:49.062] Got some output, clearing connection timeout
[16:46:49.436] "install" terminal command done
[16:46:49.437] Install terminal quit with output: ]0;C:\WINDOWS\System32\cmd.exe
[16:46:49.438] Received install output: ]0;C:\WINDOWS\System32\cmd.exe
[16:46:49.440] Stopped parsing output early. Remaining text: ]0;C:\WINDOWS\System32\cmd.exe
[16:46:49.440] Failed to parse remote port from server output
I extracted the base64 and got this script. Being a powershell guy there's a lot that can be done to minify this script, for instance echo isn't required and it can just be the items in quotes
echo "8ddcbbba8e79: running"
$ProgressPreference='SilentlyContinue'
$commitId='e5c0007ce0e9a3816679cba674d03376c03726e3'
$p=$env:PROCESSOR_ARCHITECTURE
$arch=if (($p -eq 'AMD64') -or ($p -eq 'IA64')) { 'x64' } else { 'ia32' }
$serverRoot=(Join-Path (Resolve-Path ~) '.vscode-server-insiders')
$env:VSCODE_AGENT_FOLDER=$serverRoot
$log="$serverRoot\.$commitId.log"
$sDir="$serverRoot\bin\$commitId"
$quality='insider'
$telemetry=""
$exts="--install-extension ms-vscode.powershell-preview --install-extension oderwat.indent-rainbow --force"
function details {
echo "listeningOn==$port=="
echo "osReleaseId==windows=="
echo "osVersion==$winVersion=="
echo "arch==$arch=="
echo "platform==windows=="
}
function q($code) {
echo "8ddcbbba8e79: start"
echo "exitCode==$code=="
details
echo "8ddcbbba8e79: end"
}
function getSshdParentPid {
$currentPID=$PID
while ($True) {
$parentPID=(Get-CimInstance win32_process | ? processid -eq $currentPID).parentprocessid
if (!$parentPID) {
echo "no sshd parent proc"
exit 0
}
if ((gps -Id $parentPID).Name -eq 'sshd') {
return $parentPID
}
$currentPID=$parentPID
}
}
function exitIfNeeded {
if ($launchedServerPid) {
if (!(gps -Id $launchedServerPid)) {
echo "The launched server died, exiting"
exit 0
}
} else {
if (!(gps -Id $sshdPID)) {
echo "The sshd parent died, exiting"
exit 0
}
}
}
function DownloadServer {
echo "Downloading VS Code Server"
echo '8ddcbbba8e79%%1%%'
$webPart=""
$archPart=if ($arch -eq 'x64') { "-$arch" } else { "" }
$serverName="server-win32$archPart" + $webPart
$splat=@{
Uri="https://update.code.visualstudio.com/commit:$commitId/$serverName/$quality"
TimeoutSec=20
OutFile="vscode-server.zip"
UseBasicParsing=$True
}
[Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12
Invoke-RestMethod @splat
}
function InstallServer {
$randomDirName=[System.IO.Path]::GetRandomFileName()
$tmpDest="$env:TEMP\$randomDirName"
echo "Expanding server into $tmpDest"
echo '8ddcbbba8e79%%2%%'
Expand-Archive "vscode-server.zip" -DestinationPath "$tmpDest"
mv "$tmpDest\vscode-*\*" -Destination .
}
function DoClientDownload {
echo "Trigger client server download"
echo 8ddcbbba8e79:trigger_server_download
echo platform==windows==
echo vscodeArch==$arch==
echo destFolder==$sDir==
echo 8ddcbbba8e79:trigger_server_download_end
echo "Waiting for client to transfer server archive..."
echo "Waiting for $sDir\vscode-scp-done.flag and vscode-server.zip to exist"
while($True) {
if(Test-Path "$sDir\vscode-scp-done.flag") {
if(!(Test-Path "$sDir\vscode-server.zip")) {
echo "Found flag but not server tar - server transfer failed"
q 31
}
echo "Found flag and server on host"
del $sDir\vscode-scp-done.flag
break
} else {
Start-Sleep -Seconds 3
exitIfNeeded
}
}
}
$sshdPID=getSshdParentPid
if(!(Test-Path $sDir)) {
try {
$null=ni -ItemType Directory $sDir -Force -ErrorAction SilentlyContinue
} catch {
echo "Could not create server directory. - $($_.ToString())"
return
}
if(!(Test-Path $sDir)) {
echo "Could not create server directory."
return
}
}
cd $sDir
$lockFilePath=(Join-Path "$sDir" "vscode-remote-lock.$commitId")
try {
$null=ni $lockFilePath -ItemType File -ErrorAction SilentlyContinue
} catch {
echo "Could not create server lock file. - $($_.ToString())"
return
}
try {
echo "Acquiring lock on $lockFilePath"
$file=[System.io.File]::Open($lockFilePath, 'Open', 'Read', 'None')
} catch {
echo "Installation already in progress... - $($_.ToString())"
q 24
}
try {
echo "Looking for existing server in $sDir"
if(Test-Path "$sDir\server.cmd") {
echo "vscode-server already installed. Skipping download..."
} else {
try {
DownloadServer
} catch {
echo "Failed to download & extract vscode-server. - $($_.ToString())"
DoClientDownload
}
InstallServer
if(!(Test-Path "$sDir\server.cmd")) {
echo "Failed to download & extract vscode-server."
q 25
}
}
if ($exts -ne "") {
echo "Installing extensions..."
& "$sDir\server.cmd" $telemetry --install-extension ms-vscode.powershell-preview --install-extension oderwat.indent-rainbow --force # ??
}
if(!(Get-Process node -ErrorAction SilentlyContinue | Where-Object Path -match $commitId)) {
if(Test-Path $log) {
del $log
}
$escapedServerDir=$sDir -replace ' ', '` '
$args="--host=127.0.0.1 --enable-remote-auto-shutdown --port=0 $telemetry *> '$log'"
$splat=@{
FilePath = "powershell.exe"
WindowStyle = "hidden"
ArgumentList = @(
"-ExecutionPolicy", "Unrestricted", "-NoLogo", "-NoProfile", "-NonInteractive", "-c", "$escapedServerDir\server.cmd $args"
)
PassThru = $True
}
echo "Starting server with command... & '$sDir\server.cmd' $args"
$launchedServerPid=(Start-Process @splat).ID
} else {
echo "vscode-server with $commitId is already running."
}
$listeningP=@{
Path = $log
Pattern = "Extension host agent listening on (\d+)"
}
$failedP=@{
Path = $log
Pattern = "!!!! Server terminated due to presence of CVE-2020-1416 !!!!"
}
$timeoutDate=(Get-Date).AddSeconds(4)
while ((Get-Date) -lt $timeoutDate) {
if(Test-Path $log) {
$listening=(sls @listeningP).Matches.Groups
if($listening) {
$port=$listening[1].Value
break
}
$failed=(sls @failedP).Matches.Groups
if($failed) {
echo "Server did not start successfully. Full server log at $log >>>"
cat $log
echo "<<< End of server log"
q 36
}
}
sleep -Milliseconds 500
}
if (!$port) {
echo "Server did not start successfully. Full server log at $log >>>"
cat $log
echo "<<< End of server log"
q 32
}
} catch {
echo "vscode-server failed to start. - $($_.ToString())"
} finally {
$file.Close()
}
try {
$winVersion=(Get-CimInstance Win32_OperatingSystem).Version
} catch {
echo "Failed to find Windows version - $($_.ToString())"
$winVersion="unknown"
}
echo "8ddcbbba8e79: start"
echo "sshAuthSock==$env:SSH_AUTH_SOCK=="
details
echo "8ddcbbba8e79: end"
echo "Install script is $pid, watching sshd parent $sshdPID"
while ($True) {
exitIfNeeded
sleep 30
}
These modifications get it down to 7208 without changing the script content, just shorthands.
"8ddcbbba8e79: running"
$ProgressPreference='SilentlyContinue'
$commitId='e5c0007ce0e9a3816679cba674d03376c03726e3'
$p=$env:PROCESSOR_ARCHITECTURE
$arch=if (($p -eq 'AMD64') -or ($p -eq 'IA64')) { 'x64' } else { 'ia32' }
$serverRoot=(Join-Path (Resolve-Path ~) '.vscode-server-insiders')
$env:VSCODE_AGENT_FOLDER=$serverRoot
$log="$serverRoot\.$commitId.log"
$sDir="$serverRoot\bin\$commitId"
$quality='insider'
$telemetry=""
$exts="--install-extension ms-vscode.powershell-preview --install-extension oderwat.indent-rainbow --force"
function details {
"listeningOn==$port=="
"osReleaseId==windows=="
"osVersion==$winVersion=="
"arch==$arch=="
"platform==windows=="
}
function q($code) {
"8ddcbbba8e79: start"
"exitCode==$code=="
details
"8ddcbbba8e79: end"
}
function getSshdParentPid {
$currentPID=$PID
while ($True) {
$parentPID=(gcim win32_process | ? processid -eq $currentPID).parentprocessid
if (!$parentPID) {
"no sshd parent proc"
exit 0
}
if ((gps -Id $parentPID).Name -eq 'sshd') {
return $parentPID
}
$currentPID=$parentPID
}
}
function exitIfNeeded {
if ($launchedServerPid) {
if (!(gps -Id $launchedServerPid)) {
"The launched server died, exiting"
exit 0
}
} else {
if (!(gps -Id $sshdPID)) {
"The sshd parent died, exiting"
exit 0
}
}
}
function DownloadServer {
"Downloading VS Code Server"
'8ddcbbba8e79%%1%%'
$webPart=""
$archPart=if ($arch -eq 'x64') { "-$arch" } else { "" }
$serverName="server-win32$archPart" + $webPart
$splat=@{
Uri="https://update.code.visualstudio.com/commit:$commitId/$serverName/$quality"
TimeoutSec=20
OutFile="vscode-server.zip"
UseBasicParsing=$True
}
[Net.ServicePointManager]::SecurityProtocol = 'TLS12'
irm @splat
}
function InstallServer {
$randomDirName=[IO.Path]::GetRandomFileName()
$tmpDest="$env:TEMP\$randomDirName"
"Expanding server into $tmpDest"
'8ddcbbba8e79%%2%%'
Expand-Archive "vscode-server.zip" -DestinationPath "$tmpDest"
mv "$tmpDest\vscode-*\*" -Destination .
}
function DoClientDownload {
"Trigger client server download"
8ddcbbba8e79:trigger_server_download
platform==windows==
vscodeArch==$arch==
destFolder==$sDir==
8ddcbbba8e79:trigger_server_download_end
"Waiting for client to transfer server archive..."
"Waiting for $sDir\vscode-scp-done.flag and vscode-server.zip to exist"
while($True) {
if(Test-Path "$sDir\vscode-scp-done.flag") {
if(!(Test-Path "$sDir\vscode-server.zip")) {
"Found flag but not server tar - server transfer failed"
q 31
}
"Found flag and server on host"
del $sDir\vscode-scp-done.flag
break
} else {
Start-Sleep -Seconds 3
exitIfNeeded
}
}
}
$sshdPID=getSshdParentPid
if(!(Test-Path $sDir)) {
try {
$null=ni -it d $sDir -f -ea si
} catch {
"Could not create server directory. - $($_.ToString())"
return
}
if(!(Test-Path $sDir)) {
"Could not create server directory."
return
}
}
cd $sDir
$lockFilePath=(Join-Path "$sDir" "vscode-remote-lock.$commitId")
try {
$null=ni $lockFilePath -it f -ea si
} catch {
"Could not create server lock file. - $($_.ToString())"
return
}
try {
"Acquiring lock on $lockFilePath"
$file=[IO.File]::Open($lockFilePath, 'Open', 'Read', 'None')
} catch {
"Installation already in progress... - $($_.ToString())"
q 24
}
try {
"Looking for existing server in $sDir"
if(Test-Path "$sDir\server.cmd") {
"vscode-server already installed. Skipping download..."
} else {
try {
DownloadServer
} catch {
"Failed to download & extract vscode-server. - $($_.ToString())"
DoClientDownload
}
InstallServer
if(!(Test-Path "$sDir\server.cmd")) {
"Failed to download & extract vscode-server."
q 25
}
}
if ($exts -ne "") {
"Installing extensions..."
& "$sDir\server.cmd" $telemetry --install-extension ms-vscode.powershell-preview --install-extension oderwat.indent-rainbow --force # ??
}
if(!(Get-Process node -ea SilentlyContinue | % Path -match $commitId)) {
if(Test-Path $log) {
del $log
}
$escapedServerDir=$sDir -replace ' ', '` '
$args="--host=127.0.0.1 --enable-remote-auto-shutdown --port=0 $telemetry *> '$log'"
$splat=@{
FilePath = "powershell.exe"
WindowStyle = "hidden"
ArgumentList = @(
"-ExecutionPolicy", "Unrestricted", "-NoLogo", "-NoProfile", "-NonInteractive", "-c", "$escapedServerDir\server.cmd $args"
)
PassThru = $True
}
"Starting server with command... & '$sDir\server.cmd' $args"
$launchedServerPid=(start @splat).ID
} else {
"vscode-server with $commitId is already running."
}
$listeningP=@{
Path = $log
Pattern = "Extension host agent listening on (\d+)"
}
$failedP=@{
Path = $log
Pattern = "!!!! Server terminated due to presence of CVE-2020-1416 !!!!"
}
$timeoutDate=(Date).AddSeconds(4)
while ((Date) -lt $timeoutDate) {
if(Test-Path $log) {
$listening=(sls @listeningP).Matches.Groups
if($listening) {
$port=$listening[1].Value
break
}
$failed=(sls @failedP).Matches.Groups
if($failed) {
"Server did not start successfully. Full server log at $log >>>"
cat $log
"<<< End of server log"
q 36
}
}
sleep -Milliseconds 500
}
if (!$port) {
"Server did not start successfully. Full server log at $log >>>"
cat $log
"<<< End of server log"
q 32
}
} catch {
"vscode-server failed to start. - $($_.ToString())"
} finally {
$file.Close()
}
try {
$winVersion=(gcim Win32_OperatingSystem).Version
} catch {
"Failed to find Windows version - $($_.ToString())"
$winVersion="unknown"
}
"8ddcbbba8e79: start"
"sshAuthSock==$env:SSH_AUTH_SOCK=="
details
"8ddcbbba8e79: end"
"Install script is $pid, watching sshd parent $sshdPID"
while ($True) {
exitIfNeeded
sleep 30
}
In local testing, I removed the echos from the extension in the minified extension.js locally (since you guys don't provide an open source release), and it started working.
Thanks for the suggestions. Maybe it's the extension install string that puts you over the limit
Working on this, I forgot to mention that you can work around it by setting "remote.SSH.useLocalServer": true (in your settings.json). This may cause other issues though, which is why it's disabled by default on Windows.
More aggressive minification, got it about 15% shorter
@roblourens One other minification I spotted was that
if ($exts -ne "") {
The line after should reference $exts, and not be another template fill. If specifying several extensions this will cut it down a lot. Probably should be guidance to limit # of extensions requested to install since it can very quickly break the ceiling on this script length.
Oops, good catch!