新增StarAgent插件架构,用于自定义扩展星尘代理
This commit is contained in:
parent
66efc06290
commit
4e7241cbe6
|
@ -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"); }
|
||||
}
|
|
@ -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>
|
|
@ -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
|
||||
}
|
||||
}
|
|
@ -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; }
|
||||
|
||||
|
|
|
@ -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) { }
|
||||
}
|
|
@ -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>
|
||||
|
|
9
星尘.sln
9
星尘.sln
|
@ -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}
|
||||
|
|
Loading…
Reference in New Issue