const { checkLogin, doubleCheckPassword } = require("../util-server"); const { CloudflaredTunnel } = require("node-cloudflared-tunnel"); const { UptimeKumaServer } = require("../uptime-kuma-server"); const { log } = require("../../src/util"); const { Settings } = require("../settings"); 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 Settings.get("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 Settings.set("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 Settings.get("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 Settings.set("cloudflaredTunnelToken", ""); } catch (error) { } }); }; /** * Automatically start cloudflared * @param {string} token Cloudflared tunnel token * @returns {Promise} */ module.exports.autoStart = async (token) => { if (!token) { token = await Settings.get("cloudflaredTunnelToken"); } else { // Override the current token via args or env var await Settings.set("cloudflaredTunnelToken", token); log.info("cloudflare", "Use cloudflared token from args or env var"); } if (token) { log.info("cloudflare", "Start cloudflared"); cloudflared.token = token; cloudflared.start(); } }; /** * Stop cloudflared * @returns {Promise} */ module.exports.stop = async () => { log.info("cloudflared", "Stop cloudflared"); if (cloudflared) { cloudflared.stop(); } };