From 4ae5ecff3df3c1968b324ddce8a9de75bf006c2c Mon Sep 17 00:00:00 2001 From: Louis Lam Date: Sun, 15 Jun 2025 19:34:59 +0800 Subject: [PATCH] Fix --- server/docker.js | 18 +++++++++--------- server/model/monitor.js | 2 +- server/util-server.js | 15 +++++++++++++++ 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/server/docker.js b/server/docker.js index ee6051dfa..7ca5da562 100644 --- a/server/docker.js +++ b/server/docker.js @@ -1,10 +1,10 @@ const axios = require("axios"); const { R } = require("redbean-node"); const https = require("https"); -const fs = require("fs"); +const fsAsync = require("fs").promises; const path = require("path"); const Database = require("./database"); -const { axiosAbortSignal } = require("./util-server"); +const { axiosAbortSignal, fsExists } = require("./util-server"); class DockerHost { @@ -81,7 +81,7 @@ class DockerHost { options.socketPath = dockerHost.dockerDaemon; } else if (dockerHost.dockerType === "tcp") { options.baseURL = DockerHost.patchDockerURL(dockerHost.dockerDaemon); - options.httpsAgent = new https.Agent(DockerHost.getHttpsAgentOptions(dockerHost.dockerType, options.baseURL)); + options.httpsAgent = new https.Agent(await DockerHost.getHttpsAgentOptions(dockerHost.dockerType, options.baseURL)); } try { @@ -141,9 +141,9 @@ class DockerHost { * File names can also be overridden via 'DOCKER_TLS_FILE_NAME_(CA|KEY|CERT)'. * @param {string} dockerType i.e. "tcp" or "socket" * @param {string} url The docker host URL rewritten to https:// - * @returns {object} HTTP agent options + * @returns {Promise} HTTP agent options */ - static getHttpsAgentOptions(dockerType, url) { + static async getHttpsAgentOptions(dockerType, url) { let baseOptions = { maxCachedSessions: 0, rejectUnauthorized: true @@ -156,10 +156,10 @@ class DockerHost { let certPath = path.join(Database.dockerTLSDir, dirName, DockerHost.CertificateFileNameCert); let keyPath = path.join(Database.dockerTLSDir, dirName, DockerHost.CertificateFileNameKey); - if (dockerType === "tcp" && fs.existsSync(caPath) && fs.existsSync(certPath) && fs.existsSync(keyPath)) { - let ca = fs.readFileSync(caPath); - let key = fs.readFileSync(keyPath); - let cert = fs.readFileSync(certPath); + if (dockerType === "tcp" && await fsExists(caPath) && await fsExists(certPath) && await fsExists(keyPath)) { + let ca = await fsAsync.readFile(caPath); + let key = await fsAsync.readFile(keyPath); + let cert = await fsAsync.readFile(certPath); certOptions = { ca, key, diff --git a/server/model/monitor.js b/server/model/monitor.js index c9844a55d..c1db77e8b 100644 --- a/server/model/monitor.js +++ b/server/model/monitor.js @@ -746,7 +746,7 @@ class Monitor extends BeanModel { } else if (dockerHost._dockerType === "tcp") { options.baseURL = DockerHost.patchDockerURL(dockerHost._dockerDaemon); options.httpsAgent = new https.Agent( - DockerHost.getHttpsAgentOptions(dockerHost._dockerType, options.baseURL) + await DockerHost.getHttpsAgentOptions(dockerHost._dockerType, options.baseURL) ); } diff --git a/server/util-server.js b/server/util-server.js index 08df728ed..ce2e07a42 100644 --- a/server/util-server.js +++ b/server/util-server.js @@ -23,6 +23,7 @@ const radiusClient = require("node-radius-client"); const redis = require("redis"); const oidc = require("openid-client"); const tls = require("tls"); +const { exists } = require("fs"); const { dictionaries: { @@ -1096,3 +1097,17 @@ module.exports.axiosAbortSignal = (timeoutMs) => { } } }; + +/** + * Async version of fs.existsSync + * @param path + * @returns {Promise} + */ +function fsExists(path) { + return new Promise(function (resolve, reject) { + exists(path, function (exists) { + resolve(exists); + }); + }); +} +module.exports.fsExists = fsExists;