ddns-rest

1.0.0 • Public • Published

Daplie DNS API - Dynamic DNS Server for Node.js

STOP: You probably want node-ddns

A Dynamic DNS (DDNS / DynDNS) API written in node.js.

This is one distinct part of a 3-part system.

  • node-ddns (full stack demo)
  • node-ddns-api (RESTful HTTP API)
  • node-ddns-frontend (HTML5 Management App)
  • node-ddns-service (UDP DNS Server)

Install

npm install --global rsa-compat
 
git clone https://github.com/Daplie/node-ddns-api.git
pushd node-ddns-api/

Usage

You need to have an rsa keypair. You can generate one (even on Windows) using rsa-keygen-js which is installed with rsa-compat in the step above.

rsa-keygen-js
'use strict';
 
var fs = require('fs');
var path = require('path');
var app = require('express')();
 
var ddnsPubPem = fs.readFileSync(path.join(process.cwd(), 'pubkey.pem'), 'ascii');
var ddnsStore = require('daplie-dns-api/store').create({
  filepath: path.join(process.cwd(), 'db.sqlite3')
});
 
var ddns = require('daplie-dns-api').create({
  keypair: { publicKeyPem: ddnsPubPem }
, store: ddnsStore
, prefix: '/api/com.daplie.ddns'
, app: app
});
 
var plainPort = 3000;
require('http').createServer(app).listen(plainPort, function () {
    console.info('Daplie DDNS RESTful API listening on port', plainPort);
});

API

Each domain record is tied to a specific device.

Whenever a device is updated, all associated records for that device are also updated.

API Prefix

The standard API prefix is /api/com.daplie.ddns, but this may be changed arbitrarily. All of the examples below assume /api/com.daplie.ddns

Public

  • GET /public returns all records which are publicly visible
[
  {
            "createdAt": "1459977507858",
            "device": "localhost",
            "host": "example.daplie.me",
            "id": "o7khWjafqw_2185sxEmWaiBQ42o",
            "name": "example.daplie.me",
            "registered": true,
            "ttl": 300,
            "type": "A",
            "updatedAt": "1459977508125",
            "value": "127.0.0.1",
            "zone": "aj.daplie.me"
    }
]

Authorized

Authorization happens via JWT token. The JWT contains the following fields:

{ "cn": "*.example.com" // example.com, .example.com, *.example.com, www.example.com
}

DNS Records

  • GET /records returns all records for which the JWT matches the cn field
  • POST /records
  • DELETE /records/:name/:type/:value/:device?

Device Records

  • POST /devices accepts { name: 'rpi3', addresses: { type: 'A', value: '127.0.0.1' } }
  • DELETE /devices/:name delete a device and all attached domain records
  • DELETE /devices/:name/:tld/:sld/:sub? delete matching domain records from device
  • DELETE /devices/:device/:domain delete matching domain records from device

DDNS Updates

  • POST /ddns accepts { records: [{ registered: true, groupIdx: '...', type: 'A', host: 'sub.domain.tld', value: 127.0.0.1, ttl: 600, }] }

LICENSE

Dual-licensed MIT and Apache-2.0

See LICENSE

Readme

Keywords

none

Package Sidebar

Install

npm i ddns-rest

Weekly Downloads

6

Version

1.0.0

License

(MIT OR Apache-2.0)

Last publish

Collaborators

  • coolaj86