mirror of https://github.com/abpframework/abp.git
15 changed files with 157 additions and 33 deletions
@ -0,0 +1,107 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Text.RegularExpressions; |
|||
using Volo.Abp.Cli.ProjectBuilding.Building; |
|||
|
|||
namespace Volo.Abp.Cli.ProjectBuilding.Templates |
|||
{ |
|||
public class TemplateRandomSslPortStep : ProjectBuildPipelineStep |
|||
{ |
|||
private readonly int _minSslPort; |
|||
|
|||
private readonly int _maxSslPort; |
|||
|
|||
private readonly List<string> _buildInSslUrls; |
|||
|
|||
public TemplateRandomSslPortStep(List<string> buildInSslSslUrls, int minSslPort = 44300, |
|||
int maxSslPort = 44399) |
|||
{ |
|||
_buildInSslUrls = buildInSslSslUrls; |
|||
|
|||
_minSslPort = minSslPort; |
|||
_maxSslPort = maxSslPort; |
|||
} |
|||
|
|||
public override void Execute(ProjectBuildContext context) |
|||
{ |
|||
var launchSettings = context.Files.Where(x => |
|||
!x.IsDirectory && x.Name.EndsWith("launchSettings.json", StringComparison.InvariantCultureIgnoreCase)) |
|||
.ToList(); |
|||
|
|||
var appSettings = context.Files.Where(x => |
|||
!x.IsDirectory && x.Name.EndsWith("appSettings.json", StringComparison.InvariantCultureIgnoreCase)) |
|||
.ToList(); |
|||
|
|||
|
|||
var excludePorts = new List<string>(); |
|||
excludePorts.AddRange(_buildInSslUrls.Select(GetUrlPort).ToList()); |
|||
|
|||
foreach (var buildInUrl in _buildInSslUrls) |
|||
{ |
|||
var newPort = GetRandomPort(excludePorts); |
|||
excludePorts.Add(newPort); |
|||
|
|||
var buildInUrlWithoutPort = GetUrlWithoutPort(buildInUrl); |
|||
var buildInUrlPort = GetUrlPort(buildInUrl); |
|||
|
|||
foreach (var launchSetting in launchSettings) |
|||
{ |
|||
launchSetting.NormalizeLineEndings(); |
|||
|
|||
var launchSettingLines = launchSetting.GetLines(); |
|||
for (var i = 0; i < launchSettingLines.Length; i++) |
|||
{ |
|||
if (launchSettingLines[i].Contains($"{buildInUrl}")) |
|||
{ |
|||
launchSettingLines[i] = launchSettingLines[i].Replace($"{buildInUrl}", $"{buildInUrlWithoutPort}:{newPort}"); |
|||
} |
|||
|
|||
if (launchSettingLines[i].Contains($"\"sslPort\": {buildInUrlPort}")) |
|||
{ |
|||
launchSettingLines[i] = launchSettingLines[i] |
|||
.Replace($"\"sslPort\": {buildInUrlPort}", $"\"sslPort\": {newPort}"); |
|||
} |
|||
} |
|||
launchSetting.SetLines(launchSettingLines); |
|||
|
|||
foreach (var appSetting in appSettings) |
|||
{ |
|||
appSetting.NormalizeLineEndings(); |
|||
|
|||
var appSettingLines = appSetting.GetLines(); |
|||
for (var i = 0; i < appSettingLines.Length; i++) |
|||
{ |
|||
if (appSettingLines[i].Contains(buildInUrl)) |
|||
{ |
|||
appSettingLines[i] = appSettingLines[i].Replace(buildInUrl, $"{buildInUrlWithoutPort}:{newPort}"); |
|||
} |
|||
} |
|||
appSetting.SetLines(appSettingLines); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
private string GetRandomPort(IReadOnlyCollection<string> excludePort = null) |
|||
{ |
|||
var ports = Enumerable.Range(_minSslPort, _maxSslPort).Select(p => p.ToString()); |
|||
|
|||
return RandomHelper.GetRandomOfList(excludePort != null |
|||
? ports.Except(excludePort).ToList() |
|||
: ports.ToList()); |
|||
} |
|||
|
|||
private string GetUrlPort(string url) |
|||
{ |
|||
var match = Regex.Match(url, @":(\d+)"); |
|||
return match.Success ? match.Groups[1].Value : ""; |
|||
} |
|||
|
|||
private string GetUrlWithoutPort(string url) |
|||
{ |
|||
var match = Regex.Match(url, @"(^.+):"); |
|||
return match.Success ? match.Groups[1].Value : ""; |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue