mirror of
https://github.com/openwrt/luci.git
synced 2025-12-21 19:14:34 +04:00
The ACME.sh DNS API scripts have a description of their options. Now we can parse them and render all necessary fields for a specific DNS API. When a user changes the DNS API specific options, their value is copied into the Credentials list, thus keeping backward compatibility. Some DNS APIs like CloudFlare or Selectel have alternative options (usually API v2). To see the Alternative credentials, a user should click on the Alt Options flag. Signed-off-by: Sergey Ponomarev <stokito@gmail.com>
111 lines
2.8 KiB
JavaScript
111 lines
2.8 KiB
JavaScript
// See https://github.com/acmesh-official/acme.sh/wiki/DNS-API-Structural-Info-description
|
|
class DnsApiInfo {
|
|
Id = '';
|
|
Name = '';
|
|
Domains = '';
|
|
OptsTitle = '';
|
|
Opts = [];
|
|
OptsAltTitle = '';
|
|
OptsAlt = [];
|
|
}
|
|
|
|
class DnsApiInfoOpt {
|
|
Name = '';
|
|
Title = '';
|
|
Description = '';
|
|
Default = '';
|
|
}
|
|
|
|
function parseFile(infoFileText) {
|
|
let infoFileLines = infoFileText.split('\n');
|
|
let infos = [];
|
|
let startIdx = 0;
|
|
for (let i = 1; i < infoFileLines.length; i++) {
|
|
if (infoFileLines[i] == '') {
|
|
if (i - startIdx > 2) {
|
|
let infoLines = infoFileLines.slice(startIdx, i);
|
|
let info = parseDnsApiInfoLines(infoLines);
|
|
infos.push(info);
|
|
}
|
|
startIdx = i + 1;
|
|
}
|
|
}
|
|
return infos;
|
|
}
|
|
|
|
function parseDnsApiInfoLines(lines) {
|
|
let info = new DnsApiInfo();
|
|
info.Id = lines.shift();
|
|
info.Name = lines.shift();
|
|
let optsField = getFieldVal(lines, 'Options:');
|
|
let [optsTitle, opts] = parseOpts(optsField);
|
|
info.OptsTitle = optsTitle;
|
|
info.Opts = opts;
|
|
let optsAltField = getFieldVal(lines, 'OptionsAlt:');
|
|
let [optsAltTitle, optsAlt] = parseOpts(optsAltField);
|
|
info.OptsAltTitle = optsAltTitle;
|
|
info.OptsAlt = optsAlt;
|
|
info.Domains = getFieldVal(lines, 'Domains:');
|
|
return info;
|
|
}
|
|
|
|
function parseOpts(options) {
|
|
let opts = [];
|
|
let optLines = options.split('\n');
|
|
let optsTitle = optLines.shift();
|
|
for (let optLine of optLines) {
|
|
let posName = optLine.indexOf(' ');
|
|
if (posName <= 0) {
|
|
continue;
|
|
}
|
|
let opt = new DnsApiInfoOpt();
|
|
opt.Name = optLine.substring(0, posName);
|
|
let posTitle = optLine.indexOf('.');
|
|
if (posTitle <= 0) {
|
|
opt.Title = optLine.substring(posName + 1);
|
|
} else {
|
|
opt.Title = optLine.substring(posName + 1, posTitle);
|
|
opt.Description = optLine.substring(posTitle);
|
|
let defaultPos = opt.Description.indexOf(' Default: "');
|
|
if (defaultPos >= 0) {
|
|
let defaultPosEnd = opt.Description.indexOf('".', defaultPos + 1);
|
|
opt.Default = opt.Description.substring(defaultPos + ' Default: "'.length, defaultPosEnd);
|
|
opt.Description = opt.Description.substring(0, defaultPos);
|
|
}
|
|
if (opt.Description.startsWith('. ')) {
|
|
opt.Description = opt.Description.substring(2);
|
|
} else if (opt.Description == '.') {
|
|
opt.Description = '';
|
|
}
|
|
}
|
|
opts.push(opt);
|
|
}
|
|
return [optsTitle, opts];
|
|
}
|
|
|
|
function getFieldVal(lines, fieldName) {
|
|
for (let i = 0; i < lines.length; i++) {
|
|
if (lines[i].startsWith(fieldName)) {
|
|
let firstVal = lines[i].substring(fieldName.length).trim();
|
|
let nextLines = lines.slice(i + 1);
|
|
return fieldMultiLines(nextLines, firstVal);
|
|
}
|
|
}
|
|
return '';
|
|
}
|
|
|
|
function fieldMultiLines(lines, fieldVal) {
|
|
while (lines.length > 0) {
|
|
if (!lines[0].startsWith(' ')) {
|
|
break;
|
|
}
|
|
let line = lines.shift().trim();
|
|
fieldVal += '\n' + line;
|
|
}
|
|
return fieldVal;
|
|
}
|
|
|
|
return L.Class.extend({
|
|
parseFile: parseFile,
|
|
});
|