diff --git a/jupyter_server/files/handlers.py b/jupyter_server/files/handlers.py index b1051ac182..d6bc5e4a8a 100644 --- a/jupyter_server/files/handlers.py +++ b/jupyter_server/files/handlers.py @@ -8,7 +8,7 @@ from base64 import decodebytes -from tornado import web +from tornado import gen, web from jupyter_server.base.handlers import JupyterHandler @@ -46,9 +46,9 @@ def get(self, path, include_body=True): _, name = path.rsplit('/', 1) else: name = path - - model = cm.get(path, type='file', content=include_body) - + + model = yield gen.maybe_future(cm.get(path, type='file', content=include_body)) + if self.get_argument("download", False): self.set_attachment_header(name) diff --git a/jupyter_server/prometheus/log_functions.py b/jupyter_server/prometheus/log_functions.py index 338b59d0d1..548c5fd8d4 100644 --- a/jupyter_server/prometheus/log_functions.py +++ b/jupyter_server/prometheus/log_functions.py @@ -1,4 +1,4 @@ -from notebook.prometheus.metrics import HTTP_REQUEST_DURATION_SECONDS +from jupyter_server.prometheus.metrics import HTTP_REQUEST_DURATION_SECONDS def prometheus_log_method(handler): diff --git a/jupyter_server/serverapp.py b/jupyter_server/serverapp.py index 582056c204..c94e7793cf 100755 --- a/jupyter_server/serverapp.py +++ b/jupyter_server/serverapp.py @@ -849,6 +849,12 @@ def _token_changed(self, change): @default('allow_remote_access') def _default_allow_remote(self): """Disallow remote access if we're listening only on loopback addresses""" + + # if blank, self.ip was configured to "*" meaning bind to all interfaces, + # see _valdate_ip + if self.ip == "": + return True + try: addr = ipaddress.ip_address(self.ip) except ValueError: @@ -1330,14 +1336,16 @@ def display_url(self): url += '/' else: if self.ip in ('', '0.0.0.0'): - ip = "(%s or 127.0.0.1)" % socket.gethostname() + ip = "%s" % socket.gethostname() else: ip = self.ip url = self._url(ip) if self.token: # Don't log full token if it came from config token = self.token if self._token_generated else '...' - url = url_concat(url, {'token': token}) + url = (url_concat(url, {'token': token}) + + '\n or ' + + url_concat(self._url('127.0.0.1'), {'token': token})) return url @property diff --git a/jupyter_server/services/contents/handlers.py b/jupyter_server/services/contents/handlers.py index 475282ff16..24eb1a19df 100644 --- a/jupyter_server/services/contents/handlers.py +++ b/jupyter_server/services/contents/handlers.py @@ -182,10 +182,12 @@ def post(self, path=''): cm = self.contents_manager - if cm.file_exists(path): + file_exists = yield gen.maybe_future(cm.file_exists(path)) + if file_exists: raise web.HTTPError(400, "Cannot POST to files, use PUT instead.") - if not cm.dir_exists(path): + dir_exists = yield gen.maybe_future(cm.dir_exists(path)) + if not dir_exists: raise web.HTTPError(404, "No such directory: %s" % path) model = self.get_json_body() diff --git a/jupyter_server/services/kernels/kernelmanager.py b/jupyter_server/services/kernels/kernelmanager.py index b7f6d9f9a3..ae2fd6a251 100644 --- a/jupyter_server/services/kernels/kernelmanager.py +++ b/jupyter_server/services/kernels/kernelmanager.py @@ -26,7 +26,7 @@ from jupyter_server._tz import utcnow, isoformat from ipython_genutils.py3compat import getcwd -from notebook.prometheus.metrics import KERNEL_CURRENTLY_RUNNING_TOTAL +from jupyter_server.prometheus.metrics import KERNEL_CURRENTLY_RUNNING_TOTAL class MappingKernelManager(MultiKernelManager): @@ -415,9 +415,11 @@ def record_activity(msg_list): msg = session.deserialize(fed_msg_list) msg_type = msg['header']['msg_type'] - self.log.debug("activity on %s: %s", kernel_id, msg_type) if msg_type == 'status': kernel.execution_state = msg['content']['execution_state'] + self.log.debug("activity on %s: %s (%s)", kernel_id, msg_type, kernel.execution_state) + else: + self.log.debug("activity on %s: %s", kernel_id, msg_type) kernel._activity_stream.on_recv(record_activity) diff --git a/jupyter_server/terminal/__init__.py b/jupyter_server/terminal/__init__.py index 1f8360739a..c20001c894 100644 --- a/jupyter_server/terminal/__init__.py +++ b/jupyter_server/terminal/__init__.py @@ -21,6 +21,9 @@ def initialize(webapp, root_dir, connection_url, settings): shell = settings.get('shell_command', [os.environ.get('SHELL') or default_shell] ) + # Enable login mode - to automatically source the /etc/profile script + if os.name != 'nt': + shell.append('-l') terminal_manager = webapp.settings['terminal_manager'] = NamedTermManager( shell_command=shell, extra_env={'JUPYTER_SERVER_ROOT': root_dir,