dyndns/dyndns.js

97 lines
4.6 KiB
JavaScript
Raw Permalink Normal View History

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)