mirror of
				https://github.com/louislam/uptime-kuma.git
				synced 2025-10-31 19:39:20 +08:00 
			
		
		
		
	Add configurable dns cache
This commit is contained in:
		| @@ -1,6 +1,8 @@ | ||||
| const https = require("https"); | ||||
| const http = require("http"); | ||||
| const CacheableLookup = require("cacheable-lookup"); | ||||
| const { Settings } = require("./settings"); | ||||
| const { log } = require("../src/util"); | ||||
|  | ||||
| class CacheableDnsHttpAgent { | ||||
|  | ||||
| @@ -9,12 +11,30 @@ class CacheableDnsHttpAgent { | ||||
|     static httpAgentList = {}; | ||||
|     static httpsAgentList = {}; | ||||
|  | ||||
|     static enable = false; | ||||
|  | ||||
|     /** | ||||
|      * Register cacheable to global agents | ||||
|      * Register/Disable cacheable to global agents | ||||
|      */ | ||||
|     static registerGlobalAgent() { | ||||
|     static async update() { | ||||
|         log.debug("CacheableDnsHttpAgent", "update"); | ||||
|         let isEnable = await Settings.get("dnsCache"); | ||||
|  | ||||
|         if (isEnable !== this.enable) { | ||||
|             log.debug("CacheableDnsHttpAgent", "value changed"); | ||||
|  | ||||
|             if (isEnable) { | ||||
|                 log.debug("CacheableDnsHttpAgent", "enable"); | ||||
|                 this.cacheable.install(http.globalAgent); | ||||
|                 this.cacheable.install(https.globalAgent); | ||||
|             } else { | ||||
|                 log.debug("CacheableDnsHttpAgent", "disable"); | ||||
|                 this.cacheable.uninstall(http.globalAgent); | ||||
|                 this.cacheable.uninstall(https.globalAgent); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         this.enable = isEnable; | ||||
|     } | ||||
|  | ||||
|     static install(agent) { | ||||
| @@ -26,6 +46,10 @@ class CacheableDnsHttpAgent { | ||||
|      * @return {https.Agent} | ||||
|      */ | ||||
|     static getHttpsAgent(agentOptions) { | ||||
|         if (!this.enable) { | ||||
|             return new https.Agent(agentOptions); | ||||
|         } | ||||
|  | ||||
|         let key = JSON.stringify(agentOptions); | ||||
|         if (!(key in this.httpsAgentList)) { | ||||
|             this.httpsAgentList[key] = new https.Agent(agentOptions); | ||||
| @@ -39,6 +63,10 @@ class CacheableDnsHttpAgent { | ||||
|      * @return {https.Agents} | ||||
|      */ | ||||
|     static getHttpAgent(agentOptions) { | ||||
|         if (!this.enable) { | ||||
|             return new http.Agent(agentOptions); | ||||
|         } | ||||
|  | ||||
|         let key = JSON.stringify(agentOptions); | ||||
|         if (!(key in this.httpAgentList)) { | ||||
|             this.httpAgentList[key] = new http.Agent(agentOptions); | ||||
|   | ||||
| @@ -136,6 +136,7 @@ const { proxySocketHandler } = require("./socket-handlers/proxy-socket-handler") | ||||
| const { dockerSocketHandler } = require("./socket-handlers/docker-socket-handler"); | ||||
| const { maintenanceSocketHandler } = require("./socket-handlers/maintenance-socket-handler"); | ||||
| const { Settings } = require("./settings"); | ||||
| const { CacheableDnsHttpAgent } = require("./cacheable-dns-http-agent"); | ||||
|  | ||||
| app.use(express.json()); | ||||
|  | ||||
| @@ -1114,6 +1115,8 @@ let needSetup = false; | ||||
|                 await setSettings("general", data); | ||||
|                 server.entryPage = data.entryPage; | ||||
|  | ||||
|                 await CacheableDnsHttpAgent.update(); | ||||
|  | ||||
|                 // Also need to apply timezone globally | ||||
|                 if (data.serverTimezone) { | ||||
|                     await server.setTimezone(data.serverTimezone); | ||||
|   | ||||
| @@ -83,12 +83,12 @@ class UptimeKumaServer { | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         CacheableDnsHttpAgent.registerGlobalAgent(); | ||||
|  | ||||
|         this.io = new Server(this.httpServer); | ||||
|     } | ||||
|  | ||||
|     async initAfterDatabaseReady() { | ||||
|         await CacheableDnsHttpAgent.update(); | ||||
|  | ||||
|         process.env.TZ = await this.getTimezone(); | ||||
|         dayjs.tz.setDefault(process.env.TZ); | ||||
|         log.debug("DEBUG", "Timezone: " + process.env.TZ); | ||||
|   | ||||
| @@ -150,6 +150,46 @@ | ||||
|                 </div> | ||||
|             </div> | ||||
|  | ||||
|             <!-- Search Engine --> | ||||
|             <div class="mb-4"> | ||||
|                 <label class="form-label"> | ||||
|                     {{ $t("Enable DNS Cache") }} | ||||
|                     <div class="form-text"> | ||||
|                         ⚠️ {{ $t("dnsCacheDescription") }} | ||||
|                     </div> | ||||
|                 </label> | ||||
|  | ||||
|                 <div class="form-check"> | ||||
|                     <input | ||||
|                         id="dnsCacheEnable" | ||||
|                         v-model="settings.dnsCache" | ||||
|                         class="form-check-input" | ||||
|                         type="radio" | ||||
|                         name="flexRadioDefault" | ||||
|                         :value="true" | ||||
|                         required | ||||
|                     /> | ||||
|                     <label class="form-check-label" for="dnsCacheEnable"> | ||||
|                         {{ $t("Enable") }} | ||||
|                     </label> | ||||
|                 </div> | ||||
|  | ||||
|                 <div class="form-check"> | ||||
|                     <input | ||||
|                         id="dnsCacheDisable" | ||||
|                         v-model="settings.dnsCache" | ||||
|                         class="form-check-input" | ||||
|                         type="radio" | ||||
|                         name="flexRadioDefault" | ||||
|                         :value="false" | ||||
|                         required | ||||
|                     /> | ||||
|                     <label class="form-check-label" for="dnsCacheDisable"> | ||||
|                         {{ $t("Disable") }} | ||||
|                     </label> | ||||
|                 </div> | ||||
|             </div> | ||||
|  | ||||
|             <!-- Save Button --> | ||||
|             <div> | ||||
|                 <button class="btn btn-primary" type="submit"> | ||||
|   | ||||
| @@ -646,4 +646,8 @@ export default { | ||||
|     "Server Timezone": "Server Timezone", | ||||
|     statusPageMaintenanceEndDate: "End", | ||||
|     IconUrl: "Icon URL", | ||||
|     "Enable DNS Cache": "Enable DNS Cache", | ||||
|     "Enable": "Enable", | ||||
|     "Disable": "Disable", | ||||
|     dnsCacheDescription: "It may be not working in some IPv6 environments, disable it if you encounter any issues.", | ||||
| }; | ||||
|   | ||||
| @@ -382,4 +382,7 @@ export default { | ||||
|     setAsDefaultProxyDescription: "預設情況下,新監測器將啟用此代理伺服器。您仍可分別停用各監測器的代理伺服器。", | ||||
|     Maintenance: "維護", | ||||
|     statusMaintenance: "維護中", | ||||
|     "Enable DNS Cache": "啟用 DNS 快取", | ||||
|     "Enable": "啟用", | ||||
|     "Disable": "停用", | ||||
| }; | ||||
|   | ||||
| @@ -157,6 +157,10 @@ export default { | ||||
|                     this.settings.entryPage = "dashboard"; | ||||
|                 } | ||||
|  | ||||
|                 if (this.settings.dnsCache === undefined) { | ||||
|                     this.settings.dnsCache = false; | ||||
|                 } | ||||
|  | ||||
|                 if (this.settings.keepDataPeriodDays === undefined) { | ||||
|                     this.settings.keepDataPeriodDays = 180; | ||||
|                 } | ||||
|   | ||||
| @@ -101,7 +101,7 @@ class Logger { | ||||
|      * @param level Log level. One of INFO, WARN, ERROR, DEBUG or can be customized. | ||||
|      */ | ||||
|     log(module, msg, level) { | ||||
|         if (this.hideLog[level] && this.hideLog[level].includes(module)) { | ||||
|         if (this.hideLog[level] && this.hideLog[level].includes(module.toLowerCase())) { | ||||
|             return; | ||||
|         } | ||||
|         module = module.toUpperCase(); | ||||
|   | ||||
| @@ -115,7 +115,7 @@ class Logger { | ||||
|      * @param level Log level. One of INFO, WARN, ERROR, DEBUG or can be customized. | ||||
|      */ | ||||
|     log(module: string, msg: any, level: string) { | ||||
|         if (this.hideLog[level] && this.hideLog[level].includes(module)) { | ||||
|         if (this.hideLog[level] && this.hideLog[level].includes(module.toLowerCase())) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user