server version display

also tests
This commit is contained in:
Will Starms
2019-10-12 18:40:58 -05:00
parent 9fdab027da
commit 8c1620e6c5
5 changed files with 36 additions and 0 deletions

View File

@@ -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

View File

@@ -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)

View File

@@ -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')

View File

@@ -1,3 +1,9 @@
i.sort-icon { i.sort-icon {
margin-left: 4px; margin-left: 4px;
} }
.version_footer {
position: fixed;
bottom: 0;
width: 100%;
}

View File

@@ -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>?