WSL/tools/test/gh-release-server.py

76 lines
2.7 KiB
Python

# pip install click
# python gh-release-server.py 2.0.0 --msi ..\..\bin\x64\Debug\wsl.msi --msix ..\..\bin\x64\Debug\installer.msix
import click
from http.server import SimpleHTTPRequestHandler, HTTPServer
from http import HTTPStatus
import socketserver
import json
from winreg import *
RELEASES_PATH = '/releases'
MSI_PATH = '/msi'
MSIX_PATH = '/msix'
@click.command()
@click.argument('version', required=True)
@click.option('--msi', default=None)
@click.option('--port', default=8000)
@click.option('--msix', default=None)
@click.option('--pre-release', default=False, is_flag=True)
def main(port: int, version: str, msi: str, msix: str, pre_release: bool):
lxss_key = OpenKeyEx(HKEY_LOCAL_MACHINE, '''SOFTWARE\Microsoft\Windows\CurrentVersion\Lxss''', 0, KEY_SET_VALUE)
assets = []
if msix:
assets.append({'url': f'http://127.0.0.1:{port}{MSIX_PATH}', 'id': 0, 'name': 'wsl.msixbundle'})
if msi:
assets.append({'url': f'http://127.0.0.1:{port}{MSI_PATH}', 'id': 0, 'name': 'wsl.x64.msi'})
release_json = {'name': version, 'created_at': '2023-06-14T16:56:30Z', 'assets': assets}
release_response = json.dumps([release_json] if pre_release else release_json).encode()
class ReleaseRequestHandler(SimpleHTTPRequestHandler):
def translate_path(self, path):
return path
def do_GET(self):
print(self.path)
if self.path == RELEASES_PATH:
self.send_response(HTTPStatus.OK)
self.send_header("Content-type", 'application/octet-stream')
self.send_header("Content-Length", str(len(release_response)))
self.end_headers()
self.wfile.write(release_response)
elif self.path == MSI_PATH:
self.path = msi
file = self.send_head()
if file is None:
raise RuntimeError(f'Failed to open {msi}')
self.copyfile(file, self.wfile)
elif self.path == MSIX_PATH:
self.path = msix
file = self.send_head()
if file is None:
raise RuntimeError(f'Failed to open {msix}')
self.copyfile(file, self.wfile)
else:
print(f'Received unexpected request: {self.path}')
SetValueEx(lxss_key, 'GitHubUrlOverride', 0, REG_SZ, f'http://127.0.0.1:{port}{RELEASES_PATH}')
try:
with socketserver.TCPServer(("127.0.0.1", port), ReleaseRequestHandler) as server:
print(f'Serving on port {port}')
server.serve_forever()
finally:
DeleteValue(lxss_key, 'GitHubUrlOverride')
if __name__ == '__main__':
main()