summaryrefslogtreecommitdiffstats
path: root/server/socket-handlers/cloudflared-socket-handler.js
diff options
context:
space:
mode:
Diffstat (limited to 'server/socket-handlers/cloudflared-socket-handler.js')
-rw-r--r--server/socket-handlers/cloudflared-socket-handler.js122
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();
+ }
+};