Skip to content

Commit

Permalink
[rqd] On Windows, pass environment and properly escape command chars. (
Browse files Browse the repository at this point in the history
  • Loading branch information
ndeebook committed Oct 27, 2022
1 parent 234a9ce commit 3742ff0
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 4 deletions.
22 changes: 18 additions & 4 deletions rqd/rqd/rqcore.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,6 @@ def __createEnvVariables(self):
self.frameEnv["TZ"] = self.rqCore.machine.getTimezone()
self.frameEnv["USER"] = self.runFrame.user_name
self.frameEnv["LOGNAME"] = self.runFrame.user_name
self.frameEnv["MAIL"] = "/usr/mail/%s" % self.runFrame.user_name
self.frameEnv["HOME"] = "/net/homedirs/%s" % self.runFrame.user_name
self.frameEnv["mcp"] = "1"
self.frameEnv["show"] = self.runFrame.show
self.frameEnv["shot"] = self.runFrame.shot
Expand All @@ -99,8 +97,18 @@ def __createEnvVariables(self):
self.frameEnv["CUE_GPU_MEMORY"] = str(self.rqCore.machine.getGpuMemoryFree())
self.frameEnv["SP_NOMYCSHRC"] = "1"

for key in self.runFrame.environment:
self.frameEnv[key] = self.runFrame.environment[key]
if platform.system() in ("Linux", "Darwin"):
self.frameEnv["MAIL"] = "/usr/mail/%s" % self.runFrame.user_name
self.frameEnv["HOME"] = "/net/homedirs/%s" % self.runFrame.user_name
elif platform.system() == "Windows":
self.frameEnv["APPDATA"] = os.environ["APPDATA"]
self.frameEnv["SYSTEMROOT"] = os.environ["SYSTEMROOT"]

for key, value in self.runFrame.environment.items():
if key == 'PATH':
self.frameEnv[key] += os.pathsep + value
else:
self.frameEnv[key] = value

# Add threads to use all assigned hyper-threading cores
if 'CPU_LIST' in self.runFrame.attributes and 'CUE_THREADS' in self.frameEnv:
Expand Down Expand Up @@ -128,6 +136,11 @@ def _createCommandFile(self, command):
except OSError:
pass # okay, already exists

# Windows Batch needs some characters escaped:
command = command.replace('%', '%%')
for char in '^&<>|':
command = command.replace(char, '^' + char)

commandFile = os.path.join(
rqd_tmp_dir,
'cmd-%s-%s.bat' % (self.runFrame.frame_id, time.time()))
Expand Down Expand Up @@ -358,6 +371,7 @@ def runWindows(self):
tempCommand = [self._createCommandFile(runFrame.command)]

frameInfo.forkedCommand = subprocess.Popen(tempCommand,
env=self.frameEnv,
stdin=subprocess.PIPE,
stdout=self.rqlog,
stderr=self.rqlog)
Expand Down
2 changes: 2 additions & 0 deletions rqd/rqd/rqmachine.py
Original file line number Diff line number Diff line change
Expand Up @@ -509,6 +509,8 @@ def getPathEnv(self):
"""Returns the correct path environment for the given machine"""
if platform.system() == 'Linux':
return '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
if platform.system() == 'Windows':
return 'C:/Windows/system32;C:/Windows;C:/Windows/System32/Wbem'
return ''

@rqd.rqutil.Memoize
Expand Down

0 comments on commit 3742ff0

Please sign in to comment.