A module for communicating with a CJDNS node over the admin UDP interface.
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
lib
test-live
test
.editorconfig
.gitignore
.npmignore
README.md
index.js
package.json

README.md

cjdns-admin


A nodejs module for working with the CJDNS admin interface over UDP. It's made to be consistent, robust and easy to use.

Jump:

Install


It's available via npm

npm install cjdns-admin

createAdmin constructor


The createAdmin function returns an EventEmitter4 with members for each admin function and their alternate. It also contains members which handle automatic paging for functions which are paged.

Options:

  • ip, string, optional
  • port, number, optional
  • password, string, required

Usage:

var cjdnsAdmin = require('cjdns-admin'),
    admin,
    channel;

// create a new Admin
admin = cjdnsAdmin.createAdmin({
    ip: '127.0.0.1',
    port: 11234,
    password: 'my cjdns password'
});

// ping the admin
channel = admin.ping();

// create a response handler
function pingResponse (res) {
    // process ping response
    console.dir(res);
}

// handle the response
admin.on(channel, pingResponse);

CJDNS Admin functions

  • Original: named the same as CJDNS calls them
  • Alternate: consistent with normal JS function nomenclature
  • Underneath they call the same function
Original Alternate
Admin_asyncEnabled admin.asyncEnabled
Admin_availableFunctions admin.availableFunctions
admin.availableFunctionsPaged
AdminLog_logMany log.logMany
AdminLog_subscribe log.subscribe
AdminLog_subscriptions log.subscriptions
AdminLog_unsubscribe log.unsubscribe
Allocator_bytesAllocated allocator.bytesAllocated
Allocator_snapshot allocator.snapshot
AuthorizedPasswords_add authorizedPasswords.add
AuthorizedPasswords_list authorizedPasswords.list
AuthorizedPasswords_remove authorizedPasswords.remove
Core_exit core.exit
Core_initTunnel core.initTunnel
Core_pid core.pid
InterfaceController_disconnectPeer interfaceController.disconnectPeer
InterfaceController_peerStats interfaceController.peerStats
interfaceController.peerStatsPaged
IpTunnel_allowConnection ipTunnel.allowConnection
IpTunnel_connectTo ipTunnel.connectTo
IpTunnel_listConnections ipTunnel.listConnections
IpTunnel_removeConnection ipTunnel.removeConnection
IpTunnel_showConnection ipTunnel.showConnection
Janitor_dumpRumorMill janitor.dumpRumorMill
memory admin.memory
nodeStore.dumpTablePaged
NodeStore_getLink nodeStore.getLink
NodeStore_getRouteLabel nodeStore.getRouteLabel
NodeStore_nodeForAddr nodeStore.nodeForAddr
ping admin.ping
RouterModule_findNode routerModule.findNode
RouterModule_getPeers routerModule.getPeers
RouterModule_lookup routerModule.lookup
RouterModule_nextHop routerModule.nextHop
RouterModule_pingNode routerModule.pingNode
SearchRunner_showActiveSearch searchRunner.showActiveSearch
SearchRunner_search searchRunner.search
Security_checkPermissions security.checkPermissions
Security_chroot security.chroot
Security_getUser security.getUser
Security_nofiles security.nofiles
Security_noforks security.noforks
Security_seccomp security.seccomp
Security_setupComplete security.setupComplete
Security_setUser security.setUser
SessionManager_getHandles sessionManager.getHandles
sessionManager.getHandlesPaged
SessionManager_sessionStats sessionManager.sessionStats
SwitchPinger_ping switchPinger.ping
UDPInterface_beginConnection udpInterface.beginConnection
UDPInterface_new udpInterface.new

Admin_asyncEnabled, admin.asyncEnabled

Usage:

channel = admin.asyncEnabled();
admin.once(channel, processResponse);

Admin_availableFunctions, admin.availableFunctions

  • page, int, optional

Usage:

var channel,
    options;

options = {
    page: 0
};

channel = admin.availableFunctions(options);
admin.once(channel, processResponse);

AdminLog_logMany, log.logMany

  • count, int, required

Usage:

var channel,
    options;

options = {
    count: 0
};

channel = admin.log.logMany(options);
admin.once(channel, processResponse);

AdminLog_subscribe, log.subscribe

  • file, string, optional
  • level, string, optional
  • line, int, optional

Usage:

var channel,
    options;

options = {
    file: '',
    level: '',
    line: 0
};

channel = admin.log.subscribe(options);
admin.once(channel, processResponse);

AdminLog_subscriptions, log.subscriptions

Usage:

channel = admin.log.subscriptions();
admin.once(channel, processResponse);

AdminLog_unsubscribe, log.unsubscribe

  • streamId, string, required

Usage:

var channel,
    options;

options = {
    streamId: ''
};

channel = admin.log.unsubscribe(options);
admin.once(channel, processResponse);

Allocator_bytesAllocated, allocator.bytesAllocated

Usage:

channel = admin.allocator.bytesAllocated();
admin.once(channel, processResponse);

Allocator_snapshot, allocator.snapshot

  • includeAllocations, int, optional

Usage:

var channel,
    options;

options = {
    includeAllocations: 0
};

channel = admin.allocator.snapshot(options);
admin.once(channel, processResponse);

AuthorizedPasswords_add, authorizedPasswords.add

  • authType, int, optional
  • ipv6, string, optional
  • password, string, required
  • user, string, required

Usage:

var channel,
    options;

options = {
    authType: 0,
    ipv6: '',
    password: '',
    user: ''
};

channel = admin.authorizedPasswords.add(options);
admin.once(channel, processResponse);

AuthorizedPasswords_list, authorizedPasswords.list

Usage:

channel = admin.authorizedPasswords.list();
admin.once(channel, processResponse);

AuthorizedPasswords_remove, authorizedPasswords.remove

  • user, string, required

Usage:

var channel,
    options;

options = {
    user: ''
};

channel = admin.authorizedPasswords.remove(options);
admin.once(channel, processResponse);

Core_exit, core.exit

Usage:

channel = admin.core.exit();
admin.once(channel, processResponse);

Core_initTunnel, core.initTunnel

  • desiredTunName, string, optional

Usage:

var channel,
    options;

options = {
    desiredTunName: ''
};

channel = admin.core.initTunnel(options);
admin.once(channel, processResponse);

Core_pid, core.pid

Usage:

channel = admin.core.pid();
admin.once(channel, processResponse);

InterfaceController_disconnectPeer, interfaceController.disconnectPeer

  • pubkey, string, required

Usage:

var channel,
    options;

options = {
    pubkey: ''
};

channel = admin.interfaceController.disconnectPeer(options);
admin.once(channel, processResponse);

InterfaceController_peerStats, interfaceController.peerStats

  • page, int, optional

Usage:

var channel,
    options;

options = {
    page: 0
};

channel = admin.interfaceController.peerStats(options);
admin.once(channel, processResponse);

IpTunnel_allowConnection, ipTunnel.allowConnection

  • ip4Address, string, optional
  • ip4Prefix, int, optional
  • ip6Address, string, optional
  • ip6Prefix, int, optional
  • publicKeyOfAuthorizedNode, string, required

Usage:

var channel,
    options;

options = {
    ip4Address: '',
    ip4Prefix: 0,
    ip6Address: '',
    ip6Prefix: 0,
    publicKeyOfAuthorizedNode: ''
};

channel = admin.ipTunnel.allowConnection(options);
admin.once(channel, processResponse);

IpTunnel_connectTo, ipTunnel.connectTo

  • publicKeyOfNodeToConnectTo, string, required

Usage:

var channel,
    options;

options = {
    publicKeyOfNodeToConnectTo: ''
};

channel = admin.ipTunnel.connectTo(options);
admin.once(channel, processResponse);

IpTunnel_listConnections, ipTunnel.listConnections

Usage:

channel = admin.ipTunnel.listConnections();
admin.once(channel, processResponse);

IpTunnel_removeConnection, ipTunnel.removeConnection

  • connection, int, required

Usage:

var channel,
    options;

options = {
    connection: 0
};

channel = admin.ipTunnel.removeConnection(options);
admin.once(channel, processResponse);

IpTunnel_showConnection, ipTunnel.showConnection

  • connection, int, required

Usage:

var channel,
    options;

options = {
    connection: 0
};

channel = admin.ipTunnel.showConnection(options);
admin.once(channel, processResponse);

Janitor_dumpRumorMill, janitor.dumpRumorMill

  • mill, string, required
  • page, int, required

Usage:

var channel,
    options;

options = {
    mill: '',
    page: 0
};

channel = admin.janitor.dumpRumorMill(options);
admin.once(channel, processResponse);

memory, admin.memory

Usage:

channel = admin.memory();
admin.once(channel, processResponse);

NodeStore_dumpTable, nodeStore.dumpTable

  • page, int, required

Usage:

var channel,
    options;

options = {
    page: 0
};

channel = admin.nodeStore.dumpTable(options);
admin.once(channel, processResponse);

NodeStore_getLink, nodeStore.getLink

  • linkNum, int, required
  • parent, string, optional

Usage:

var channel,
    options;

options = {
    linkNum: 0,
    parent: ''
};

channel = admin.nodeStore.getLink(options);
admin.once(channel, processResponse);

NodeStore_getRouteLabel, nodeStore.getRouteLabel

  • pathParentToChild, string, required
  • pathToParent, string, required

Usage:

var channel,
    options;

options = {
    pathParentToChild: '',
    pathToParent: ''
};

channel = admin.nodeStore.getRouteLabel(options);
admin.once(channel, processResponse);

NodeStore_nodeForAddr, nodeStore.nodeForAddr

  • ip, string, optional

Usage:

var channel,
    options;

options = {
    ip: ''
};

channel = admin.nodeStore.nodeForAddr(options);
admin.once(channel, processResponse);

ping, admin.ping

Usage:

channel = admin.ping();
admin.once(channel, processResponse);

RouterModule_findNode, routerModule.findNode

  • nodeToQuery, string, required
  • target, string, required
  • timeout, int, optional

Usage:

var channel,
    options;

options = {
    nodeToQuery: '',
    target: '',
    timeout: 0
};

channel = admin.routerModule.findNode(options);
admin.once(channel, processResponse);

RouterModule_getPeers, routerModule.getPeers

  • nearbyPath, string, optional
  • path, string, required
  • timeout, int, optional

Usage:

var channel,
    options;

options = {
    nearbyPath: '',
    path: '',
    timeout: 0
};

channel = admin.routerModule.getPeers(options);
admin.once(channel, processResponse);

RouterModule_lookup, routerModule.lookup

  • address, string, required

Usage:

var channel,
    options;

options = {
    address: ''
};

channel = admin.routerModule.lookup(options);
admin.once(channel, processResponse);

RouterModule_nextHop, routerModule.nextHop

  • nodeToQuery, string, required
  • target, string, required
  • timeout, int, optional

Usage:

var channel,
    options;

options = {
    nodeToQuery: '',
    target: '',
    timeout: 0
};

channel = admin.routerModule.nextHop(options);
admin.once(channel, processResponse);

RouterModule_pingNode, routerModule.pingNode

  • path, string, required
  • timeout, int, optional

Usage:

var channel,
    options;

options = {
    path: '',
    timeout: 0
};

channel = admin.routerModule.pingNode(options);
admin.once(channel, processResponse);

SearchRunner_search, searchRunner.search

  • ipv6, string, required
  • maxRequests, int, optional

Usage:

var channel,
    options;

options = {
    ipv6: '',
    maxRequests: 0
};

channel = admin.searchRunner.search(options);
admin.once(channel, processResponse);

SearchRunner_showActiveSearch, searchRunner.showActiveSearch

  • number, int, required

Usage:

var channel,
    options;

options = {
    number: 0
};

channel = admin.searchRunner.showActiveSearch(options);
admin.once(channel, processResponse);

Security_checkPermissions, security.checkPermissions

Usage:

channel = admin.security.checkPermissions();
admin.once(channel, processResponse);

Security_chroot, security.chroot

  • root, string, required

Usage:

var channel,
    options;

options = {
    root: ''
};

channel = admin.security.chroot(options);
admin.once(channel, processResponse);

Security_getUser, security.getUser

  • user, string, optional

Usage:

var channel,
    options;

options = {
    user: ''
};

channel = admin.security.getUser(options);
admin.once(channel, processResponse);

Security_nofiles, security.nofiles

Usage:

channel = admin.security.nofiles();
admin.once(channel, processResponse);

Security_noforks, security.noforks

Usage:

channel = admin.security.noforks();
admin.once(channel, processResponse);

Security_seccomp, security.seccomp

Usage:

channel = admin.security.seccomp();
admin.once(channel, processResponse);

Security_setupComplete, security.setupComplete

Usage:

channel = admin.security.setupComplete();
admin.once(channel, processResponse);

Security_setUser, security.setUser

  • keepNetAdmin, int, required
  • uid, int, required

Usage:

var channel,
    options;

options = {
    keepNetAdmin: 0,
    uid: 0
};

channel = admin.security.setUser(options);
admin.once(channel, processResponse);

SessionManager_getHandles, sessionManager.getHandles

  • page, int, optional

Usage:

var channel,
    options;

options = {
    page: 0
};

channel = admin.sessionManager.getHandles(options);
admin.once(channel, processResponse);

SessionManager_sessionStats, sessionManager.sessionStats

  • handle, int, required

Usage:

var channel,
    options;

options = {
    handle: 0
};

channel = admin.sessionManager.sessionStats(options);
admin.once(channel, processResponse);

SwitchPinger_ping, switchPinger.ping

  • data, string, optional
  • keyPing, int, optional
  • path, string, required
  • timeout, int, optional

Usage:

var channel,
    options;

options = {
    data: '',
    keyPing: 0,
    path: '',
    timeout: 0
};

channel = admin.switchPinger.ping(options);
admin.once(channel, processResponse);

UDPInterface_beginConnection, udpInterface.beginConnection

  • address, string, required
  • interfaceNumber, int, optional
  • password, string, optional
  • publicKey, string, required

Usage:

var channel,
    options;

options = {
    address: '',
    interfaceNumber: 0,
    password: '',
    publicKey: ''
};

channel = admin.udpInterface.beginConnection(options);
admin.once(channel, processResponse);

UDPInterface_new, udpInterface.new

  • bindAddress, string, optional

Usage:

var channel,
    options;

options = {
    bindAddress: ''
};

channel = admin.udpInterface.new(options);
admin.once(channel, processResponse);

Paged Functions

The paged functions will fetch all pages and return the result. Passing options is optional. The callback receives err and results as arguments and both are Array types.

function pagedCallback(err, results) {
    if (err) {
        return console.log('paged callback error', err);
    }
    console.log('paged function results array', );
}
admin.availableFunctionsPaged(pagedCallback);
admin.interfaceController.peerStatsPaged(pagedCallback);
admin.nodeStore.dumpTablePaged(pagedCallback);
admin.sessionManager.getHandlesPaged(pagedCallback);

// mill property is optional
admin.janitor.dumpRumorMillPaged({ mill: '' }, pagedCallback);

Development

Create environment variables that the tests will look for:

# cjdns development environment
export CJDNS_ADMIN_PORT=11234
export CJDNS_ADMIN_IP=127.0.0.1
export CJDNS_ADMIN_PASSWORD=from your cjdroute config

Tools are available via npm scripts. See package.json in the scripts section.

npm run lint

# test offline functionality
npm test
npm test -- --watch

# test online, UDP, and potentially dangerous functions
# on an actual node
npm run test-live
npm run test-live -- --watch

# render docs to html for testing
npm run doc-gen
npm run doc-watch