Compare commits

...

2 Commits

14 changed files with 80 additions and 50 deletions

View File

@ -21,7 +21,7 @@
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
<PackageReference Include="NewLife.Redis" Version="6.3.2025.701" />
<PackageReference Include="NewLife.Redis" Version="6.3.2025.801" />
<PackageReference Include="NewLife.UnitTest" Version="1.0.2025.101" />
<PackageReference Include="xunit" Version="2.9.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.3">

View File

@ -20,7 +20,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="NewLife.XCode" Version="11.19.2025.717-beta0003" />
<PackageReference Include="NewLife.XCode" Version="11.20.2025.801" />
</ItemGroup>
<ItemGroup>

View File

@ -18,7 +18,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="NewLife.Core" Version="11.5.2025.717-beta0001" />
<PackageReference Include="NewLife.Core" Version="11.6.2025.801" />
</ItemGroup>
</Project>

View File

@ -18,7 +18,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="NewLife.Core" Version="11.5.2025.717-beta0001" />
<PackageReference Include="NewLife.Core" Version="11.6.2025.801" />
</ItemGroup>
</Project>

View File

@ -94,12 +94,13 @@
<Column Name="FileName" DataType="String" Description="文件。应用启动文件可直接使用zip包支持差异定制为空时使用应用集配置" Category="发布参数" />
<Column Name="Arguments" DataType="String" Length="500" Description="参数。启动应用的参数,为空时使用应用集配置" Category="发布参数" />
<Column Name="WorkingDirectory" DataType="String" Length="200" Description="工作目录。应用根目录,为空时使用应用集配置" Category="发布参数" />
<Column Name="UserName" DataType="String" Description="用户名。以该用户执行应用" Category="发布参数" />
<Column Name="Environments" DataType="String" Length="500" Description="环境变量。启动应用前设置的环境变量" Category="发布参数" />
<Column Name="Mode" DataType="Int32" Description="工作模式。0默认exe/zip1仅解压2解压后运行3仅运行一次4多实例exe/zip。为空时使用应用集配置" Type="Stardust.Models.ServiceModes" Category="发布参数" />
<Column Name="Delay" DataType="Int32" Description="延迟。批量发布时,需要延迟执行的时间,用于滚动发布,单位秒" Category="发布参数" />
<Column Name="ProcessId" DataType="Int32" Description="进程" Category="状态" />
<Column Name="UserName" DataType="String" Description="用户名。启动该进程的用户名" Category="状态" />
<Column Name="ProcessName" DataType="String" Length="200" Description="进程名称" Category="状态" />
<Column Name="ProcessUser" DataType="String" Description="进程用户。启动该进程的用户名" Category="状态" />
<Column Name="StartTime" DataType="DateTime" Description="进程时间" Category="状态" />
<Column Name="Version" DataType="String" Description="版本。客户端" Category="状态" />
<Column Name="Compile" DataType="DateTime" Description="编译时间。客户端" Category="状态" />

View File

@ -561,6 +561,17 @@
<td>应用根目录,为空时使用应用集配置</td>
</tr>
<tr>
<td>UserName</td>
<td>用户名</td>
<td>String</td>
<td>50</td>
<td></td>
<td></td>
<td></td>
<td>以该用户执行应用</td>
</tr>
<tr>
<td>Environments</td>
<td>环境变量</td>
@ -605,17 +616,6 @@
<td></td>
</tr>
<tr>
<td>UserName</td>
<td>用户名</td>
<td>String</td>
<td>50</td>
<td></td>
<td></td>
<td></td>
<td>启动该进程的用户名</td>
</tr>
<tr>
<td>ProcessName</td>
<td>进程名称</td>
@ -627,6 +627,17 @@
<td></td>
</tr>
<tr>
<td>ProcessUser</td>
<td>进程用户</td>
<td>String</td>
<td>50</td>
<td></td>
<td></td>
<td></td>
<td>启动该进程的用户名</td>
</tr>
<tr>
<td>StartTime</td>
<td>进程时间</td>

View File

@ -180,6 +180,7 @@ public partial class AppDeployNode : Entity<AppDeployNode>
Arguments = Arguments,
Environments = Environments,
WorkingDirectory = WorkingDirectory,
UserName = UserName,
Enable = app.Enable && Enable,
//AutoStart = app.AutoStart,
@ -203,8 +204,8 @@ public partial class AppDeployNode : Entity<AppDeployNode>
{
ProcessId = inf.Id;
ProcessName = inf.Name;
ProcessUser = inf.UserName;
Version = inf.Version;
UserName = inf.UserName;
StartTime = inf.StartTime;
Listens = inf.Listens;
}
@ -214,7 +215,7 @@ public partial class AppDeployNode : Entity<AppDeployNode>
IP = online.IP;
ProcessId = online.ProcessId;
ProcessName = online.ProcessName;
UserName = online.UserName;
ProcessUser = online.UserName;
StartTime = online.StartTime;
Listens = online.Listens;
Version = online.Version;

View File

@ -106,6 +106,15 @@ public partial class AppDeployNode
[BindColumn("WorkingDirectory", "工作目录。应用根目录,为空时使用应用集配置", "")]
public String WorkingDirectory { get => _WorkingDirectory; set { if (OnPropertyChanging("WorkingDirectory", value)) { _WorkingDirectory = value; OnPropertyChanged("WorkingDirectory"); } } }
private String _UserName;
/// <summary>用户名。以该用户执行应用</summary>
[Category("发布参数")]
[DisplayName("用户名")]
[Description("用户名。以该用户执行应用")]
[DataObjectField(false, false, true, 50)]
[BindColumn("UserName", "用户名。以该用户执行应用", "")]
public String UserName { get => _UserName; set { if (OnPropertyChanging("UserName", value)) { _UserName = value; OnPropertyChanged("UserName"); } } }
private String _Environments;
/// <summary>环境变量。启动应用前设置的环境变量</summary>
[Category("发布参数")]
@ -142,15 +151,6 @@ public partial class AppDeployNode
[BindColumn("ProcessId", "进程", "")]
public Int32 ProcessId { get => _ProcessId; set { if (OnPropertyChanging("ProcessId", value)) { _ProcessId = value; OnPropertyChanged("ProcessId"); } } }
private String _UserName;
/// <summary>用户名。启动该进程的用户名</summary>
[Category("状态")]
[DisplayName("用户名")]
[Description("用户名。启动该进程的用户名")]
[DataObjectField(false, false, true, 50)]
[BindColumn("UserName", "用户名。启动该进程的用户名", "")]
public String UserName { get => _UserName; set { if (OnPropertyChanging("UserName", value)) { _UserName = value; OnPropertyChanged("UserName"); } } }
private String _ProcessName;
/// <summary>进程名称</summary>
[Category("状态")]
@ -160,6 +160,15 @@ public partial class AppDeployNode
[BindColumn("ProcessName", "进程名称", "")]
public String ProcessName { get => _ProcessName; set { if (OnPropertyChanging("ProcessName", value)) { _ProcessName = value; OnPropertyChanged("ProcessName"); } } }
private String _ProcessUser;
/// <summary>进程用户。启动该进程的用户名</summary>
[Category("状态")]
[DisplayName("进程用户")]
[Description("进程用户。启动该进程的用户名")]
[DataObjectField(false, false, true, 50)]
[BindColumn("ProcessUser", "进程用户。启动该进程的用户名", "")]
public String ProcessUser { get => _ProcessUser; set { if (OnPropertyChanging("ProcessUser", value)) { _ProcessUser = value; OnPropertyChanged("ProcessUser"); } } }
private DateTime _StartTime;
/// <summary>进程时间</summary>
[Category("状态")]
@ -305,12 +314,13 @@ public partial class AppDeployNode
"FileName" => _FileName,
"Arguments" => _Arguments,
"WorkingDirectory" => _WorkingDirectory,
"UserName" => _UserName,
"Environments" => _Environments,
"Mode" => _Mode,
"Delay" => _Delay,
"ProcessId" => _ProcessId,
"UserName" => _UserName,
"ProcessName" => _ProcessName,
"ProcessUser" => _ProcessUser,
"StartTime" => _StartTime,
"Version" => _Version,
"Compile" => _Compile,
@ -341,12 +351,13 @@ public partial class AppDeployNode
case "FileName": _FileName = Convert.ToString(value); break;
case "Arguments": _Arguments = Convert.ToString(value); break;
case "WorkingDirectory": _WorkingDirectory = Convert.ToString(value); break;
case "UserName": _UserName = Convert.ToString(value); break;
case "Environments": _Environments = Convert.ToString(value); break;
case "Mode": _Mode = (Stardust.Models.ServiceModes)value.ToInt(); break;
case "Delay": _Delay = value.ToInt(); break;
case "ProcessId": _ProcessId = value.ToInt(); break;
case "UserName": _UserName = Convert.ToString(value); break;
case "ProcessName": _ProcessName = Convert.ToString(value); break;
case "ProcessUser": _ProcessUser = Convert.ToString(value); break;
case "StartTime": _StartTime = value.ToDateTime(); break;
case "Version": _Version = Convert.ToString(value); break;
case "Compile": _Compile = value.ToDateTime(); break;
@ -411,6 +422,9 @@ public partial class AppDeployNode
/// <summary>工作目录。应用根目录,为空时使用应用集配置</summary>
public static readonly Field WorkingDirectory = FindByName("WorkingDirectory");
/// <summary>用户名。以该用户执行应用</summary>
public static readonly Field UserName = FindByName("UserName");
/// <summary>环境变量。启动应用前设置的环境变量</summary>
public static readonly Field Environments = FindByName("Environments");
@ -423,12 +437,12 @@ public partial class AppDeployNode
/// <summary>进程</summary>
public static readonly Field ProcessId = FindByName("ProcessId");
/// <summary>用户名。启动该进程的用户名</summary>
public static readonly Field UserName = FindByName("UserName");
/// <summary>进程名称</summary>
public static readonly Field ProcessName = FindByName("ProcessName");
/// <summary>进程用户。启动该进程的用户名</summary>
public static readonly Field ProcessUser = FindByName("ProcessUser");
/// <summary>进程时间</summary>
public static readonly Field StartTime = FindByName("StartTime");
@ -507,6 +521,9 @@ public partial class AppDeployNode
/// <summary>工作目录。应用根目录,为空时使用应用集配置</summary>
public const String WorkingDirectory = "WorkingDirectory";
/// <summary>用户名。以该用户执行应用</summary>
public const String UserName = "UserName";
/// <summary>环境变量。启动应用前设置的环境变量</summary>
public const String Environments = "Environments";
@ -519,12 +536,12 @@ public partial class AppDeployNode
/// <summary>进程</summary>
public const String ProcessId = "ProcessId";
/// <summary>用户名。启动该进程的用户名</summary>
public const String UserName = "UserName";
/// <summary>进程名称</summary>
public const String ProcessName = "ProcessName";
/// <summary>进程用户。启动该进程的用户名</summary>
public const String ProcessUser = "ProcessUser";
/// <summary>进程时间</summary>
public const String StartTime = "StartTime";

View File

@ -41,7 +41,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="NewLife.XCode" Version="11.19.2025.717-beta0003" />
<PackageReference Include="NewLife.XCode" Version="11.20.2025.801" />
</ItemGroup>
<ItemGroup>

View File

@ -46,8 +46,8 @@
<ItemGroup>
<PackageReference Include="NewLife.IP" Version="2.3.2025.601" />
<PackageReference Include="NewLife.Redis" Version="6.3.2025.701" />
<PackageReference Include="NewLife.Remoting.Extensions" Version="3.4.2025.722-beta0820" />
<PackageReference Include="NewLife.Redis" Version="6.3.2025.801" />
<PackageReference Include="NewLife.Remoting.Extensions" Version="3.4.2025.801" />
</ItemGroup>
<ItemGroup>

View File

@ -52,8 +52,8 @@
<ItemGroup>
<PackageReference Include="NewLife.Cube.Core" Version="6.5.2025.715-beta1654" />
<PackageReference Include="NewLife.IP" Version="2.3.2025.601" />
<PackageReference Include="NewLife.Redis" Version="6.3.2025.701" />
<PackageReference Include="NewLife.Remoting.Extensions" Version="3.4.2025.722-beta0820" />
<PackageReference Include="NewLife.Redis" Version="6.3.2025.801" />
<PackageReference Include="NewLife.Remoting.Extensions" Version="3.4.2025.801" />
</ItemGroup>
<ItemGroup>

View File

@ -401,15 +401,15 @@ public class ServiceController : DisposeBase
}
// 指定用户时,以特定用户启动进程
if (!service.UserName.IsNullOrEmpty())
var user = service.UserName;
if (!user.IsNullOrEmpty())
{
si.UserName = service.UserName;
si.UserName = user;
//si.UseShellExecute = false;
// 在Linux系统中改变目录所属用户
if (Runtime.Linux)
{
var user = service.UserName;
if (!user.Contains(':')) user = $"{user}:{user}";
//Process.Start("chown", $"-R {user} {si.WorkingDirectory}");
Process.Start("chown", $"-R {user} {si.WorkingDirectory.CombinePath("../").GetBasePath()}").WaitForExit(5_000);
@ -438,19 +438,19 @@ public class ServiceController : DisposeBase
Process? p = null;
// Windows桌面用户运行
if (Runtime.Windows && (service.UserName == "$" || service.UserName == "$$"))
if (Runtime.Windows && (user == "$" || user == "$$"))
{
// 交互模式直接运行
if (Environment.UserInteractive)
{
si.UserName = null;
si.UserName = null!;
p = Process.Start(si);
}
else
{
// 桌面用户运行
var desktop = new Desktop { Log = Log };
var pid = desktop.StartProcess(si.FileName, si.Arguments, si.WorkingDirectory, service.UserName == "$$", true);
var pid = desktop.StartProcess(si.FileName, si.Arguments, si.WorkingDirectory, user == "$$", true);
p = Process.GetProcessById((Int32)pid);
}
}

View File

@ -32,7 +32,7 @@
<RepositoryUrl>https://github.com/NewLifeX/Stardust</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<PackageTags>新生命团队;X组件;NewLife;$(AssemblyName)</PackageTags>
<PackageReleaseNotes>优化发布子系统发布时支持应用nginx配置</PackageReleaseNotes>
<PackageReleaseNotes>增加网络质量监控</PackageReleaseNotes>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<PublishRepositoryUrl>true</PublishRepositoryUrl>
<EmbedUntrackedSources>true</EmbedUntrackedSources>
@ -119,10 +119,10 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="NewLife.Remoting" Version="3.4.2025.722-beta0820" />
<PackageReference Include="NewLife.Remoting" Version="3.4.2025.801" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="NewLife.Core" Version="11.5.2025.717-beta0001" />
<PackageReference Include="NewLife.Core" Version="11.6.2025.801" />
</ItemGroup>
</Project>

View File

@ -33,7 +33,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="NewLife.Core" Version="11.5.2025.717-beta0001" />
<PackageReference Include="NewLife.Core" Version="11.6.2025.801" />
</ItemGroup>
<ItemGroup>