mirror of
https://github.com/jupyterhub/jupyterhub.git
synced 2025-10-15 22:13:00 +00:00
server version display
also tests
This commit is contained in:
@@ -1185,6 +1185,10 @@ class JupyterHub(Application):
|
|||||||
False, help="""Shuts down all user servers on logout"""
|
False, help="""Shuts down all user servers on logout"""
|
||||||
).tag(config=True)
|
).tag(config=True)
|
||||||
|
|
||||||
|
server_tokens = Bool(
|
||||||
|
True, help="""Display JupyterHub version information on admin page"""
|
||||||
|
).tag(config=True)
|
||||||
|
|
||||||
@default('statsd')
|
@default('statsd')
|
||||||
def _statsd(self):
|
def _statsd(self):
|
||||||
if self.statsd_host:
|
if self.statsd_host:
|
||||||
@@ -2133,6 +2137,7 @@ class JupyterHub(Application):
|
|||||||
internal_ssl_ca=self.internal_ssl_ca,
|
internal_ssl_ca=self.internal_ssl_ca,
|
||||||
trusted_alt_names=self.trusted_alt_names,
|
trusted_alt_names=self.trusted_alt_names,
|
||||||
shutdown_on_logout=self.shutdown_on_logout,
|
shutdown_on_logout=self.shutdown_on_logout,
|
||||||
|
server_tokens=self.server_tokens,
|
||||||
eventlog=self.eventlog,
|
eventlog=self.eventlog,
|
||||||
)
|
)
|
||||||
# allow configured settings to have priority
|
# allow configured settings to have priority
|
||||||
|
@@ -14,6 +14,7 @@ from tornado import gen
|
|||||||
from tornado import web
|
from tornado import web
|
||||||
from tornado.httputil import url_concat
|
from tornado.httputil import url_concat
|
||||||
|
|
||||||
|
from .. import __version__
|
||||||
from .. import orm
|
from .. import orm
|
||||||
from ..metrics import SERVER_POLL_DURATION_SECONDS
|
from ..metrics import SERVER_POLL_DURATION_SECONDS
|
||||||
from ..metrics import ServerPollStatus
|
from ..metrics import ServerPollStatus
|
||||||
@@ -422,6 +423,8 @@ class AdminHandler(BaseHandler):
|
|||||||
sort={s: o for s, o in zip(sorts, orders)},
|
sort={s: o for s, o in zip(sorts, orders)},
|
||||||
allow_named_servers=self.allow_named_servers,
|
allow_named_servers=self.allow_named_servers,
|
||||||
named_server_limit_per_user=self.named_server_limit_per_user,
|
named_server_limit_per_user=self.named_server_limit_per_user,
|
||||||
|
server_tokens=self.settings.get('server_tokens', True),
|
||||||
|
server_version='{} {}'.format(__version__, self.version_hash),
|
||||||
)
|
)
|
||||||
self.finish(html)
|
self.finish(html)
|
||||||
|
|
||||||
|
@@ -110,6 +110,21 @@ async def test_admin(app):
|
|||||||
assert r.url.endswith('/admin')
|
assert r.url.endswith('/admin')
|
||||||
|
|
||||||
|
|
||||||
|
async def test_admin_version(app):
|
||||||
|
cookies = await app.login_user('admin')
|
||||||
|
r = await get_page('admin', app, cookies=cookies, allow_redirects=False)
|
||||||
|
r.raise_for_status()
|
||||||
|
assert "version_footer" in r.text
|
||||||
|
|
||||||
|
|
||||||
|
async def test_admin_version_disabled(app):
|
||||||
|
cookies = await app.login_user('admin')
|
||||||
|
with mock.patch.dict(app.tornado_settings, {'server_tokens': False}):
|
||||||
|
r = await get_page('admin', app, cookies=cookies, allow_redirects=False)
|
||||||
|
r.raise_for_status()
|
||||||
|
assert "version_footer" not in r.text
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize('sort', ['running', 'last_activity', 'admin', 'name'])
|
@pytest.mark.parametrize('sort', ['running', 'last_activity', 'admin', 'name'])
|
||||||
async def test_admin_sort(app, sort):
|
async def test_admin_sort(app, sort):
|
||||||
cookies = await app.login_user('admin')
|
cookies = await app.login_user('admin')
|
||||||
|
@@ -1,3 +1,9 @@
|
|||||||
i.sort-icon {
|
i.sort-icon {
|
||||||
margin-left: 4px;
|
margin-left: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.version_footer {
|
||||||
|
position: fixed;
|
||||||
|
bottom: 0;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
@@ -103,6 +103,13 @@
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
{%- if server_tokens -%}
|
||||||
|
<div class="container-fluid navbar-default small version_footer">
|
||||||
|
<div class="navbar-text">
|
||||||
|
JupyterHub {{ server_version }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{%- endif -%}
|
||||||
|
|
||||||
{% call modal('Delete User', btn_class='btn-danger delete-button') %}
|
{% call modal('Delete User', btn_class='btn-danger delete-button') %}
|
||||||
Are you sure you want to delete user <span class="delete-username">USER</span>?
|
Are you sure you want to delete user <span class="delete-username">USER</span>?
|
||||||
|
Reference in New Issue
Block a user