parent
a6b52b7ba6
commit
f1f4b3b377
@ -1,19 +1,72 @@
|
|||||||
const { checkLogin } = require("../util-server");
|
const { checkLogin, setSetting, setting } = require("../util-server");
|
||||||
|
const { CloudflaredTunnel } = require("node-cloudflared-tunnel");
|
||||||
|
const { io } = require("../server");
|
||||||
|
|
||||||
const prefix = "cloudflared_";
|
const prefix = "cloudflared_";
|
||||||
|
const cloudflared = new CloudflaredTunnel();
|
||||||
|
|
||||||
|
let isRunning;
|
||||||
|
|
||||||
|
cloudflared.change = (running, message) => {
|
||||||
|
io.to("cloudflared").emit(prefix + "running", running);
|
||||||
|
io.to("cloudflared").emit(prefix + "message", message);
|
||||||
|
isRunning = running;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
cloudflared.error = (errorMessage) => {
|
||||||
|
io.to("cloudflared").emit(prefix + "errorMessage", errorMessage);
|
||||||
|
};
|
||||||
|
|
||||||
module.exports.cloudflaredSocketHandler = (socket) => {
|
module.exports.cloudflaredSocketHandler = (socket) => {
|
||||||
|
|
||||||
socket.on(prefix + "start", async (callback) => {
|
socket.on(prefix + "join", async () => {
|
||||||
try {
|
try {
|
||||||
checkLogin(socket);
|
checkLogin(socket);
|
||||||
|
socket.join("cloudflared");
|
||||||
|
io.to(socket.userID).emit(prefix + "installed", cloudflared.checkInstalled());
|
||||||
|
io.to(socket.userID).emit(prefix + "running", isRunning);
|
||||||
|
io.to(socket.userID).emit(prefix + "token", await setting("cloudflaredTunnelToken"));
|
||||||
|
} catch (error) { }
|
||||||
|
});
|
||||||
|
|
||||||
} catch (error) {
|
socket.on(prefix + "leave", async () => {
|
||||||
callback({
|
try {
|
||||||
ok: false,
|
checkLogin(socket);
|
||||||
msg: error.message,
|
socket.leave("cloudflared");
|
||||||
});
|
} catch (error) { }
|
||||||
}
|
});
|
||||||
|
|
||||||
|
socket.on(prefix + "start", async (token) => {
|
||||||
|
try {
|
||||||
|
checkLogin(socket);
|
||||||
|
if (token && typeof token === "string") {
|
||||||
|
token = token.trim();
|
||||||
|
|
||||||
|
// try to strip out "cloudflared.exe service install"
|
||||||
|
let array = token.split(" ");
|
||||||
|
if (array.length > 1) {
|
||||||
|
for (let i = 0; i < array.length - 1; i++) {
|
||||||
|
if (array[i] === "install") {
|
||||||
|
token = array[i + 1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await setSetting("cloudflaredTunnelToken", token);
|
||||||
|
cloudflared.token = token;
|
||||||
|
} else {
|
||||||
|
cloudflared.token = null;
|
||||||
|
}
|
||||||
|
cloudflared.start();
|
||||||
|
} catch (error) { }
|
||||||
|
});
|
||||||
|
|
||||||
|
socket.on(prefix + "stop", async () => {
|
||||||
|
try {
|
||||||
|
checkLogin(socket);
|
||||||
|
cloudflared.stop();
|
||||||
|
} catch (error) { }
|
||||||
});
|
});
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -0,0 +1,111 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<h4 class="mt-4">Cloudflare Tunnel</h4>
|
||||||
|
|
||||||
|
<div class="my-3">
|
||||||
|
<div>
|
||||||
|
cloudflared:
|
||||||
|
<span v-if="installed === true" class="text-primary">{{ $t("Installed") }}</span>
|
||||||
|
<span v-else-if="installed === false" class="text-danger">{{ $t("Not installed") }}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
{{ $t("Status") }}:
|
||||||
|
<span v-if="running" class="text-primary">{{ $t("Running") }}</span>
|
||||||
|
<span v-else-if="!running" class="text-danger">{{ $t("Not running") }}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div v-if="false">
|
||||||
|
{{ message }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mt-3">
|
||||||
|
Message:
|
||||||
|
<textarea v-model="errorMessage" class="form-control" readonly></textarea>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p v-if="installed === false">(Download cloudflared from <a href="https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/installation/">Cloudflare Website</a>)</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- If installed show token input -->
|
||||||
|
<div v-if="installed" class="mb-2">
|
||||||
|
<div class="mb-4">
|
||||||
|
<label class="form-label" for="cloudflareTunnelToken">
|
||||||
|
Cloudflare Tunnel {{ $t("Token") }}
|
||||||
|
</label>
|
||||||
|
<HiddenInput
|
||||||
|
id="cloudflareTunnelToken"
|
||||||
|
v-model="cloudflareTunnelToken"
|
||||||
|
autocomplete="one-time-code"
|
||||||
|
/>
|
||||||
|
<div class="form-text">
|
||||||
|
Don't know how to get the token? Please read the guide:<br />
|
||||||
|
<a href="https://github.com/louislam/uptime-kuma/wiki/Reverse-Proxy-with-Cloudflare-Tunnel" target="_blank">
|
||||||
|
https://github.com/louislam/uptime-kuma/wiki/Reverse-Proxy-with-Cloudflare-Tunnel
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Save Button -->
|
||||||
|
<div>
|
||||||
|
<button v-if="!running" class="btn btn-primary" type="submit" @click="start">
|
||||||
|
{{ $t("Start") }} cloudflared
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button v-if="running" class="btn btn-danger" type="submit" @click="stop">
|
||||||
|
{{ $t("Stop") }} cloudflared
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h4 class="mt-4">Other Software</h4>
|
||||||
|
<div>
|
||||||
|
For example: nginx, Apache and Traefik. <br />
|
||||||
|
Please read <a href="https://github.com/louislam/uptime-kuma/wiki/Reverse-Proxy" target="_blank">https://github.com/louislam/uptime-kuma/wiki/Reverse-Proxy</a>.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import HiddenInput from "../../components/HiddenInput.vue";
|
||||||
|
|
||||||
|
const prefix = "cloudflared_";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
components: {
|
||||||
|
HiddenInput,
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return this.$root.cloudflared;
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.$root.getSocket().emit(prefix + "join");
|
||||||
|
},
|
||||||
|
unmounted() {
|
||||||
|
this.$root.getSocket().emit(prefix + "leave");
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
start() {
|
||||||
|
this.$root.getSocket().emit(prefix + "start", this.cloudflareTunnelToken);
|
||||||
|
},
|
||||||
|
stop() {
|
||||||
|
this.$root.getSocket().emit(prefix + "stop");
|
||||||
|
},
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.logo {
|
||||||
|
margin: 4em 1em;
|
||||||
|
}
|
||||||
|
.update-link {
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
|
</style>
|
Loading…
Reference in new issue