@ -1,13 +1,16 @@
// no npm!
const os = require ( 'os' )
const fs = require ( 'fs' )
const dns = require ( 'dns' )
const net = require ( 'net' )
const ini = require ( './ini' )
const path = require ( 'path' )
const http = require ( 'http' )
const https = require ( 'https' )
const { spawn , exec } = require ( 'child_process' )
const os = require ( 'os' )
const fs = require ( 'fs' )
const dns = require ( 'dns' )
const net = require ( 'net' )
const ini = require ( './ini' )
const path = require ( 'path' )
const http = require ( 'http' )
const https = require ( 'https' )
const {
spawn ,
exec
} = require ( 'child_process' )
// FIXME: disable rpc if desired
const VERSION = 0.6
@ -15,10 +18,10 @@ console.log('lokinet launcher version', VERSION, 'registered')
function log ( ) {
var args = [ ]
for ( var i in arguments ) {
for ( var i in arguments ) {
var arg = arguments [ i ]
//console.log('arg type', arg, 'is', typeof(arg))
if ( typeof ( arg ) == 'object' ) {
if ( typeof ( arg ) == 'object' ) {
arg = JSON . stringify ( arg )
}
args . push ( arg )
@ -29,9 +32,9 @@ function log() {
function getBoundIPv4s ( ) {
var nics = os . networkInterfaces ( )
var ipv4s = [ ]
for ( var adapter in nics ) {
for ( var adapter in nics ) {
var ips = nics [ adapter ]
for ( var ipIdx in ips ) {
for ( var ipIdx in ips ) {
var ipMap = ips [ ipIdx ]
if ( ipMap . address . match ( /\./ ) ) {
ipv4s . push ( ipMap . address )
@ -51,12 +54,12 @@ function getNetworkIP(callback) {
//log('getNetworkIP from', ip, auto_config_test_port)
var socket = net . createConnection ( auto _config _test _port , ip )
socket . setTimeout ( 5000 )
socket . on ( 'connect' , function ( ) {
socket . on ( 'connect' , function ( ) {
callback ( undefined , socket . address ( ) . address )
socket . end ( )
} )
var abort = false
socket . on ( 'timeout' , function ( ) {
socket . on ( 'timeout' , function ( ) {
if ( socket . address ( ) . address ) {
abort = true
var resultIp = socket . address ( ) . address
@ -69,7 +72,7 @@ function getNetworkIP(callback) {
//callback('timeout', 'error')
}
} )
socket . on ( 'error' , function ( e ) {
socket . on ( 'error' , function ( e ) {
console . error ( 'NETWORK: getNetworkIP error' , e )
// FIXME: maybe a retry here
log ( 'getNetworkIP failure test' , socket . address ( ) . address )
@ -84,10 +87,9 @@ function getNetworkIP(callback) {
function getIfNameFromIP ( ip ) {
var nics = os . networkInterfaces ( )
var ipv4s = [ ]
for ( var adapter in nics ) {
for ( var adapter in nics ) {
var ips = nics [ adapter ]
for ( var ipIdx in ips ) {
for ( var ipIdx in ips ) {
var ipMap = ips [ ipIdx ]
if ( ipMap . address == ip ) {
return adapter
@ -110,7 +112,7 @@ function httpGet(url, cb) {
}
// well somehow this can get hung on macos
var abort = false
var watchdog = setInterval ( function ( ) {
var watchdog = setInterval ( function ( ) {
if ( shuttingDown ) {
//if (cb) cb()
// [', url, ']
@ -151,8 +153,7 @@ function httpGet(url, cb) {
cb ( data )
} )
} ) . on ( "error" , ( err ) => {
console . error ( "NETWORK: httpGet Error: " + err . message , 'port' , urlDetails . port )
//console.log('err', err)
console . error ( "NETWORK: httpGet Error: " , err . message , 'port' , urlDetails . port )
cb ( )
} )
}
@ -162,10 +163,11 @@ function dynDNSHandler(data, cb) {
}
function getPublicIPv6 ( cb ) {
//v6.ident.me
//v6.ident.me
}
var getPublicIPv4 _retries = 0
function getPublicIPv4 ( cb ) {
// trust more than one source
// randomly find 2 matching sources
@ -173,29 +175,43 @@ function getPublicIPv4(cb) {
// dns is faster than http
// dig +short myip.opendns.com @resolver1.opendns.com
// httpGet doesn't support https yet...
var publicIpServices = [
{ url : 'https://api.ipify.org' } ,
{ url : 'https://ipinfo.io/ip' } ,
{ url : 'https://ipecho.net/plain' } ,
var publicIpServices = [ {
url : 'https://api.ipify.org'
} ,
{
url : 'https://ipinfo.io/ip'
} ,
{
url : 'https://ipecho.net/plain'
} ,
//{ url: 'http://api.ipify.org' },
//{ url: 'http://ipinfo.io/ip' },
//{ url: 'http://ipecho.net/plain' },
{ url : 'http://ifconfig.me' } ,
{ url : 'http://ipv4.icanhazip.com' } ,
{ url : 'http://v4.ident.me' } ,
{ url : 'http://checkip.amazonaws.com' } ,
{
url : 'http://ifconfig.me'
} ,
{
url : 'http://ipv4.icanhazip.com'
} ,
{
url : 'http://v4.ident.me'
} ,
{
url : 'http://checkip.amazonaws.com'
} ,
//{ url: 'https://checkip.dyndns.org', handler: dynDNSHandler },
]
var service = [ ]
service [ 0 ] = Math . floor ( Math . random ( ) * publicIpServices . length )
service [ 1 ] = Math . floor ( Math . random ( ) * publicIpServices . length )
var done = [ false , false ]
var done = [ false , false ]
function markDone ( idx , value ) {
if ( value === undefined ) value = ''
done [ idx ] = value . trim ( )
let ready = true
//log('done', done)
for ( var i in done ) {
for ( var i in done ) {
if ( done [ i ] === false ) {
ready = false
log ( 'getPublicIPv4' , i , 'is not ready' )
@ -220,7 +236,7 @@ function getPublicIPv4(cb) {
}
function doCall ( number ) {
httpGet ( publicIpServices [ service [ number ] ] . url , function ( ip ) {
httpGet ( publicIpServices [ service [ number ] ] . url , function ( ip ) {
if ( ip === false ) {
service [ number ] = ( Math . random ( ) * publicIpServices . length )
// retry
@ -248,7 +264,7 @@ function randomString(len) {
function isDnsPort ( ip , port , cb ) {
const resolver = new dns . Resolver ( )
resolver . setServers ( [ ip + ':' + port ] )
resolver . resolve ( auto _config _test _host , function ( err , records ) {
resolver . resolve ( auto _config _test _host , function ( err , records ) {
if ( err ) console . error ( 'resolve error:' , err )
log ( auto _config _test _host , records )
cb ( records !== undefined )
@ -260,12 +276,12 @@ function testDNSForLokinet(server, cb) {
resolver . setServers ( [ server ] )
// incase server is 127.0.0.1:undefined
try {
resolver . resolve ( 'localhost.loki' , function ( err , records ) {
resolver . resolve ( 'localhost.loki' , function ( err , records ) {
if ( err ) console . error ( 'NETWORK: localhost.loki resolve err:' , err )
//log(server, 'localhost.loki test results', records)
cb ( records )
} )
} catch ( e ) {
} catch ( e ) {
console . error ( 'NETWORK: testDNSForLokinet error, incorrect server?' , server )
cb ( )
}
@ -275,18 +291,18 @@ function lookup(host, cb) {
var resolver = new dns . Resolver ( )
//console.log('lokinet lookup servers', runningConfig.dns.bind)
resolver . setServers ( [ runningConfig . dns . bind ] )
resolver . resolve ( host , function ( err , records ) {
resolver . resolve ( host , function ( err , records ) {
if ( err ) {
// not as bad... that's at least a properly formatted response
if ( err . code == 'ENOTFOUND' ) {
records = null
} else
// leave bad
if ( err . code == 'ETIMEOUT' ) {
records = undefined
} else {
console . error ( 'lokinet lookup unknown err' , err )
}
// leave bad
if ( err . code == 'ETIMEOUT' ) {
records = undefined
} else {
console . error ( 'lokinet lookup unknown err' , err )
}
}
//console.log(host, 'lokinet dns test results', records)
cb ( records )
@ -296,7 +312,8 @@ function lookup(host, cb) {
function findLokiNetDNS ( cb ) {
const localIPs = getBoundIPv4s ( )
var checksLeft = 0
var servers = [ ]
var servers = [ ]
function checkDone ( ) {
if ( shuttingDown ) {
//if (cb) cb()
@ -304,7 +321,7 @@ function findLokiNetDNS(cb) {
return
}
checksLeft --
if ( checksLeft <= 0 ) {
if ( checksLeft <= 0 ) {
log ( 'readResolv done' )
cb ( servers )
}
@ -332,10 +349,10 @@ function findLokiNetDNS(cb) {
}
* /
// maybe check all local ips too
for ( var i in localIPs ) {
for ( var i in localIPs ) {
const server = localIPs [ i ]
checksLeft ++
testDNSForLokinet ( server , function ( isLokinet ) {
testDNSForLokinet ( server , function ( isLokinet ) {
if ( isLokinet !== undefined ) {
// lokinet
log ( server , 'is a lokinet DNS server' )
@ -360,7 +377,7 @@ function readResolv(dns_ip, cb) {
}
checksLeft --
//log('readResolv reports left', checksLeft)
if ( checksLeft <= 0 ) {
if ( checksLeft <= 0 ) {
log ( 'readResolv done' )
cb ( servers )
}
@ -368,7 +385,7 @@ function readResolv(dns_ip, cb) {
var resolvers = dns . getServers ( )
log ( 'Current resolvers' , resolvers )
for ( var i in resolvers ) {
for ( var i in resolvers ) {
const server = resolvers [ i ]
if ( server == dns _ip ) {
log ( 'preventing DNS loop on' , dns _ip )
@ -378,7 +395,7 @@ function readResolv(dns_ip, cb) {
if ( idx != - 1 ) {
log ( 'local DNS server detected' , server )
checksLeft ++ // wait for it
testDNSForLokinet ( server , function ( isLokinet ) {
testDNSForLokinet ( server , function ( isLokinet ) {
if ( isLokinet === undefined ) {
// not lokinet
log ( server , 'is not a lokinet DNS server' )
@ -441,7 +458,7 @@ function readResolv(dns_ip, cb) {
// this can really delay the start of lokinet
function findFreePort53 ( ips , index , cb ) {
log ( 'testing' , ips [ index ] , 'port 53' )
isDnsPort ( ips [ index ] , 53 , function ( res ) {
isDnsPort ( ips [ index ] , 53 , function ( res ) {
//console.log('isDnsPort res', res)
// false
if ( ! res ) {
@ -459,7 +476,9 @@ function findFreePort53(ips, index, cb) {
}
// https://stackoverflow.com/a/40686853
function mkDirByPathSync ( targetDir , { isRelativeToScript = false } = { } ) {
function mkDirByPathSync ( targetDir , {
isRelativeToScript = false
} = { } ) {
const sep = path . sep
const initDir = path . isAbsolute ( targetDir ) ? sep : ''
const baseDir = isRelativeToScript ? _ _dirname : '.'
@ -493,7 +512,8 @@ function makeMultiplatformPath(path) {
}
var cleanUpBootstrap = false
var cleanUpIni = false
var cleanUpIni = false
function generateINI ( config , need , markDone , cb ) {
const homeDir = os . homedir ( )
//console.log('homeDir', homeDir)
@ -523,7 +543,7 @@ function generateINI(config, need, markDone, cb) {
use _lokinet _rpc _port : use _lokinet _rpc _port ,
}
if ( config . bootstrap _url ) {
httpGet ( config . bootstrap _url , function ( bootstrapData ) {
httpGet ( config . bootstrap _url , function ( bootstrapData ) {
if ( bootstrapData ) {
cleanUpBootstrap = true
const tmpRcPath = os . tmpdir ( ) + '/' + randomString ( 8 ) + '.lokinet_signed'
@ -540,14 +560,14 @@ function generateINI(config, need, markDone, cb) {
//params.lokinet_bootstrap_path = ''
markDone ( 'bootstrap' , params )
}
readResolv ( config . dns _ip , function ( servers ) {
readResolv ( config . dns _ip , function ( servers ) {
upstreamDNS _servers = servers
params . upstreamDNS _servers = servers
upstreams = 'upstream=' + servers . join ( '\nupstream=' )
upstreams = 'upstream=' + servers . join ( '\nupstream=' )
markDone ( 'upstream' , params )
} )
log ( 'trying' , 'http://' + config . rpc _ip + ':' + config . rpc _port )
httpGet ( 'http://' + config . rpc _ip + ':' + config . rpc _port , function ( testData ) {
log ( 'trying' , 'http://' + config . rpc _ip + ':' + config . rpc _port )
httpGet ( 'http://' + config . rpc _ip + ':' + config . rpc _port , function ( testData ) {
//log('rpc has', testData)
if ( testData !== undefined ) {
log ( 'Bumping RPC port' , testData )
@ -562,7 +582,7 @@ function generateINI(config, need, markDone, cb) {
skipDNS = true
markDone ( 'dnsBind' , params )
}
getNetworkIP ( function ( e , ip ) {
getNetworkIP ( function ( e , ip ) {
if ( ip == 'error' || ! ip ) {
console . error ( 'NETWORK: can\'t detect default adapter IP address' )
// can't handle the exits here because we don't know if it's an actual requirements
@ -583,7 +603,7 @@ function generateINI(config, need, markDone, cb) {
tryIps . push ( '127.3.2.1' )
}
tryIps . push ( ip )
findFreePort53 ( tryIps , 0 , function ( free53Ip ) {
findFreePort53 ( tryIps , 0 , function ( free53Ip ) {
if ( free53Ip === undefined ) {
console . error ( 'NETWORK: Cant automatically find an IP to put a lokinet DNS server on' )
// can't handle the exits here because we don't know if it's an actual requirements
@ -597,7 +617,7 @@ function generateINI(config, need, markDone, cb) {
markDone ( 'dnsBind' , params )
} )
} )
getPublicIPv4 ( function ( ip ) {
getPublicIPv4 ( function ( ip ) {
//log('generateINI - ip', ip)
params . publicIP = ip
markDone ( 'publicIP' , params )
@ -650,24 +670,26 @@ function applyConfig(file_config, config_obj) {
var runningConfig = { }
var genSnCallbackFired
function generateSerivceNodeINI ( config , cb ) {
const homeDir = os . homedir ( )
var done = {
bootstrap : false ,
upstream : false ,
rpcCheck : false ,
dnsBind : false ,
netIf : false ,
publicIP : false ,
upstream : false ,
rpcCheck : false ,
dnsBind : false ,
netIf : false ,
publicIP : false ,
}
if ( config . publicIP ) {
done . publicIP = undefined
}
genSnCallbackFired = false
function markDone ( completeProcess , params ) {
done [ completeProcess ] = true
let ready = true
for ( var i in done ) {
for ( var i in done ) {
if ( ! done [ i ] ) {
ready = false
log ( i , 'is not ready' )
@ -688,7 +710,7 @@ function generateSerivceNodeINI(config, cb) {
if ( config . lokid . data _dir ) {
keyPath = config . lokid . data _dir
// make sure it has a trailing slash
if ( keyPath [ keyPath . length - 1 ] != '/' ) {
if ( keyPath [ keyPath . length - 1 ] != '/' ) {
keyPath += '/'
}
}
@ -719,8 +741,7 @@ function generateSerivceNodeINI(config, cb) {
bind : {
// will be set after
} ,
network : {
} ,
network : { } ,
api : {
enabled : true ,
bind : config . rpc _ip + ':' + params . use _lokinet _rpc _port
@ -734,12 +755,12 @@ function generateSerivceNodeINI(config, cb) {
}
}
if ( useNAT ) {
runningConfig . router [ 'public-ip' ] = params . publicIP
runningConfig . router [ 'public-ip' ] = params . publicIP
runningConfig . router [ 'public-port' ] = config . public _port
}
// inject manual NAT config?
if ( config . public _ip ) {
runningConfig . router [ 'public-ip' ] = config . public _ip
runningConfig . router [ 'public-ip' ] = config . public _ip
runningConfig . router [ 'public-port' ] = config . public _port
}
runningConfig . bind [ params . lokinet _nic ] = config . public _port
@ -757,18 +778,20 @@ function generateSerivceNodeINI(config, cb) {
}
var genClientCallbackFired
function generateClientINI ( config , cb ) {
var done = {
bootstrap : false ,
upstream : false ,
rpcCheck : false ,
dnsBind : false ,
upstream : false ,
rpcCheck : false ,
dnsBind : false ,
}
genClientCallbackFired = false
function markDone ( completeProcess , params ) {
done [ completeProcess ] = true
let ready = true
for ( var i in done ) {
for ( var i in done ) {
if ( ! done [ i ] ) {
ready = false
log ( i , 'is not ready' )
@ -795,8 +818,7 @@ function generateClientINI(config, cb) {
netdb : {
dir : params . lokinet _nodedb ,
} ,
network : {
} ,
network : { } ,
api : {
enabled : true ,
bind : config . rpc _ip + ':' + params . use _lokinet _rpc _port
@ -816,6 +838,7 @@ function generateClientINI(config, cb) {
var shuttingDown
var lokinet
var lokinetLogging = true
function preLaunchLokinet ( config , cb ) {
//console.log('userInfo', os.userInfo('utf8'))
//console.log('started as', process.getuid(), process.geteuid())
@ -826,12 +849,12 @@ function preLaunchLokinet(config, cb) {
console . error ( 'MacOS requires you start this with sudo' )
process . exit ( )
}
// leave the linux commentary for later
/ *
} else {
if ( process . getuid ( ) == 0 ) {
console . error ( 'Its not recommended you run this as root' )
} * /
// leave the linux commentary for later
/ *
} else {
if ( process . getuid ( ) == 0 ) {
console . error ( 'Its not recommended you run this as root' )
} * /
}
if ( os . platform ( ) == 'linux' ) {
@ -933,7 +956,7 @@ function launchLokinet(config, cb) {
if ( ! shuttingDown ) {
if ( config . restart ) {
// restart it in 30 seconds to avoid pegging the cpu
setTimeout ( function ( ) {
setTimeout ( function ( ) {
log ( 'loki_daemon is still running, restarting lokinet' )
launchLokinet ( config )
} , 30 * 1000 )
@ -950,25 +973,25 @@ function checkConfig(config) {
if ( config === undefined ) config = { }
if ( config . auto _config _test _ips === undefined ) config . auto _config _test _ips = [ '1.1.1.1' , '8.8.8.8' ]
if ( config . auto _config _test _host === undefined ) config . auto _config _test _host = 'www.imdb.com'
if ( config . auto _config _test _port === undefined ) config . auto _config _test _port = 80
if ( config . auto _config _test _host === undefined ) config . auto _config _test _host = 'www.imdb.com'
if ( config . auto _config _test _port === undefined ) config . auto _config _test _port = 80
auto _config _test _port = config . auto _config _test _port
auto _config _test _host = config . auto _config _test _host
auto _config _test _ips = config . auto _config _test _ips
auto _config _test _ips = config . auto _config _test _ips
if ( config . binary _path === undefined ) config . binary _path = '/usr/local/bin/lokinet'
if ( config . binary _path === undefined ) config . binary _path = '/usr/local/bin/lokinet'
// we don't always want a bootstrap (seed mode)
// maybe if no port we shouldn't configure it
if ( config . rpc _ip === undefined ) config . rpc _ip = '127.0.0.1'
if ( config . rpc _port === undefined ) config . rpc _port = 0
if ( config . rpc _ip === undefined ) config . rpc _ip = '127.0.0.1'
if ( config . rpc _port === undefined ) config . rpc _port = 0
// set public_port ?
}
function waitForUrl ( url , cb ) {
httpGet ( url , function ( data ) {
httpGet ( url , function ( data ) {
//console.log('rpc data', data)
// will be undefined if down (ECONNREFUSED)
// if success
@ -982,7 +1005,7 @@ function waitForUrl(url, cb) {
log ( 'not going to start lokinet, shutting down' )
return
}
setTimeout ( function ( ) {
setTimeout ( function ( ) {
waitForUrl ( url , cb )
} , 1000 )
}
@ -997,12 +1020,12 @@ function startServiceNode(config, cb) {
config . restart = true
// FIXME: check for bootstrap stomp and strip it
// only us lokinet devs will need to make our own seed node
preLaunchLokinet ( config , function ( ) {
preLaunchLokinet ( config , function ( ) {
// test lokid rpc port first
// also this makes sure the service key file exists
var url = 'http://' + config . lokid . rpc _user + ':' + config . lokid . rpc _pass + '@' + config . lokid . rpc _ip + ':' + config . lokid . rpc _port
var url = 'http://' + config . lokid . rpc _user + ':' + config . lokid . rpc _pass + '@' + config . lokid . rpc _ip + ':' + config . lokid . rpc _port
log ( 'lokinet waiting for lokid RPC server' )
waitForUrl ( url , function ( ) {
waitForUrl ( url , function ( ) {
launchLokinet ( config , cb )
} )
} )
@ -1010,9 +1033,9 @@ function startServiceNode(config, cb) {
function startClient ( config , cb ) {
checkConfig ( config )
if ( config . bootstrap _path === undefined && config . bootstrap _url === undefined ) config . bootstrap _url = 'https://i2p.rocks/bootstrap.signed'
if ( config . bootstrap _path === undefined && config . bootstrap _url === undefined ) config . bootstrap _url = 'https://i2p.rocks/bootstrap.signed'
config . ini _writer = generateClientINI
preLaunchLokinet ( config , function ( ) {
preLaunchLokinet ( config , function ( ) {
launchLokinet ( config , cb )
} )
}
@ -1033,7 +1056,7 @@ function isPidRunning(pid) {
process . kill ( pid , 0 )
//console.log('able to kill', pid)
return true
} catch ( e ) {
} catch ( e ) {
if ( e . code == 'ERR_INVALID_ARG_TYPE' ) {
// means pid was undefined
return true
@ -1049,11 +1072,11 @@ function isPidRunning(pid) {
console . log ( pid , 'isRunning' , e . code )
return false
}
return false
}
// intent to stop lokinet and don't restart it
var retries = 0
function stop ( ) {
shuttingDown = true
if ( lokinet && lokinet . killed ) {
@ -1073,7 +1096,7 @@ function stop() {
lokinet . killed = true
// HACK: lokinet on macos can not be killed if rpc port is in use
var monitorTimerStart = Date . now ( )
var monitorTimer = setInterval ( function ( ) {
var monitorTimer = setInterval ( function ( ) {
if ( ! isPidRunning ( lokinet . pid ) ) {
// launcher can't exit until this interval is cleared
clearInterval ( monitorTimer )
@ -1091,7 +1114,7 @@ function stop() {
console . error ( 'Lokinet is still running 30s after we intentionally killed lokinet?' )
var handles = process . _getActiveHandles ( )
console . log ( 'handles' , handles . length )
for ( var i in handles ) {
for ( var i in handles ) {
var handle = handles [ i ]
console . log ( i , 'type' , handle . _type , handle )
}
@ -1127,7 +1150,7 @@ function stop() {
// isRunning covers this too well
function getPID ( ) {
return ( lokinet && ! lokinet . killed && lokinet . pid ) ? lokinet . pid : 0
return ( lokinet && ! lokinet . killed && lokinet . pid ) ? lokinet . pid : 0
}
function enableLogging ( ) {
@ -1144,7 +1167,7 @@ function getLokiNetIP(cb) {
log ( 'lokinet seems to be running, querying' , runningConfig . dns . bind )
// where's our DNS server?
//log('RunningConfig says our lokinet\'s DNS is on', runningConfig.dns.bind)
testDNSForLokinet ( runningConfig . dns . bind , function ( ips ) {
testDNSForLokinet ( runningConfig . dns . bind , function ( ips ) {
//log('lokinet test', ips)
if ( ips && ips . length ) {
cb ( ips [ 0 ] )
@ -1163,8 +1186,8 @@ function getLokiNetIP(cb) {
}
if ( runningConfig . api . enabled ) {
log ( 'wait for lokinet startup' , runningConfig . api )
var url = 'http://' + runningConfig . api . bind + '/'
waitForUrl ( url , function ( ) {
var url = 'http://' + runningConfig . api . bind + '/'
waitForUrl ( url , function ( ) {
checkDNS ( )
} )
} else {
@ -1173,24 +1196,24 @@ function getLokiNetIP(cb) {
}
module . exports = {
startServiceNode : startServiceNode ,
startClient : startClient ,
checkConfig : checkConfig ,
findLokiNetDNS : findLokiNetDNS ,
lookup : lookup ,
isRunning : isRunning ,
stop : stop ,
getLokiNetIP : getLokiNetIP ,
enableLogging : enableLogging ,
disableLogging : disableLogging ,
getPID : getPID ,
startServiceNode : startServiceNode ,
startClient : startClient ,
checkConfig : checkConfig ,
findLokiNetDNS : findLokiNetDNS ,
lookup : lookup ,
isRunning : isRunning ,
stop : stop ,
getLokiNetIP : getLokiNetIP ,
enableLogging : enableLogging ,
disableLogging : disableLogging ,
getPID : getPID ,
// FIXME: should we allow hooking of log() too?
onMessage : function ( data ) {
onMessage : function ( data ) {
if ( lokinetLogging ) {
console . log ( ` lokinet: ${ data } ` )
}
} ,
onError : function ( data ) {
onError : function ( data ) {
console . log ( ` lokineterr: ${ data } ` )
} ,
}