const R = require("ramda"); const qs = require("querystring"); const { DOMAIN_API_HOST, DOMAIN_API_PORT, DOMAIN_USER, DOMAIN_API_KEY, DOMAIN_DOMAIN, } = require("../constants"); const CpanelClient = (options) => { const api = ({ basePath = "", action = "" }) => (module, func, defaultQuery = {}) => (q = {}) => { const query = { ...defaultQuery, ...q, cpanel_jsonapi_user: options.username, cpanel_jsonapi_module: module, cpanel_jsonapi_func: func, cpanel_jsonapi_apiversion: 2, }; const request = { headers: { Authorization: `cpanel ${options.username}:${options.apiKey}`, }, rejectUnauthorized: false, }; const path = `${basePath}/${action}?${qs.stringify(query)}`; const reqUrl = `https://${options.host}:${options.port}/${path}`; const { fetch } = options.dependencies; return fetch(reqUrl, request).then((res) => res.json()); }; const api2 = api({ basePath: "json-api", action: "cpanel" }); const uapi = (module, func, defaultQuery) => api({ basePath: "execute", action: `${module}/${func}` })( module, func, defaultQuery, ); return { zone: { // { customonly, domain } // -> [{ class, ttl, name, line, Line, cname, type, record }] fetch: R.compose( (p) => p.then(R.pathOr([], ["cpanelresult", "data"])), api2("ZoneEdit", "fetchzone_records", { customonly: 0, domain: options.domain, }), ), // { name, type(A|CNAME), cname, address, ttl } // -> {} add: api2("ZoneEdit", "add_zone_record", { domain: options.domain, }), // { line } // -> {} remove: api2("ZoneEdit", "remove_zone_record", { domain: options.domain, }), }, redirection: { // {} // -> [{ domain, destination }] fetch: R.compose( (p) => p.then(R.pathOr([], ["data"])), uapi("Mime", "list_redirects"), ), // { domain, redirect, type(permanent|tmp), redirect_wildcard(0|1), redirect(0|1|2) } // -> {} add: uapi("Mime", "add_redirect"), // { domain } // -> {} remove: uapi("Mime", "delete_redirect"), }, file: { write: uapi("Fileman", "save_file_content", { from_charset: "UTF-8", to_charset: "UTF-8", fallback: 1, }), }, email: { // { domain, exchanger, priority } // -> {} add: uapi("Email", "add_mx", { alwaysaccept: "auto" }), // { domain, exchanger, priority } // -> {} remove: uapi("Email", "delete_mx", { alwaysaccept: "auto" }), }, }; }; if (!DOMAIN_API_KEY) { console.error("Api key cannot be empty"); process.exit(1); } const cpanel = CpanelClient({ host: DOMAIN_API_HOST, port: DOMAIN_API_PORT, username: DOMAIN_USER, apiKey: DOMAIN_API_KEY, domain: DOMAIN_DOMAIN, dependencies: { fetch }, }); module.exports = { cpanel, CpanelClient, };