master
py 76 lines 2.66 KB
Raw
1 # pip install click
2 # python gh-release-server.py 2.0.0 --msi ..\..\bin\x64\Debug\wsl.msi --msix ..\..\bin\x64\Debug\installer.msix
3
4 import click
5 from http.server import SimpleHTTPRequestHandler, HTTPServer
6 from http import HTTPStatus
7 import socketserver
8 import json
9 from winreg import *
10
11 RELEASES_PATH = '/releases'
12 MSI_PATH = '/msi'
13 MSIX_PATH = '/msix'
14
15 @click.command()
16 @click.argument('version', required=True)
17 @click.option('--msi', default=None)
18 @click.option('--port', default=8000)
19 @click.option('--msix', default=None)
20 @click.option('--pre-release', default=False, is_flag=True)
21 def main(port: int, version: str, msi: str, msix: str, pre_release: bool):
22 lxss_key = OpenKeyEx(HKEY_LOCAL_MACHINE, '''SOFTWARE\Microsoft\Windows\CurrentVersion\Lxss''', 0, KEY_SET_VALUE)
23
24 assets = []
25 if msix:
26 assets.append({'url': f'http://127.0.0.1:{port}{MSIX_PATH}', 'id': 0, 'name': 'wsl.msixbundle'})
27
28 if msi:
29 assets.append({'url': f'http://127.0.0.1:{port}{MSI_PATH}', 'id': 0, 'name': 'wsl.x64.msi'})
30
31 release_json = {'name': version, 'created_at': '2023-06-14T16:56:30Z', 'assets': assets}
32 release_response = json.dumps([release_json] if pre_release else release_json).encode()
33
34 class ReleaseRequestHandler(SimpleHTTPRequestHandler):
35 def translate_path(self, path):
36 return path
37
38 def do_GET(self):
39 print(self.path)
40
41 if self.path == RELEASES_PATH:
42 self.send_response(HTTPStatus.OK)
43 self.send_header("Content-type", 'application/octet-stream')
44 self.send_header("Content-Length", str(len(release_response)))
45 self.end_headers()
46
47 self.wfile.write(release_response)
48 elif self.path == MSI_PATH:
49 self.path = msi
50 file = self.send_head()
51 if file is None:
52 raise RuntimeError(f'Failed to open {msi}')
53
54 self.copyfile(file, self.wfile)
55 elif self.path == MSIX_PATH:
56 self.path = msix
57 file = self.send_head()
58 if file is None:
59 raise RuntimeError(f'Failed to open {msix}')
60
61 self.copyfile(file, self.wfile)
62 else:
63 print(f'Received unexpected request: {self.path}')
64
65 SetValueEx(lxss_key, 'GitHubUrlOverride', 0, REG_SZ, f'http://127.0.0.1:{port}{RELEASES_PATH}')
66
67 try:
68
69 with socketserver.TCPServer(("127.0.0.1", port), ReleaseRequestHandler) as server:
70 print(f'Serving on port {port}')
71 server.serve_forever()
72 finally:
73 DeleteValue(lxss_key, 'GitHubUrlOverride')
74
75 if __name__ == '__main__':
76 main()