conoha-ddns/app.js

108 lines
4.0 KiB
JavaScript

const request = require('request');
const config = require('./config.json');
const so = require('./libs/storeObject');
/**
* @param {string} uri
* @param {string} method
* @param {object} data
*/
async function urlRequest(uri, method = 'GET', data = {}) {
return new Promise((resolve, reject) => {
let token = so.get('token');
let headers = {
'X-Auth-Token': token && token.id ? token.id : '',
'Accept': 'application/json',
'Content-Type': 'application/json'
}
let json = {
method,
uri,
headers,
json: data
};
request(json, (err, res, body) => {
if (err) return reject(err);
if (res.statusCode != 200) return reject(`HTTP Request Fail , URL: ${uri} , StatusCode: ${res.statusCode} , Reponse: ${JSON.stringify(body)}`);
return resolve(body);
});
})
}
const runUpdateDNS = async() => {
try {
let ip = await urlRequest('http://ip.trj.tw/getip.php');
console.log(`${Date.now()} // get public ip: ${ip}`);
let t = so.get('token');
if (t == null || ('etime' in t && t.etime < Date.now() + 30000)) {
let tokenData = await urlRequest(`${config.api.url.identity}/tokens`, 'POST', {
'auth': {
'passwordCredentials': {
'username': config.api.username,
'password': config.api.password
},
'tenantId': config.api.tenantid
}
});
let { token } = tokenData.access;
token.etime = new Date(token.expires).getTime();
so.set('token', token);
console.log(`${Date.now()} - get api token: ${token.id}, expire: ${token.expires}`);
}
let domainsData = await urlRequest(`${config.api.url.dns}/v1/domains`);
for (let i in domainsData.domains) {
let tmp = domainsData.domains[i];
for (let j in config.domain) {
if (config.domain[j].name == tmp.name) {
config.domain[j].id = tmp.id;
console.log(`${Date.now()} - get domain ${config.domain[j].name} id: ${tmp.id}`);
}
}
}
for (let i in config.domain) {
if (!('id' in config.domain[i])) continue;
let data = await urlRequest(`${config.api.url.dns}/v1/domains/${config.domain[i].id}/records`);
for (let j in data.records) {
let tmp = data.records[j];
if (!/^a$/i.test(tmp.type)) continue;
for (let k in config.domain[i].sub) {
let ctmp = config.domain[i].sub[k];
if (tmp.name == `${ctmp.name}.${config.domain[i].name}`) {
ctmp.id = tmp.id;
ctmp.changed = ip == tmp.data ? false : true;
console.log(`${Date.now()} - get record ${ctmp.name}.${config.domain[i].name} id: ${tmp.id}`);
}
}
}
}
for (let i in config.domain) {
if (!('id' in config.domain[i])) continue;
let id = config.domain[i].id;
for (let j in config.domain[i].sub) {
let tmp = config.domain[i].sub[j];
if (!('id' in tmp) || !('changed' in tmp)) continue;
if (!tmp.changed) {
console.log(`${Date.now()} - dns record ${tmp.name}.${config.domain[i].name} ip not change`);
continue;
}
await urlRequest(`${config.api.url.dns}/v1/domains/${id}/records/${tmp.id}`, 'PUT', { data: ip });
console.log(`${Date.now()} - dns record ${tmp.name}.${config.domain[i].name} update finish`);
}
}
} catch (e) {
console.log(`${Date.now()} - ${e}`);
return;
}
};
runUpdateDNS();
setInterval(() => runUpdateDNS(), 300000);