diff --git a/enterprise_gateway/services/kernels/handlers.py b/enterprise_gateway/services/kernels/handlers.py index 8f4299a4a..15af66e5e 100644 --- a/enterprise_gateway/services/kernels/handlers.py +++ b/enterprise_gateway/services/kernels/handlers.py @@ -58,7 +58,32 @@ async def post(self): raise tornado.web.HTTPError(400) # Transfer inherited environment variables from current process - env = {key: value for key, value in os.environ.items() if key in self.inherited_envs} + if os.name == "nt": + # We need to ensure we pass all needed environment variables to the kernel + # Users can use inherited_envs to add custom envrioment variables, + # and we ensure PATH, SYSTEMROOT, TEMP, USERPROFILE, WINDIR, COMSPEC, APPDATA, LOCALAPPDATA, PROGRAMDATA and PROGRAMFILES are included + # this allows a more out-of-the-box experience for users + required_envs: set[str] = { + "PATH", + "SYSTEMROOT", + "TEMP", + "USERPROFILE", + "WINDIR", + "COMSPEC", + "APPDATA", + "LOCALAPPDATA", + "PROGRAMDATA", + "PROGRAMFILES", + } + env = { + key: value + for key, value in os.environ.items() + if key in self.inherited_envs or key in required_envs + } + else: + env = { + key: value for key, value in os.environ.items() if key in self.inherited_envs + } # Allow all KERNEL_* envs and those specified in client_envs and set from client. If this EG # instance is configured to accept all envs in the payload (i.e., client_envs == '*'), go ahead diff --git a/enterprise_gateway/services/processproxies/processproxy.py b/enterprise_gateway/services/processproxies/processproxy.py index 405adfbca..eb62f83c4 100644 --- a/enterprise_gateway/services/processproxies/processproxy.py +++ b/enterprise_gateway/services/processproxies/processproxy.py @@ -1043,6 +1043,8 @@ def __init__(self, kernel_manager: RemoteKernelManager, proxy_config: dict): # """Initialize the proxy.""" super().__init__(kernel_manager, proxy_config) kernel_manager.ip = localinterfaces.LOCALHOST + if os.name == "nt": + self.win32_interrupt_event = None async def launch_process( self, kernel_cmd: str, **kwargs: dict[str, Any] | None @@ -1059,6 +1061,10 @@ async def launch_process( except OSError: pass self.ip = local_ip + if ( + os.name == "nt" + ): # if operating system is Windows then link the win32_interrupt_event from the kernel + self.win32_interrupt_event = self.local_proc.win32_interrupt_event self.log.info( "Local kernel launched on '{}', pid: {}, pgid: {}, KernelID: {}, cmd: '{}'".format( self.ip, self.pid, self.pgid, self.kernel_id, kernel_cmd