97 lines
4.6 KiB
JavaScript
97 lines
4.6 KiB
JavaScript
const http = require("http")
|
|
const { request } = require("https")
|
|
|
|
|
|
|
|
|
|
|
|
const app = (req, res) => {
|
|
|
|
const [email, key] = Buffer.from(req.headers.authorization.replace(/[Bb]asic /, ""), "base64").toString().split(":")
|
|
const CFHeaders = { "X-Auth-Key": key, "X-Auth-Email": email, "Content-Type": "application/json" }
|
|
const url = new URL(req.url, `http://${req.headers.host}`)
|
|
|
|
//console.log(url.searchParams.d)
|
|
|
|
const CFReq = request(`https://api.cloudflare.com/client/v4/zones?name=${url.searchParams.get("d").match(/\w+\.\w+\.?$/)[0]}`, { method: "GET", headers: CFHeaders }, (response) => {
|
|
const data = [];
|
|
|
|
response.on("data", (d) => {
|
|
data.push(d)
|
|
})
|
|
|
|
response.on("end", () => {
|
|
const { success, result } = JSON.parse(data.map((Buf) => Buffer.from(Buf).toString()).join(""))
|
|
|
|
data.splice(0, data.length);
|
|
|
|
if (success) {
|
|
const ZCReq = request(`https://api.cloudflare.com/client/v4/zones/${result[0].id}/dns_records?proxied=false&name=${url.searchParams.get("d")}&match=all`, { method: "GET", headers: CFHeaders }, (response) => {
|
|
response.on("data", (d) => {
|
|
data.push(d)
|
|
})
|
|
response.on("end", () => {
|
|
const ZCReqRes = JSON.parse(data.map((Buf) => Buffer.from(Buf).toString()).join(""))
|
|
if (ZCReqRes.success) {
|
|
if (ZCReqRes.result.length == 0 || !ZCReqRes.result.find(({ type }) => type == "A"||type=="CNAME")) {
|
|
const createCFEntryReq = request(`https://api.cloudflare.com/client/v4/zones/${result[0].id}/dns_records`, { method: "POST", headers: CFHeaders }, (response) => {
|
|
data.splice(0, data.length);
|
|
|
|
response.on("data", (d) => {
|
|
data.push(d)
|
|
})
|
|
response.on("end", () => {
|
|
const createCFEntryReqRes = JSON.parse(data.map((Buf) => Buffer.from(Buf).toString()).join(""))
|
|
if (!createCFEntryReqRes.success) {
|
|
res.writeHead(500, "An Error occurred while creating an A record")
|
|
}
|
|
res.end()
|
|
|
|
})
|
|
})
|
|
createCFEntryReq.write(JSON.stringify({ type: "A", name: url.searchParams.get("d"), content: url.searchParams.get("ip"), ttl: 60 }))
|
|
createCFEntryReq.end()
|
|
} else {
|
|
const updateCFEntryReq = request(`https://api.cloudflare.com/client/v4/zones/${result[0].id}/dns_records/${ZCReqRes.result.find(({ type }) => type == "A").id}`, { method: "PATCH", headers: CFHeaders }, (response) => {
|
|
data.splice(0, data.length);
|
|
|
|
response.on("data", (d) => {
|
|
data.push(d)
|
|
})
|
|
response.on("end", () => {
|
|
const updateCFEntryReqRes = JSON.parse(data.map((Buf) => Buffer.from(Buf).toString()).join(""))
|
|
if (!updateCFEntryReqRes.success) {
|
|
res.writeHead(500, "An Error occurred while patching an A record")
|
|
}
|
|
res.end()
|
|
|
|
})
|
|
})
|
|
updateCFEntryReq.write(JSON.stringify({ content: url.searchParams.get("ip"), ttl: 60, type:"A" }))
|
|
updateCFEntryReq.end()
|
|
}
|
|
} else {
|
|
res.writeHead(500, "An Error occurred while querying CloudFlare Zone Records")
|
|
res.end()
|
|
}
|
|
})
|
|
})
|
|
ZCReq.end()
|
|
} else {
|
|
console.log(data.map((Buf) => Buffer.from(Buf).toString()).join(""))
|
|
res.writeHead(500, "An Error occurred while querying the Zone List")
|
|
res.end()
|
|
}
|
|
|
|
|
|
})
|
|
|
|
})
|
|
CFReq.end()
|
|
|
|
}
|
|
|
|
const server = http.createServer(app)
|
|
|
|
server.listen(5555)
|