cfdns 2.1.1 → 2.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  # cfdns
2
- [![](https://img.shields.io/npm/v/cfdns.svg?style=flat)](https://www.npmjs.org/package/cfdns) [![](https://img.shields.io/npm/dm/cfdns.svg)](https://www.npmjs.org/package/cfdns) [![](https://api.travis-ci.org/silverwind/cfdns.svg?style=flat)](https://travis-ci.org/silverwind/cfdns)
2
+ [![](https://img.shields.io/npm/v/cfdns.svg?style=flat)](https://www.npmjs.org/package/cfdns) [![](https://img.shields.io/npm/dm/cfdns.svg)](https://www.npmjs.org/package/cfdns) [![](https://packagephobia.com/badge?p=cfdns)](https://packagephobia.com/result?p=cfdns) [![](https://api.travis-ci.org/silverwind/cfdns.svg?style=flat)](https://travis-ci.org/silverwind/cfdns)
3
3
 
4
4
  > CLI to modify DNS records hosted on Cloudflare
5
5
 
@@ -0,0 +1 @@
1
+ export { };
package/dist/index.js ADDED
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env node
2
+ import e,{argv as t,exit as n}from"node:process";import r,{homedir as i}from"node:os";import a from"node:tty";import{join as o}from"node:path";import{chmod as s,readFile as c,unlink as l,writeFile as ee}from"node:fs/promises";var u=Object.create,d=Object.defineProperty,f=Object.getOwnPropertyDescriptor,p=Object.getOwnPropertyNames,m=Object.getPrototypeOf,h=Object.prototype.hasOwnProperty,g=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),_=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=p(t),a=0,o=i.length,s;a<o;a++)s=i[a],!h.call(e,s)&&s!==n&&d(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=f(t,s))||r.enumerable});return e},v=((e,t,n)=>(n=e==null?{}:u(m(e)),_(t||!e||!e.__esModule?d(n,`default`,{value:e,enumerable:!0}):n,e)))(g(((e,t)=>{function n(e,t){var n=e;return t.slice(0,-1).forEach(function(e){n=n[e]||{}}),t[t.length-1]in n}function r(e){return typeof e==`number`||/^0x[0-9a-f]+$/i.test(e)?!0:/^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(e)}function i(e,t){return t===`constructor`&&typeof e[t]==`function`||t===`__proto__`}t.exports=function(e,t){t||={};var a={bools:{},strings:{},unknownFn:null};typeof t.unknown==`function`&&(a.unknownFn=t.unknown),typeof t.boolean==`boolean`&&t.boolean?a.allBools=!0:[].concat(t.boolean).filter(Boolean).forEach(function(e){a.bools[e]=!0});var o={};function s(e){return o[e].some(function(e){return a.bools[e]})}Object.keys(t.alias||{}).forEach(function(e){o[e]=[].concat(t.alias[e]),o[e].forEach(function(t){o[t]=[e].concat(o[e].filter(function(e){return t!==e}))})}),[].concat(t.string).filter(Boolean).forEach(function(e){a.strings[e]=!0,o[e]&&[].concat(o[e]).forEach(function(e){a.strings[e]=!0})});var c=t.default||{},l={_:[]};function ee(e,t){return a.allBools&&/^--[^=]+$/.test(t)||a.strings[e]||a.bools[e]||o[e]}function u(e,t,n){for(var r=e,o=0;o<t.length-1;o++){var s=t[o];if(i(r,s))return;r[s]===void 0&&(r[s]={}),(r[s]===Object.prototype||r[s]===Number.prototype||r[s]===String.prototype)&&(r[s]={}),r[s]===Array.prototype&&(r[s]=[]),r=r[s]}var c=t[t.length-1];i(r,c)||((r===Object.prototype||r===Number.prototype||r===String.prototype)&&(r={}),r===Array.prototype&&(r=[]),r[c]===void 0||a.bools[c]||typeof r[c]==`boolean`?r[c]=n:Array.isArray(r[c])?r[c].push(n):r[c]=[r[c],n])}function d(e,t,n){if(!(n&&a.unknownFn&&!ee(e,n)&&a.unknownFn(n)===!1)){var i=!a.strings[e]&&r(t)?Number(t):t;u(l,e.split(`.`),i),(o[e]||[]).forEach(function(e){u(l,e.split(`.`),i)})}}Object.keys(a.bools).forEach(function(e){d(e,c[e]===void 0?!1:c[e])});var f=[];e.indexOf(`--`)!==-1&&(f=e.slice(e.indexOf(`--`)+1),e=e.slice(0,e.indexOf(`--`)));for(var p=0;p<e.length;p++){var m=e[p],h,g;if(/^--.+=/.test(m)){var _=m.match(/^--([^=]+)=([\s\S]*)$/);h=_[1];var v=_[2];a.bools[h]&&(v=v!==`false`),d(h,v,m)}else if(/^--no-.+/.test(m))h=m.match(/^--no-(.+)/)[1],d(h,!1,m);else if(/^--.+/.test(m))h=m.match(/^--(.+)/)[1],g=e[p+1],g!==void 0&&!/^(-|--)[^-]/.test(g)&&!a.bools[h]&&!a.allBools&&(!o[h]||!s(h))?(d(h,g,m),p+=1):/^(true|false)$/.test(g)?(d(h,g===`true`,m),p+=1):d(h,a.strings[h]?``:!0,m);else if(/^-[^-]+/.test(m)){for(var y=m.slice(1,-1).split(``),b=!1,x=0;x<y.length;x++){if(g=m.slice(x+2),g===`-`){d(y[x],g,m);continue}if(/[A-Za-z]/.test(y[x])&&g[0]===`=`){d(y[x],g.slice(1),m),b=!0;break}if(/[A-Za-z]/.test(y[x])&&/-?\d+(\.\d*)?(e-?\d+)?$/.test(g)){d(y[x],g,m),b=!0;break}if(y[x+1]&&y[x+1].match(/\W/)){d(y[x],m.slice(x+2),m),b=!0;break}else d(y[x],a.strings[y[x]]?``:!0,m)}h=m.slice(-1)[0],!b&&h!==`-`&&(e[p+1]&&!/^(-|--)[^-]/.test(e[p+1])&&!a.bools[h]&&(!o[h]||!s(h))?(d(h,e[p+1],m),p+=1):e[p+1]&&/^(true|false)$/.test(e[p+1])?(d(h,e[p+1]===`true`,m),p+=1):d(h,a.strings[h]?``:!0,m))}else if((!a.unknownFn||a.unknownFn(m)!==!1)&&l._.push(a.strings._||!r(m)?m:Number(m)),t.stopEarly){l._.push.apply(l._,e.slice(p+1));break}}return Object.keys(c).forEach(function(e){n(l,e.split(`.`))||(u(l,e.split(`.`),c[e]),(o[e]||[]).forEach(function(t){u(l,t.split(`.`),c[e])}))}),t[`--`]?l[`--`]=f.slice():f.forEach(function(e){l._.push(e)}),l}}))(),1);const y=(e=0)=>t=>`\u001B[${t+e}m`,b=(e=0)=>t=>`\u001B[${38+e};5;${t}m`,x=(e=0)=>(t,n,r)=>`\u001B[${38+e};2;${t};${n};${r}m`,S={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};Object.keys(S.modifier);const te=Object.keys(S.color),ne=Object.keys(S.bgColor);[...te,...ne];function re(){let e=new Map;for(let[t,n]of Object.entries(S)){for(let[t,r]of Object.entries(n))S[t]={open:`\u001B[${r[0]}m`,close:`\u001B[${r[1]}m`},n[t]=S[t],e.set(r[0],r[1]);Object.defineProperty(S,t,{value:n,enumerable:!1})}return Object.defineProperty(S,"codes",{value:e,enumerable:!1}),S.color.close=`\x1B[39m`,S.bgColor.close=`\x1B[49m`,S.color.ansi=y(),S.color.ansi256=b(),S.color.ansi16m=x(),S.bgColor.ansi=y(10),S.bgColor.ansi256=b(10),S.bgColor.ansi16m=x(10),Object.defineProperties(S,{rgbToAnsi256:{value(e,t,n){return e===t&&t===n?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(t/255*5)+Math.round(n/255*5)},enumerable:!1},hexToRgb:{value(e){let t=/[a-f\d]{6}|[a-f\d]{3}/i.exec(e.toString(16));if(!t)return[0,0,0];let[n]=t;n.length===3&&(n=[...n].map(e=>e+e).join(``));let r=Number.parseInt(n,16);return[r>>16&255,r>>8&255,r&255]},enumerable:!1},hexToAnsi256:{value:e=>S.rgbToAnsi256(...S.hexToRgb(e)),enumerable:!1},ansi256ToAnsi:{value(e){if(e<8)return 30+e;if(e<16)return 90+(e-8);let t,n,r;if(e>=232)t=((e-232)*10+8)/255,n=t,r=t;else{e-=16;let i=e%36;t=Math.floor(e/36)/5,n=Math.floor(i/6)/5,r=i%6/5}let i=Math.max(t,n,r)*2;if(i===0)return 30;let a=30+(Math.round(r)<<2|Math.round(n)<<1|Math.round(t));return i===2&&(a+=60),a},enumerable:!1},rgbToAnsi:{value:(e,t,n)=>S.ansi256ToAnsi(S.rgbToAnsi256(e,t,n)),enumerable:!1},hexToAnsi:{value:e=>S.ansi256ToAnsi(S.hexToAnsi256(e)),enumerable:!1}}),S}const C=re();function w(t,n=globalThis.Deno?globalThis.Deno.args:e.argv){let r=t.startsWith(`-`)?``:t.length===1?`-`:`--`,i=n.indexOf(r+t),a=n.indexOf(`--`);return i!==-1&&(a===-1||i<a)}const{env:T}=e;let E;w(`no-color`)||w(`no-colors`)||w(`color=false`)||w(`color=never`)?E=0:(w(`color`)||w(`colors`)||w(`color=true`)||w(`color=always`))&&(E=1);function ie(){if(`FORCE_COLOR`in T)return T.FORCE_COLOR===`true`?1:T.FORCE_COLOR===`false`?0:T.FORCE_COLOR.length===0?1:Math.min(Number.parseInt(T.FORCE_COLOR,10),3)}function ae(e){return e===0?!1:{level:e,hasBasic:!0,has256:e>=2,has16m:e>=3}}function oe(t,{streamIsTTY:n,sniffFlags:i=!0}={}){let a=ie();a!==void 0&&(E=a);let o=i?E:a;if(o===0)return 0;if(i){if(w(`color=16m`)||w(`color=full`)||w(`color=truecolor`))return 3;if(w(`color=256`))return 2}if(`TF_BUILD`in T&&`AGENT_NAME`in T)return 1;if(t&&!n&&o===void 0)return 0;let s=o||0;if(T.TERM===`dumb`)return s;if(e.platform===`win32`){let e=r.release().split(`.`);return Number(e[0])>=10&&Number(e[2])>=10586?Number(e[2])>=14931?3:2:1}if(`CI`in T)return[`GITHUB_ACTIONS`,`GITEA_ACTIONS`,`CIRCLECI`].some(e=>e in T)?3:[`TRAVIS`,`APPVEYOR`,`GITLAB_CI`,`BUILDKITE`,`DRONE`].some(e=>e in T)||T.CI_NAME===`codeship`?1:s;if(`TEAMCITY_VERSION`in T)return+!!/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(T.TEAMCITY_VERSION);if(T.COLORTERM===`truecolor`||T.TERM===`xterm-kitty`||T.TERM===`xterm-ghostty`||T.TERM===`wezterm`)return 3;if(`TERM_PROGRAM`in T){let e=Number.parseInt((T.TERM_PROGRAM_VERSION||``).split(`.`)[0],10);switch(T.TERM_PROGRAM){case`iTerm.app`:return e>=3?3:2;case`Apple_Terminal`:return 2}}return/-256(color)?$/i.test(T.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(T.TERM)||`COLORTERM`in T?1:s}function D(e,t={}){return ae(oe(e,{streamIsTTY:e&&e.isTTY,...t}))}const se={stdout:D({isTTY:a.isatty(1)}),stderr:D({isTTY:a.isatty(2)})};function ce(e,t,n){let r=e.indexOf(t);if(r===-1)return e;let i=t.length,a=0,o=``;do o+=e.slice(a,r)+t+n,a=r+i,r=e.indexOf(t,a);while(r!==-1);return o+=e.slice(a),o}function le(e,t,n,r){let i=0,a=``;do{let o=e[r-1]===`\r`;a+=e.slice(i,o?r-1:r)+t+(o?`\r
3
+ `:`
4
+ `)+n,i=r+1,r=e.indexOf(`
5
+ `,i)}while(r!==-1);return a+=e.slice(i),a}const{stdout:O,stderr:k}=se,A=Symbol(`GENERATOR`),j=Symbol(`STYLER`),M=Symbol(`IS_EMPTY`),ue=[`ansi`,`ansi`,`ansi256`,`ansi16m`],N=Object.create(null),de=(e,t={})=>{if(t.level&&!(Number.isInteger(t.level)&&t.level>=0&&t.level<=3))throw Error("The `level` option should be an integer from 0 to 3");let n=O?O.level:0;e.level=t.level===void 0?n:t.level},fe=e=>{let t=(...e)=>e.join(` `);return de(t,e),Object.setPrototypeOf(t,P.prototype),t};function P(e){return fe(e)}Object.setPrototypeOf(P.prototype,Function.prototype);for(let[e,t]of Object.entries(C))N[e]={get(){let n=L(this,I(t.open,t.close,this[j]),this[M]);return Object.defineProperty(this,e,{value:n}),n}};N.visible={get(){let e=L(this,this[j],!0);return Object.defineProperty(this,"visible",{value:e}),e}};const F=(e,t,n,...r)=>e===`rgb`?t===`ansi16m`?C[n].ansi16m(...r):t===`ansi256`?C[n].ansi256(C.rgbToAnsi256(...r)):C[n].ansi(C.rgbToAnsi(...r)):e===`hex`?F(`rgb`,t,n,...C.hexToRgb(...r)):C[n][e](...r);for(let e of[`rgb`,`hex`,`ansi256`]){N[e]={get(){let{level:t}=this;return function(...n){let r=I(F(e,ue[t],`color`,...n),C.color.close,this[j]);return L(this,r,this[M])}}};let t=`bg`+e[0].toUpperCase()+e.slice(1);N[t]={get(){let{level:t}=this;return function(...n){let r=I(F(e,ue[t],`bgColor`,...n),C.bgColor.close,this[j]);return L(this,r,this[M])}}}}const pe=Object.defineProperties(()=>{},{...N,level:{enumerable:!0,get(){return this[A].level},set(e){this[A].level=e}}}),I=(e,t,n)=>{let r,i;return n===void 0?(r=e,i=t):(r=n.openAll+e,i=t+n.closeAll),{open:e,close:t,openAll:r,closeAll:i,parent:n}},L=(e,t,n)=>{let r=(...e)=>me(r,e.length===1?``+e[0]:e.join(` `));return Object.setPrototypeOf(r,pe),r[A]=e,r[j]=t,r[M]=n,r},me=(e,t)=>{if(e.level<=0||!t)return e[M]?``:t;let n=e[j];if(n===void 0)return t;let{openAll:r,closeAll:i}=n;if(t.includes(`\x1B`))for(;n!==void 0;)t=ce(t,n.close,n.open),n=n.parent;let a=t.indexOf(`
6
+ `);return a!==-1&&(t=le(t,i,r,a)),r+t+i};Object.defineProperties(P.prototype,N);const R=P();P({level:k?k.level:0});var he=`2.1.3`;const z=(0,v.default)(t.slice(2),{boolean:[`c`,`color`,`h`,`help`,`n`,`no-color`,`v`,`version`],string:[`_`],alias:{c:`color`,h:`help`,n:`no-color`,v:`version`}});function B(e){e&&console.info(`Error: ${e}`),n(+!!e)}z.version&&(console.info(he),B());const V={login:[2,2],logout:[0,0],get:[2,2],set:[3,4],add:[3,4],del:[2,2]},[H,...U]=z._,ge=H&&V[H]&&U.length>=V[H][0]&&U.length<=V[H][1];(!H||z.help||!Object.keys(V).includes(H)||!ge)&&(console.info(`usage: cfdns [options] command [args]
7
+
8
+ Commands:
9
+ login <email> <key> Log in to the API
10
+ get <name> <type> Retrieve a DNS record
11
+ set <name> <type> <value> [<ttl>] Create or update a DNS record
12
+ del <name> <type> Delete a DNS record
13
+ logout Log out from the API
14
+
15
+ Options:
16
+ -c, --color Force-enable color output
17
+ -n, --no-color Disable color output
18
+ -v, --version Print the version
19
+ -h, --help Print this help
20
+
21
+ Example:
22
+ $ cfdns login user@example.com 4c689aa3462a44a121c1f199c1081240b9be4
23
+ $ cfdns set example.com a 1.2.3.4 120
24
+ $ cfdns get example.com a
25
+ $ cfdns del example.com a`),B());let W,G;async function K(e,t,n){let r=await fetch(`https://api.cloudflare.com/client/v4/${t}`,{method:e.toUpperCase(),headers:{"Content-Type":`application/json`,"X-Auth-Email":W,"X-Auth-Key":G},body:n===void 0?void 0:JSON.stringify(n)}),i=await r.json();if(!r.ok)throw Error(`${r.status} ${r.statusText}: ${JSON.stringify(i)}`);return i.result}const q=o(i(),`.cfdnsrc`);if(H===`login`||H===`logout`){if(H===`login`)[W,G]=U,await ee(q,JSON.stringify({email:W,key:G})),await s(q,384),console.info(`login data saved`);else try{await l(q),console.info(`login data deleted`)}catch{console.info(`no login data found`)}B()}else try{({email:W,key:G}=JSON.parse(await c(q,`utf8`)))}catch{B(`login data not found, please log in first.`)}U[1]&&=U[1].toUpperCase();let[J,Y,X,Z]=U;Z||=120,typeof Z==`string`&&(Z=Number(Z));const Q=(await K(`get`,`zones`)).find(e=>J.endsWith(e.name));Q||B(`no matching zone found`);const $=(await K(`get`,`zones/${Q.id}/dns_records?name=${J}&type=${Y}`))[0];H===`get`?console.info($):H===`set`||H===`add`?$?X!==$.content||Z!==$.ttl?(await K(`put`,`zones/${Q.id}/dns_records/${$.id}`,{name:J,type:Y,content:X,ttl:Z,proxied:$.proxied}),console.info(`updated ${R.magenta(J)} ${Z} IN ${Y} ${R.green(X)}`)):console.info(`${R.magenta(J)} is up to date`):(await K(`post`,`zones/${Q.id}/dns_records`,{name:J,type:Y,content:X,ttl:Z,proxied:!1}),console.info(`created ${R.magenta(J)} ${Z} IN ${Y} ${R.green(X)}`)):H===`del`&&$&&(await K(`delete`,`zones/${Q.id}/dns_records/${$.id}`),console.info(`deleted ${R.magenta(J)} ${$.ttl} IN ${Y} ${R.green($.content)}`)),B();export{};
package/package.json CHANGED
@@ -1,21 +1,19 @@
1
1
  {
2
2
  "name": "cfdns",
3
- "version": "2.1.1",
3
+ "version": "2.1.3",
4
4
  "description": "CLI to modify DNS records hosted on Cloudflare",
5
5
  "author": "silverwind <me@silverwind.io>",
6
6
  "repository": "silverwind/cfdns",
7
+ "type": "module",
8
+ "sideEffects": false,
7
9
  "license": "BSD-2-Clause",
8
- "scripts": {
9
- "test": "make test"
10
- },
10
+ "bin": "./dist/index.js",
11
11
  "engines": {
12
- "node": ">=8"
13
- },
14
- "bin": {
15
- "cfdns": "cfdns.js"
12
+ "node": ">=22",
13
+ "bun": "*"
16
14
  },
17
15
  "files": [
18
- "cfdns.js"
16
+ "dist"
19
17
  ],
20
18
  "keywords": [
21
19
  "cloudflare",
@@ -25,17 +23,20 @@
25
23
  "record",
26
24
  "ddns"
27
25
  ],
28
- "dependencies": {
29
- "chalk": "2.4.1",
30
- "fs-extra": "^7.0.0",
31
- "minimist": "^1.2.0",
32
- "request": "^2.88.0",
33
- "request-promise-native": "^1.0.5",
34
- "ver": "3.0.0"
35
- },
36
26
  "devDependencies": {
37
- "eslint": "^5.6.1",
38
- "eslint-config-silverwind": "^2.0.9",
39
- "updates": "^4.5.2"
27
+ "@types/minimist": "1.2.5",
28
+ "@types/node": "25.8.0",
29
+ "@typescript/native-preview": "7.0.0-dev.20260515.1",
30
+ "chalk": "5.6.2",
31
+ "eslint": "10.4.0",
32
+ "eslint-config-silverwind": "133.0.2",
33
+ "minimist": "1.2.8",
34
+ "tsdown": "0.22.0",
35
+ "tsdown-config-silverwind": "3.0.1",
36
+ "typescript": "6.0.3",
37
+ "typescript-config-silverwind": "18.0.0",
38
+ "updates": "17.16.12",
39
+ "updates-config-silverwind": "3.0.2",
40
+ "versions": "15.0.4"
40
41
  }
41
- }
42
+ }
package/cfdns.js DELETED
@@ -1,146 +0,0 @@
1
- #!/usr/bin/env node
2
- "use strict";
3
-
4
- const args = require("minimist")(process.argv.slice(2), {
5
- boolean: [
6
- "c", "color",
7
- "h", "help",
8
- "n", "no-color",
9
- "v", "version",
10
- ],
11
- string: [
12
- "_",
13
- ],
14
- alias: {
15
- c: "color",
16
- h: "help",
17
- n: "no-color",
18
- v: "version",
19
- },
20
- });
21
-
22
- function exit(err) {
23
- if (err) console.info(`Error: ${err}`);
24
- process.exit(err ? 1 : 0);
25
- }
26
-
27
- if (args.version) {
28
- console.info(require("./package.json").version);
29
- exit();
30
- }
31
-
32
- const cmds = {
33
- login: [2, 2],
34
- logout: [0, 0],
35
- get: [2, 2],
36
- set: [3, 4],
37
- add: [3, 4],
38
- del: [2, 2],
39
- };
40
-
41
- const [cmd, ...params] = args._;
42
- const paramLengthOkay = cmd && cmds[cmd] && (params.length >= cmds[cmd][0] && params.length <= cmds[cmd][1]);
43
- if (!cmd || args.help || !Object.keys(cmds).includes(cmd) || !paramLengthOkay) {
44
- console.info(`usage: cfdns [options] command [args]
45
-
46
- Commands:
47
- login <email> <key> Log in to the API
48
- get <name> <type> Retrieve a DNS record
49
- set <name> <type> <value> [<ttl>] Create or update a DNS record
50
- del <name> <type> Delete a DNS record
51
- logout Log out from the API
52
-
53
- Options:
54
- -c, --color Force-enable color output
55
- -n, --no-color Disable color output
56
- -v, --version Print the version
57
- -h, --help Print this help
58
-
59
- Example:
60
- $ cfdns login user@example.com 4c689aa3462a44a121c1f199c1081240b9be4
61
- $ cfdns set example.com a 1.2.3.4 120
62
- $ cfdns get example.com a
63
- $ cfdns del example.com a`);
64
- exit();
65
- }
66
-
67
- const request = require("request-promise-native");
68
- const chalk = require("chalk");
69
-
70
- let email, key;
71
-
72
- async function req(method, path, body) {
73
- return (await request({
74
- method: method.toUpperCase(),
75
- json: true,
76
- uri: `https://api.cloudflare.com/client/v4/${path}`,
77
- headers: {
78
- "X-Auth-Email": email,
79
- "X-Auth-Key": key,
80
- },
81
- body,
82
- })).result;
83
- }
84
-
85
- (async () => {
86
- const fs = require("fs-extra");
87
- const rcfile = require("path").join(require("os").homedir(), ".cfdnsrc");
88
-
89
- if (cmd === "login" || cmd === "logout") {
90
- if (cmd === "login") {
91
- [email, key] = params;
92
- await fs.writeFile(rcfile, JSON.stringify({email, key}));
93
- await fs.chmod(rcfile, 0o600);
94
- console.info("login data saved");
95
- } else {
96
- try {
97
- await fs.unlink(rcfile);
98
- console.info("login data deleted");
99
- } catch (err) {
100
- console.info("no login data found");
101
- }
102
- }
103
- exit();
104
- } else {
105
- try {
106
- ({email, key} = JSON.parse(await fs.readFile(rcfile)));
107
- } catch (err) {
108
- exit("login data not found, please log in first.");
109
- }
110
- }
111
-
112
- if (params[1]) params[1] = params[1].toUpperCase();
113
- let [name, type, content, ttl] = params;
114
- if (!ttl) ttl = 120;
115
- if (typeof ttl === "string") ttl = Number(ttl);
116
- const zones = await req("get", "zones");
117
- const zone = zones.find(zone => name.endsWith(zone.name));
118
- if (!zone) exit("no matching zone found");
119
-
120
- const record = (await req("get", `zones/${zone.id}/dns_records?name=${name}&type=${type}`))[0];
121
- if (cmd === "get") {
122
- console.info(record);
123
- } else if (cmd === "set" || cmd === "add") {
124
- if (record) {
125
- if (content !== record.content || ttl !== record.ttl) {
126
- await req("put", `zones/${zone.id}/dns_records/${record.id}`, {
127
- name, type, content, ttl, proxied: record.proxied
128
- });
129
- console.info(`updated ${chalk.magenta(name)} ${ttl} IN ${type} ${chalk.green(content)}`);
130
- } else {
131
- console.info(`${chalk.magenta(name)} is up to date`);
132
- }
133
- } else {
134
- await req("post", `zones/${zone.id}/dns_records`, {
135
- name, type, content, ttl, proxied: false
136
- });
137
- console.info(`created ${chalk.magenta(name)} ${ttl} IN ${type} ${chalk.green(content)}`);
138
- }
139
- } else if (cmd === "del") {
140
- if (record) {
141
- await req("delete", `zones/${zone.id}/dns_records/${record.id}`);
142
- console.info(`deleted ${chalk.magenta(name)} ${record.ttl} IN ${type} ${chalk.green(record.content)}`);
143
- }
144
- }
145
- exit();
146
- })();