Skip to content

Commit 7ac457a

Browse files
committed
pass more functionality via env-vars
1 parent 419e5e5 commit 7ac457a

File tree

2 files changed

+98
-5
lines changed

2 files changed

+98
-5
lines changed

README.md

+18
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,24 @@ It tries to find the `openvscode-server` executable checking the following:
2222
- 4. special locations:
2323
- `/opt/openvscode-server/bin/openvscode-server`
2424

25+
## Configuration
26+
The jupyter-openvscodeserver-proxy can be configures via the following environment variables
27+
28+
- JUPYTER_OPENVSCODE_PROXY_TIMEOUT = <int> in seconds, default=60
29+
Specifies how long jupyter-openvscodeserver-proxy shall wait for the OpenVSCode-Server to startup until it gives up.
30+
- JUPYTER_OPENVSCODE_PROXY_USE_SOCKET = <TRUE|FALSE>, default=FALSE
31+
Use unix sockets for highest security standards.
32+
- JUPYTER_OPENVSCODE_PROXY_DEFAULT_FOLDER = <path>, default=current working directory
33+
The workspace folder to open when no input is specified in the browser URL. A relative or absolute path resolved against the current working directory.
34+
35+
### VSCode options
36+
- JUPYTER_OPENVSCODE_PROXY_SERVER_DATA_DIR = <path>
37+
Specifies the directory that server data is kept in. If not set the default is used.
38+
- JUPYTER_OPENVSCODE_PROXY_USER_DATA_DIR = <path>
39+
Specifies the directory that user data is kept in. If not set the default is used.
40+
- JUPYTER_OPENVSCODE_PROXY_EXTENSIONS_DIR = <path>
41+
Specifies the directory that extensions are kept in. If not set the default is used.
42+
2543
## Install
2644

2745
#### Create and Activate Environment

jupyter_openvscodeserver_proxy/__init__.py

+80-5
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,33 @@ def _get_executable(prog):
4949

5050
raise FileNotFoundError(f'Could not find {prog} in PATH')
5151

52+
# return supported arguments
53+
def _support_args(args):
54+
ret = subprocess.check_output([_get_executable('openvscode-server'), '--help'])
55+
help_output = ret.decode()
56+
return {arg: (help_output.find(f"--{arg}") != -1) for arg in args}
57+
58+
# check the version number
59+
def _is_version_supported(major_min, minor_min):
60+
import subprocess
61+
import re
62+
63+
try:
64+
ret = subprocess.check_output([_get_executable('openvscode-server'), '--version'])
65+
help_output = ret.decode()
66+
67+
version_line = result.stdout.splitlines()[0]
68+
match = re.match(r"(\d+)\.(\d+)", version_line)
69+
if not match:
70+
raise ValueError("Could not extract version number")
71+
72+
major, minor = map(int, match.groups())
73+
return (major > major_min) or (major == major_min and minor >= minor_min)
74+
75+
except (subprocess.CalledProcessError, IndexError, ValueError) as e:
76+
logger.error(f"Error checking version: {e}")
77+
return False
78+
5279
# return url prefix
5380
def _get_urlprefix():
5481
url_prefix = os.environ.get('JUPYTERHUB_SERVICE_PREFIX')
@@ -77,6 +104,34 @@ def _get_cmd(port, unix_socket):
77104
logger.error("Token generation in temp file FAILED")
78105
raise FileNotFoundError("Token generation in temp file FAILED")
79106

107+
# check for supported arguments
108+
supported_args = _support_args([
109+
'version',
110+
'socket-path',
111+
'server-base-path',
112+
'default-folder',
113+
'server-data-dir',
114+
'user-data-dir',
115+
'extensions-dir',
116+
])
117+
118+
# check the version
119+
if supported_args['version']:
120+
if not _is_version_supported(1, 98):
121+
raise NotImplementedError(
122+
'OpenVSCode-Server is not installed in the required version of >= 1.98'
123+
)
124+
else:
125+
raise NotImplementedError(
126+
'Checking the version number of OpenVSCode-Server failed'
127+
)
128+
129+
# check if settig a base-path is supported
130+
if not supported_args['socket-base-path']:
131+
raise NotImplementedError(
132+
'OpenVSCode Server does not support --socket-base-path, which is crucial.'
133+
)
134+
80135
# create command
81136
cmd = [
82137
_get_executable('openvscode-server'),
@@ -85,17 +140,37 @@ def _get_cmd(port, unix_socket):
85140
'--connection-token-file={}'.format(fpath_token),
86141
'--accept-server-license-terms',
87142
'--disable-telemetry',
88-
# '--default-folder=<dir>',
89-
# '--server-data-dir=<dir>',
90-
# '--user-data-dir=<dir>',
91-
# '--extensions-dir=<dir>',
92143
# '--log=<level>',
93144
]
145+
94146
if unix_socket != "":
95-
cmd.append('--socket-path={unix_socket}')
147+
if supported_args['socket-path']:
148+
cmd.append('--socket-path={unix_socket}')
149+
else:
150+
raise NotImplementedError(f'openvscode-server does not support requested socket connection')
96151
else:
97152
cmd.append('--port={port}')
98153

154+
if supported_args['default-folder']:
155+
default_folder = os.getenv('JUPYTER_OPENVSCODE_PROXY_DEFAULT_FOLDER', None)
156+
if default_folder is not None:
157+
cmd.append('--default-folder=' + str(default_folder))
158+
159+
if supported_args['server-data-dir']:
160+
server_data_dir = os.getenv('JUPYTER_OPENVSCODE_PROXY_SERVER_DATA_DIR', None)
161+
if server_data_dir is not None:
162+
cmd.append('--server-data-dir=' + str(server_data_dir))
163+
164+
if supported_args['user-data-dir']:
165+
user_data_dir = os.getenv('JUPYTER_OPENVSCODE_PROXY_USER_DATA_DIR', None)
166+
if user_data_dir is not None:
167+
cmd.append('--user-data-dir=' + str(user_data_dir))
168+
169+
if supported_args['extensions-dir']:
170+
extensions_dir = os.getenv('JUPYTER_OPENVSCODE_PROXY_EXTENSIONS_DIR', None)
171+
if extensions_dir is not None:
172+
cmd.append('--extensions-dir=' + str(extensions_dir))
173+
99174
logger.info('OpenVSCode-Server command: ' + ' '.join(cmd))
100175
return cmd
101176

0 commit comments

Comments
 (0)