新增StarAgent插件架构,用于自定义扩展星尘代理

This commit is contained in:
大石头 2022-05-30 09:57:34 +08:00
parent 66efc06290
commit 4e7241cbe6
7 changed files with 159 additions and 3 deletions

View File

@ -0,0 +1,30 @@
using System.Net.NetworkInformation;
using NewLife;
using NewLife.Log;
using NewLife.Threading;
using Stardust.Plugins;
namespace NetworkDetect;
public class NetDetect : AgentPlugin
{
private TimerX _timer;
/// <summary>开始工作</summary>
public override void Start()
{
if (_timer == null) _timer = new TimerX(DoWork, null, 1000, 15_000);
}
/// <summary>停止工作</summary>
/// <param name="reason"></param>
public override void Stop(String reason) => _timer.TryDispose();
private void DoWork(Object state)
{
var flag = NetworkInterface.GetIsNetworkAvailable();
XTrace.WriteLine("网络:{0}", flag ? "可用" : "不可用");
}
protected override void Dispose(Boolean disposing) { base.Dispose(disposing); Stop(disposing ? "Dispose" : "GC"); }
}

View File

@ -0,0 +1,25 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.1</TargetFramework>
<AssemblyTitle>网络监测</AssemblyTitle>
<Description>检测网络,如果长期不可用,则重启系统,主要应用于嵌入式工控机</Description>
<Company>新生命开发团队</Company>
<Copyright>©2002-2022 NewLife</Copyright>
<VersionPrefix>1.0</VersionPrefix>
<VersionSuffix>$([System.DateTime]::Now.ToString(`yyyy.MMdd`))</VersionSuffix>
<Version>$(VersionPrefix).$(VersionSuffix)</Version>
<FileVersion>$(Version)</FileVersion>
<AssemblyVersion>$(VersionPrefix).*</AssemblyVersion>
<Deterministic>false</Deterministic>
<OutputPath>..\..\Bin\NetworkDetect</OutputPath>
<!--<GenerateDocumentationFile>True</GenerateDocumentationFile>-->
<ImplicitUsings>enable</ImplicitUsings>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\Stardust\Stardust.csproj" />
</ItemGroup>
</Project>

View File

@ -3,12 +3,16 @@ using System.Reflection;
using NewLife;
using NewLife.Agent;
using NewLife.Log;
using NewLife.Model;
using NewLife.Reflection;
using NewLife.Remoting;
using NewLife.Serialization;
using NewLife.Threading;
using Stardust;
using Stardust.Managers;
using Stardust.Plugins;
using Host = NewLife.Agent.Host;
using IHost = NewLife.Agent.IHost;
using Upgrade = Stardust.Web.Upgrade;
namespace StarAgent
@ -55,12 +59,15 @@ namespace StarAgent
}
/// <summary>服务类。名字可以自定义</summary>
internal class MyService : ServiceBase
internal class MyService : ServiceBase, IServiceProvider
{
public StarSetting StarSetting { get; set; }
public Setting AgentSetting { get; set; }
/// <summary>宿主服务提供者</summary>
public IServiceProvider Provider { get; set; }
public MyService()
{
ServiceName = "StarAgent";
@ -86,6 +93,7 @@ namespace StarAgent
private StarClient _Client;
private StarFactory _factory;
private ServiceManager _Manager;
private PluginManager _PluginManager;
private String _lastVersion;
public void StartClient()
@ -172,6 +180,15 @@ namespace StarAgent
Log = XTrace.Log,
};
// 插件管理器
_PluginManager = new PluginManager
{
Identity = "StarAgent",
Provider = this,
Log = XTrace.Log,
};
// 监听端口,用于本地通信
if (set.LocalPort > 0)
{
@ -188,6 +205,7 @@ namespace StarAgent
Service = this,
Host = Host,
Manager = _Manager,
PluginManager = _PluginManager,
StarSetting = StarSetting,
AgentSetting = AgentSetting,
Log = XTrace.Log
@ -207,6 +225,15 @@ namespace StarAgent
_Manager.Start();
// 启动插件
WriteLog("启动插件[{0}]", _PluginManager.Identity);
_PluginManager.Load();
_PluginManager.Init();
foreach (var item in _PluginManager.Plugins)
{
if (item is IAgentPlugin plugin) plugin.Start();
}
base.StartWork(reason);
}
@ -243,6 +270,13 @@ namespace StarAgent
_server.TryDispose();
_server = null;
// 停止插件
WriteLog("停止插件[{0}]", _PluginManager.Identity);
foreach (var item in _PluginManager.Plugins)
{
if (item is IAgentPlugin plugin) plugin.Stop(reason);
}
}
private async Task CheckUpgrade(Object data)
@ -384,5 +418,19 @@ namespace StarAgent
Console.WriteLine(models.ToJson(true));
}
#region IServiceProvider
Object IServiceProvider.GetService(Type serviceType)
{
if (serviceType == typeof(ServiceManager)) return _Manager;
if (serviceType == typeof(StarClient)) return _Client;
if (serviceType == typeof(StarFactory)) return _factory;
if (serviceType == typeof(ApiServer)) return _server;
if (serviceType == typeof(ServiceBase)) return this;
if (serviceType == typeof(IHost)) return Host;
return Provider?.GetService(serviceType);
}
#endregion
}
}

View File

@ -2,6 +2,7 @@
using NewLife;
using NewLife.Agent;
using NewLife.Log;
using NewLife.Model;
using NewLife.Net;
using NewLife.Remoting;
using NewLife.Serialization;
@ -9,6 +10,7 @@ using NewLife.Threading;
using Stardust;
using Stardust.Managers;
using Stardust.Models;
using IHost = NewLife.Agent.IHost;
namespace StarAgent
{
@ -27,9 +29,12 @@ namespace StarAgent
/// <summary>服务主机</summary>
public IHost Host { get; set; }
/// <summary>本地应用服务管理</summary>
/// <summary>应用服务管理</summary>
public ServiceManager Manager { get; set; }
/// <summary>插件管理</summary>
public PluginManager PluginManager { get; set; }
/// <summary>星尘设置</summary>
public StarSetting StarSetting { get; set; }

View File

@ -0,0 +1,39 @@
using NewLife;
using NewLife.Model;
namespace Stardust.Plugins;
/// <summary>星尘代理插件</summary>
public interface IAgentPlugin : IPlugin
{
/// <summary>开始工作</summary>
public void Start();
/// <summary>停止工作</summary>
/// <param name="reason"></param>
public void Stop(String reason);
}
/// <summary>星尘代理插件基类</summary>
[Plugin("StarAgent")]
public abstract class AgentPlugin : DisposeBase, IAgentPlugin
{
/// <summary>初始化插件</summary>
/// <param name="identity"></param>
/// <param name="provider"></param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public virtual Boolean Init(String identity, IServiceProvider provider)
{
if (identity != "StarAgent") return false;
return true;
}
/// <summary>开始工作</summary>
public virtual void Start() { }
/// <summary>停止工作</summary>
/// <param name="reason"></param>
public virtual void Stop(String reason) { }
}

View File

@ -27,7 +27,7 @@
<RepositoryUrl>https://github.com/NewLifeX/Stardust</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<PackageTags>新生命团队;X组件;NewLife;$(AssemblyName)</PackageTags>
<PackageReleaseNotes></PackageReleaseNotes>
<PackageReleaseNotes>新增StarAgent插件架构用于自定义扩展星尘代理</PackageReleaseNotes>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<PublishRepositoryUrl>true</PublishRepositoryUrl>
<EmbedUntrackedSources>true</EmbedUntrackedSources>

View File

@ -36,6 +36,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StarGateway", "StarGateway\
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Stardust.Extensions", "Stardust.Extensions\Stardust.Extensions.csproj", "{28C1DC01-2A89-47B6-8E9D-6351C12722AC}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{11AD7F18-1320-41C5-B4A9-F208DBCAA5A9}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetworkDetect", "Plugins\NetworkDetect\NetworkDetect.csproj", "{7178875E-F5DD-4136-A5E6-EEBF151396CB}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -86,6 +90,10 @@ Global
{28C1DC01-2A89-47B6-8E9D-6351C12722AC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{28C1DC01-2A89-47B6-8E9D-6351C12722AC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{28C1DC01-2A89-47B6-8E9D-6351C12722AC}.Release|Any CPU.Build.0 = Release|Any CPU
{7178875E-F5DD-4136-A5E6-EEBF151396CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7178875E-F5DD-4136-A5E6-EEBF151396CB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7178875E-F5DD-4136-A5E6-EEBF151396CB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7178875E-F5DD-4136-A5E6-EEBF151396CB}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -93,6 +101,7 @@ Global
GlobalSection(NestedProjects) = preSolution
{7DE10A4D-1749-4474-A6B2-F52CA8462813} = {48B9E6E7-289F-42F2-8ACA-E7DF8E7C9059}
{677C6502-2C9C-4907-AD82-670BE77B0AE6} = {48B9E6E7-289F-42F2-8ACA-E7DF8E7C9059}
{7178875E-F5DD-4136-A5E6-EEBF151396CB} = {11AD7F18-1320-41C5-B4A9-F208DBCAA5A9}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {9337283C-C795-479F-A2F1-C892EBE2490C}