diff options
Diffstat (limited to 'server/socket-handlers/cloudflared-socket-handler.js')
-rw-r--r-- | server/socket-handlers/cloudflared-socket-handler.js | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/server/socket-handlers/cloudflared-socket-handler.js b/server/socket-handlers/cloudflared-socket-handler.js new file mode 100644 index 0000000..809191f --- /dev/null +++ b/server/socket-handlers/cloudflared-socket-handler.js @@ -0,0 +1,122 @@ +const { checkLogin, setSetting, setting, doubleCheckPassword } = require("../util-server"); +const { CloudflaredTunnel } = require("node-cloudflared-tunnel"); +const { UptimeKumaServer } = require("../uptime-kuma-server"); +const { log } = require("../../src/util"); +const io = UptimeKumaServer.getInstance().io; + +const prefix = "cloudflared_"; +const cloudflared = new CloudflaredTunnel(); + +/** + * Change running state + * @param {string} running Is it running? + * @param {string} message Message to pass + * @returns {void} + */ +cloudflared.change = (running, message) => { + io.to("cloudflared").emit(prefix + "running", running); + io.to("cloudflared").emit(prefix + "message", message); +}; + +/** + * Emit an error message + * @param {string} errorMessage Error message to send + * @returns {void} + */ +cloudflared.error = (errorMessage) => { + io.to("cloudflared").emit(prefix + "errorMessage", errorMessage); +}; + +/** + * Handler for cloudflared + * @param {Socket} socket Socket.io instance + * @returns {void} + */ +module.exports.cloudflaredSocketHandler = (socket) => { + + socket.on(prefix + "join", async () => { + try { + checkLogin(socket); + socket.join("cloudflared"); + io.to(socket.userID).emit(prefix + "installed", cloudflared.checkInstalled()); + io.to(socket.userID).emit(prefix + "running", cloudflared.running); + io.to(socket.userID).emit(prefix + "token", await setting("cloudflaredTunnelToken")); + } catch (error) { } + }); + + socket.on(prefix + "leave", async () => { + try { + checkLogin(socket); + socket.leave("cloudflared"); + } catch (error) { } + }); + + socket.on(prefix + "start", async (token) => { + try { + checkLogin(socket); + if (token && typeof token === "string") { + await setSetting("cloudflaredTunnelToken", token); + cloudflared.token = token; + } else { + cloudflared.token = null; + } + cloudflared.start(); + } catch (error) { } + }); + + socket.on(prefix + "stop", async (currentPassword, callback) => { + try { + checkLogin(socket); + const disabledAuth = await setting("disableAuth"); + if (!disabledAuth) { + await doubleCheckPassword(socket, currentPassword); + } + cloudflared.stop(); + } catch (error) { + callback({ + ok: false, + msg: error.message, + }); + } + }); + + socket.on(prefix + "removeToken", async () => { + try { + checkLogin(socket); + await setSetting("cloudflaredTunnelToken", ""); + } catch (error) { } + }); + +}; + +/** + * Automatically start cloudflared + * @param {string} token Cloudflared tunnel token + * @returns {Promise<void>} + */ +module.exports.autoStart = async (token) => { + if (!token) { + token = await setting("cloudflaredTunnelToken"); + } else { + // Override the current token via args or env var + await setSetting("cloudflaredTunnelToken", token); + console.log("Use cloudflared token from args or env var"); + } + + if (token) { + console.log("Start cloudflared"); + cloudflared.token = token; + cloudflared.start(); + } +}; + +/** + * Stop cloudflared + * @returns {Promise<void>} + */ +module.exports.stop = async () => { + log.info("cloudflared", "Stop cloudflared"); + if (cloudflared) { + cloudflared.stop(); + } +}; |