diff --git a/README.md b/README.md
index 5ce38c7..2e5d4d0 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,44 @@
阿里云服务,域名DDNS更新器,支持IPV6。
-部分项目代码参考与各大Blog。
+## 配置文件示例
+
+```yaml
+version: 1.7
+
+#输出域名记录查询返回信息
+debug: false
+
+Service:
+ #更新间隔(毫秒)
+ period: 900000
+ # 阿里云地域ID,可以不改动
+ # 请参考 https://help.aliyun.com/knowledge_detail/40654.html
+ region-id: "cn-hangzhou"
+ # IP地址查询相关设定
+ # 用于获取对应的IP地址,以更新到域名
+ # 如不需要IPV6,则可以直接将地址留空。
+ ipQuery:
+ IPv4: "http://ifconfig.me/ip"
+ IPv6: "https://v6.ip.zxinc.org/getip"
+
+
+#更新任务列表
+UpdateRequests:
+ test:
+ domain: "test.cn" # 域名,如 www.baidu.com 中的 baidu.com
+ AccessKey: "xx" # 访问密钥 (在个人控制台中获取)
+ AccessSecret: "xx" # 访问密码 (在个人控制台中获取)
+ record: "www" #主机记录
+ ipv6: false # 该记录是否为IPv6[AAAA]记录 (默认为false)
+```
+
+## 守护进程示例
+
+### Linux systemd
+
+请参考 [systemd自启动java程序](https://www.cnblogs.com/yoyotl/p/8178363.html) 。
+
## 支持与捐赠
diff --git a/pom.xml b/pom.xml
index 5cbf78b..6fd8d86 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
com.carmwork
aliddns-updater
- 1.0.1
+ 2.0.0
jar
@@ -14,7 +14,7 @@
8
UTF-8
UTF-8
- com.carmwork.aliddns.Main
+ cc.carm.app.aliddns.Main
@@ -105,6 +105,14 @@
compile
+
+
+ com.alibaba
+ fastjson
+ 1.2.73
+ compile
+
+
cc.bukkit
BukkitConfiguration
diff --git a/src/main/java/cc/carm/app/aliddns/Main.java b/src/main/java/cc/carm/app/aliddns/Main.java
index 31c3a34..d769fbe 100644
--- a/src/main/java/cc/carm/app/aliddns/Main.java
+++ b/src/main/java/cc/carm/app/aliddns/Main.java
@@ -1,4 +1,104 @@
package cc.carm.app.aliddns;
+import cc.carm.app.aliddns.manager.ConfigManager;
+import cc.carm.app.aliddns.manager.RequestManager;
+import com.sun.istack.internal.NotNull;
+
+import java.util.Arrays;
+import java.util.Timer;
+import java.util.TimerTask;
+
public class Main {
+
+ private static ConfigManager configManager;
+ private static RequestManager requestManager;
+
+ private static TimerTask updateTimerTask;
+
+
+ public static void main(String[] args) throws InterruptedException {
+ print("-------------------------------------------");
+ print("阿里云服务 DDNS更新器");
+ print("项目地址 https://git.carm.cc/AliDDNS-Updater");
+ print("-------------------------------------------");
+ Thread.sleep(1000L);
+ info("初始化配置文件管理...");
+
+ configManager = new ConfigManager();
+ getConfigManager().initConfig();
+
+ if (getConfigManager().getConfig().getDouble("version", 1.0) < getConfigManager().getConfigVersion()) {
+ info(" 配置文件过时,正在尝试重新创建...");
+ getConfigManager().backupConfig();
+ getConfigManager().createConfig();
+ }
+
+ info(" 完成加载配置文件 v" + getConfigManager().getConfig().getDouble("version", 1.0));
+
+ info();
+
+ info("初始化记录请求管理器...");
+ requestManager = new RequestManager();
+ int loaded = requestManager.loadRequests();
+
+ if (loaded < 1) {
+ error(" 您没有配置任何记录,请检查配置文件!");
+ System.exit(0);
+ } else {
+ info(" 初始化完成,共加载了 " + loaded + " 个任务");
+ }
+
+ info();
+
+ System.out.println("所有任务已设定为每 " + ConfigManager.getPeriod() + " 毫秒进行一次更新。");
+ info();
+ info("启用更新线程...");
+ print("-------------------------------------------");
+
+ Timer timer = new Timer();
+ timer.schedule(updateTimerTask = new TimerTask() {
+ @Override
+ public void run() {
+ getRequestManager().doUpdate();
+ }
+ }, 500, ConfigManager.getPeriod());
+
+ }
+
+
+ public static void print(String... messages) {
+ if (messages == null || messages.length == 0) {
+ System.out.println(" ");
+ } else {
+ Arrays.stream(messages).forEach(System.out::println);
+ }
+ }
+
+ public static void printWithPrefix(@NotNull String prefix, String... messages) {
+ if (messages == null || messages.length == 0) {
+ System.out.println(" ");
+ } else {
+ Arrays.stream(messages).map(x -> prefix + x).forEach(System.out::println);
+ }
+ }
+
+ public static void info(String... messages) {
+ printWithPrefix("[INFO] ", messages);
+ }
+
+ public static void debug(String... messages) {
+ printWithPrefix("[DEBUG] ", messages);
+ }
+
+ public static void error(String... messages) {
+ printWithPrefix("[ERROR] ", messages);
+ }
+
+ public static ConfigManager getConfigManager() {
+ return configManager;
+ }
+
+ public static RequestManager getRequestManager() {
+ return requestManager;
+ }
}
diff --git a/src/main/java/com/carmwork/aliddns/managers/ConfigManager.java b/src/main/java/cc/carm/app/aliddns/manager/ConfigManager.java
similarity index 78%
rename from src/main/java/com/carmwork/aliddns/managers/ConfigManager.java
rename to src/main/java/cc/carm/app/aliddns/manager/ConfigManager.java
index 8e077aa..3b599a7 100644
--- a/src/main/java/com/carmwork/aliddns/managers/ConfigManager.java
+++ b/src/main/java/cc/carm/app/aliddns/manager/ConfigManager.java
@@ -1,6 +1,7 @@
-package com.carmwork.aliddns.managers;
+package cc.carm.app.aliddns.manager;
import com.google.common.base.Charsets;
+import com.sun.istack.internal.Nullable;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
@@ -10,7 +11,9 @@
public class ConfigManager {
- private double configVersion = 1.6;
+ private static ConfigManager instance;
+
+ private final double CONFIG_VERSION = 1.7;
private File sourceFile;
private File dataFolder;
@@ -20,17 +23,43 @@ public class ConfigManager {
public ConfigManager() {
- String path = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
+ instance = this;
+ String path = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
this.sourceFile = new File(path);
+ this.dataFolder = sourceFile.getParentFile();
+ this.configFile = new File(dataFolder, "config.yml");
+ }
- this.dataFolder = sourceFile.getParentFile();
+ public static boolean isDebugMode() {
+ return true;
+ }
- this.configFile = new File(dataFolder, "config.yml");
+ public static String getRegionID() {
+ return getInstance().getConfig().getString("Service.region-id", "cn-hangzhou");
+ }
+ public static long getPeriod() {
+ return getInstance().getConfig().getLong("Service.period", 900000L);
}
+ public static String getIPv4QueryURL() {
+ return getInstance().getConfig().getString("Service.ipQuery.IPv4", "http://ifconfig.me/ip");
+ }
+
+ @Nullable
+ public static String getIPv6QueryURL() {
+ return getInstance().getConfig().getString("Service.ipQuery.IPv6", "https://v6.ip.zxinc.org/getip");
+ }
+
+ public static boolean isIPV6Enabled() {
+ return getIPv6QueryURL() == null || getIPv4QueryURL().length() == 0;
+ }
+
+ public static ConfigManager getInstance() {
+ return instance;
+ }
public FileConfiguration getConfig() {
if (newConfig == null) {
@@ -64,13 +93,13 @@ public void initConfig() {
if (!configFile.exists()) {
createConfig();
} else {
- System.out.println(" Configuration found at " + configFile.getAbsolutePath());
+ System.out.println(" 配置文件加载于 " + configFile.getAbsolutePath());
}
}
public void createConfig() {
saveResource("config.yml", true);
- System.out.println(" Configuration created at " + configFile.getAbsolutePath());
+ System.out.println(" 配置文件创建于 " + configFile.getAbsolutePath());
}
public void saveResource(String resourcePath, boolean replace) {
@@ -133,7 +162,7 @@ public InputStream getResource(String filename) {
public void backupConfig() {
try {
copy(configFile, "config.yml.bak");
- System.out.println(" Configuration backup at " + configFile.getAbsolutePath() + ".bak");
+ System.out.println(" 旧的配置文件已备份与 " + configFile.getAbsolutePath() + ".bak");
this.configFile = new File(dataFolder, "config.yml");
} catch (Exception ignore) {
@@ -166,6 +195,8 @@ public static void copy(final File file, final String newName) throws IOExceptio
}
public double getConfigVersion() {
- return configVersion;
+ return CONFIG_VERSION;
}
+
+
}
diff --git a/src/main/java/cc/carm/app/aliddns/manager/RequestManager.java b/src/main/java/cc/carm/app/aliddns/manager/RequestManager.java
new file mode 100644
index 0000000..8cd94b2
--- /dev/null
+++ b/src/main/java/cc/carm/app/aliddns/manager/RequestManager.java
@@ -0,0 +1,131 @@
+package cc.carm.app.aliddns.manager;
+
+import cc.carm.app.aliddns.Main;
+import cc.carm.app.aliddns.model.UpdateRequest;
+import org.bukkit.configuration.ConfigurationSection;
+import org.bukkit.configuration.file.FileConfiguration;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+public class RequestManager {
+
+ public final String SECTION = "UpdateRequests";
+
+ private int updatedTimes = 1;
+ private final SimpleDateFormat format;
+
+ public final HashMap requests;
+
+ public RequestManager() {
+ this.requests = new HashMap<>();
+ this.format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+ }
+
+ public int loadRequests() {
+ requests.clear();
+ Main.info("正在加载记录...");
+
+ FileConfiguration config = Main.getConfigManager().getConfig();
+ ConfigurationSection rootSection = config.getConfigurationSection(SECTION);
+ if (rootSection != null) {
+
+ for (String taskName : rootSection.getKeys(false)) {
+ ConfigurationSection requestSection = rootSection.getConfigurationSection(taskName);
+ if (requestSection == null) continue;
+ UpdateRequest request = UpdateRequest.readConfiguration(requestSection);
+ if (request.isIpv6() && !ConfigManager.isIPV6Enabled()) {
+ Main.info("记录 [" + taskName + "] 为IPv6任务,但本实例未启用IPv6,跳过加载。");
+ continue;
+ }
+ requests.put(taskName, request);
+ }
+ }
+
+ return getRequests().size();
+ }
+
+
+ public void doUpdate() {
+
+ Main.info("[" + this.format.format(new Date()) + "]" + " 开始执行第" + updatedTimes + "次更新...");
+
+ Main.info("开始从 " + ConfigManager.getIPv4QueryURL() + " 获取IPv4地址...");
+ String IPv4 = getCurrentHostIP(false);
+ Main.info(" 获取完成,当前IPv4地址为 " + IPv4);
+
+ String IPv6 = null;
+ if (ConfigManager.isIPV6Enabled()) {
+ Main.info("开始从 " + ConfigManager.getIPv6QueryURL() + " 获取IPv6地址...");
+ IPv6 = getCurrentHostIP(true);
+ Main.info(" 获取完成,当前IPv6地址为 " + IPv6);
+ }
+
+ for (Map.Entry entry : getRequests().entrySet()) {
+ UpdateRequest currentRequest = entry.getValue();
+ if (currentRequest.isIpv6() && IPv6 == null) {
+ Main.info("记录 [" + entry.getKey() + "] 为IPv6任务,但本实例未启用IPv6,跳过。");
+ continue;
+ }
+ try {
+
+ String currentHost = currentRequest.isIpv6() ? IPv6 : IPv4;
+
+ if (currentRequest.shouldUpdate(currentHost)) {
+ boolean success = currentRequest.doUpdate(currentHost);
+ if (success) {
+ Main.info(" 记录 “" + currentRequest.getRecord() + "." + currentRequest.getDomain() + "” 成功更新为 " + currentHost + " 。");
+ } else {
+ Main.error(" 记录 “" + currentRequest.getRecord() + "." + currentRequest.getDomain() + "” 更新失败,请检查网络。");
+ }
+ } else {
+ Main.info(" 记录 “" + currentRequest.getRecord() + "." + currentRequest.getDomain() + "” 无需更新,跳过。");
+ }
+ } catch (Exception exception) {
+ Main.error("在更新请求 [" + entry.getKey() + "] 时发生问题,请检查配置。");
+ exception.printStackTrace();
+ }
+ }
+
+ updatedTimes++;
+ }
+
+ public HashMap getRequests() {
+ return new HashMap<>(this.requests);
+ }
+
+ public static String getCurrentHostIP(boolean isIPV6) {
+ StringBuilder result = new StringBuilder();
+ String requestURL = isIPV6 ? ConfigManager.getIPv6QueryURL() : ConfigManager.getIPv4QueryURL();
+
+ try {
+ // 使用HttpURLConnection网络请求第三方接口
+ URL url = new URL(requestURL);
+ HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
+ urlConnection.setRequestMethod("GET");
+ urlConnection.setConnectTimeout(60000);
+ urlConnection.setReadTimeout(60000);
+ urlConnection.connect();
+
+ BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
+ String line;
+ while ((line = in.readLine()) != null) {
+ result.append(line);
+ }
+ in.close();
+ } catch (Exception e) {
+ Main.error("获取" + (isIPV6 ? "IPV6" : "IPV4") + "地址失败,请检查配置的请求连接和当前网络!");
+ e.printStackTrace();
+ }
+ return result.toString();
+
+ }
+
+}
diff --git a/src/main/java/cc/carm/app/aliddns/model/UpdateRequest.java b/src/main/java/cc/carm/app/aliddns/model/UpdateRequest.java
new file mode 100644
index 0000000..af8ee66
--- /dev/null
+++ b/src/main/java/cc/carm/app/aliddns/model/UpdateRequest.java
@@ -0,0 +1,144 @@
+package cc.carm.app.aliddns.model;
+
+import cc.carm.app.aliddns.Main;
+import cc.carm.app.aliddns.manager.ConfigManager;
+import com.alibaba.fastjson.JSON;
+import com.aliyuncs.DefaultAcsClient;
+import com.aliyuncs.IAcsClient;
+import com.aliyuncs.alidns.model.v20150109.DescribeDomainRecordsRequest;
+import com.aliyuncs.alidns.model.v20150109.DescribeDomainRecordsResponse;
+import com.aliyuncs.alidns.model.v20150109.UpdateDomainRecordRequest;
+import com.aliyuncs.alidns.model.v20150109.UpdateDomainRecordResponse;
+import com.aliyuncs.exceptions.ClientException;
+import com.aliyuncs.profile.DefaultProfile;
+import com.sun.istack.internal.NotNull;
+import org.bukkit.configuration.ConfigurationSection;
+
+import java.util.List;
+
+public class UpdateRequest {
+
+
+ @NotNull
+ private final String accessKey;
+ @NotNull
+ private final String accessKeySecret;
+
+ private final DefaultProfile profile;
+ private final IAcsClient client;
+
+
+ private final String domain;
+ private final String record;
+
+ private final boolean ipv6;
+
+ private String recordID;
+
+ public UpdateRequest(@NotNull String accessKey, @NotNull String accessKeySecret, String domain, String record, boolean ipv6) {
+ this.accessKey = accessKey;
+ this.accessKeySecret = accessKeySecret;
+ this.domain = domain;
+ this.record = record;
+ this.ipv6 = ipv6;
+
+ this.profile = DefaultProfile.getProfile(ConfigManager.getRegionID(), getAccessKey(), getAccessKeySecret());
+ this.client = new DefaultAcsClient(profile);
+
+ }
+
+ @NotNull
+ public String getAccessKey() {
+ return accessKey;
+ }
+
+ @NotNull
+ public String getAccessKeySecret() {
+ return accessKeySecret;
+ }
+
+ public String getDomain() {
+ return domain;
+ }
+
+ public String getRecord() {
+ return record;
+ }
+
+ public boolean isIpv6() {
+ return ipv6;
+ }
+
+ public String getRecordType() {
+ return isIpv6() ? "AAAA" : "A";
+ }
+
+ @NotNull
+ public static UpdateRequest readConfiguration(@NotNull ConfigurationSection section) {
+ return new UpdateRequest(
+ section.getString("AccessKey", "xx"),
+ section.getString("AccessSecret", "xx"),
+ section.getString("domain", "xx"),
+ section.getString("record", "xx"),
+ section.getBoolean("AccessSecret", false)
+ );
+ }
+
+
+ /**
+ * 检查是否需要进行更新操作
+ *
+ * @param currentValue 当前数值内容
+ * @return 若当前数值与最新数值不同,则返回true。
+ */
+ public boolean shouldUpdate(String currentValue) throws ClientException {
+ DescribeDomainRecordsRequest describeDomainRecordsRequest = new DescribeDomainRecordsRequest();
+ describeDomainRecordsRequest.setDomainName(getDomain()); // 主域名
+ describeDomainRecordsRequest.setRRKeyWord(getRecord()); // 主机记录
+ describeDomainRecordsRequest.setType(getRecordType()); // 解析记录类型
+
+ // 获取主域名的所有解析记录列表
+ DescribeDomainRecordsResponse describeDomainRecordsResponse = client.getAcsResponse(describeDomainRecordsRequest);
+ if (ConfigManager.isDebugMode()) {
+ Main.debug(" ", JSON.toJSONString(describeDomainRecordsResponse, true));
+ }
+ // 最新的一条解析记录
+ List domainRecords = describeDomainRecordsResponse.getDomainRecords();
+
+ if (domainRecords == null || domainRecords.size() == 0) {
+ Main.error(" 域名“" + getDomain() + "”下无" + getRecordType() + "记录 “" + getRecord() + "” ,请检查阿里云控制台。");
+ return false;
+ }
+
+ DescribeDomainRecordsResponse.Record record = domainRecords.get(0); //得到最新一条
+
+ this.recordID = record.getRecordId(); //记录RecordID
+ String recordValue = record.getValue();
+
+ return currentValue.length() > 0 && !currentValue.equals(recordValue);
+ }
+
+ /**
+ * 进行更新操作
+ *
+ * @param currentValue 当前数值内容
+ */
+ public boolean doUpdate(String currentValue) throws ClientException {
+ UpdateDomainRecordRequest updateDomainRecordRequest = new UpdateDomainRecordRequest();
+ updateDomainRecordRequest.setRR(getRecord());
+ updateDomainRecordRequest.setRecordId(recordID);
+ updateDomainRecordRequest.setValue(currentValue);
+ updateDomainRecordRequest.setType(getRecordType());
+
+ //发出请求,收到回复
+ UpdateDomainRecordResponse updateDomainRecordResponse = client.getAcsResponse(updateDomainRecordRequest);
+
+ if (ConfigManager.isDebugMode()) {
+ Main.debug(" ", JSON.toJSONString(updateDomainRecordResponse, true));
+ }
+
+ return this.recordID.equals(updateDomainRecordResponse.getRecordId());
+ }
+
+
+}
diff --git a/src/main/java/com/carmwork/aliddns/Main.java b/src/main/java/com/carmwork/aliddns/Main.java
deleted file mode 100644
index f38ceef..0000000
--- a/src/main/java/com/carmwork/aliddns/Main.java
+++ /dev/null
@@ -1,131 +0,0 @@
-package com.carmwork.aliddns;
-
-import com.carmwork.aliddns.enums.RecordType;
-import com.carmwork.aliddns.managers.ConfigManager;
-import com.carmwork.aliddns.managers.DNSManager;
-import com.carmwork.aliddns.managers.RequestManager;
-import com.carmwork.aliddns.model.UpdateRequest;
-import com.carmwork.aliddns.utils.IPAddressUtil;
-
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.Timer;
-import java.util.TimerTask;
-
-public class Main {
- private static ConfigManager configManager;
- private static RequestManager requestManager;
-
- private static TimerTask updateTimerTask;
-
- private static boolean outputDomainRecordsResponse = false;
- private static boolean enableV6 = true;
-
- public static void main(String[] args) {
- System.out.println("--------------------------------------");
- System.out.println("Aliyun DDNS Updater");
- System.out.println("--------------------------------------");
-
- System.out.println("Initializing ConfigManager...");
- configManager = new ConfigManager();
- getConfigManager().initConfig();
-
- if (getConfigManager().getConfig().getDouble("version", 1.0) < getConfigManager().getConfigVersion()) {
- System.out.println(" Configuration outdated , try recreating. ");
- getConfigManager().backupConfig();
- getConfigManager().createConfig();
- }
-
- System.out.println(" Loaded Configuration v" + getConfigManager().getConfig().getDouble("version", 1.0));
-
- outputDomainRecordsResponse = getConfigManager().getConfig().getBoolean("outputDomainRecordsResponse", false);
- if (outputDomainRecordsResponse) {
- System.out.println("Domain Records Response Output enabled.");
- }
-
- enableV6 = (getConfigManager().getConfig().getString("IPQueryURL.IPv6") != null) && (!getConfigManager().getConfig().getString("IPQueryURL.IPv6").equalsIgnoreCase(""));
- if (!enableV6) {
- System.out.println("IPv6 DDNS disabled.");
- }
-
- System.out.println("");
-
- System.out.println("Initializing RequestManager...");
- requestManager = new RequestManager();
- requestManager.loadRequests();
-
- if (getRequestManager().getRequests().size() < 1) {
- System.err.println("No configured requests , exiting.");
- System.exit(0);
- }
-
-
- System.out.println("");
-
- long period = getConfigManager().getConfig().getLong("period", 500);
- System.out.println("All the tasks will be updated every " + period + " ms.");
-
- System.out.println("");
-
- System.out.println("Starting update Thread...");
- System.out.println("--------------------------------------");
-
- Timer timer = new Timer();
- timer.schedule(updateTimerTask = new TimerTask() {
- int i = 1;
-
- @Override
- public void run() {
- System.out.println("#" + i + " " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
-
- System.out.println(" Getting current IPv4 Address ...");
- String IPv4 = IPAddressUtil.getCurrentHostIP(RecordType.A);
- System.out.println(" Current IPv4 : " + IPv4);
-
- String IPv6 = null;
- if (enableV6) {
- System.out.println(" Getting current IPv6 Address ...");
- IPv6 = IPAddressUtil.getCurrentHostIP(RecordType.AAAA);
- System.out.println(" Current IPv6 : " + IPv6);
- }
-
-
- for (String requestName : getRequestManager().getRequests().keySet()) {
- System.out.println(" Running Request [" + requestName + "]");
- UpdateRequest currentRequest = getRequestManager().getRequests().get(requestName);
- if (currentRequest.getType() == RecordType.A) {
- DNSManager.updateDNS(IPv4, currentRequest);
- } else {
- if (!enableV6) {
- System.out.println(" Skipped(IPv6 disabled).");
- } else {
- DNSManager.updateDNS(IPv6, currentRequest);
- }
- }
- }
- i++;
-
- }
- }, 500, period);
- }
-
- public static ConfigManager getConfigManager() {
- return configManager;
- }
-
- public static RequestManager getRequestManager() {
- return requestManager;
- }
-
- public static TimerTask getUpdateTimerTask() {
- return updateTimerTask;
- }
-
- public static boolean isEnableV6() {
- return enableV6;
- }
-
- public static boolean isOutputDomainRecordsResponse() {
- return outputDomainRecordsResponse;
- }
-}
diff --git a/src/main/java/com/carmwork/aliddns/enums/RecordType.java b/src/main/java/com/carmwork/aliddns/enums/RecordType.java
deleted file mode 100644
index 2d481ec..0000000
--- a/src/main/java/com/carmwork/aliddns/enums/RecordType.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.carmwork.aliddns.enums;
-
-public enum RecordType {
- AAAA(),
- A();
-
- RecordType() {
- }
-
- public static RecordType getRecordType(String s) {
- return s.equalsIgnoreCase("A") ? A : AAAA;
- }
-
-}
diff --git a/src/main/java/com/carmwork/aliddns/managers/DNSManager.java b/src/main/java/com/carmwork/aliddns/managers/DNSManager.java
deleted file mode 100644
index 9f30daa..0000000
--- a/src/main/java/com/carmwork/aliddns/managers/DNSManager.java
+++ /dev/null
@@ -1,131 +0,0 @@
-package com.carmwork.aliddns.managers;
-
-import com.aliyuncs.DefaultAcsClient;
-import com.aliyuncs.IAcsClient;
-import com.aliyuncs.alidns.model.v20150109.DescribeDomainRecordsRequest;
-import com.aliyuncs.alidns.model.v20150109.DescribeDomainRecordsResponse;
-import com.aliyuncs.alidns.model.v20150109.UpdateDomainRecordRequest;
-import com.aliyuncs.alidns.model.v20150109.UpdateDomainRecordResponse;
-import com.aliyuncs.exceptions.ClientException;
-import com.aliyuncs.profile.DefaultProfile;
-import com.carmwork.aliddns.Main;
-import com.carmwork.aliddns.enums.RecordType;
-import com.carmwork.aliddns.model.UpdateRequest;
-import com.carmwork.aliddns.utils.JsonFormatTool;
-import com.google.gson.Gson;
-
-import java.util.List;
-
-/**
- * 动态域名解析
- */
-public class DNSManager {
-
- public static void updateDNS(String currentHost, UpdateRequest request) {
-
- try {
- /*
- * 地域ID参考https://help.aliyun.com/knowledge_detail/40654.html?spm=5176.13910061.0.0.5af422c8KhBIfU&aly_as=hV5o5h29N
- */
- DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", // 地域ID
- request.getAccessKey(), request.getAccessKeySecret());
-
- IAcsClient client = new DefaultAcsClient(profile);
-
- checkAndUpdateIp(currentHost, client, request.getDomain(), request.getRecord(), request.getType());
-
- } catch (Exception e) {
- // java.net.UnknownHostException: alidns.aliyuncs.com
- e.printStackTrace();
- }
-
- }
-
- /**
- * @param client
- * @param domainName 您的域名,如 baidu.com
- * @param ipRRKeyWord 您的主机记录,如 www
- * @param type ipv4 填 A ,ipv6 填 AAAA
- */
- private static void checkAndUpdateIp(String currentHost, IAcsClient client, String domainName, String ipRRKeyWord, RecordType type) {
-
- Gson gson = new Gson();
- // 查询指定二级域名的最新解析记录
- DescribeDomainRecordsRequest describeDomainRecordsRequest = new DescribeDomainRecordsRequest();
- // 主域名
- describeDomainRecordsRequest.setDomainName(domainName);
- // 主机记录
- describeDomainRecordsRequest.setRRKeyWord(ipRRKeyWord);
- // 解析记录类型
- describeDomainRecordsRequest.setType(type.name());
-
- // 获取主域名的所有解析记录列表
- DescribeDomainRecordsResponse describeDomainRecordsResponse = null;
- // 最新的一条解析记录
- List domainRecords = null;
- try {
-
- describeDomainRecordsResponse = client.getAcsResponse(describeDomainRecordsRequest);
- if (Main.isOutputDomainRecordsResponse()) {
- System.out.println(" " + JsonFormatTool.formatJson(gson.toJson(describeDomainRecordsResponse), " "));
- }
-
- domainRecords = describeDomainRecordsResponse.getDomainRecords();
-
- } catch (ClientException e1) {
- if (Main.isOutputDomainRecordsResponse()) {
- System.out.println(" " + e1.getMessage());
- }
-
- }
-
- if (domainRecords == null) {
- System.err.println(" Failed to get domain records.");
- System.err.println(" Please check your configuration.");
- return;
- }
-
- if (domainRecords.size() != 0) {
- DescribeDomainRecordsResponse.Record record = domainRecords.get(0);
- // 记录ID
- String recordId = record.getRecordId();
- // 记录值
- String recordsValue = record.getValue();
-
- if (currentHost.length() > 0 && !currentHost.equals(recordsValue)) {
- System.out.println(" Updating...");
- // 修改解析记录
- UpdateDomainRecordRequest updateDomainRecordRequest = new UpdateDomainRecordRequest();
- // 主机记录
- updateDomainRecordRequest.setRR(ipRRKeyWord);
- // 记录ID
- updateDomainRecordRequest.setRecordId(recordId);
- // 将主机记录值改为当前主机IP
- updateDomainRecordRequest.setValue(currentHost);
- // 解析记录类型
- updateDomainRecordRequest.setType(type.name());
- // 修改解析记录
- UpdateDomainRecordResponse updateDomainRecordResponse = null;
- try {
- updateDomainRecordResponse = client.getAcsResponse(updateDomainRecordRequest);
- if (Main.isOutputDomainRecordsResponse()) {
- System.out.println(" " + JsonFormatTool.formatJson(gson.toJson(updateDomainRecordResponse), " "));
- }
- if (recordId.equals(updateDomainRecordResponse.getRecordId())) {
- System.out.println(" Update Success! ");
- System.out.println(" " + ipRRKeyWord + "." + domainName + "->" + currentHost);
- System.out.println();
- } else {
- System.err.println(" Update failed!");
- }
- } catch (ClientException e) {
- e.printStackTrace();
- }
- } else {
- System.out.println(" Update skipped.");
- }
- } else {
- System.err.println(" Update failed. Domain record doesn't exist.");
- }
- }
-}
diff --git a/src/main/java/com/carmwork/aliddns/managers/RequestManager.java b/src/main/java/com/carmwork/aliddns/managers/RequestManager.java
deleted file mode 100644
index 2f4d1d2..0000000
--- a/src/main/java/com/carmwork/aliddns/managers/RequestManager.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package com.carmwork.aliddns.managers;
-
-import com.carmwork.aliddns.Main;
-import com.carmwork.aliddns.enums.RecordType;
-import com.carmwork.aliddns.model.UpdateRequest;
-import org.bukkit.configuration.file.FileConfiguration;
-
-import java.util.HashMap;
-
-public class RequestManager {
-
- public HashMap requests;
-
- private String section = "UpdateRequests";
-
- public RequestManager() {
- this.requests = new HashMap<>();
- }
-
- public void loadRequests() {
- System.out.println(" Loading Requests.");
- requests.clear();
-
- FileConfiguration config = Main.getConfigManager().getConfig();
-
- for (String taskName : config.getConfigurationSection(section).getKeys(false)) {
- String accessKey = config.getString(section + "." + taskName + ".AccessKey", "");
- String accessKeySecret = config.getString(section + "." + taskName + ".AccessKeySecret", "");
- String domain = config.getString(section + "." + taskName + ".domain", "");
- String record = config.getString(section + "." + taskName + ".record", "");
- String type = config.getString(section + "." + taskName + ".type", "");
- UpdateRequest updateRequest = new UpdateRequest(accessKey, accessKeySecret, domain, record, type);
- if (updateRequest.getType() == RecordType.AAAA && !Main.isEnableV6()) {
- System.err.println(" Request @" + taskName + " using " + updateRequest.getType().name() + " ,but IPv6 is disabled, skipped.");
- } else {
- requests.put(taskName, updateRequest);
- }
- }
- System.out.println(" " + getRequests().size() + " request" + (getRequests().size() > 1 ? "s have" : " has") + " been loaded.");
-
-
- }
-
- public HashMap getRequests() {
- return requests;
- }
-}
diff --git a/src/main/java/com/carmwork/aliddns/model/UpdateRequest.java b/src/main/java/com/carmwork/aliddns/model/UpdateRequest.java
deleted file mode 100644
index 13d39e9..0000000
--- a/src/main/java/com/carmwork/aliddns/model/UpdateRequest.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package com.carmwork.aliddns.model;
-
-import com.carmwork.aliddns.enums.RecordType;
-
-public class UpdateRequest {
-
- private String accessKey;
- private String accessKeySecret;
- private String domain;
- private String record;
- private RecordType type;
-
- public UpdateRequest(String accessKey, String accessKeySecret, String domain, String record, RecordType type) {
- this.accessKey = accessKey;
- this.accessKeySecret = accessKeySecret;
- this.domain = domain;
- this.record = record;
- this.type = type;
- }
-
- public UpdateRequest(String accessKey, String accessKeySecret, String domain, String record, String type) {
- this.accessKey = accessKey;
- this.accessKeySecret = accessKeySecret;
- this.domain = domain;
- this.record = record;
- this.type = RecordType.getRecordType(type);
- }
-
- public String getAccessKey() {
- return accessKey;
- }
-
-
- public String getAccessKeySecret() {
- return accessKeySecret;
- }
-
- public String getDomain() {
- return domain;
- }
-
- public String getRecord() {
- return record;
- }
-
- public RecordType getType() {
- return type;
- }
-}
diff --git a/src/main/java/com/carmwork/aliddns/utils/IPAddressUtil.java b/src/main/java/com/carmwork/aliddns/utils/IPAddressUtil.java
deleted file mode 100644
index 7dc265b..0000000
--- a/src/main/java/com/carmwork/aliddns/utils/IPAddressUtil.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package com.carmwork.aliddns.utils;
-
-import com.carmwork.aliddns.Main;
-import com.carmwork.aliddns.enums.RecordType;
-
-import java.io.BufferedReader;
-import java.io.InputStreamReader;
-import java.net.HttpURLConnection;
-import java.net.URL;
-
-public class IPAddressUtil {
- /**
- * 获取当前主机公网IP
- */
- public static String getCurrentHostIP(RecordType type) {
- String result = "";
- String requestURL = "";
- switch (type) {
- case AAAA: {
- requestURL = Main.getConfigManager().getConfig().getString("IPQueryURL.IPv6", "http://v6.ip.zxinc.org/getip");
- break;
- }
- case A: {
- requestURL = Main.getConfigManager().getConfig().getString("IPQueryURL.IPv4", "http://v4.ip.zxinc.org/getip");
- break;
- }
- }
-
- BufferedReader in = null;
- try {
- // 使用HttpURLConnection网络请求第三方接口
- URL url = new URL(requestURL);
- HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
- urlConnection.setRequestMethod("GET");
- urlConnection.setConnectTimeout(60000);
- urlConnection.setReadTimeout(60000);
- urlConnection.connect();
-
- in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
- String line;
- while ((line = in.readLine()) != null) {
- result += line;
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- // 使用finally块来关闭输入流
- finally {
- try {
- if (in != null) {
- in.close();
- }
- } catch (Exception e2) {
- e2.printStackTrace();
- }
-
- }
-
- return result;
-
- }
-
-}
diff --git a/src/main/java/com/carmwork/aliddns/utils/JsonFormatTool.java b/src/main/java/com/carmwork/aliddns/utils/JsonFormatTool.java
deleted file mode 100644
index 49ea36b..0000000
--- a/src/main/java/com/carmwork/aliddns/utils/JsonFormatTool.java
+++ /dev/null
@@ -1,151 +0,0 @@
-package com.carmwork.aliddns.utils;
-
-import java.util.ArrayList;
-
-public class JsonFormatTool {
- /**
- * json字符串的格式化
- *
- * @param json 需要格式的json串
- * @param fillStringUnit 每一层之前的占位符号比如空格 制表符
- * @return
- * @author peiyuxin
- */
- public static String formatJson(String json, String fillStringUnit) {
- if (json == null || json.trim().length() == 0) {
- return null;
- }
-
- int fixedLenth = 0;
- ArrayList tokenList = new ArrayList();
- {
- String jsonTemp = json;
- //预读取
- while (jsonTemp.length() > 0) {
- String token = getToken(jsonTemp);
- jsonTemp = jsonTemp.substring(token.length());
- token = token.trim();
- tokenList.add(token);
- }
- }
-
- for (int i = 0; i < tokenList.size(); i++) {
- String token = tokenList.get(i);
- int length = token.getBytes().length;
- if (length > fixedLenth && i < tokenList.size() - 1 && tokenList.get(i + 1).equals(":")) {
- fixedLenth = length;
- }
- }
-
- StringBuilder buf = new StringBuilder();
- int count = 0;
- for (int i = 0; i < tokenList.size(); i++) {
-
- String token = tokenList.get(i);
-
- if (token.equals(",")) {
- buf.append(token);
- doFill(buf, count, fillStringUnit);
- continue;
- }
- if (token.equals(":")) {
- buf.append(" ").append(token).append(" ");
- continue;
- }
- if (token.equals("{")) {
- String nextToken = tokenList.get(i + 1);
- if (nextToken.equals("}")) {
- i++;
- buf.append("{ }");
- } else {
- count++;
- buf.append(token);
- doFill(buf, count, fillStringUnit);
- }
- continue;
- }
- if (token.equals("}")) {
- count--;
- doFill(buf, count, fillStringUnit);
- buf.append(token);
- continue;
- }
- if (token.equals("[")) {
- String nextToken = tokenList.get(i + 1);
- if (nextToken.equals("]")) {
- i++;
- buf.append("[ ]");
- } else {
- count++;
- buf.append(token);
- doFill(buf, count, fillStringUnit);
- }
- continue;
- }
- if (token.equals("]")) {
- count--;
- doFill(buf, count, fillStringUnit);
- buf.append(token);
- continue;
- }
-
- buf.append(token);
- //左对齐
- if (i < tokenList.size() - 1 && tokenList.get(i + 1).equals(":")) {
- int fillLength = fixedLenth - token.getBytes().length;
- if (fillLength > 0) {
- for (int j = 0; j < fillLength; j++) {
- buf.append(" ");
- }
- }
- }
- }
- return buf.toString();
- }
-
- private static String getToken(String json) {
- StringBuilder buf = new StringBuilder();
- boolean isInYinHao = false;
- while (json.length() > 0) {
- String token = json.substring(0, 1);
- json = json.substring(1);
-
- if (!isInYinHao &&
- (token.equals(":") || token.equals("{") || token.equals("}")
- || token.equals("[") || token.equals("]")
- || token.equals(","))) {
- if (buf.toString().trim().length() == 0) {
- buf.append(token);
- }
-
- break;
- }
-
- if (token.equals("\\")) {
- buf.append(token);
- buf.append(json.substring(0, 1));
- json = json.substring(1);
- continue;
- }
- if (token.equals("\"")) {
- buf.append(token);
- if (isInYinHao) {
- break;
- } else {
- isInYinHao = true;
- continue;
- }
- }
- buf.append(token);
- }
- return buf.toString();
- }
-
- private static void doFill(StringBuilder buf, int count, String fillStringUnit) {
- buf.append("\n");
- for (int i = 0; i < count; i++) {
- buf.append(fillStringUnit);
- }
- }
-
-}
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
index 24aeb1c..23aa173 100644
--- a/src/main/resources/config.yml
+++ b/src/main/resources/config.yml
@@ -1,36 +1,27 @@
-# Ali ddns Updater
-version: 1.6
-
-#更新间隔(毫秒)
-period: 900000
+version: 1.7
#输出域名记录查询返回信息
-outputDomainRecordsResponse: false
+debug: false
-#IP查询网址
-IPQueryURL:
- IPv4: http://ip.cip.cc
- IPv6: http://v6.ip.zxinc.org/getip
+Service:
+ #更新间隔(毫秒)
+ period: 900000
+ # 阿里云地域ID,可以不改动
+ # 请参考 https://help.aliyun.com/knowledge_detail/40654.html
+ region-id: "cn-hangzhou"
+ # IP地址查询相关设定
+ # 用于获取对应的IP地址,以更新到域名
+ # 如不需要IPV6,则可以直接将地址留空。
+ ipQuery:
+ IPv4: "http://ifconfig.me/ip"
+ IPv6: "https://v6.ip.zxinc.org/getip"
#更新任务列表
UpdateRequests:
- #任务格式
- #'example':
- # AccessKey:
- # AccessKeySecret:
- #
- # #域名
- # domain: love.com
- #
- # #主机记录
- # record: server
- #
- # #记录类型 (仅可A记录或AAAA记录)
- # type: AAAA
test:
- AccessKey: xx
- AccessKeySecret: xx
- domain: test.cn
- record: test
- type: A
\ No newline at end of file
+ domain: "test.cn" # 域名,如 www.baidu.com 中的 baidu.com
+ AccessKey: "xx" # 访问密钥 (在个人控制台中获取)
+ AccessSecret: "xx" # 访问密码 (在个人控制台中获取)
+ record: "www" #主机记录
+ ipv6: false # 该记录是否为IPv6[AAAA]记录 (默认为false)