@@ -49,6 +49,33 @@ def _get_executable(prog):
49
49
50
50
raise FileNotFoundError (f'Could not find { prog } in PATH' )
51
51
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
+
52
79
# return url prefix
53
80
def _get_urlprefix ():
54
81
url_prefix = os .environ .get ('JUPYTERHUB_SERVICE_PREFIX' )
@@ -77,6 +104,34 @@ def _get_cmd(port, unix_socket):
77
104
logger .error ("Token generation in temp file FAILED" )
78
105
raise FileNotFoundError ("Token generation in temp file FAILED" )
79
106
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
+
80
135
# create command
81
136
cmd = [
82
137
_get_executable ('openvscode-server' ),
@@ -85,17 +140,37 @@ def _get_cmd(port, unix_socket):
85
140
'--connection-token-file={}' .format (fpath_token ),
86
141
'--accept-server-license-terms' ,
87
142
'--disable-telemetry' ,
88
- # '--default-folder=<dir>',
89
- # '--server-data-dir=<dir>',
90
- # '--user-data-dir=<dir>',
91
- # '--extensions-dir=<dir>',
92
143
# '--log=<level>',
93
144
]
145
+
94
146
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' )
96
151
else :
97
152
cmd .append ('--port={port}' )
98
153
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
+
99
174
logger .info ('OpenVSCode-Server command: ' + ' ' .join (cmd ))
100
175
return cmd
101
176
0 commit comments