Skip to content

Commit aa3d3fe

Browse files
pragnagopamhoeger
authored andcommitted
[HttpWorker][LinuxConsumption]Give executable permissions to user files (#5834)
1 parent 564dcc3 commit aa3d3fe

File tree

4 files changed

+50
-6
lines changed

4 files changed

+50
-6
lines changed

src/WebJobs.Script/WebJobs.Script.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.2.0" />
5555
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="2.2.0" />
5656
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="2.2.0" />
57+
<PackageReference Include="Mono.Posix.NETStandard" Version="1.0.0" />
5758
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
5859
<PackageReference Include="NuGet.Frameworks" Version="4.7.0" />
5960
<PackageReference Include="NuGet.LibraryModel" Version="4.7.0" />

src/WebJobs.Script/Workers/Http/HttpWorkerProcess.cs

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Diagnostics;
66
using Microsoft.Azure.WebJobs.Script.Eventing;
77
using Microsoft.Extensions.Logging;
8+
using Mono.Unix;
89

910
namespace Microsoft.Azure.WebJobs.Script.Workers.Http
1011
{
@@ -17,6 +18,7 @@ internal class HttpWorkerProcess : WorkerProcess
1718
private readonly string _scriptRootPath;
1819
private readonly string _workerId;
1920
private readonly WorkerProcessArguments _workerProcessArguments;
21+
private readonly IEnvironment _environment;
2022

2123
internal HttpWorkerProcess(string workerId,
2224
string rootScriptPath,
@@ -25,7 +27,8 @@ internal HttpWorkerProcess(string workerId,
2527
IWorkerProcessFactory processFactory,
2628
IProcessRegistry processRegistry,
2729
ILogger workerProcessLogger,
28-
IWorkerConsoleLogSource consoleLogSource)
30+
IWorkerConsoleLogSource consoleLogSource,
31+
IEnvironment environment)
2932
: base(eventManager, processRegistry, workerProcessLogger, consoleLogSource)
3033
{
3134
_processFactory = processFactory;
@@ -35,6 +38,7 @@ internal HttpWorkerProcess(string workerId,
3538
_scriptRootPath = rootScriptPath;
3639
_httpWorkerOptions = httpWorkerOptions;
3740
_workerProcessArguments = _httpWorkerOptions.Arguments;
41+
_environment = environment;
3842
}
3943

4044
internal override Process CreateWorkerProcess()
@@ -49,7 +53,31 @@ internal override Process CreateWorkerProcess()
4953
};
5054
workerContext.EnvironmentVariables.Add(HttpWorkerConstants.PortEnvVarName, _httpWorkerOptions.Port.ToString());
5155
workerContext.EnvironmentVariables.Add(HttpWorkerConstants.WorkerIdEnvVarName, _workerId);
52-
return _processFactory.CreateWorkerProcess(workerContext);
56+
Process workerProcess = _processFactory.CreateWorkerProcess(workerContext);
57+
if (_environment.IsLinuxConsumption())
58+
{
59+
AssignUserExecutePermissionsIfNotExists(workerProcess.StartInfo.FileName);
60+
}
61+
return workerProcess;
62+
}
63+
64+
private void AssignUserExecutePermissionsIfNotExists(string filePath)
65+
{
66+
try
67+
{
68+
UnixFileInfo fileInfo = new UnixFileInfo(filePath);
69+
if (!fileInfo.FileAccessPermissions.HasFlag(FileAccessPermissions.UserExecute))
70+
{
71+
_workerProcessLogger.LogDebug("Assigning execute permissions to file: {filePath}", filePath);
72+
fileInfo.FileAccessPermissions |= FileAccessPermissions.UserExecute |
73+
FileAccessPermissions.GroupExecute |
74+
FileAccessPermissions.OtherExecute;
75+
}
76+
}
77+
catch (Exception ex)
78+
{
79+
_workerProcessLogger.LogWarning(ex, "Error while assigning execute permission.");
80+
}
5381
}
5482

5583
internal override void HandleWorkerProcessExitError(WorkerProcessExitException httpWorkerProcessExitException)

src/WebJobs.Script/Workers/Http/HttpWorkerProcessFactory.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,24 +15,27 @@ internal class HttpWorkerProcessFactory : IHttpWorkerProcessFactory
1515
private readonly ILoggerFactory _loggerFactory = null;
1616
private readonly IScriptEventManager _eventManager = null;
1717
private readonly IWorkerConsoleLogSource _consoleLogSource;
18+
private readonly IEnvironment _environment;
1819

1920
public HttpWorkerProcessFactory(IScriptEventManager eventManager,
2021
ILoggerFactory loggerFactory,
2122
IWorkerProcessFactory defaultWorkerProcessFactory,
2223
IProcessRegistry processRegistry,
23-
IWorkerConsoleLogSource consoleLogSource)
24+
IWorkerConsoleLogSource consoleLogSource,
25+
IEnvironment environment)
2426
{
2527
_loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
2628
_eventManager = eventManager ?? throw new ArgumentNullException(nameof(eventManager));
2729
_consoleLogSource = consoleLogSource ?? throw new ArgumentNullException(nameof(consoleLogSource));
2830
_workerProcessFactory = defaultWorkerProcessFactory ?? throw new ArgumentNullException(nameof(defaultWorkerProcessFactory));
2931
_processRegistry = processRegistry ?? throw new ArgumentNullException(nameof(processRegistry));
32+
_environment = environment;
3033
}
3134

3235
public IWorkerProcess Create(string workerId, string scriptRootPath, HttpWorkerOptions httpWorkerOptions)
3336
{
3437
ILogger workerProcessLogger = _loggerFactory.CreateLogger($"Worker.HttpWorkerProcess.{workerId}");
35-
return new HttpWorkerProcess(workerId, scriptRootPath, httpWorkerOptions, _eventManager, _workerProcessFactory, _processRegistry, workerProcessLogger, _consoleLogSource);
38+
return new HttpWorkerProcess(workerId, scriptRootPath, httpWorkerOptions, _eventManager, _workerProcessFactory, _processRegistry, workerProcessLogger, _consoleLogSource, _environment);
3639
}
3740
}
3841
}

test/WebJobs.Script.Tests/Workers/Http/HttpWorkerProcessTests.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public class HttpWorkerProcessTests
2323
private readonly IWorkerProcessFactory _defaultWorkerProcessFactory = new DefaultWorkerProcessFactory();
2424
private readonly IProcessRegistry _processRegistry = new EmptyProcessRegistry();
2525
private readonly Mock<IWorkerConsoleLogSource> _languageWorkerConsoleLogSource = new Mock<IWorkerConsoleLogSource>();
26-
private readonly ILogger _testLogger = new TestLogger("test");
26+
private readonly TestLogger _testLogger = new TestLogger("test");
2727
private readonly HttpWorkerOptions _httpWorkerOptions;
2828

2929
public HttpWorkerProcessTests()
@@ -48,13 +48,25 @@ public void CreateWorkerProcess_VerifyEnvVars(string processEnvValue)
4848
{
4949
Assert.Equal(Environment.GetEnvironmentVariable(HttpWorkerConstants.PortEnvVarName), processEnvValue);
5050
}
51-
HttpWorkerProcess httpWorkerProcess = new HttpWorkerProcess(_testWorkerId, _rootScriptPath, _httpWorkerOptions, _mockEventManager.Object, _defaultWorkerProcessFactory, _processRegistry, _testLogger, _languageWorkerConsoleLogSource.Object);
51+
HttpWorkerProcess httpWorkerProcess = new HttpWorkerProcess(_testWorkerId, _rootScriptPath, _httpWorkerOptions, _mockEventManager.Object, _defaultWorkerProcessFactory, _processRegistry, _testLogger, _languageWorkerConsoleLogSource.Object, new TestEnvironment());
5252
Process childProcess = httpWorkerProcess.CreateWorkerProcess();
5353
Assert.NotNull(childProcess.StartInfo.EnvironmentVariables);
5454
Assert.Equal(childProcess.StartInfo.EnvironmentVariables[HttpWorkerConstants.PortEnvVarName], _workerPort.ToString());
5555
Assert.Equal(childProcess.StartInfo.EnvironmentVariables[HttpWorkerConstants.WorkerIdEnvVarName], _testWorkerId);
5656
childProcess.Dispose();
5757
}
5858
}
59+
60+
[Fact]
61+
public void CreateWorkerProcess_LinuxConsumption_AssingnsExecutePermissions_invoked()
62+
{
63+
TestEnvironment testEnvironment = new TestEnvironment();
64+
testEnvironment.SetEnvironmentVariable(EnvironmentSettingNames.ContainerName, "TestContainer");
65+
var mockHttpWorkerProcess = new HttpWorkerProcess(_testWorkerId, _rootScriptPath, _httpWorkerOptions, _mockEventManager.Object, _defaultWorkerProcessFactory, _processRegistry, _testLogger, _languageWorkerConsoleLogSource.Object, testEnvironment);
66+
mockHttpWorkerProcess.CreateWorkerProcess();
67+
// Verify method invocation
68+
var testLogs = _testLogger.GetLogMessages();
69+
Assert.Contains("Error while assigning execute permission", testLogs[0].FormattedMessage);
70+
}
5971
}
6072
}

0 commit comments

Comments
 (0)