From fa9ad8baef2aec7f087ef062d1f14a21343baeef Mon Sep 17 00:00:00 2001 From: Akshay Nair Date: Sun, 11 Oct 2020 17:33:26 +0530 Subject: [PATCH] Adds redirection api for cpanel (via uapi) + refactors cpanel --- tests/cpanel.test.js | 6 +++--- utils/lib/cpanel.js | 35 +++++++++++++++++++++++++++++------ 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/tests/cpanel.test.js b/tests/cpanel.test.js index 083a09e17..a32c562cf 100644 --- a/tests/cpanel.test.js +++ b/tests/cpanel.test.js @@ -12,7 +12,7 @@ describe('Cpanel client', () => { describe('fetchzonerecords', () => { it('should make the correct request', async () => { const fetch = mockFetch((url, request) => { - expect(url).toBe('https://example.com:2000//json-api/cpanel?customonly=1&domain=a.b&cpanel_jsonapi_user=boy&cpanel_jsonapi_module=ZoneEdit&cpanel_jsonapi_func=fetchzone_records&cpanel_jsonapi_apiversion=2'); + expect(url).toBe('https://example.com:2000/json-api/cpanel?customonly=1&domain=a.b&cpanel_jsonapi_user=boy&cpanel_jsonapi_module=ZoneEdit&cpanel_jsonapi_func=fetchzone_records&cpanel_jsonapi_apiversion=2'); expect(request).toEqual({ headers: { Authorization: 'cpanel boy:boybyebye', @@ -35,7 +35,7 @@ describe('Cpanel client', () => { it('should make the correct request with query', async () => { const fetch = mockFetch((url, request) => { - expect(url).toBe('https://example.com:2000//json-api/cpanel?customonly=1&domain=foobar.boeey&cpanel_jsonapi_user=boy&cpanel_jsonapi_module=ZoneEdit&cpanel_jsonapi_func=fetchzone_records&cpanel_jsonapi_apiversion=2'); + expect(url).toBe('https://example.com:2000/json-api/cpanel?customonly=1&domain=foobar.boeey&cpanel_jsonapi_user=boy&cpanel_jsonapi_module=ZoneEdit&cpanel_jsonapi_func=fetchzone_records&cpanel_jsonapi_apiversion=2'); expect(request).toEqual({ headers: { Authorization: 'cpanel boy:boybyebye', @@ -60,7 +60,7 @@ describe('Cpanel client', () => { describe('addzonerecord', () => { it('should make the correct request', async () => { const fetch = mockFetch((url, request) => { - expect(url).toBe('https://example.com:2000//json-api/cpanel?domain=a.b&name=googo&type=CNAME&cname=beey&ttl=2020&cpanel_jsonapi_user=boy&cpanel_jsonapi_module=ZoneEdit&cpanel_jsonapi_func=add_zone_record&cpanel_jsonapi_apiversion=2'); + expect(url).toBe('https://example.com:2000/json-api/cpanel?domain=a.b&name=googo&type=CNAME&cname=beey&ttl=2020&cpanel_jsonapi_user=boy&cpanel_jsonapi_module=ZoneEdit&cpanel_jsonapi_func=add_zone_record&cpanel_jsonapi_apiversion=2'); expect(request).toEqual({ headers: { Authorization: 'cpanel boy:boybyebye', diff --git a/utils/lib/cpanel.js b/utils/lib/cpanel.js index ac5620424..f075e035b 100644 --- a/utils/lib/cpanel.js +++ b/utils/lib/cpanel.js @@ -5,7 +5,7 @@ const { DOMAIN_API_HOST, DOMAIN_API_PORT, DOMAIN_USER, DOMAIN_API_KEY, DOMAIN_DO const CpanelClient = (options) => { // TODO: Make defaultQuery functional - const api = (module, func, defaultQuery = {}) => (q = {}) => { + const api = ({ basePath = '', action = '' }) => (module, func, defaultQuery = {}) => (q = {}) => { const query = { ...defaultQuery, ...q, @@ -22,23 +22,36 @@ const CpanelClient = (options) => { rejectUnauthorized: false, }; - const path = `${options.path || '/json-api'}/cpanel?${qs.stringify(query)}`; + 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 { // { customonly, domain } // -> { cpanelresult: { data[{ class, ttl, name, line, Line, cname, type, record }] } } fetchZoneRecords: R.compose( p => p.then(R.pathOr([], ['cpanelresult', 'data'])), - api('ZoneEdit', 'fetchzone_records', { customonly: 1, domain: options.domain }) + api2('ZoneEdit', 'fetchzone_records', { customonly: 1, domain: options.domain }) ), - // { domain, name, type, cname, address, ttl } + + // { domain, name, type(A|CNAME), cname, address, ttl } // -> { result: { status } } - addZoneRecord: api('ZoneEdit', 'add_zone_record', { domain: options.domain }), + addZoneRecord: api2('ZoneEdit', 'add_zone_record', { domain: options.domain }), + + // { domain, redirect, type(permanent|tmp), redirect_wildcard(0|1), redirect(0|1|2) } + // -> {} + addRedirection: uapi('Mime', 'add_redirect'), + + // {} + // -> { } + fetchRedirections: uapi('Mime', 'list_redirects'), }; }; @@ -56,7 +69,17 @@ const cpanel = CpanelClient({ dependencies: { fetch }, }); -// cpanel.fetchZoneRecords().then(hosts => console.log(JSON.stringify(hosts, null, 2))); +//cpanel.fetchZoneRecords() +//cpanel.addRedirection({ + //domain: 'hello.is-a.dev', + //redirect: 'https://googole.com', + //type: 'permanent', + //redirect_wildcard: 1, + //redirect_www: 0, +//}) +//cpanel.fetchRedirections() + //.then(d => console.log(JSON.stringify(d, null, 2))) + //.catch(console.error); module.exports = { cpanel,