mirror of
https://github.com/jupyterhub/the-littlest-jupyterhub.git
synced 2025-12-18 21:54:05 +08:00
Serve a temporary html page while tljh is building
This commit is contained in:
@@ -13,10 +13,13 @@ Constraints:
|
|||||||
- Use stdlib modules only
|
- Use stdlib modules only
|
||||||
"""
|
"""
|
||||||
import os
|
import os
|
||||||
|
from http.server import SimpleHTTPRequestHandler, HTTPServer
|
||||||
|
import multiprocessing
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
import logging
|
import logging
|
||||||
import shutil
|
import shutil
|
||||||
|
import urllib.request
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -90,7 +93,38 @@ def validate_host():
|
|||||||
print("For local development, see http://tljh.jupyter.org/en/latest/contributing/dev-setup.html")
|
print("For local development, see http://tljh.jupyter.org/en/latest/contributing/dev-setup.html")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
class LoaderPageRequestHandler(SimpleHTTPRequestHandler):
|
||||||
|
def do_GET(self):
|
||||||
|
if self.path == "/logs":
|
||||||
|
with open("/opt/tljh/installer.log", "rb") as log_file:
|
||||||
|
content = log_file.read()
|
||||||
|
self.wfile.write(content)
|
||||||
|
else:
|
||||||
|
self.path = '/index.html'
|
||||||
|
return SimpleHTTPRequestHandler.do_GET(self)
|
||||||
|
|
||||||
|
def serve_forever(server):
|
||||||
|
try:
|
||||||
|
server.serve_forever()
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
pass
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
# Serve the loading page until TLJH builds
|
||||||
|
url="https://raw.githubusercontent.com/jupyterhub/the-littlest-jupyterhub/master/bootstrap/index.html"
|
||||||
|
urllib.request.urlretrieve(url, "index.html")
|
||||||
|
|
||||||
|
# If the bootstrap is run to upgrade TLJH, then this will raise an "Address already in use" error
|
||||||
|
try:
|
||||||
|
loading_page_server = HTTPServer(("", 80), LoaderPageRequestHandler)
|
||||||
|
p = multiprocessing.Process(target=serve_forever, args=(loading_page_server,))
|
||||||
|
p.start()
|
||||||
|
with open('/loading.pid', 'w+') as f:
|
||||||
|
f.write(str(p.pid))
|
||||||
|
except OSError:
|
||||||
|
# Only serve the loading page when installing TLJH
|
||||||
|
pass
|
||||||
|
|
||||||
validate_host()
|
validate_host()
|
||||||
install_prefix = os.environ.get('TLJH_INSTALL_PREFIX', '/opt/tljh')
|
install_prefix = os.environ.get('TLJH_INSTALL_PREFIX', '/opt/tljh')
|
||||||
hub_prefix = os.path.join(install_prefix, 'hub')
|
hub_prefix = os.path.join(install_prefix, 'hub')
|
||||||
@@ -178,6 +212,5 @@ def main():
|
|||||||
] + sys.argv[1:]
|
] + sys.argv[1:]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
main()
|
||||||
|
|||||||
67
bootstrap/index.html
Normal file
67
bootstrap/index.html
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en-US">
|
||||||
|
<head>
|
||||||
|
<body>
|
||||||
|
<meta http-equiv="refresh" content="20"/>
|
||||||
|
<img style="width: 150px; height: auto;" src="https://raw.githubusercontent.com/jupyterhub/the-littlest-jupyterhub/master/docs/images/logo/logo.png">
|
||||||
|
<div class="loader"></div>
|
||||||
|
<div class="message">Please wait while your TLJH is building...</div>
|
||||||
|
<div class="logs_info">Click the button below to see the logs</div>
|
||||||
|
<button class="logs_button" onclick="window.location.href='/logs'">View logs</button>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
button:hover {
|
||||||
|
background: grey;
|
||||||
|
}
|
||||||
|
|
||||||
|
.message {
|
||||||
|
position: absolute;
|
||||||
|
top: 35%;
|
||||||
|
left: 30%;
|
||||||
|
font-size: 30px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: grey;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader {
|
||||||
|
position: absolute;
|
||||||
|
top: 11%;
|
||||||
|
left: 46%;
|
||||||
|
width: 150px;
|
||||||
|
height: 150px;
|
||||||
|
border-radius: 90%;
|
||||||
|
border: 7px solid transparent;
|
||||||
|
animation: spin 2s infinite ease;
|
||||||
|
animation-direction: alternate;
|
||||||
|
}
|
||||||
|
@keyframes spin {
|
||||||
|
0% {
|
||||||
|
transform: rotateZ(0deg);
|
||||||
|
border-top-color: #f17c0e
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: rotateZ(360deg);
|
||||||
|
border-top-color: #fce5cf;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.logs_info {
|
||||||
|
position: absolute;
|
||||||
|
top: 45%;
|
||||||
|
left: 42%;
|
||||||
|
font-size: 15px;
|
||||||
|
color: grey;
|
||||||
|
}
|
||||||
|
.logs_button {
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 46%;
|
||||||
|
border: 0;
|
||||||
|
color: white;
|
||||||
|
padding: 15px 32px;
|
||||||
|
font-size: 16px;
|
||||||
|
cursor: pointer;
|
||||||
|
background: #f5a252;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
@@ -6,6 +6,7 @@ import itertools
|
|||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import secrets
|
import secrets
|
||||||
|
import signal
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
@@ -499,6 +500,18 @@ def main():
|
|||||||
ensure_node()
|
ensure_node()
|
||||||
ensure_jupyterhub_package(HUB_ENV_PREFIX)
|
ensure_jupyterhub_package(HUB_ENV_PREFIX)
|
||||||
ensure_jupyterlab_extensions()
|
ensure_jupyterlab_extensions()
|
||||||
|
|
||||||
|
# Stop the http server with the loading page before traefik starts
|
||||||
|
try:
|
||||||
|
with open(pidfile, "r") as f:
|
||||||
|
pid = f.read()
|
||||||
|
os.kill(int(pid), signal.SIGINT)
|
||||||
|
# Remove the pid file and the temporary html page
|
||||||
|
os.remove('/loading.pid')
|
||||||
|
os.remove('/index.html')
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
ensure_jupyterhub_service(HUB_ENV_PREFIX)
|
ensure_jupyterhub_service(HUB_ENV_PREFIX)
|
||||||
ensure_jupyterhub_running()
|
ensure_jupyterhub_running()
|
||||||
ensure_symlinks(HUB_ENV_PREFIX)
|
ensure_symlinks(HUB_ENV_PREFIX)
|
||||||
|
|||||||
Reference in New Issue
Block a user