添加项目文件。
This commit is contained in:
25
.dockerignore
Normal file
25
.dockerignore
Normal file
@@ -0,0 +1,25 @@
|
||||
**/.classpath
|
||||
**/.dockerignore
|
||||
**/.env
|
||||
**/.git
|
||||
**/.gitignore
|
||||
**/.project
|
||||
**/.settings
|
||||
**/.toolstarget
|
||||
**/.vs
|
||||
**/.vscode
|
||||
**/*.*proj.user
|
||||
**/*.dbmdl
|
||||
**/*.jfm
|
||||
**/azds.yaml
|
||||
**/bin
|
||||
**/charts
|
||||
**/docker-compose*
|
||||
**/Dockerfile*
|
||||
**/node_modules
|
||||
**/npm-debug.log
|
||||
**/obj
|
||||
**/secrets.dev.yaml
|
||||
**/values.dev.yaml
|
||||
LICENSE
|
||||
README.md
|
||||
35
Hua.DDNS.Test/AppJobTest.cs
Normal file
35
Hua.DDNS.Test/AppJobTest.cs
Normal file
@@ -0,0 +1,35 @@
|
||||
using Hua.DDNS.Jobs;
|
||||
using Hua.DDNS.Test.Start;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Serilog;
|
||||
|
||||
namespace Hua.DDNS.Test
|
||||
{
|
||||
public class AppJobTest
|
||||
{
|
||||
[Theory]
|
||||
[InlineData("appsetting.Ali.json")]
|
||||
[InlineData("appsetting.Tencent.json")]
|
||||
public void UpdateDNS(string configPath)
|
||||
{
|
||||
try
|
||||
{
|
||||
var config = new ConfigurationBuilder()
|
||||
.SetBasePath(AppContext.BaseDirectory)
|
||||
.AddJsonFile(configPath, true)
|
||||
.AddEnvironmentVariables()// <20>ѻ<EFBFBD><D1BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD>ŵ<EFBFBD> Configuraiton<6F><6E><EFBFBD><EFBFBD>
|
||||
.Build();
|
||||
|
||||
var sc = DIConfig.ConfigureServices(config);
|
||||
var job = sc.GetService<AppJob>();
|
||||
|
||||
job?.Execute(null);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Assert.False(false, $"<22><><EFBFBD><EFBFBD><EFBFBD>쳣:{e.Message}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
37
Hua.DDNS.Test/Hua.DDNS.Test.csproj
Normal file
37
Hua.DDNS.Test/Hua.DDNS.Test.csproj
Normal file
@@ -0,0 +1,37 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
|
||||
<IsPackable>false</IsPackable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.1.0" />
|
||||
<PackageReference Include="xunit" Version="2.4.1" />
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="coverlet.collector" Version="3.1.2">
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
</PackageReference>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Hua.DDNS\Hua.DDNS.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Update="appsettings.Ali.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Update="appsettings.Tencent.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
48
Hua.DDNS.Test/Start/DIConfig.cs
Normal file
48
Hua.DDNS.Test/Start/DIConfig.cs
Normal file
@@ -0,0 +1,48 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Hua.DDNS.Common.Config;
|
||||
using Hua.DDNS.Common.Http;
|
||||
using Hua.DDNS.Common;
|
||||
using Hua.DDNS.Jobs;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Serilog;
|
||||
|
||||
namespace Hua.DDNS.Test.Start
|
||||
{
|
||||
public class DIConfig
|
||||
{
|
||||
public static IServiceProvider ConfigureServices(IConfiguration configuration)
|
||||
{
|
||||
Log.Logger = new LoggerConfiguration()
|
||||
.Enrich.FromLogContext()
|
||||
.WriteTo.Console()
|
||||
.WriteTo.File(
|
||||
Path.Combine("Log\\log-.log"),
|
||||
rollingInterval: RollingInterval.Day)
|
||||
.CreateLogger();
|
||||
|
||||
var services = new ServiceCollection();
|
||||
services.AddSingleton<IConfiguration>(configuration);
|
||||
services.AddLogging(loggingBuilder =>
|
||||
{
|
||||
loggingBuilder.AddConfiguration(configuration.GetSection("Logging")); //配置logging的一些东西
|
||||
// 下面的这行需要 Microsoft.Extensions.Logging.Console
|
||||
loggingBuilder.AddConsole(); //加多个 每一个Ilooger下面就会有多个provider
|
||||
});
|
||||
|
||||
// 注入了一个默认的ILogger
|
||||
services.AddSingleton<SettingProvider>();
|
||||
//services.AddSingleton<SyncECMFileProvider>();
|
||||
services.AddSingleton<Url>();
|
||||
services.AddSingleton<SqlHelper>();
|
||||
services.AddTransient<IHttpHelper, HttpHelper>();
|
||||
services.AddTransient<AppJob>();
|
||||
return services.BuildServiceProvider();
|
||||
}
|
||||
}
|
||||
}
|
||||
1
Hua.DDNS.Test/Usings.cs
Normal file
1
Hua.DDNS.Test/Usings.cs
Normal file
@@ -0,0 +1 @@
|
||||
global using Xunit;
|
||||
32
Hua.DDNS.Test/appsettings.Ali.json
Normal file
32
Hua.DDNS.Test/appsettings.Ali.json
Normal file
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"ConnectionStrings": {
|
||||
"pgConnection": "Host=127.0.0.1;Port=5432;Database=Worker;Username=Worker;Password=123456;"
|
||||
},
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.Hosting.Lifetime": "Information"
|
||||
}
|
||||
},
|
||||
"App": {
|
||||
"AppJob": {
|
||||
"Corn": "* * * * * ?" //https://cron.qqe2.com/
|
||||
},
|
||||
|
||||
"Domain": {
|
||||
"Platform": "Ali",
|
||||
// 阿里云的 Access Id
|
||||
"Id": "AliId",
|
||||
// 阿里云的 Access Key
|
||||
"Key": "AliKey",
|
||||
// 主域名
|
||||
"domain": "demoDomain.cn",
|
||||
// 子域名前缀
|
||||
"subDomainArray": [ "bjb", "git" ],
|
||||
// 记录类型
|
||||
"type": "A",
|
||||
//间隔时间 秒
|
||||
"time": "30"
|
||||
}
|
||||
}
|
||||
}
|
||||
32
Hua.DDNS.Test/appsettings.Tencent.json
Normal file
32
Hua.DDNS.Test/appsettings.Tencent.json
Normal file
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"ConnectionStrings": {
|
||||
"pgConnection": "Host=127.0.0.1;Port=5432;Database=Worker;Username=Worker;Password=123456;"
|
||||
},
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.Hosting.Lifetime": "Information"
|
||||
}
|
||||
},
|
||||
"App": {
|
||||
"AppJob": {
|
||||
"Corn": "* * * * * ?" //https://cron.qqe2.com/
|
||||
},
|
||||
|
||||
"Domain": {
|
||||
"Platform": "Tencent",
|
||||
// 阿里云的 Access Id
|
||||
"Id": "Id",
|
||||
// 阿里云的 Access Key
|
||||
"Key": "Key",
|
||||
// 主域名
|
||||
"domain": "demoDomain.cn",
|
||||
// 子域名前缀
|
||||
"subDomainArray": [ "bjb", "git" ],
|
||||
// 记录类型
|
||||
"type": "A",
|
||||
//间隔时间 秒
|
||||
"time": "30"
|
||||
}
|
||||
}
|
||||
}
|
||||
31
Hua.DDNS.sln
Normal file
31
Hua.DDNS.sln
Normal file
@@ -0,0 +1,31 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.2.32616.157
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Hua.DDNS", "Hua.DDNS\Hua.DDNS.csproj", "{EBC77B5D-87D5-4923-84A6-93DB2248DEB0}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Hua.DDNS.Test", "Hua.DDNS.Test\Hua.DDNS.Test.csproj", "{BB544060-5ABF-4A3C-965B-BE7CA7BD61E7}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{EBC77B5D-87D5-4923-84A6-93DB2248DEB0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{EBC77B5D-87D5-4923-84A6-93DB2248DEB0}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{EBC77B5D-87D5-4923-84A6-93DB2248DEB0}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{EBC77B5D-87D5-4923-84A6-93DB2248DEB0}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{BB544060-5ABF-4A3C-965B-BE7CA7BD61E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{BB544060-5ABF-4A3C-965B-BE7CA7BD61E7}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{BB544060-5ABF-4A3C-965B-BE7CA7BD61E7}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{BB544060-5ABF-4A3C-965B-BE7CA7BD61E7}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {D8744CA6-C2DB-4287-B8B3-E5917B12391D}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
8
Hua.DDNS/Common/Config/Options/AppOption.cs
Normal file
8
Hua.DDNS/Common/Config/Options/AppOption.cs
Normal file
@@ -0,0 +1,8 @@
|
||||
namespace Hua.DDNS.Common.Config.Options
|
||||
{
|
||||
|
||||
public class AppOption
|
||||
{
|
||||
public DomainOption Domain { get; set; }
|
||||
}
|
||||
}
|
||||
50
Hua.DDNS/Common/Config/Options/DomainOption.cs
Normal file
50
Hua.DDNS/Common/Config/Options/DomainOption.cs
Normal file
@@ -0,0 +1,50 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Hua.DDNS.Common.Config.Options
|
||||
{
|
||||
|
||||
|
||||
public class DomainOption
|
||||
{
|
||||
/// <summary>
|
||||
/// 平台
|
||||
/// </summary>
|
||||
public string Platform { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Id
|
||||
/// </summary>
|
||||
public string Id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Key
|
||||
/// </summary>
|
||||
public string Key { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 域名
|
||||
/// </summary>
|
||||
public string domain { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 子域列表
|
||||
/// </summary>
|
||||
public string[] subDomainArray { get; set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 解析记录类型
|
||||
/// </summary>
|
||||
public string type { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 间隔时间 秒
|
||||
/// </summary>
|
||||
public string time { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
17
Hua.DDNS/Common/Config/SettingProvider.cs
Normal file
17
Hua.DDNS/Common/Config/SettingProvider.cs
Normal file
@@ -0,0 +1,17 @@
|
||||
using Hua.DDNS.Common.Config.Options;
|
||||
|
||||
namespace Hua.DDNS.Common.Config
|
||||
{
|
||||
public class SettingProvider
|
||||
{
|
||||
private readonly AppOption _app;
|
||||
public SettingProvider(IConfiguration configuration)
|
||||
{
|
||||
_app = new AppOption();
|
||||
configuration.GetSection("App").Bind(_app);
|
||||
}
|
||||
|
||||
public AppOption App => _app;
|
||||
}
|
||||
|
||||
}
|
||||
13
Hua.DDNS/Common/FileHelper.cs
Normal file
13
Hua.DDNS/Common/FileHelper.cs
Normal file
@@ -0,0 +1,13 @@
|
||||
namespace Hua.DDNS.Common
|
||||
{
|
||||
public class FileHelper
|
||||
{
|
||||
public static void DeleteIfExists(string path)
|
||||
{
|
||||
if (File.Exists(path))
|
||||
{
|
||||
File.Delete(path);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
141
Hua.DDNS/Common/Http/HttpHelper.cs
Normal file
141
Hua.DDNS/Common/Http/HttpHelper.cs
Normal file
@@ -0,0 +1,141 @@
|
||||
using System.Net;
|
||||
using System.Net.Http.Json;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Hua.DDNS.Common.Http
|
||||
{
|
||||
public class HttpHelper: IHttpHelper
|
||||
{
|
||||
private static ILogger<HttpHelper> _logger;
|
||||
private static HttpClientHandler _handler;
|
||||
|
||||
public HttpHelper(ILogger<HttpHelper> logger)
|
||||
{
|
||||
_logger = logger;
|
||||
_handler = new HttpClientHandler();
|
||||
}
|
||||
|
||||
public HttpClient GetHttpClient()
|
||||
{
|
||||
return new HttpClient(_handler){};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// PostAsync
|
||||
/// </summary>
|
||||
/// <typeparam name="TIn"></typeparam>
|
||||
/// <typeparam name="TOut"></typeparam>
|
||||
/// <param name="url"></param>
|
||||
/// <param name="input"></param>
|
||||
/// <param name="timeOut">超时时间</param>
|
||||
/// <returns></returns>
|
||||
public async Task<TOut?> PostAsync<TIn, TOut>(string url, TIn input, int timeOut = 10)
|
||||
{
|
||||
try
|
||||
{
|
||||
var client = GetHttpClient();
|
||||
client.Timeout = new TimeSpan(0, 10, timeOut);
|
||||
_logger.LogDebug($"Post:{url}\n[{JsonConvert.SerializeObject(input)}]");
|
||||
var result = await client.PostAsync(url, JsonContent.Create(input));
|
||||
var strResult = await result.Content.ReadAsStringAsync();
|
||||
if (result.StatusCode != HttpStatusCode.OK)
|
||||
{
|
||||
_logger.LogDebug($"Error[{result.StatusCode}]:{url}\t{strResult}");
|
||||
}
|
||||
return await result.Content.ReadFromJsonAsync<TOut>();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_logger.LogError(url);
|
||||
_logger.LogError(e.Message);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// PostAsync
|
||||
/// </summary>
|
||||
/// <typeparam name="TOut"></typeparam>
|
||||
/// <param name="url"></param>
|
||||
/// <param name="timeOut"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<TOut?> GetAsync<TOut>(string url,int timeOut = 10)
|
||||
{
|
||||
try
|
||||
{
|
||||
var client = GetHttpClient();
|
||||
client.Timeout = new TimeSpan(0, 10, timeOut);
|
||||
_logger.LogDebug($"Get:{url}");
|
||||
var result = await client.GetAsync(url);
|
||||
var strResult = await result.Content.ReadAsStringAsync();
|
||||
if (result.StatusCode != HttpStatusCode.OK)
|
||||
{
|
||||
_logger.LogDebug($"Error[{result.StatusCode}]:{url}\t{strResult}");
|
||||
}
|
||||
return await result.Content.ReadFromJsonAsync<TOut>();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_logger.LogError(url);
|
||||
_logger.LogError(e.Message);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
#region 下载文件
|
||||
|
||||
/// <summary>
|
||||
/// http下载文件 (仅支持小文件)
|
||||
/// </summary>
|
||||
/// <param name="url">下载文件地址</param>
|
||||
/// <param name="localPath">文件存放地址,包含文件名</param>
|
||||
/// <returns></returns>
|
||||
public bool DownloadFile(string url, string localPath)
|
||||
{
|
||||
ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, errors) => true;
|
||||
|
||||
var request = WebRequest.Create(url) as HttpWebRequest;
|
||||
Stream stream = new FileStream(localPath, FileMode.CreateNew);
|
||||
try
|
||||
{
|
||||
// 设置参数
|
||||
//发送请求并获取相应回应数据
|
||||
var response = request?.GetResponse() as HttpWebResponse;
|
||||
//直到request.GetResponse()程序才开始向目标网页发送Post请求
|
||||
var responseStream = response?.GetResponseStream();
|
||||
//创建本地文件写入流
|
||||
stream.Close();
|
||||
responseStream?.Close();
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获得当前机器的公网 IP
|
||||
/// </summary>
|
||||
public async Task<string> GetCurrentPublicIpv4()
|
||||
{
|
||||
using var client = new HttpClient();
|
||||
using var request = new HttpRequestMessage(HttpMethod.Get, "http://175.24.175.136:8008/WebUtil/GetIp");
|
||||
using var response = await client.SendAsync(request);
|
||||
return await response.Content.ReadAsStringAsync();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public interface IHttpHelper
|
||||
{
|
||||
public Task<string> GetCurrentPublicIpv4();
|
||||
public Task<TOut?> PostAsync<TIn, TOut>(string url, TIn input, int timeOut = 10);
|
||||
public Task<TOut?> GetAsync<TOut>(string url, int timeOut = 10);
|
||||
public bool DownloadFile(string url, string fileFullName);
|
||||
public HttpClient GetHttpClient();
|
||||
}
|
||||
}
|
||||
14
Hua.DDNS/Common/Http/HttpResult.cs
Normal file
14
Hua.DDNS/Common/Http/HttpResult.cs
Normal file
@@ -0,0 +1,14 @@
|
||||
namespace Hua.DDNS.Common.Http
|
||||
{
|
||||
public class HttpResult<T>
|
||||
{
|
||||
public virtual T Data { get; set; }
|
||||
|
||||
public string DataDescription { get; set; }
|
||||
|
||||
public int Result { get; set; }
|
||||
|
||||
public string Message { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
16
Hua.DDNS/Common/Http/Url.cs
Normal file
16
Hua.DDNS/Common/Http/Url.cs
Normal file
@@ -0,0 +1,16 @@
|
||||
using Hua.DDNS.Common.Config;
|
||||
using Hua.DDNS.Start;
|
||||
|
||||
namespace Hua.DDNS.Common.Http
|
||||
{
|
||||
public class Url
|
||||
{
|
||||
private readonly SettingProvider _settingProvider;
|
||||
|
||||
public Url(SettingProvider settingProvider)
|
||||
{
|
||||
_settingProvider = settingProvider;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
46
Hua.DDNS/Common/SqlHelper.cs
Normal file
46
Hua.DDNS/Common/SqlHelper.cs
Normal file
@@ -0,0 +1,46 @@
|
||||
using System.Data;
|
||||
using Dapper;
|
||||
using Npgsql;
|
||||
|
||||
namespace Hua.DDNS.Common
|
||||
{
|
||||
public class SqlHelper
|
||||
{
|
||||
|
||||
private readonly string _connectionString;
|
||||
private readonly ILogger<SqlHelper> _logger;
|
||||
|
||||
public SqlHelper(IConfiguration configuration, ILogger<SqlHelper> logger)
|
||||
{
|
||||
_logger = logger;
|
||||
_connectionString = configuration.GetConnectionString("pgsql");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查询所有结果
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="strSql"></param>
|
||||
/// <returns></returns>
|
||||
/// <exception cref="Exception"></exception>
|
||||
public List<T> GetList<T>(string strSql)
|
||||
{
|
||||
var list = new List<T>();
|
||||
|
||||
try
|
||||
{
|
||||
using IDbConnection connection = new NpgsqlConnection(_connectionString);
|
||||
connection.Open();
|
||||
list = connection.Query<T>(strSql).ToList();
|
||||
connection.Close();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_logger.LogError(e.Message);
|
||||
throw;
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
23
Hua.DDNS/Dockerfile
Normal file
23
Hua.DDNS/Dockerfile
Normal file
@@ -0,0 +1,23 @@
|
||||
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.
|
||||
|
||||
#Depending on the operating system of the host machines(s) that will build or run the containers, the image specified in the FROM statement may need to be changed.
|
||||
#For more information, please see https://aka.ms/containercompat
|
||||
|
||||
FROM mcr.microsoft.com/dotnet/runtime:6.0 AS base
|
||||
WORKDIR /app
|
||||
|
||||
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
|
||||
WORKDIR /src
|
||||
COPY ["Hua.DDNS/Hua.DDNS.csproj", "Hua.DDNS/"]
|
||||
RUN dotnet restore "Hua.DDNS/Hua.DDNS.csproj"
|
||||
COPY . .
|
||||
WORKDIR "/src/Hua.DDNS"
|
||||
RUN dotnet build "Hua.DDNS.csproj" -c Release -o /app/build
|
||||
|
||||
FROM build AS publish
|
||||
RUN dotnet publish "Hua.DDNS.csproj" -c Release -o /app/publish
|
||||
|
||||
FROM base AS final
|
||||
WORKDIR /app
|
||||
COPY --from=publish /app/publish .
|
||||
ENTRYPOINT ["dotnet", "Hua.DDNS.dll"]
|
||||
41
Hua.DDNS/Hua.DDNS.csproj
Normal file
41
Hua.DDNS/Hua.DDNS.csproj
Normal file
@@ -0,0 +1,41 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk.Worker">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<UserSecretsId>dotnet-Hua.DDNS-C4DADDFF-6D5B-4BD5-AB11-02F07B517CAC</UserSecretsId>
|
||||
<DockerDefaultTargetOS>Windows</DockerDefaultTargetOS>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="AlibabaCloud.SDK.Alidns20150109" Version="3.0.0" />
|
||||
<PackageReference Include="Hua.DotNet.Code" Version="0.0.8" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.1" />
|
||||
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.15.1" />
|
||||
<PackageReference Include="Dapper" Version="2.0.123" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.1" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.0" />
|
||||
<PackageReference Include="Newtonsoft.Json.Bson" Version="1.0.2" />
|
||||
<PackageReference Include="Npgsql" Version="6.0.3" />
|
||||
<PackageReference Include="QRCoder" Version="1.4.1" />
|
||||
<PackageReference Include="Quartz.Extensions.DependencyInjection" Version="3.4.0" />
|
||||
<PackageReference Include="Quartz.Extensions.Hosting" Version="3.4.0" />
|
||||
<PackageReference Include="Serilog" Version="2.10.0" />
|
||||
<PackageReference Include="Serilog.Extensions.Hosting" Version="4.2.0" />
|
||||
<PackageReference Include="Serilog.Settings.Configuration" Version="3.3.0" />
|
||||
<PackageReference Include="Serilog.Sinks.Console" Version="4.0.1" />
|
||||
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
|
||||
<PackageReference Include="TencentCloudSDK.Dnspod" Version="3.0.623" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Update="InstallServiceByNssm.bat">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Update="nssm.exe">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
32
Hua.DDNS/InstallServiceByNssm.bat
Normal file
32
Hua.DDNS/InstallServiceByNssm.bat
Normal file
@@ -0,0 +1,32 @@
|
||||
cd /d %~dp0
|
||||
echo OFF
|
||||
net.exe session 1>NUL 2>NUL && (
|
||||
goto as_admin
|
||||
) || (
|
||||
goto not_admin
|
||||
)
|
||||
:not_admin
|
||||
echo <20><><EFBFBD>Թ<EFBFBD><D4B9><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ǰ<EFBFBD>ű<EFBFBD><C5B1><EFBFBD>
|
||||
goto end
|
||||
|
||||
:as_admin
|
||||
SET basePath=%cd%
|
||||
SET serviceName=Hua.DDNS
|
||||
SET displayName="Hua.DDNS Demo"
|
||||
SET description="Hua.DDNS Demo"
|
||||
SET servicePath="%basePath%\%serviceName%.exe"
|
||||
ECHO %servicePath%
|
||||
net stop %serviceName%
|
||||
sc delete %serviceName%
|
||||
ping 1.1.1.1 -n 1 -w 10 > nul
|
||||
nssm install %serviceName% %servicePath%
|
||||
nssm set %serviceName% AppDirectory %basePath%
|
||||
nssm set %serviceName% AppStopMethodSkip 6
|
||||
nssm set %serviceName% AppStopMethodConsole 1000
|
||||
nssm set %serviceName% AppThrottle 5000
|
||||
ping 1.1.1.1 -n 1 -w 10 > nul
|
||||
nssm start %serviceName%
|
||||
Echo <20><>װ<EFBFBD>ɹ<EFBFBD>
|
||||
goto end
|
||||
:end
|
||||
Pause
|
||||
134
Hua.DDNS/Jobs/AppJob.cs
Normal file
134
Hua.DDNS/Jobs/AppJob.cs
Normal file
@@ -0,0 +1,134 @@
|
||||
using Hua.DDNS.Common;
|
||||
using Hua.DDNS.Common.Config;
|
||||
using Hua.DDNS.Common.Config.Options;
|
||||
using Hua.DDNS.Common.Http;
|
||||
using Hua.DDNS.Start;
|
||||
using Quartz;
|
||||
using System.Net;
|
||||
using AlibabaCloud.OpenApiClient.Models;
|
||||
using AlibabaCloud.SDK.Alidns20150109.Models;
|
||||
using Hua.DotNet.Code.Extension;
|
||||
using TencentCloud.Common;
|
||||
using TencentCloud.Common.Profile;
|
||||
using TencentCloud.Dnspod.V20210323;
|
||||
using TencentCloud.Dnspod.V20210323.Models;
|
||||
|
||||
using Tea;
|
||||
using Tea.Utils;
|
||||
|
||||
namespace Hua.DDNS.Jobs
|
||||
{
|
||||
[DisallowConcurrentExecution]
|
||||
public class AppJob : IJob, IDisposable
|
||||
{
|
||||
private readonly ILogger<AppJob> _logger;
|
||||
private readonly SettingProvider _settingProvider;
|
||||
private readonly DomainOption _domainOption;
|
||||
private readonly IHttpHelper _httpHelper;
|
||||
public string CurrentIpv4Address;
|
||||
|
||||
|
||||
|
||||
public AppJob(ILogger<AppJob> logger,SettingProvider settingProvider, IHttpHelper httpHelper)
|
||||
{
|
||||
_logger = logger;
|
||||
_settingProvider = settingProvider;
|
||||
_httpHelper = httpHelper;
|
||||
_domainOption = _settingProvider.App.Domain;
|
||||
|
||||
|
||||
}
|
||||
public async Task Execute(IJobExecutionContext context)
|
||||
{
|
||||
_logger.LogInformation("开始任务执行");
|
||||
try
|
||||
{
|
||||
var oldIp = (await Dns.GetHostEntryAsync($"{_domainOption.subDomainArray.First()}.{_domainOption.domain}")).AddressList.First();
|
||||
CurrentIpv4Address = await _httpHelper.GetCurrentPublicIpv4();
|
||||
|
||||
if (CurrentIpv4Address!=oldIp.ToString())
|
||||
{
|
||||
await UpdateDns();
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_logger.LogError(e,e.Message);
|
||||
}
|
||||
finally
|
||||
{
|
||||
_logger.LogInformation("任务执行完成");
|
||||
}
|
||||
}
|
||||
|
||||
private async Task UpdateDns()
|
||||
{
|
||||
//更新Ip记录
|
||||
switch (_domainOption.Platform)
|
||||
{
|
||||
case "Tencent":
|
||||
var _dnspodClient = new DnspodClient(
|
||||
// 实例化一个认证对象,入参需要传入腾讯云账户secretId,secretKey,此处还需注意密钥对的保密
|
||||
// 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取
|
||||
new Credential { SecretId = _domainOption.Id, SecretKey = _domainOption.Key },
|
||||
"",
|
||||
// 实例化一个client选项,可选的,没有特殊需求可以跳过
|
||||
new ClientProfile()
|
||||
{
|
||||
// 实例化一个http选项,可选的,没有特殊需求可以跳过
|
||||
HttpProfile = new HttpProfile { Endpoint = ("dnspod.tencentcloudapi.com") }
|
||||
});
|
||||
|
||||
//获取域名解析记录
|
||||
var describeRecordList = await _dnspodClient.DescribeRecordList(new DescribeRecordListRequest() { Domain = _domainOption.domain });
|
||||
var record = describeRecordList.RecordList.FirstOrDefault(m =>
|
||||
m.Value == CurrentIpv4Address && _domainOption.subDomainArray.Any(n => m.Name == n));
|
||||
if (record!=null && record.Value == CurrentIpv4Address) return;//如果记录已经变更,不调用更新接口
|
||||
|
||||
await _dnspodClient.ModifyRecordBatch(new ModifyRecordBatchRequest()
|
||||
{
|
||||
RecordIdList =
|
||||
describeRecordList.RecordList
|
||||
.Where(m => m.Value != CurrentIpv4Address && _domainOption.subDomainArray.Any(n => m.Name == n))
|
||||
.Select(m => m.RecordId)
|
||||
.ToArray(),
|
||||
Change = "value",
|
||||
ChangeTo = CurrentIpv4Address
|
||||
});
|
||||
|
||||
break;
|
||||
case "Ali":
|
||||
var aliClient = new AlibabaCloud.SDK.Alidns20150109.Client(new Config()
|
||||
{
|
||||
// 您的 AccessKey ID
|
||||
AccessKeyId = _domainOption.Id,
|
||||
// 您的 AccessKey Secret
|
||||
AccessKeySecret = _domainOption.Key,
|
||||
Endpoint = "alidns.cn-beijing.aliyuncs.com",
|
||||
});
|
||||
|
||||
var aliDescribeRecordList = (await aliClient.DescribeDomainRecordsAsync(new DescribeDomainRecordsRequest()
|
||||
{
|
||||
DomainName = _domainOption.domain
|
||||
})).Body.DomainRecords.Record;
|
||||
|
||||
foreach (var aliDomainRecord in aliDescribeRecordList
|
||||
.Where(m => m.Value != CurrentIpv4Address && _domainOption.subDomainArray.Any(n => m.Value == n)))
|
||||
{
|
||||
|
||||
await aliClient.UpdateDomainRecordAsync(new UpdateDomainRecordRequest()
|
||||
{
|
||||
RecordId = aliDomainRecord.RecordId,
|
||||
Value = CurrentIpv4Address,
|
||||
});
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
_logger.LogInformation("AppJob已销毁");
|
||||
}
|
||||
}
|
||||
}
|
||||
10
Hua.DDNS/Jobs/AppJobContext.cs
Normal file
10
Hua.DDNS/Jobs/AppJobContext.cs
Normal file
@@ -0,0 +1,10 @@
|
||||
namespace Hua.DDNS.Jobs
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Job上下文
|
||||
/// </summary>
|
||||
public class AppJobContext
|
||||
{
|
||||
}
|
||||
}
|
||||
14
Hua.DDNS/Properties/launchSettings.json
Normal file
14
Hua.DDNS/Properties/launchSettings.json
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"profiles": {
|
||||
"Hua.DDNS": {
|
||||
"commandName": "Project",
|
||||
"environmentVariables": {
|
||||
"DOTNET_ENVIRONMENT": "Development"
|
||||
},
|
||||
"dotnetRunMessages": true
|
||||
},
|
||||
"Docker": {
|
||||
"commandName": "Docker"
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Hua.DDNS/Start/Cache.cs
Normal file
11
Hua.DDNS/Start/Cache.cs
Normal file
@@ -0,0 +1,11 @@
|
||||
namespace Hua.DDNS.Start
|
||||
{
|
||||
public class Cache
|
||||
{
|
||||
/// <summary>
|
||||
/// Tocken
|
||||
/// </summary>
|
||||
public static string Tocken { get; set; } = null;
|
||||
|
||||
}
|
||||
}
|
||||
94
Hua.DDNS/Start/Program.cs
Normal file
94
Hua.DDNS/Start/Program.cs
Normal file
@@ -0,0 +1,94 @@
|
||||
using Hua.DDNS.Common;
|
||||
using Hua.DDNS.Common.Config;
|
||||
using Hua.DDNS.Common.Http;
|
||||
using Hua.DDNS.Jobs;
|
||||
using Quartz;
|
||||
using Serilog;
|
||||
|
||||
namespace Hua.DDNS.Start
|
||||
{
|
||||
public static class Program
|
||||
{
|
||||
public static async Task Main(string[] args)
|
||||
{
|
||||
await CreateHostBuilder(args).Build().RunAsync();
|
||||
}
|
||||
|
||||
private static IHostBuilder CreateHostBuilder(string[] args) =>
|
||||
Host.CreateDefaultBuilder(args)
|
||||
.UseWindowsService()
|
||||
.UseSerilog()
|
||||
.ConfigureServices((hostContext, services) =>
|
||||
{
|
||||
Log.Logger = new LoggerConfiguration()
|
||||
.Enrich.FromLogContext()
|
||||
.WriteTo.Console()
|
||||
.WriteTo.File(
|
||||
Path.Combine("Log\\log-.log"),
|
||||
rollingInterval: RollingInterval.Day)
|
||||
.CreateLogger();
|
||||
ConfigDi(hostContext, services);
|
||||
ConfigQuartz(hostContext, services);
|
||||
});
|
||||
|
||||
public static IServiceProvider ConfigDi(HostBuilderContext hostContext, IServiceCollection services)
|
||||
{
|
||||
services.AddSingleton<SettingProvider>();
|
||||
//services.AddSingleton<SyncECMFileProvider>();
|
||||
services.AddSingleton<Url>();
|
||||
services.AddSingleton<SqlHelper>();
|
||||
services.AddTransient<IHttpHelper, HttpHelper>();
|
||||
return services.BuildServiceProvider();
|
||||
}
|
||||
|
||||
private static void ConfigQuartz(HostBuilderContext hostContext, IServiceCollection services)
|
||||
{
|
||||
// if you are using persistent job store, you might want to alter some options
|
||||
services.Configure<QuartzOptions>(options =>
|
||||
{
|
||||
options.Scheduling.IgnoreDuplicates = true; // default: false
|
||||
options.Scheduling.OverWriteExistingData = true; // default: true
|
||||
});
|
||||
|
||||
// base configuration for DI
|
||||
services.AddQuartz(q =>
|
||||
{
|
||||
// handy when part of cluster or you want to otherwise identify ltiple schedulers
|
||||
q.SchedulerId = "Hua.DDNS.Demo";
|
||||
// this is default configuration if you don't alter it
|
||||
q.UseMicrosoftDependencyInjectionJobFactory();
|
||||
|
||||
// these are the defaults
|
||||
q.UseSimpleTypeLoader();
|
||||
q.UseInMemoryStore();
|
||||
q.UseDefaultThreadPool(tp => { tp.MaxConcurrency = 10; });
|
||||
|
||||
//configure jobs with code
|
||||
var appJobKey = new JobKey("AppJob", "AppJobGroup");
|
||||
q.AddJob<AppJob>(j => j
|
||||
.StoreDurably()
|
||||
.WithIdentity(appJobKey)
|
||||
.WithDescription("AppJob")
|
||||
);
|
||||
|
||||
q.AddTrigger(t => t
|
||||
.WithIdentity("AppJob Trigger")
|
||||
.ForJob(appJobKey)
|
||||
.WithCronSchedule(hostContext.Configuration.GetSection("App:AppJob:Corn").Value)
|
||||
.WithDescription("AppJob trigger")
|
||||
.StartNow()
|
||||
);
|
||||
});
|
||||
|
||||
// Quartz.Extensions.Hosting hosting
|
||||
services.AddQuartzHostedService(options =>
|
||||
{
|
||||
// when shutting down we want jobs to complete gracefully
|
||||
options.WaitForJobsToComplete = true;
|
||||
|
||||
// when we need to init another IHostedServices first
|
||||
options.StartDelay = TimeSpan.FromSeconds(10);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
32
Hua.DDNS/appsettings.Development.json
Normal file
32
Hua.DDNS/appsettings.Development.json
Normal file
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"ConnectionStrings": {
|
||||
"pgConnection": "Host=127.0.0.1;Port=5432;Database=Worker;Username=Worker;Password=123456;"
|
||||
},
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.Hosting.Lifetime": "Information"
|
||||
}
|
||||
},
|
||||
"App": {
|
||||
"AppJob": {
|
||||
"Corn": "* * * * * ?" //https://cron.qqe2.com/
|
||||
},
|
||||
|
||||
"Domain": {
|
||||
"Platform": "Ali",
|
||||
// Access Id/Secret Id
|
||||
"Id": "Id",
|
||||
// Access Key/Secret Key
|
||||
"Key": "Key",
|
||||
// 主域名
|
||||
"domain": "demo.cn",
|
||||
// 子域名前缀
|
||||
"subDomainArray": [ "bjb", "git"],
|
||||
// 记录类型
|
||||
"type": "A",
|
||||
//间隔时间 秒
|
||||
"time": "30"
|
||||
}
|
||||
}
|
||||
}
|
||||
32
Hua.DDNS/appsettings.json
Normal file
32
Hua.DDNS/appsettings.json
Normal file
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"ConnectionStrings": {
|
||||
"pgConnection": "Host=127.0.0.1;Port=5432;Database=Worker;Username=Worker;Password=123456;"
|
||||
},
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.Hosting.Lifetime": "Information"
|
||||
}
|
||||
},
|
||||
"App": {
|
||||
"AppJob": {
|
||||
"Corn": "* * * * * ?" //https://cron.qqe2.com/
|
||||
},
|
||||
|
||||
"Domain": {
|
||||
"Platform": "Ali",
|
||||
// Access Id/Secret Id
|
||||
"Id": "Id",
|
||||
// Access Key/Secret Key
|
||||
"Key": "Key",
|
||||
// 主域名
|
||||
"domain": "demo.cn",
|
||||
// 子域名前缀
|
||||
"subDomainArray": [ "bjb", "git" ],
|
||||
// 记录类型
|
||||
"type": "A",
|
||||
//间隔时间 秒
|
||||
"time": "30"
|
||||
}
|
||||
}
|
||||
}
|
||||
BIN
Hua.DDNS/nssm.exe
Normal file
BIN
Hua.DDNS/nssm.exe
Normal file
Binary file not shown.
Reference in New Issue
Block a user