-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.mjs
79 lines (69 loc) · 2.39 KB
/
index.mjs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import { initLogging } from "./utils.mjs";
import { getIP } from "./utils.mjs";
import { printAsciiArt } from "./utils.mjs";
printAsciiArt();
initLogging();
const ip = await getIP();
console.log(`Public IP:[${ip}]`);
const dotk = process.env.DIGITALOCEAN_TOKEN;
if (!dotk) {
console.error("Invalid DIGITALOCEAN_TOKEN env variable");
process.exit(1);
}
let auth = await $`doctl auth --access-token=$DIGITALOCEAN_TOKEN init`;
if (auth.exitCode != 0) {
console.error(`
Error Authenticating with DigitalOcean.
Ensure you have set the env variable DIGITALOCEAN_TOKEN correctly
Generate your token here: https://cloud.digitalocean.com/account/api/tokens.
`);
process.exit(1);
}
async function updateRecords() {
// Get records to update
let recordsStr = await fs.readFileSync("records.json", { encoding: "utf-8" });
let records = JSON.parse(recordsStr);
let totalUpdates = 0;
Object.keys(records).forEach(async (domain) => {
let result =
await $`doctl compute domain records list ${domain} -o json`.catch(
(e) => {
console.error(`Error obtaining records for domain ${domain}: `, e);
}
);
if (result) {
console.log(`Updating records: ${domain}`);
let recordsDO = JSON.parse(result);
records[domain].forEach(async (r) => {
let foundRecord = recordsDO.find(
(v) => v.name == r.name && v.type == r.type
);
if (
foundRecord &&
(foundRecord.ttl != r.ttl || foundRecord.data != ip)
) {
totalUpdates++;
console.log(`--- Updating Record ---`);
console.log(` Domain: ${domain}`);
console.log(` Name: ${foundRecord.name}`);
console.log(` TTL: ${foundRecord.ttl} -> ${r.ttl}`);
console.log(` IP: ${foundRecord.data} -> ${ip}\n`);
result = await $`doctl compute domain records update ${domain} \
-o json \
--record-id ${foundRecord.id} \
--record-data ${ip} \
--record-ttl ${r.ttl}`;
if (result.exitCode != 0) {
console.error("Error updating record, ", result);
} else {
console.log("Update successful");
}
}
});
}
console.log(`${totalUpdates} records updated`);
});
}
updateRecords();
let intervalSeconds = process.env.INTERVAL_SECONDS || 60 * 5;
let interval = setInterval(updateRecords, intervalSeconds * 1000);