This commit is contained in:
孙诚
2025-02-27 16:58:21 +08:00
commit 80ab8d76eb
40 changed files with 2482 additions and 0 deletions

View File

@@ -0,0 +1,95 @@
using System.Diagnostics;
using System.Net;
using System.Net.Http.Headers;
using System.Net.Http.Json;
using System.Text;
using Core;
using FluentScheduler;
using Interface.Jobs;
using Microsoft.Extensions.Configuration;
namespace Service.Jobs;
public class HealthyTaskRegistry : Registry, IHealthyTaskRegistry
{
private readonly IConfiguration _configuration;
public HealthyTaskRegistry(IConfiguration configuration)
{
_configuration = configuration;
Schedule(Job).ToRunNow().AndEvery(2).Minutes();
}
public async void Job()
{
try
{
await JobExecute();
}
catch (Exception e)
{
Console.WriteLine(e);
await WxNotify.SendCommonAsync($"HealthyTaskRegistry.Job() error: {e}");
}
}
private async Task JobExecute()
{
// 获取 配置 是个 KV 集合
var configs = _configuration.GetSection("HealthyTasks");
// 遍历配置
foreach (var item in configs.GetChildren())
{
// 获取配置的 containerName 和 url
var containerName = item["ContainerName"];
var url = item["Url"];
// 执行
await ExecuteItem(containerName!, url!);
}
}
private async Task ExecuteItem(string containerName, string url)
{
try
{
var client = new HttpClient();
// basic auth
string authInfo = Convert.ToBase64String(Encoding.ASCII.GetBytes("suncheng:SCsunch940622"));
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", authInfo);
var response = await client.GetAsync(url);
if (response.StatusCode != HttpStatusCode.OK)
{
throw new Exception($"StatusCode: {response.StatusCode}");
}
Console.WriteLine($"ContainerName: {containerName}, Url: {url}, StatusCode: {response.StatusCode}");
}
catch (Exception e)
{
Console.WriteLine(e);
await WxNotify.SendCommonAsync($"ExecuteItem {containerName} error: {e.Message}");
await ExecuteReboot(containerName);
}
}
private async Task ExecuteReboot(string containerName)
{
var command = $"docker restart {containerName}";
var (responseCode, message) = await Command.ExecAsync(command);
if (responseCode != HttpStatusCode.OK)
{
await WxNotify.SendCommonAsync($"ExecuteReboot {containerName} error: {responseCode} message: {message}");
}
else
{
await WxNotify.SendCommonAsync($"ContainerName: {containerName}");
}
}
}