forked from ivan-loh/mac-lookup
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathindex.js
128 lines (90 loc) · 2.66 KB
/
index.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
123
124
125
126
127
128
'use strict';
var fs = require('fs');
var request = require('request');
var sqlite3 = require('sqlite3').verbose();
var lineReader = require('line-reader');
/**
* Some consts
*/
var rebuilding = false;
var options = {
url: 'http://standards-oui.ieee.org/oui.txt',
sql: __dirname + '/oui.db',
txt: __dirname + '/oui.txt'
};
options.db = new sqlite3.Database(options.sql);
function parse(next) {
var process = function(db) {
lineReader.eachLine(options.txt, function(line, last) {
line = line.trimLeft().trimRight();
if (line.length < 15) { return; }
// Get OUI
var oui = line.substr(0,8).split('-').join('');
if ( (oui) && (oui.length !== 6) ) { return; }
// Get Name
var name;
line = line.substr(9).trimLeft();
if (line.substr(0,5) === '(hex)') { name = line.substr(6).trimLeft(); }
if (name === undefined) { return; }
if (name.length < 1) { return; }
var stmt = 'INSERT INTO oui(oui, name) VALUES($oui, $name)';
var parm = { $oui: oui, $name: name };
db.run(stmt, parm, function (err) {
if (err) { console.warn(err); }
});
if (last) {
rebuilding = false;
return next();
}
})
};
fs.unlink(options.sql, function (err) {
if (err) return next(err);
var db = new sqlite3.Database(options.sql);
options.db = db;
var stmt = 'CREATE TABLE IF NOT EXISTS oui(oui TEXT PRIMARY KEY, name TEXT)';
db.run(stmt, function (err) {
if (err) { return next(err); }
return process(db);
});
});
}
exports.rebuild = function (next) {
if (rebuilding) {
return next(new Error('Already Rebuilding'));
}
rebuilding = true;
try {
fs.unlinkSync(options.txt);
} catch (e) {
console.warn('unlinking problem', e);
}
request(options.url)
.on('error', console.error)
.on('end', function () {
parse(next);
})
.pipe(fs.createWriteStream(options.txt));
};
exports.lookup = function (oui, next) {
if (!oui || oui.length < 6) {
return next(new Error('Invalid Request'),null);
}
var _oui = oui.split('-').join('').split(':').join('').split('.').join('').toUpperCase();
if (_oui.length != 6) {
return next(new Error('invalid OUI'));
}
var db = options.db;
var query = 'SELECT * FROM oui WHERE oui=$oui LIMIT 1';
var param = { $oui: _oui };
db.get(query, param, function (err, row) {
next(err ? err : null, (!!row) ? row.name : null);
});
};
exports.each = function (each, next) {
var db = options.db;
var query = 'SELECT * FROM oui';
db.each(query, function (err, row) {
each(err, row);
}, next);
};