first commit
This commit is contained in:
commit
ef05b04d91
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
node_modules/
|
||||
config/config.json
|
28
package-lock.json
generated
Normal file
28
package-lock.json
generated
Normal file
@ -0,0 +1,28 @@
|
||||
{
|
||||
"name": "bindd",
|
||||
"version": "1.0.0",
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "bindd",
|
||||
"version": "1.0.0",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"flumm-fetch": "^1.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/flumm-fetch": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/flumm-fetch/-/flumm-fetch-1.0.1.tgz",
|
||||
"integrity": "sha512-pZ5U0hheCSW43vfGZQMunr03U7rUOX+iy2y13Tu4nc3iRL+E/Qfeo5nZ2B2JMYKOGIx1A1anUYOz+ulyhouyjg=="
|
||||
}
|
||||
},
|
||||
"dependencies": {
|
||||
"flumm-fetch": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/flumm-fetch/-/flumm-fetch-1.0.1.tgz",
|
||||
"integrity": "sha512-pZ5U0hheCSW43vfGZQMunr03U7rUOX+iy2y13Tu4nc3iRL+E/Qfeo5nZ2B2JMYKOGIx1A1anUYOz+ulyhouyjg=="
|
||||
}
|
||||
}
|
||||
}
|
14
package.json
Normal file
14
package.json
Normal file
@ -0,0 +1,14 @@
|
||||
{
|
||||
"name": "bindd",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "src/index.mjs",
|
||||
"scripts": {
|
||||
"start": "node --experimental-json-modules src/index.mjs"
|
||||
},
|
||||
"author": "Flummi",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"flumm-fetch": "^1.0.1"
|
||||
}
|
||||
}
|
60
src/index.mjs
Normal file
60
src/index.mjs
Normal file
@ -0,0 +1,60 @@
|
||||
import cfg from "../config/config.json" assert { type: "json" };
|
||||
import fetch from "flumm-fetch";
|
||||
import { promises as fs } from "fs";
|
||||
import { execSync as exec } from "child_process";
|
||||
|
||||
class updateBind {
|
||||
bindTpl = zone => `zone "${zone}" {\n type slave;\n file "/etc/bind/keyhelp_domains/${zone}";\n masters { 135.181.244.181; };\n};\n`;
|
||||
fetchApi = async path => (await fetch(`https://${cfg.api.host}/${path}`, { headers: { "X-API-Key": cfg.api.key } })).json();
|
||||
|
||||
constructor() {
|
||||
return (async () => {
|
||||
await this.init();
|
||||
return this;
|
||||
})();
|
||||
};
|
||||
|
||||
async init() {
|
||||
try {
|
||||
this.domains = (await fs.readFile(cfg.bind.config, "utf-8"))
|
||||
.match(/zone \"(.*?)\"/g)
|
||||
.map(z => z.replace(/zone \"(.*?)\"/, "$1"));
|
||||
} catch {
|
||||
this.domains = [];
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
async generateConfig() {
|
||||
const dnslist = (await Promise.all((await this.fetchApi("domains?subdomains=false")).map(async domain => {
|
||||
const dns = await this.fetchApi(`dns/${domain.id}`);
|
||||
if(dns.is_dns_disabled)
|
||||
return false;
|
||||
return {
|
||||
id: domain.id,
|
||||
name: domain.domain,
|
||||
dkim: dns.dkim_txt_record,
|
||||
dns: dns.records
|
||||
};
|
||||
}))).filter(Boolean);
|
||||
|
||||
if(dnslist.length > 0) {
|
||||
const files = await fs.readdir(cfg.bind.domainFiles);
|
||||
await Promise.all(files.map(async file => await fs.unlink(`${cfg.bind.domainFiles}/${file}`)));
|
||||
}
|
||||
|
||||
let bindconfig = [];
|
||||
for(const domain of dnslist)
|
||||
bindconfig.push(this.bindTpl(domain.name));
|
||||
await fs.writeFile(cfg.bind.config, bindconfig);
|
||||
};
|
||||
|
||||
reloadBind() {
|
||||
return exec("systemctl restart named");
|
||||
};
|
||||
};
|
||||
|
||||
const bind = await new updateBind();
|
||||
|
||||
await bind.generateConfig();
|
||||
bind.reloadBind();
|
Loading…
Reference in New Issue
Block a user