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)