2019-08-13 14:19:27 +08:00
|
|
|
|
using Bootstrap.DataAccess;
|
2019-08-23 22:33:44 +08:00
|
|
|
|
using Microsoft.Extensions.Configuration;
|
2019-08-13 14:19:27 +08:00
|
|
|
|
using Microsoft.Extensions.Diagnostics.HealthChecks;
|
2019-08-23 22:33:44 +08:00
|
|
|
|
using System;
|
2019-08-13 20:23:28 +08:00
|
|
|
|
using System.Collections.Generic;
|
2019-08-13 14:19:27 +08:00
|
|
|
|
using System.Linq;
|
2019-08-13 13:39:18 +08:00
|
|
|
|
using System.Threading;
|
|
|
|
|
using System.Threading.Tasks;
|
2019-08-13 14:19:27 +08:00
|
|
|
|
using Task = System.Threading.Tasks.Task;
|
2019-08-13 13:39:18 +08:00
|
|
|
|
|
|
|
|
|
namespace Bootstrap.Admin.HealthChecks
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2019-08-13 14:39:35 +08:00
|
|
|
|
/// 数据库检查类
|
2019-08-13 13:39:18 +08:00
|
|
|
|
/// </summary>
|
|
|
|
|
public class DBHealthCheck : IHealthCheck
|
|
|
|
|
{
|
2019-08-23 22:33:44 +08:00
|
|
|
|
private IConfiguration _configuration;
|
|
|
|
|
private static readonly Func<IConfiguration, string, string> ConnectionStringResolve = (c, name) => string.IsNullOrEmpty(name)
|
|
|
|
|
? c.GetSection("ConnectionStrings").GetChildren().FirstOrDefault()?.Value
|
|
|
|
|
: c.GetConnectionString(name);
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 构造函数
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="configuration"></param>
|
|
|
|
|
public DBHealthCheck(IConfiguration configuration)
|
|
|
|
|
{
|
|
|
|
|
_configuration = configuration;
|
|
|
|
|
}
|
|
|
|
|
|
2019-08-13 13:39:18 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 异步检查方法
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="context"></param>
|
|
|
|
|
/// <param name="cancellationToken"></param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
|
|
|
|
|
{
|
2019-08-23 22:33:44 +08:00
|
|
|
|
var db = _configuration.GetSection("DB").GetChildren()
|
|
|
|
|
.Select(config => new
|
2019-08-13 20:23:28 +08:00
|
|
|
|
{
|
2019-08-23 22:33:44 +08:00
|
|
|
|
Enabled = bool.TryParse(config["Enabled"], out var en) ? en : false,
|
|
|
|
|
ProviderName = config["ProviderName"],
|
|
|
|
|
Widget = config["Widget"],
|
|
|
|
|
ConnectionString = ConnectionStringResolve(config.GetSection("ConnectionStrings").Exists() ? config : _configuration, string.Empty)
|
|
|
|
|
}).FirstOrDefault(i => i.Enabled);
|
2019-08-23 23:02:57 +08:00
|
|
|
|
|
|
|
|
|
// 检查 Admin 账户权限
|
|
|
|
|
var user = UserHelper.RetrieveUserByUserName("Admin");
|
|
|
|
|
var roles = RoleHelper.RetrievesByUserName("Admin");
|
2019-08-23 22:33:44 +08:00
|
|
|
|
var dicts = DictHelper.RetrieveDicts();
|
2019-08-23 23:02:57 +08:00
|
|
|
|
var menus = MenuHelper.RetrieveMenusByUserName("Admin");
|
|
|
|
|
|
2019-08-23 22:33:44 +08:00
|
|
|
|
var data = new Dictionary<string, object>()
|
|
|
|
|
{
|
|
|
|
|
{ "ConnectionString", db.ConnectionString },
|
|
|
|
|
{ "Widget", db.Widget },
|
|
|
|
|
{ "DbType", db.ProviderName },
|
2019-08-23 23:02:57 +08:00
|
|
|
|
{ "Dicts", dicts.Count() },
|
|
|
|
|
{ "User(Admin)", user != null },
|
|
|
|
|
{ "Roles(Admin)", string.Join(",", roles) },
|
|
|
|
|
{ "Navigations(Admin)", menus.Count() }
|
2019-08-23 22:33:44 +08:00
|
|
|
|
};
|
2019-08-23 23:02:57 +08:00
|
|
|
|
|
|
|
|
|
var v = dicts.Any() && user != null && roles.Any() && menus.Any();
|
|
|
|
|
return v ? Task.FromResult(HealthCheckResult.Healthy("Ok", data)) : Task.FromResult(HealthCheckResult.Degraded("Failed"));
|
2019-08-13 13:39:18 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|