Files
DbusSmsForward/DbusTest/Helper/ConfigHelper.cs
T

209 lines
7.2 KiB
C#

using DbusSmsForward.SettingModel;
using Microsoft.Extensions.Configuration;
using System.Net;
using System.Text.Json;
namespace DbusSmsForward.Helper;
public static class ConfigHelper
{
private static readonly JsonSerializerOptions JsonOptions = new(SourceGenerationContext.Default.Options)
{
PropertyNameCaseInsensitive = true,
WriteIndented = true
};
public static string DefaultSettingsFileName => Path.Combine(AppContext.BaseDirectory, "appsettings.json");
public static string ResolveConfigPath(IConfiguration? configuration = null)
{
string[] candidates =
[
configuration?["DBUSSMSFORWARD_CONFIG_PATH"] ?? string.Empty,
Environment.GetEnvironmentVariable("DBUSSMSFORWARD_CONFIG_PATH") ?? string.Empty,
"/etc/dbussmsforward/appsettings.json",
DefaultSettingsFileName
];
foreach (string candidate in candidates)
{
if (!string.IsNullOrWhiteSpace(candidate) && File.Exists(candidate))
{
return candidate;
}
}
return candidates.Last(static c => !string.IsNullOrWhiteSpace(c));
}
public static DbusSmsForwardOptions LoadOptions(IConfiguration? configuration = null)
{
DbusSmsForwardOptions options = new();
string configPath = ResolveConfigPath(configuration);
if (File.Exists(configPath))
{
string json = File.ReadAllText(configPath);
options = JsonSerializer.Deserialize(json, SourceGenerationContext.Default.DbusSmsForwardOptions) ?? new DbusSmsForwardOptions();
}
if (configuration is not null)
{
configuration.GetSection("DbusSmsForward").Bind(options);
configuration.GetSection("Daemon").Bind(options.Daemon);
configuration.GetSection("Modem").Bind(options.Modem);
configuration.GetSection("Forwarding").Bind(options.Forwarding);
configuration.GetSection("Notifications").Bind(options.Notifications);
configuration.GetSection("LegacyCompatibility").Bind(options.LegacyCompatibility);
}
return options;
}
public static void SaveOptions(DbusSmsForwardOptions options, string? path = null)
{
string target = path ?? ResolveConfigPath();
Directory.CreateDirectory(Path.GetDirectoryName(target) ?? AppContext.BaseDirectory);
string updatedJson = JsonSerializer.Serialize(options, SourceGenerationContext.Default.DbusSmsForwardOptions);
File.WriteAllText(target, updatedJson);
}
public static void SaveLegacySettings(appsettingsModel result, string? path = null)
{
string target = path ?? DefaultSettingsFileName;
Directory.CreateDirectory(Path.GetDirectoryName(target) ?? AppContext.BaseDirectory);
string updatedJson = JsonSerializer.Serialize(result, SourceGenerationContext.Default.appsettingsModel);
File.WriteAllText(target, updatedJson);
}
public static void GetSettings(ref appsettingsModel result)
{
string settingsFileName = ResolveConfigPath();
if (!File.Exists(settingsFileName))
{
result ??= new appsettingsModel();
return;
}
string config = File.ReadAllText(settingsFileName);
try
{
if (LooksLikeNewConfig(config))
{
DbusSmsForwardOptions options = JsonSerializer.Deserialize(config, SourceGenerationContext.Default.DbusSmsForwardOptions) ?? new DbusSmsForwardOptions();
result = ConvertToLegacy(options);
return;
}
result = JsonSerializer.Deserialize(config, SourceGenerationContext.Default.appsettingsModel) ?? new appsettingsModel();
}
catch
{
result ??= new appsettingsModel();
}
}
public static void UpdateSettings(ref appsettingsModel result)
{
SaveLegacySettings(result);
}
public static bool JudgeIsForwardIgnore(uint storage)
{
appsettingsModel result = new();
GetSettings(ref result);
string forwardStorageType = result.appSettings.ForwardIgnoreStorageType?.Trim().ToLowerInvariant() ?? string.Empty;
return (forwardStorageType, storage) switch
{
("unknown", 0) => true,
("sm", 1) => true,
("me", 2) => true,
("mt", 3) => true,
("sr", 4) => true,
("bm", 5) => true,
("ta", 6) => true,
_ => false
};
}
public static string GetDeviceHostName()
{
try
{
return Dns.GetHostName();
}
catch
{
try
{
return Environment.MachineName;
}
catch
{
return string.Empty;
}
}
}
public static string ResolveDeviceName(DbusSmsForwardOptions options)
{
if (!string.IsNullOrWhiteSpace(options.Forwarding.DeviceName))
{
return options.Forwarding.DeviceName;
}
return GetDeviceHostName();
}
public static appsettingsModel ConvertToLegacy(DbusSmsForwardOptions options)
{
return new appsettingsModel
{
appSettings = new LegacyAppSettings
{
EmailConfig = options.Notifications.Email,
PushPlusConfig = options.Notifications.PushPlus,
DingTalkConfig = options.Notifications.DingTalk,
BarkConfig = options.Notifications.Bark,
WeComApplicationConfig = options.Notifications.WeComApplication,
TGBotConfig = options.Notifications.TelegramBot,
ShellConfig = options.Notifications.Shell,
SmsCodeKey = options.Forwarding.SmsCodeKey,
ForwardIgnoreStorageType = options.Forwarding.IgnoreStorageType,
DeviceName = options.Forwarding.DeviceName
}
};
}
public static DbusSmsForwardOptions ConvertFromLegacy(appsettingsModel legacy)
{
return new DbusSmsForwardOptions
{
Forwarding = new ForwardingConfig
{
DeviceName = legacy.appSettings.DeviceName,
SmsCodeKey = legacy.appSettings.SmsCodeKey,
IgnoreStorageType = legacy.appSettings.ForwardIgnoreStorageType
},
Notifications = new NotificationChannels
{
Email = legacy.appSettings.EmailConfig,
PushPlus = legacy.appSettings.PushPlusConfig,
DingTalk = legacy.appSettings.DingTalkConfig,
Bark = legacy.appSettings.BarkConfig,
WeComApplication = legacy.appSettings.WeComApplicationConfig,
TelegramBot = legacy.appSettings.TGBotConfig,
Shell = legacy.appSettings.ShellConfig
}
};
}
private static bool LooksLikeNewConfig(string json)
{
using JsonDocument document = JsonDocument.Parse(json);
JsonElement root = document.RootElement;
return root.TryGetProperty("Daemon", out _) || root.TryGetProperty("Notifications", out _) || root.TryGetProperty("Forwarding", out _);
}
}