1+ import os, osproc, strutils, json, puppy
2+
3+ let tempDir = getEnv (" TEMP" )
4+ let wslTempDir = " /mnt/" & tempDir[0 ].toLowerAscii () & tempDir[2 ..^ 1 ].replace (" \\ " , " /" )
5+
6+ proc runCommand (cmd: string ): (int , string , string ) =
7+ let result = execCmdEx (cmd, options = {poUsePath, poStdErrToStdOut})
8+ echo result .output
9+ return (result .exitCode, result .output, result .output)
10+
11+ proc downloadKernel () =
12+
13+ # Get latest kernel version of Microsoft/WSL2-Linux-Kernel from GitHub API
14+ let response = get (" https://api.github.com/repos/microsoft/WSL2-Linux-Kernel/releases/latest" )
15+ let json = parseJson (response.body)
16+ let kernelVersion = json[" tag_name" ].str
17+ # Get download url for kernel tar.gz
18+ let downloadUrl = " https://github.com/microsoft/WSL2-Linux-Kernel/archive/refs/tags/" & kernelVersion & " .tar.gz"
19+ # Use puppy library to download kernel tar.gz
20+ let download = get (downloadUrl)
21+ let kernelTar = open (tempDir & " /kernel.tar.gz" , fmWrite)
22+ kernelTar.write (download.body)
23+ kernelTar.close ()
24+
25+ let perfElfExists = fileExists (" perf.elf" )
26+
27+ if perfElfExists:
28+ let (output, exitCode) = execCmdEx (" wsl.exe --system --user root ./perf.elf " & commandLineParams ().join (" " ))
29+ echo output
30+ if exitCode != 0 :
31+ quit (exitCode)
32+ else :
33+ echo " perf does not exist. Do you want to build and install perf? [Y/n]"
34+ let response = readLine (stdin)
35+ if response in [" " , " Y" , " y" ]:
36+ echo " Installing perf"
37+ discard runCommand (" wsl.exe --system --user root sh -c \" while true; do sleep 1000; done\" &" )
38+ echo " Installing dependencies"
39+ discard runCommand (" wsl.exe --system --user root tdnf install -y gcc glibc-devel make gawk tar kernel-headers binutils flex bison glibc-static diffutils elfutils-libelf-devel libnuma-devel libbabeltrace2-devel python3" )
40+ echo " Downloading perf sources"
41+ downloadKernel ()
42+ echo " Copying perf sources to WSL System Distro"
43+ discard runCommand (" wsl --system --user root cp " & wslTempDir & " /kernel.tar.gz ~/kernel.tar.gz" )
44+ echo " Extracting perf sources"
45+ discard runCommand (" wsl --system --user root tar -xzf ~/kernel.tar.gz -C ~" )
46+ echo " Building perf"
47+ discard runCommand (" wsl --system --user root sh -c \" cd ~/WSL2-Linux-Kernel-* && make -C tools/perf LDFLAGS='-static'\" " )
48+ echo " Copying perf to local directory"
49+ discard runCommand (" wsl --system --user root cp ~/WSL2-Linux-Kernel-*/tools/perf/perf ./perf.elf" )
50+ echo " Cleaning up"
51+ discard runCommand (" wsl --system --user root pkill sleep" )
52+ removeFile (getEnv (" TEMP" ) & " /kernel.tar.gz" )
53+ echo " perf installed: " , fileExists (" perf.elf" )
54+ let (output, exitCode) = execCmdEx (" wsl.exe --system --user root ./perf.elf " & commandLineParams ().join (" " ))
55+ echo output
56+ if exitCode != 0 :
57+ quit (exitCode)
58+ else :
59+ echo " Exiting..."
0 commit comments