mirror of
https://github.com/Expand-sys/CloudflarePlesk-Link
synced 2026-03-22 09:47:09 +11:00
First Edition: does _acme-challenge dns records
This commit is contained in:
parent
0399e13431
commit
6c116acff5
4 changed files with 302 additions and 0 deletions
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
/node_modules
|
||||||
|
.env
|
||||||
217
index.js
Normal file
217
index.js
Normal file
|
|
@ -0,0 +1,217 @@
|
||||||
|
const fetch = require('node-fetch');
|
||||||
|
const dotenv = require('dotenv')
|
||||||
|
const nodemailer = require('nodemailer')
|
||||||
|
dotenv.config();
|
||||||
|
|
||||||
|
|
||||||
|
let transporter = nodemailer.createTransport({
|
||||||
|
host: process.env.HOST,
|
||||||
|
port: 465,
|
||||||
|
secure: true, // true for 465, false for other ports
|
||||||
|
auth: {
|
||||||
|
user: process.env.SENDER, // generated ethereal user
|
||||||
|
pass: process.env.SPASS, // generated ethereal password
|
||||||
|
},
|
||||||
|
})
|
||||||
|
let message = [];
|
||||||
|
async function grabdomainnames(){
|
||||||
|
let domains = [];
|
||||||
|
await fetch('https://'+process.env.PLESKURL+'/api/v2/domains', {
|
||||||
|
method:"GET",
|
||||||
|
headers: {
|
||||||
|
'X-API-Key': process.env.PLESKKEY,
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'Accept': 'application/json'
|
||||||
|
},
|
||||||
|
}).then(response => response.json())
|
||||||
|
.then(data => {
|
||||||
|
for(i in data){
|
||||||
|
domains.push(data[i].name)
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
return domains
|
||||||
|
}
|
||||||
|
let domainInfo = []
|
||||||
|
async function grabCloudflaredomains(){
|
||||||
|
let domains = [];
|
||||||
|
await fetch('https://api.cloudflare.com/client/v4/zones?match=all&account.id='+process.env.CLOUDACCOUNTID, {
|
||||||
|
method: 'GET',
|
||||||
|
headers: {
|
||||||
|
'X-Auth-Email': process.env.CLOUDEMAIL,
|
||||||
|
'X-Auth-Key': process.env.CLOUDKEY,
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'Accept': 'application/json'
|
||||||
|
},
|
||||||
|
})
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(async data => {
|
||||||
|
for(i in data.result){
|
||||||
|
domainInfo.push(data.result[i])
|
||||||
|
domains.push(data.result[i].name)
|
||||||
|
}
|
||||||
|
|
||||||
|
if(data.result_info.total_pages > 1){
|
||||||
|
let count = 1
|
||||||
|
while(count < data.result_info.total_pages){
|
||||||
|
count = count+1
|
||||||
|
await fetch('https://api.cloudflare.com/client/v4/zones?match=all&account.id='+process.env.CLOUDACCOUNTID+'&page='+count, {
|
||||||
|
method: 'GET',
|
||||||
|
headers: {
|
||||||
|
'X-Auth-Email': process.env.CLOUDEMAIL,
|
||||||
|
'X-Auth-Key': process.env.CLOUDKEY,
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'Accept': 'application/json'
|
||||||
|
},
|
||||||
|
})
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(data => {
|
||||||
|
for(i in data.result){
|
||||||
|
domainInfo.push(data.result[i])
|
||||||
|
domains.push(data.result[i].name)
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return domains
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async function filterDomains(){
|
||||||
|
let cloudflare = await grabCloudflaredomains();
|
||||||
|
let plesk = await grabdomainnames();
|
||||||
|
let result = await cloudflare.filter( ( el ) => plesk.includes( el ) );
|
||||||
|
return result
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
async function dns(){
|
||||||
|
let domains = await filterDomains()
|
||||||
|
let records = []
|
||||||
|
for(i in domains){
|
||||||
|
let res = await fetch('https://'+process.env.PLESKURL+'/api/v2/cli/dns/call', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'X-API-Key': process.env.PLESKKEY,
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'Accept': 'application/json'
|
||||||
|
},
|
||||||
|
body: JSON.stringify({ "params": [ "--info", domains[i]]})
|
||||||
|
})
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(data => {
|
||||||
|
let string = data.stdout.split("\n")
|
||||||
|
let acme = "_acme-challenge"
|
||||||
|
length = acme.length;
|
||||||
|
for(i in string){
|
||||||
|
if (string[i].indexOf(acme)!=-1) {
|
||||||
|
// one of the substrings is in yourstring
|
||||||
|
records.push(string[i]) //result
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
let finalarray = []
|
||||||
|
for(i in records){
|
||||||
|
finalarray.push(records[i].split(' '))
|
||||||
|
}
|
||||||
|
return finalarray
|
||||||
|
}
|
||||||
|
|
||||||
|
async function mergedns(){
|
||||||
|
let finalarray = await dns()
|
||||||
|
for(i in finalarray){
|
||||||
|
for(x in domainInfo){
|
||||||
|
if(finalarray[i][0].includes(domainInfo[x].name)){
|
||||||
|
finalarray[i].push(domainInfo[x].id);
|
||||||
|
finalarray[i].push(domainInfo[x].name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(i in finalarray){
|
||||||
|
let zone = finalarray[i][4];
|
||||||
|
|
||||||
|
await fetch('https://api.cloudflare.com/client/v4/zones/'+zone+'/dns_records?type=TXT&name=_acme-challenge.'+finalarray[i][5], {
|
||||||
|
method: 'GET',
|
||||||
|
headers: {
|
||||||
|
'X-Auth-Email': process.env.CLOUDEMAIL,
|
||||||
|
'X-Auth-Key': process.env.CLOUDKEY,
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'Accept': 'application/json'
|
||||||
|
},
|
||||||
|
|
||||||
|
})
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(data => {
|
||||||
|
if(data.result[0] == undefined){
|
||||||
|
finalarray[i].push("create")
|
||||||
|
}else{
|
||||||
|
finalarray[i].push(data.result[0].id)
|
||||||
|
finalarray[i].push(data.result[0].content)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return finalarray
|
||||||
|
}
|
||||||
|
senddns()
|
||||||
|
async function senddns(){
|
||||||
|
let finalarray = await mergedns()
|
||||||
|
|
||||||
|
for(i in finalarray){
|
||||||
|
if(finalarray[i][6] == 'create'){
|
||||||
|
fetch("https://api.cloudflare.com/client/v4/zones/"+finalarray[i][4]+"/dns_records", {
|
||||||
|
body: JSON.stringify({type:finalarray[i][1], name:finalarray[i][0], content:finalarray[i][3], ttl:1}),
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
"X-Auth-Email": process.env.CLOUDEMAIL,
|
||||||
|
"X-Auth-Key": process.env.CLOUDKEY,
|
||||||
|
},
|
||||||
|
method: "POST"
|
||||||
|
})
|
||||||
|
} else if(finalarray[i][3] ==finalarray[i][7]){
|
||||||
|
message.push("punching sand for this turn")
|
||||||
|
console.log("punching sand for this turn")
|
||||||
|
}else{
|
||||||
|
await fetch('https://api.cloudflare.com/client/v4/zones/'+finalarray[i][4]+'/dns_records/'+finalarray[i][6], {
|
||||||
|
method: 'PUT',
|
||||||
|
headers: {
|
||||||
|
'X-Auth-Email': process.env.CLOUDEMAIL,
|
||||||
|
'X-Auth-Key': process.env.CLOUDKEY,
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'Accept': 'application/json'
|
||||||
|
},
|
||||||
|
body: JSON.stringify({type:finalarray[i][1], name:finalarray[i][0], content:finalarray[i][3], ttl:1}),
|
||||||
|
})
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(data => {
|
||||||
|
message.push(data)
|
||||||
|
console.log(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
message.push(finalarray)
|
||||||
|
console.log(finalarray)
|
||||||
|
mail()
|
||||||
|
}
|
||||||
|
async function mail(){
|
||||||
|
let info = await transporter.sendMail({
|
||||||
|
from: '"DNSBOT" <'+process.env.SENDER+'>',
|
||||||
|
to: process.env.EMAIL,
|
||||||
|
subject: "DNS updates "+ new Date,
|
||||||
|
text: message.toString().replaceAll(',', "\n"),
|
||||||
|
})
|
||||||
|
console.log(info)
|
||||||
|
console.log("Message sent to "+process.env.EMAIL)
|
||||||
|
}
|
||||||
59
package-lock.json
generated
Normal file
59
package-lock.json
generated
Normal file
|
|
@ -0,0 +1,59 @@
|
||||||
|
{
|
||||||
|
"name": "cloudflareplesk-link",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"lockfileVersion": 2,
|
||||||
|
"requires": true,
|
||||||
|
"packages": {
|
||||||
|
"": {
|
||||||
|
"name": "cloudflareplesk-link",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"dotenv": "^8.5.1",
|
||||||
|
"node-fetch": "^2.6.1",
|
||||||
|
"nodemailer": "^6.6.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/dotenv": {
|
||||||
|
"version": "8.5.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.5.1.tgz",
|
||||||
|
"integrity": "sha512-qC1FbhCH7UH7B+BcRNUDhAk04d/n+tnGGB1ctwndZkVFeehYJOn39pRWWzmdzpFqImyX1KB8tO0DCHLf8yRaYQ==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/node-fetch": {
|
||||||
|
"version": "2.6.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
|
||||||
|
"integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==",
|
||||||
|
"engines": {
|
||||||
|
"node": "4.x || >=6.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/nodemailer": {
|
||||||
|
"version": "6.6.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.6.0.tgz",
|
||||||
|
"integrity": "sha512-ikSMDU1nZqpo2WUPE0wTTw/NGGImTkwpJKDIFPZT+YvvR9Sj+ze5wzu95JHkBMglQLoG2ITxU21WukCC/XsFkg==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"dotenv": {
|
||||||
|
"version": "8.5.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.5.1.tgz",
|
||||||
|
"integrity": "sha512-qC1FbhCH7UH7B+BcRNUDhAk04d/n+tnGGB1ctwndZkVFeehYJOn39pRWWzmdzpFqImyX1KB8tO0DCHLf8yRaYQ=="
|
||||||
|
},
|
||||||
|
"node-fetch": {
|
||||||
|
"version": "2.6.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
|
||||||
|
"integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw=="
|
||||||
|
},
|
||||||
|
"nodemailer": {
|
||||||
|
"version": "6.6.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.6.0.tgz",
|
||||||
|
"integrity": "sha512-ikSMDU1nZqpo2WUPE0wTTw/NGGImTkwpJKDIFPZT+YvvR9Sj+ze5wzu95JHkBMglQLoG2ITxU21WukCC/XsFkg=="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
24
package.json
Normal file
24
package.json
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
{
|
||||||
|
"name": "cloudflareplesk-link",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "A Link between Cloudflare DNS and Plesk for renewing lets encrypt certificates",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "node index.js"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/Expand-sys/CloudflarePlesk-Link.git"
|
||||||
|
},
|
||||||
|
"author": "Expand",
|
||||||
|
"license": "ISC",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/Expand-sys/CloudflarePlesk-Link/issues"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/Expand-sys/CloudflarePlesk-Link#readme",
|
||||||
|
"dependencies": {
|
||||||
|
"dotenv": "^8.5.1",
|
||||||
|
"node-fetch": "^2.6.1",
|
||||||
|
"nodemailer": "^6.6.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue