forked from jupyterhub/jupyter-remote-desktop-proxy
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request jupyterhub#79 from jupyterhub/server
Add a "Hub Control Panel" menu item if running inside a JupyterHub
- Loading branch information
Showing
10 changed files
with
174 additions
and
64 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
7 changes: 7 additions & 0 deletions
7
jupyter-config/jupyter_notebook_config.d/jupyter_remote_desktop_proxy.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
{ | ||
"NotebookApp": { | ||
"nbserver_extensions": { | ||
"jupyter_remote_desktop_proxy": true | ||
} | ||
} | ||
} |
7 changes: 7 additions & 0 deletions
7
jupyter-config/jupyter_server_config.d/jupyter_remote_desktop_proxy.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
{ | ||
"ServerApp": { | ||
"jpserver_extensions": { | ||
"jupyter_remote_desktop_proxy": true | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,64 +1,17 @@ | ||
import os | ||
import shlex | ||
import tempfile | ||
from shutil import which | ||
|
||
HERE = os.path.dirname(os.path.abspath(__file__)) | ||
|
||
|
||
def setup_desktop(): | ||
# make a secure temporary directory for sockets | ||
# This is only readable, writeable & searchable by our uid | ||
sockets_dir = tempfile.mkdtemp() | ||
sockets_path = os.path.join(sockets_dir, 'vnc-socket') | ||
vncserver = which('vncserver') | ||
from .server_extension import load_jupyter_server_extension | ||
|
||
if vncserver is None: | ||
# Use bundled tigervnc | ||
vncserver = os.path.join(HERE, 'share/tigervnc/bin/vncserver') | ||
|
||
# TigerVNC provides the option to connect a Unix socket. TurboVNC does not. | ||
# TurboVNC and TigerVNC share the same origin and both use a Perl script | ||
# as the executable vncserver. We can determine if vncserver is TigerVNC | ||
# by searching TigerVNC string in the Perl script. | ||
with open(vncserver) as vncserver_file: | ||
is_tigervnc = "TigerVNC" in vncserver_file.read() | ||
HERE = os.path.dirname(os.path.abspath(__file__)) | ||
|
||
if is_tigervnc: | ||
vnc_args = [vncserver, '-rfbunixpath', sockets_path] | ||
socket_args = ['--unix-target', sockets_path] | ||
else: | ||
vnc_args = [vncserver] | ||
socket_args = [] | ||
|
||
if not os.path.exists(os.path.expanduser('~/.vnc/xstartup')): | ||
vnc_args.extend(['-xstartup', os.path.join(HERE, 'share/xstartup')]) | ||
def _jupyter_server_extension_points(): | ||
""" | ||
Set up the server extension for collecting metrics | ||
""" | ||
return [{"module": "jupyter_remote_desktop_proxy"}] | ||
|
||
vnc_command = shlex.join( | ||
vnc_args | ||
+ [ | ||
'-verbose', | ||
'-geometry', | ||
'1680x1050', | ||
'-SecurityTypes', | ||
'None', | ||
'-fg', | ||
] | ||
) | ||
|
||
return { | ||
'command': [ | ||
'websockify', | ||
'-v', | ||
'--web', | ||
os.path.join(HERE, 'static'), | ||
'--heartbeat', | ||
'30', | ||
'{port}', | ||
] | ||
+ socket_args | ||
+ ['--', '/bin/sh', '-c', f'cd {os.getcwd()} && {vnc_command}'], | ||
'timeout': 30, | ||
'mappath': {'/': '/index.html'}, | ||
'new_browser_window': True, | ||
} | ||
# For backward compatibility | ||
_load_jupyter_server_extension = load_jupyter_server_extension | ||
_jupyter_server_extension_paths = _jupyter_server_extension_points |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
import os | ||
|
||
import jinja2 | ||
from jupyter_server.base.handlers import JupyterHandler | ||
from tornado import web | ||
|
||
jinja_env = jinja2.Environment( | ||
loader=jinja2.FileSystemLoader( | ||
os.path.join(os.path.dirname(__file__), 'templates') | ||
), | ||
) | ||
|
||
|
||
HERE = os.path.dirname(os.path.abspath(__file__)) | ||
|
||
|
||
class DesktopHandler(JupyterHandler): | ||
@web.authenticated | ||
async def get(self): | ||
template_params = { | ||
'base_url': self.base_url, | ||
} | ||
template_params.update(self.serverapp.jinja_template_vars) | ||
self.write(jinja_env.get_template("index.html").render(**template_params)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
from pathlib import Path | ||
|
||
from jupyter_server.base.handlers import AuthenticatedFileHandler | ||
from jupyter_server.utils import url_path_join | ||
from jupyter_server_proxy.handlers import AddSlashHandler | ||
|
||
from .handlers import DesktopHandler | ||
|
||
HERE = Path(__file__).parent | ||
|
||
|
||
def load_jupyter_server_extension(server_app): | ||
""" | ||
Called during notebook start | ||
""" | ||
base_url = server_app.web_app.settings["base_url"] | ||
|
||
server_app.web_app.add_handlers( | ||
".*", | ||
[ | ||
# Serve our own static files | ||
( | ||
url_path_join(base_url, "/desktop/static/(.*)"), | ||
AuthenticatedFileHandler, | ||
{"path": (str(HERE / "static"))}, | ||
), | ||
# To simplify URL mapping, we make sure that /desktop/ always | ||
# has a trailing slash | ||
(url_path_join(base_url, "/desktop"), AddSlashHandler), | ||
(url_path_join(base_url, "/desktop/"), DesktopHandler), | ||
], | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
import os | ||
import shlex | ||
import tempfile | ||
from shutil import which | ||
|
||
HERE = os.path.dirname(os.path.abspath(__file__)) | ||
|
||
|
||
def setup_websockify(): | ||
# make a secure temporary directory for sockets | ||
# This is only readable, writeable & searchable by our uid | ||
sockets_dir = tempfile.mkdtemp() | ||
sockets_path = os.path.join(sockets_dir, 'vnc-socket') | ||
vncserver = which('vncserver') | ||
|
||
if vncserver is None: | ||
# Use bundled tigervnc | ||
vncserver = os.path.join(HERE, 'share/tigervnc/bin/vncserver') | ||
|
||
# TigerVNC provides the option to connect a Unix socket. TurboVNC does not. | ||
# TurboVNC and TigerVNC share the same origin and both use a Perl script | ||
# as the executable vncserver. We can determine if vncserver is TigerVNC | ||
# by searching TigerVNC string in the Perl script. | ||
with open(vncserver) as vncserver_file: | ||
is_tigervnc = "TigerVNC" in vncserver_file.read() | ||
|
||
if is_tigervnc: | ||
vnc_args = [vncserver, '-rfbunixpath', sockets_path] | ||
socket_args = ['--unix-target', sockets_path] | ||
else: | ||
vnc_args = [vncserver] | ||
socket_args = [] | ||
|
||
if not os.path.exists(os.path.expanduser('~/.vnc/xstartup')): | ||
vnc_args.extend(['-xstartup', os.path.join(HERE, 'share/xstartup')]) | ||
|
||
vnc_command = shlex.join( | ||
vnc_args | ||
+ [ | ||
'-verbose', | ||
'-geometry', | ||
'1680x1050', | ||
'-SecurityTypes', | ||
'None', | ||
'-fg', | ||
] | ||
) | ||
|
||
return { | ||
'command': [ | ||
'websockify', | ||
'-v', | ||
'--heartbeat', | ||
'30', | ||
'{port}', | ||
] | ||
+ socket_args | ||
+ ['--', '/bin/sh', '-c', f'cd {os.getcwd()} && {vnc_command}'], | ||
'timeout': 30, | ||
'new_browser_window': True, | ||
# We want the launcher entry to point to /desktop/, not to /desktop-websockify/ | ||
# /desktop/ is the user facing URL, while /desktop-websockify/ now *only* serves | ||
# websockets. | ||
"launcher_entry": {"title": "Desktop", "path_info": "desktop"}, | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters