Browse Source

Check if suite is already working or port is in use by another process

pull/15692/head
Yunus Emre Kalkan 4 years ago
parent
commit
ea8c65c292
  1. 65
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs

65
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs

@ -35,23 +35,26 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency
private readonly NuGetService _nuGetService;
private readonly AuthService _authService;
private readonly CliHttpClientFactory _cliHttpClientFactory;
private readonly SuiteAppSettingsService _suiteAppSettingsService;
private const string SuitePackageName = "Volo.Abp.Suite";
public ILogger<SuiteCommand> Logger { get; set; }
private const string AbpSuiteHost = "http://localhost:3000";
private int _abpSuitePort = 3000;
public SuiteCommand(
AbpNuGetIndexUrlService nuGetIndexUrlService,
NuGetService nuGetService,
ICmdHelper cmdHelper,
AuthService authService,
CliHttpClientFactory cliHttpClientFactory)
CliHttpClientFactory cliHttpClientFactory,
SuiteAppSettingsService suiteAppSettingsService)
{
CmdHelper = cmdHelper;
_nuGetIndexUrlService = nuGetIndexUrlService;
_nuGetService = nuGetService;
_authService = authService;
_cliHttpClientFactory = cliHttpClientFactory;
_suiteAppSettingsService = suiteAppSettingsService;
Logger = NullLogger<SuiteCommand>.Instance;
}
@ -72,17 +75,20 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency
commandLineArgs.Options.ContainsKey(Options.Preview.Long);
var version = commandLineArgs.Options.GetOrNull(Options.Version.Short, Options.Version.Long);
var currentSuiteVersionAsString = GetCurrentSuiteVersion();
switch (operationType)
{
case "":
case null:
await InstallSuiteIfNotInstalledAsync();
await InstallSuiteIfNotInstalledAsync(currentSuiteVersionAsString);
_abpSuitePort = await _suiteAppSettingsService.GetSuitePortAsync(currentSuiteVersionAsString);
RunSuite();
break;
case "generate":
await InstallSuiteIfNotInstalledAsync();
await InstallSuiteIfNotInstalledAsync(currentSuiteVersionAsString);
_abpSuitePort = await _suiteAppSettingsService.GetSuitePortAsync(currentSuiteVersionAsString);
var suiteProcess = StartSuite();
System.Threading.Thread.Sleep(500); //wait for initialization of the app
await GenerateCrudPageAsync(commandLineArgs);
@ -130,7 +136,7 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency
}
var IsSolutionBuiltResponse = await client.GetAsync(
$"{AbpSuiteHost}/api/abpSuite/solutions/{solutionId.ToString()}/is-built"
$"http://localhost:{_abpSuitePort}/api/abpSuite/solutions/{solutionId.ToString()}/is-built"
);
var IsSolutionBuilt = Convert.ToBoolean(await IsSolutionBuiltResponse.Content.ReadAsStringAsync());
@ -148,7 +154,7 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency
);
var responseMessage = await client.PostAsync(
$"{AbpSuiteHost}/api/abpSuite/crudPageGenerator/{solutionId.ToString()}/save-and-generate-entity",
$"http://localhost:{_abpSuitePort}/api/abpSuite/crudPageGenerator/{solutionId.ToString()}/save-and-generate-entity",
entityContent
);
@ -178,7 +184,7 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency
}
var responseMessage = await client.GetHttpResponseMessageWithRetryAsync(
"http://localhost:3000/api/abpSuite/solutions",
$"http://localhost:{_abpSuitePort}/api/abpSuite/solutions",
_cliHttpClientFactory.GetCancellationToken(TimeSpan.FromMinutes(10)),
Logger,
timeIntervals.ToArray());
@ -216,7 +222,7 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency
);
var responseMessage = await client.PostAsync(
"http://localhost:3000/api/abpSuite/addSolution",
$"http://localhost:{_abpSuitePort}/api/abpSuite/addSolution",
entityContent,
_cliHttpClientFactory.GetCancellationToken(TimeSpan.FromMinutes(10))
);
@ -234,11 +240,9 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency
}
}
private async Task InstallSuiteIfNotInstalledAsync()
private async Task InstallSuiteIfNotInstalledAsync(string currentSuiteVersion)
{
var currentSuiteVersionAsString = GetCurrentSuiteVersion();
if (string.IsNullOrEmpty(currentSuiteVersionAsString))
if (string.IsNullOrEmpty(currentSuiteVersion))
{
await InstallSuiteAsync();
}
@ -430,6 +434,19 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency
Logger.LogWarning("Couldn't check ABP Suite installed status: " + ex.Message);
}
if (IsSuiteAlreadyRunning())
{
Logger.LogInformation("Opening suite...");
CmdHelper.Open($"http://localhost:{_abpSuitePort}");
return;
}
if (IsPortAlreadyInUse())
{
Logger.LogError($"Port \"{_abpSuitePort}\" is already in use.");
return;
}
CmdHelper.RunCmd("abp-suite");
}
@ -453,23 +470,32 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency
return null;
}
if (IsPortAlreadyInUse())
{
Logger.LogError($"Port \"{_abpSuitePort}\" is already in use.");
return null;
}
return CmdHelper.RunCmdAndGetProcess("abp-suite --no-browser");
}
private bool IsSuiteAlreadyRunning()
{
return GetProcessesRelatedWithSuite().Any();
}
private bool IsPortAlreadyInUse()
{
var ipGP = IPGlobalProperties.GetIPGlobalProperties();
var endpoints = ipGP.GetActiveTcpListeners();
return endpoints.Any(e => e.Port == 3000);
return endpoints.Any(e => e.Port == _abpSuitePort);
}
private void KillSuite()
{
try
{
var suiteProcesses = (from p in Process.GetProcesses()
where p.ProcessName.ToLower().Contains("abp-suite")
select p);
var suiteProcesses = GetProcessesRelatedWithSuite();
foreach (var suiteProcess in suiteProcesses)
{
@ -483,6 +509,13 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency
}
}
private IEnumerable<Process> GetProcessesRelatedWithSuite()
{
return (from p in Process.GetProcesses()
where p.ProcessName.ToLower().Contains("abp-suite")
select p);
}
public string GetUsageInfo()
{
var sb = new StringBuilder();

Loading…
Cancel
Save