This repository has been archived by the owner on Sep 3, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.js
122 lines (99 loc) · 3.07 KB
/
app.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
// Copyright (c) 2020, BB. Jansen
//
// Please see the included LICENSE file for more information.
'use strict'
// Load .env
require('dotenv').config()
// Setup logger
require('console-stamp')(console, {
pattern: 'dd/mm/yyyy HH:MM:ss.l',
colors: {
stamp: 'green',
label: 'white'
}
})
// Load Libraries
const cron = require('node-cron')
const DB = require('./lib/db')
const Network = require('./lib/network')
const db = new DB()
const network = new Network()
// Seed Node Config
const seedNode = {
address: process.env.SEED_NODE,
ip: process.env.SEED_NODE.split(':')[0],
port: process.env.SEED_NODE.split(':')[1],
name: 'LTO Services',
app: 'ltoL',
version: '1.1.0'
}
// Start
init(seedNode)
// Init
async function init (seedNode) {
await db.createTables()
// Check for patient zero
if (!seedNode.address) {
console.error('no seed node address specified in .env [ip:port]')
return
} else {
const checkSeed = await db.selectNode(seedNode.address)
if (checkSeed.length <= 0) {
await db.insertNode(seedNode.address, seedNode)
console.info('[seed] set as ' + seedNode.address)
} else {
console.info('[seed] using ' + seedNode.address)
}
}
// Set cron jobs
cron.schedule(process.env.CRON_DISCOVER || '*/15 * * * *', () => { discoverNodes() })
cron.schedule(process.env.CRON_PING || '0 * * * *', () => { pingNodes() })
cron.schedule(process.env.CRON_SCAN || '0 * * * *', () => { scanNodes() })
cron.schedule(process.env.CRON_LOCATE || '0 0 * * *', () => { locateNodes() })
}
// Discover nodes in the network
async function discoverNodes () {
// Get all stored nodes that have been last seen 24 hours +
let knownNodes = await db.selectNodes()
// collect peer node for each stored node
knownNodes.map(async node => {
let getPeers = await network.getPeers(node.ip, node.port)
// Store peer nodes, let sql handle duplicates
getPeers.map(async peer => {
await db.insertNode(peer.address.slice(1), {
ip: peer.address.slice(1).split(':')[0],
port: peer.address.split(':')[1],
name: peer.peerName,
app: peer.applicationName,
version: peer.applicationVersion
})
})
})
}
async function pingNodes () {
// Get all stored nodes
let knownNodes = await db.selectNodes()
// check status for each stored node
knownNodes.map(async node => {
let getStatus = await network.getStatus(node.ip, node.port)
await db.updateStatus(node.address, getStatus)
})
}
async function scanNodes () {
// Get all stored nodes that have been last seen 24 hours +
let knownNodes = await db.selectNodes()
// check ports for each stored node
knownNodes.map(async node => {
let portStatus = await network.checkPort(node.ip, node.port)
await db.updatePort(node.address, portStatus)
})
}
async function locateNodes () {
// Get all stored nodes
let knownNodes = await db.selectNodes()
// check status for each stored node
knownNodes.map(async node => {
let geoData = await network.locateNode(node.ip)
await db.updateGeo(node.address, geoData)
})
}