diff --git a/lib/ble/index.js b/lib/ble/index.js index 3e27678..bf23506 100644 --- a/lib/ble/index.js +++ b/lib/ble/index.js @@ -1,31 +1,38 @@ 'use strict'; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); /** @module ble */ /** Bluetooth Low Energy module */ -const util = require('util'); -const os = require('os'); +const util_1 = require("util"); +const os_1 = require("os"); +const fs_extra_1 = require("fs-extra"); const log = require('../log')('ble'); -const wifi = require('../wifi'); +const wifi_1 = require("../wifi"); +const wifi = new wifi_1.Wifi(); const DEVICE_NAME = process.env.DEVICE_NAME || 'intval3'; const SERVICE_ID = process.env.SERVICE_ID || 'intval3_ble'; const CHAR_ID = process.env.CHAR_ID || 'intval3char'; const WIFI_ID = process.env.WIFI_ID || 'wifichar'; -const NETWORK = os.networkInterfaces(); +const NETWORK = os_1.networkInterfaces(); //?type? const MAC = getMac() || spoofMac(); //Give the device a unique device name, needs to be in env process.env.BLENO_DEVICE_NAME += '_' + MAC; -const bleno = require('bleno'); +const bleno_1 = __importDefault(require("bleno")); +const { Characteristic } = bleno_1.default; let currentWifi = 'disconnected'; let currentAddr = null; let getState; const chars = []; function createChar(name, uuid, prop, write, read) { - function characteristic() { - bleno.Characteristic.call(this, { - uuid: uuid, + const characteristic = function () { + Characteristic.call(this, { + uuid, properties: prop }); - } - util.inherits(characteristic, bleno.Characteristic); + }; + util_1.inherits(characteristic, Characteristic); if (prop.indexOf('read') !== -1) { //data, offset, withoutResponse, callback characteristic.prototype.onReadRequest = read; @@ -36,61 +43,67 @@ function createChar(name, uuid, prop, write, read) { chars.push(new characteristic()); } function createChars(onWrite, onRead) { - createChar('intval3', CHAR_ID, ['read', 'write'], onWrite, onRead); - createChar('wifi', WIFI_ID, ['read', 'write'], onWifiWrite, onWifiRead); + const permissions = ['read', 'write']; + createChar('intval3', CHAR_ID, permissions, onWrite, onRead); + createChar('wifi', WIFI_ID, permissions, onWifiWrite, onWifiRead); } -function onWifiWrite(data, offset, withoutResponse, callback) { +async function onWifiWrite(data, offset) { let result; let utf8; - let obj; + let obj = {}; let ssid; let pwd; + let psk; if (offset) { log.warn(`Offset scenario`); - result = bleno.Characteristic.RESULT_ATTR_NOT_LONG; - return callback(result); + result = bleno_1.default.Characteristic.RESULT_ATTR_NOT_LONG; + return result; } utf8 = data.toString('utf8'); obj = JSON.parse(utf8); ssid = obj.ssid; pwd = obj.pwd; log.info(`connecting to AP`, { ssid: ssid }); - return wifi.createPSK(ssid, pwd, (err, hash, plaintext) => { - if (err) { - log.error('Error hashing wifi password', err); - result = bleno.Characteristic.RESULT_UNLIKELY_ERROR; - return callback(result); - } - return wifi.setNetwork(ssid, plaintext, hash, (err, data) => { - if (err) { - log.error('Error configuring wifi', err); - result = bleno.Characteristic.RESULT_UNLIKELY_ERROR; - return callback(result); - } - currentWifi = ssid; - currentAddr = getIp(); - log.info(`Connected to AP`, { ssid: ssid, ip: currentAddr }); - result = bleno.Characteristic.RESULT_SUCCESS; - return callback(result); - }); - }); + try { + psk = await wifi.createPSK(ssid, pwd); + } + catch (err) { + log.error('Error hashing wifi password', err); + result = bleno_1.default.Characteristic.RESULT_UNLIKELY_ERROR; + return result; + } + try { + await wifi.setNetwork(ssid, psk.plaintext, psk.hash); + } + catch (err) { + log.error('Error configuring wifi', err); + result = bleno_1.default.Characteristic.RESULT_UNLIKELY_ERROR; + return result; + } + currentWifi = ssid; + currentAddr = getIp(); + log.info(`Connected to AP`, { ssid, ip: currentAddr }); + result = bleno_1.default.Characteristic.RESULT_SUCCESS; + return result; } -function onWifiRead(offset, callback) { - let result = bleno.Characteristic.RESULT_SUCCESS; +async function onWifiRead(offset, callback) { + let result = bleno_1.default.Characteristic.RESULT_SUCCESS; let wifiRes = {}; let data; - wifi.list((err, list) => { - if (err) { - result = bleno.Characteristic.RESULT_UNLIKELY_ERROR; - return callback(result); - } - wifiRes.available = list; - wifiRes.current = currentWifi; - wifiRes.ip = currentAddr; - log.info('Discovered available APs', { found: list.length }); - data = new Buffer(JSON.stringify(wifiRes)); - callback(result, data.slice(offset, data.length)); - }); + let list; + try { + list = await wifi.list(); + } + catch (err) { + result = bleno_1.default.Characteristic.RESULT_UNLIKELY_ERROR; + return callback(result); + } + wifiRes.available = list; + wifiRes.current = currentWifi; + wifiRes.ip = currentAddr; + log.info('Discovered available APs', { found: list.length }); + data = new Buffer(JSON.stringify(wifiRes)); + return callback(result, data.slice(offset, data.length)); } function getMac() { const colonRe = new RegExp(':', 'g'); @@ -102,15 +115,15 @@ function getMac() { function spoofMac() { const fs = require('fs'); const FSPATH = require.resolve('uuid'); - const IDFILE = os.homedir() + '/.intval3id'; + const IDFILE = os_1.homedir() + '/.intval3id'; let uuid; let UUIDPATH; let TMP; let MACTMP; let dashRe; delete require.cache[FSPATH]; - if (fs.existsSync(IDFILE)) { - return fs.readFileSync(IDFILE, 'utf8'); + if (fs_extra_1.existsSync(IDFILE)) { + return fs_extra_1.readFileSync(IDFILE, 'utf8'); } uuid = require('uuid').v4; UUIDPATH = require.resolve('uuid'); @@ -118,13 +131,13 @@ function spoofMac() { TMP = uuid(); MACTMP = TMP.replace(dashRe, '').substring(0, 12); dashRe = new RegExp('-', 'g'); - fs.writeFileSync(IDFILE, MACTMP, 'utf8'); + fs_extra_1.writeFileSync(IDFILE, MACTMP, 'utf8'); return MACTMP; } function getIp() { let addr = null; let ipv4; - const ifaces = os.networkInterfaces(); + const ifaces = os_1.networkInterfaces(); if (ifaces && ifaces.wlan0) { ipv4 = ifaces.wlan0.filter(iface => { if (iface.family === 'IPv4') { @@ -137,8 +150,8 @@ function getIp() { } return addr; } -function capitalize(s) { - return s[0].toUpperCase() + s.slice(1); +function capitalize(str) { + return str[0].toUpperCase() + str.slice(1); } /** Class representing the bluetooth interface */ class BLE { @@ -150,42 +163,47 @@ class BLE { constructor(bleGetState) { log.info('Starting bluetooth service'); getState = bleGetState; - bleno.on('stateChange', state => { + bleno_1.default.on('stateChange', state => { log.info('stateChange', { state: state }); if (state === 'poweredOn') { log.info('Starting advertising', { DEVICE_NAME, DEVICE_ID: process.env.BLENO_DEVICE_NAME }); - bleno.startAdvertising(DEVICE_NAME, [CHAR_ID]); + bleno_1.default.startAdvertising(DEVICE_NAME, [CHAR_ID]); } else { - bleno.stopAdvertising(); + bleno_1.default.stopAdvertising(); } }); - bleno.on('advertisingStart', err => { + bleno_1.default.on('advertisingStart', err => { log.info('advertisingStart', { res: (err ? 'error ' + err : 'success') }); createChars(this._onWrite.bind(this), this._onRead.bind(this)); if (!err) { - bleno.setServices([ - new bleno.PrimaryService({ + bleno_1.default.setServices([ + new bleno_1.default.PrimaryService({ uuid: SERVICE_ID, characteristics: chars }) ]); } }); - bleno.on('accept', clientAddress => { + bleno_1.default.on('accept', clientAddress => { log.info('accept', { clientAddress: clientAddress }); }); - bleno.on('disconnect', clientAddress => { + bleno_1.default.on('disconnect', clientAddress => { log.info('disconnect', { clientAddress: clientAddress }); }); - wifi.getNetwork((err, ssid) => { - if (err) { - return log.error('wifi.getNetwork', err); - } - currentWifi = ssid; - currentAddr = getIp(); - log.info('wifi.getNetwork', { ssid: ssid, ip: currentAddr }); - }); + this._refreshWifi(); + } + async _refreshWifi() { + let ssid; + try { + ssid = await wifi.getNetwork(); + } + catch (err) { + return log.error('wifi.getNetwork', err); + } + currentWifi = ssid; + currentAddr = getIp(); + log.info('wifi.getNetwork', { ssid: ssid, ip: currentAddr }); } _onWrite(data, offset, withoutResponse, callback) { let result = {}; @@ -194,12 +212,12 @@ class BLE { let fn; if (offset) { log.warn(`Offset scenario`); - result = bleno.Characteristic.RESULT_ATTR_NOT_LONG; + result = bleno_1.default.Characteristic.RESULT_ATTR_NOT_LONG; return callback(result); } utf8 = data.toString('utf8'); obj = JSON.parse(utf8); - result = bleno.Characteristic.RESULT_SUCCESS; + result = bleno_1.default.Characteristic.RESULT_SUCCESS; fn = `_on${capitalize(obj.type)}`; if (obj.type && this[fn]) { return this[fn](obj, () => { @@ -211,7 +229,7 @@ class BLE { } } _onRead(offset, callback) { - const result = bleno.Characteristic.RESULT_SUCCESS; + const result = bleno_1.default.Characteristic.RESULT_SUCCESS; const state = getState(); const data = new Buffer(JSON.stringify(state)); callback(result, data.slice(offset, data.length)); diff --git a/lib/ble/index.js.map b/lib/ble/index.js.map index a8dc81c..a9bd41f 100644 --- a/lib/ble/index.js.map +++ b/lib/ble/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ble/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ble/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/wifi/index.js b/lib/wifi/index.js index 4e12e7e..fb029c7 100644 --- a/lib/wifi/index.js +++ b/lib/wifi/index.js @@ -10,114 +10,117 @@ const iwgetid = '/sbin/iwgetid'; const log = require('../log')('wifi'); const child_process_1 = require("child_process"); const fs_1 = require("fs"); -let _entry = null; -let _ssid = null; /** Class representing the wifi features */ class Wifi { constructor() { - this._cb = null; + this._ssid = null; + this._entry = null; } /** * List available wifi access points * * @param {function} callback Function which gets invoked after list is returned */ - list(callback) { - child_process_1.exec(iwlist, (err, stdout, stderr) => { - if (err) { - console.error(err); - return callback(err); - } - const limit = 20; - const lines = stdout.split('\n'); - let output = []; - let line; - let i = 0; - for (let l of lines) { - line = l.replace('ESSID:', '').trim(); - if (line !== '""' && i < limit) { - line = line.replace(quoteRe, ''); - output.push(line); + async list() { + return new Promise((resolve, reject) => { + return child_process_1.exec(iwlist, (err, stdout, stderr) => { + if (err) { + log.error('list', err); + return reject(err); } - i++; - } - output = output.filter(ap => { - if (ap !== '') - return ap; + const limit = 20; + const lines = stdout.split('\n'); + let output = []; + let line; + let i = 0; + for (let l of lines) { + line = l.replace('ESSID:', '').trim(); + if (line !== '""' && i < limit) { + line = line.replace(quoteRe, ''); + output.push(line); + } + i++; + } + output = output.filter(ap => { + if (ap !== '') + return ap; + }); + return resolve(output); }); - return callback(null, output); }); } /** * (internal function) Invoked after config file is read, * then invokes file write on the config file * - * @param {object} err (optional) Error object only present if problem reading config file - * @param {string} data Contents of the config file */ - _readConfigCb(err, data) { + async _readConfig() { + let data; let parsed; let current; - if (err) { - console.error(err); - return this._cb(err); + try { + data = await fs_1.readFile(filePath, 'utf8'); + } + catch (err) { + log.error('_readConfig', err); + throw err; } parsed = this._parseConfig(data); current = parsed.find((network) => { - return network.ssid === _ssid; + return network.ssid === this._ssid; }); if (typeof current !== 'undefined') { - data = data.replace(current.raw, _entry); + data = data.replace(current.raw, this._entry); } else { - data += '\n\n' + _entry; + data += '\n\n' + this._entry; } - _entry = null; - fs_1.writeFile(filePath, data, 'utf8', this._writeConfigCb.bind(this)); + this._entry = null; + return data; } /** * (internal function) Invoked after config file is written, * then executes reconfiguration command * - * @param {object} err (optional) Error object only present if problem writing config file */ - _writeConfigCb(err) { - if (err) { - console.error(err); - return this._cb(err); + async _writeConfig(data) { + try { + await fs_1.writeFile(filePath, data, { encoding: 'utf-8' }); + } + catch (err) { + log.error('_readConfigCb', err); + throw err; } - child_process_1.exec(reconfigure, this._reconfigureCb.bind(this)); } /** * (internal function) Invoked after reconfiguration command is complete * - * @param {object} err (optional) Error object only present if configuration command fails - * @param {string} stdout Standard output from reconfiguration command - * @param {string} stderr Error output from command if fails */ - _reconfigureCb(err, stdout, stderr) { - if (err) { - console.error(err); - return this._cb(err); - } - log.info('Wifi reconfigured'); - child_process_1.exec(refresh, this._refreshCb.bind(this)); + async _reconfigure() { + return new Promise((resolve, reject) => { + return child_process_1.exec(reconfigure, (err, stdout, stderr) => { + if (err) { + return reject(err); + } + log.info('Wifi reconfigured'); + return resolve(true); + }); + }); } /** * (internal function) Invoked after wifi refresh command is complete * - * @param {object} err (optional) Error object only present if refresh command fails - * @param {string} stdout Standard output from refresh command - * @param {string} stderr Error output from command if fails */ - _refreshCb(err, stdout, stderr) { - if (err) { - console.error(err); - return this._cb(err); - } - log.info('Wifi refreshed'); - this._cb(null, { ssid: _ssid }); - this._cb = () => { }; + async _refresh() { + return new Promise((resolve, reject) => { + return child_process_1.exec(refresh, (err, stdout, stderr) => { + if (err) { + return reject(err); + } + log.info('Wifi refreshed'); + return resolve({ ssid: this._ssid }); + }); + }); } _parseConfig(str) { const networks = []; @@ -157,21 +160,22 @@ class Wifi { * * @param {string} ssid SSID of wifi network * @param {string} pwd Plaintext passphrase of wifi network - * @param {function} callback Function called after psk hash is generated */ - createPSK(ssid, pwd, callback) { + createPSK(ssid, pwd) { const cmd = `wpa_passphrase '${ssid.replace(/'/g, `'\\''`)}' '${pwd.replace(/'/g, `'\\''`)}' | grep "psk="`; let lines; let hash; let plaintext; - child_process_1.exec(cmd, (err, stdout, stderr) => { - if (err) { - return callback(err); - } - lines = stdout.replace('#psk=', '').split('psk='); - hash = lines[1]; - plaintext = lines[0]; - callback(null, hash.trim(), plaintext.trim()); + return new Promise((resolve, reject) => { + return child_process_1.exec(cmd, (err, stdout, stderr) => { + if (err) { + return reject(err); + } + lines = stdout.replace('#psk=', '').split('psk='); + hash = lines[1]; + plaintext = lines[0]; + return resolve({ hash: hash.trim(), plaintext: plaintext.trim() }); + }); }); } /** @@ -180,30 +184,56 @@ class Wifi { * @param {string} ssid SSID of network to configure * @param {string} pwd Password of access point, plaintext to be masked * @param {string} hash Password/SSID of access point, securely hashed - * @param {function} callback Function invoked after process is complete, or fails */ - setNetwork(ssid, pwd, hash, callback) { + async setNetwork(ssid, pwd, hash) { let masked = pwd.split('').map(char => { return char !== '"' ? '*' : '"'; }).join(''); - _entry = `network={\n\tssid="${ssid}"\n\t#psk=${masked}\n\tpsk=${hash}\n}\n`; - this._cb = callback; - _ssid = ssid; - fs_1.readFile(filePath, 'utf8', this._readConfigCb.bind(this)); + let data; + this._entry = `network={\n\tssid="${ssid}"\n\t#psk=${masked}\n\tpsk=${hash}\n}\n`; + this._ssid = ssid; + try { + data = await this._readConfig(); + } + catch (err) { + log.error(err); + } + try { + await this._writeConfig(data); + } + catch (err) { + log.error(err); + } + try { + await this._reconfigure(); + } + catch (err) { + log.error(err); + } + try { + await this._refresh(); + } + catch (err) { + log.error(err); + } + return { ssid: this._ssid }; } /** * Executes command which gets the currently connected network * * @param {function} callback Function which is invoked after command is completed */ - getNetwork(callback) { + async getNetwork() { let output; - child_process_1.exec(iwgetid, (err, stdout, stderr) => { - if (err) { - return callback(err); - } - output = stdout.split('ESSID:')[1].replace(quoteRe, '').trim(); - callback(null, output); + return new Promise((resolve, reject) => { + return child_process_1.exec(iwgetid, (err, stdout, stderr) => { + if (err) { + return reject(err); + } + output = stdout.split('ESSID:')[1].replace(quoteRe, '').trim(); + return resolve(output); + }); }); } } -module.exports = new Wifi(); +exports.Wifi = Wifi; +module.exports.Wifi = Wifi; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/lib/wifi/index.js.map b/lib/wifi/index.js.map index 8adff32..60c1c64 100644 --- a/lib/wifi/index.js.map +++ b/lib/wifi/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/wifi/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/wifi/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index cf080b8..eb84b99 100644 --- a/package-lock.json +++ b/package-lock.json @@ -57,6 +57,15 @@ "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", "dev": true }, + "@types/bleno": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/bleno/-/bleno-0.4.1.tgz", + "integrity": "sha512-CY4CG5jFURnigEi1qQVnKgtyxg7jQEAmTjBpawejmt91XRThKowP90IvZksv/Qrjfh5IgZIGLe0SXGMUpwS6ZA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", diff --git a/package.json b/package.json index a0a7f7f..490a19e 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "winston": "^3.2.1" }, "devDependencies": { + "@types/bleno": "^0.4.1", "@types/fs-extra": "^8.0.0", "@types/node": "^12.7.12", "@types/node-persist": "0.0.33", diff --git a/src/ble/index.ts b/src/ble/index.ts index 5b6b5fc..257fcca 100644 --- a/src/ble/index.ts +++ b/src/ble/index.ts @@ -3,38 +3,51 @@ /** @module ble */ /** Bluetooth Low Energy module */ -const util = require('util') -const os = require('os') +import { inherits } from 'util' +import { networkInterfaces, homedir } from 'os' +import { readFileSync, existsSync, writeFileSync } from 'fs-extra' const log = require('../log')('ble') -const wifi = require('../wifi') +import { Wifi } from '../wifi' +const wifi = new Wifi() -const DEVICE_NAME = process.env.DEVICE_NAME || 'intval3' -const SERVICE_ID = process.env.SERVICE_ID || 'intval3_ble' -const CHAR_ID = process.env.CHAR_ID || 'intval3char' -const WIFI_ID = process.env.WIFI_ID || 'wifichar' -const NETWORK = os.networkInterfaces() -const MAC = getMac() || spoofMac() +const DEVICE_NAME : string = process.env.DEVICE_NAME || 'intval3' +const SERVICE_ID : string = process.env.SERVICE_ID || 'intval3_ble' +const CHAR_ID : string = process.env.CHAR_ID || 'intval3char' +const WIFI_ID : string = process.env.WIFI_ID || 'wifichar' +const NETWORK : any = networkInterfaces() //?type? +const MAC : string = getMac() || spoofMac() //Give the device a unique device name, needs to be in env process.env.BLENO_DEVICE_NAME += '_' + MAC -const bleno = require('bleno') +import bleno from 'bleno' +const { Characteristic } = bleno +let currentWifi : string = 'disconnected' +let currentAddr : string = null +let getState : Function -let currentWifi = 'disconnected' -let currentAddr = null -let getState +const chars : any[] = [] -const chars = [] +interface WifiInfo { + ssid : string + pwd : string +} -function createChar(name, uuid, prop, write, read) { - function characteristic () { - bleno.Characteristic.call(this, { - uuid : uuid, +interface WifiResponse { + available : string[] + current : string + ip : string +} + +function createChar(name : string, uuid : string, prop : string[], write : Function, read : Function) { + const characteristic : any = function () { + Characteristic.call(this, { + uuid, properties: prop }) } - util.inherits(characteristic, bleno.Characteristic) + inherits(characteristic, Characteristic) if (prop.indexOf('read') !== -1) { //data, offset, withoutResponse, callback characteristic.prototype.onReadRequest = read @@ -45,64 +58,76 @@ function createChar(name, uuid, prop, write, read) { chars.push(new characteristic()) } -function createChars (onWrite, onRead) { - createChar('intval3', CHAR_ID, ['read', 'write'], onWrite, onRead) - createChar('wifi', WIFI_ID, ['read', 'write'], onWifiWrite, onWifiRead) +function createChars (onWrite : Function, onRead : Function) { + const permissions : string[] = ['read', 'write']; + createChar('intval3', CHAR_ID, permissions, onWrite, onRead) + createChar('wifi', WIFI_ID, permissions, onWifiWrite, onWifiRead) } -function onWifiWrite (data, offset, withoutResponse, callback) { - let result - let utf8 - let obj - let ssid - let pwd +async function onWifiWrite (data : any, offset : number) { + let result : any + let utf8 : string + let obj : WifiInfo = {} as WifiInfo + let ssid : string + let pwd : string + let psk : any + if (offset) { log.warn(`Offset scenario`) result = bleno.Characteristic.RESULT_ATTR_NOT_LONG - return callback(result) - } + return result + } + utf8 = data.toString('utf8') obj = JSON.parse(utf8) ssid = obj.ssid pwd = obj.pwd - log.info(`connecting to AP`, { ssid : ssid }) - return wifi.createPSK(ssid, pwd, (err, hash, plaintext) => { - if (err) { - log.error('Error hashing wifi password', err) - result = bleno.Characteristic.RESULT_UNLIKELY_ERROR - return callback(result) - } - return wifi.setNetwork(ssid, plaintext, hash, (err, data) => { - if (err) { - log.error('Error configuring wifi', err) - result = bleno.Characteristic.RESULT_UNLIKELY_ERROR - return callback(result) - } - currentWifi = ssid - currentAddr = getIp() - log.info(`Connected to AP`, { ssid : ssid, ip : currentAddr }) - result = bleno.Characteristic.RESULT_SUCCESS - return callback(result) - }) - }) + + log.info(`connecting to AP`, { ssid : ssid }) + + try { + psk = await wifi.createPSK(ssid, pwd) + } catch (err) { + log.error('Error hashing wifi password', err) + result = bleno.Characteristic.RESULT_UNLIKELY_ERROR + return result + } + + try { + await wifi.setNetwork(ssid, psk.plaintext, psk.hash) + } catch (err) { + log.error('Error configuring wifi', err) + result = bleno.Characteristic.RESULT_UNLIKELY_ERROR + return result + } + + currentWifi = ssid + currentAddr = getIp() + log.info(`Connected to AP`, { ssid, ip : currentAddr }) + result = bleno.Characteristic.RESULT_SUCCESS + return result } -function onWifiRead (offset, callback) { - let result = bleno.Characteristic.RESULT_SUCCESS - let wifiRes = {} - let data - wifi.list((err, list) => { - if (err) { - result = bleno.Characteristic.RESULT_UNLIKELY_ERROR - return callback(result) - } - wifiRes.available = list - wifiRes.current = currentWifi - wifiRes.ip = currentAddr - log.info('Discovered available APs', { found : list.length }) - data = new Buffer(JSON.stringify(wifiRes)) - callback(result, data.slice(offset, data.length)) - }) +async function onWifiRead (offset : number, callback : Function) { + let result : any = bleno.Characteristic.RESULT_SUCCESS + let wifiRes : WifiResponse = {} as WifiResponse + let data : any + let list : any + + try { + list = await wifi.list() + } catch (err) { + result = bleno.Characteristic.RESULT_UNLIKELY_ERROR + return callback(result) + } + + wifiRes.available = list + wifiRes.current = currentWifi + wifiRes.ip = currentAddr + log.info('Discovered available APs', { found : list.length }) + data = new Buffer(JSON.stringify(wifiRes)) + + return callback(result, data.slice(offset, data.length)) } function getMac () { @@ -116,15 +141,15 @@ function getMac () { function spoofMac () { const fs = require('fs') const FSPATH = require.resolve('uuid') - const IDFILE = os.homedir() + '/.intval3id' + const IDFILE = homedir() + '/.intval3id' let uuid let UUIDPATH let TMP let MACTMP let dashRe delete require.cache[FSPATH] - if (fs.existsSync(IDFILE)) { - return fs.readFileSync(IDFILE, 'utf8') + if (existsSync(IDFILE)) { + return readFileSync(IDFILE, 'utf8') } uuid = require('uuid').v4 UUIDPATH = require.resolve('uuid') @@ -132,14 +157,14 @@ function spoofMac () { TMP = uuid() MACTMP = TMP.replace(dashRe, '').substring(0, 12) dashRe = new RegExp('-', 'g') - fs.writeFileSync(IDFILE, MACTMP, 'utf8') + writeFileSync(IDFILE, MACTMP, 'utf8') return MACTMP } function getIp () { let addr = null let ipv4 - const ifaces = os.networkInterfaces() + const ifaces = networkInterfaces() if (ifaces && ifaces.wlan0) { ipv4 = ifaces.wlan0.filter(iface => { if (iface.family === 'IPv4') { @@ -154,8 +179,8 @@ function getIp () { } -function capitalize (s) { - return s[0].toUpperCase() + s.slice(1) +function capitalize (str : string) { + return str[0].toUpperCase() + str.slice(1) } /** Class representing the bluetooth interface */ @@ -165,7 +190,7 @@ class BLE { * * @constructor */ - constructor (bleGetState) { + constructor (bleGetState : Function) { log.info('Starting bluetooth service') getState = bleGetState @@ -201,29 +226,38 @@ class BLE { log.info('disconnect', { clientAddress : clientAddress }) }) - wifi.getNetwork((err, ssid) => { - if (err) { - return log.error('wifi.getNetwork', err) - } - currentWifi = ssid - currentAddr = getIp() - log.info('wifi.getNetwork', {ssid : ssid, ip : currentAddr }) - }) + this._refreshWifi() } - _onWrite (data, offset, withoutResponse, callback) { + private async _refreshWifi () { + let ssid : string + + try { + ssid = await wifi.getNetwork() as string + } catch (err) { + return log.error('wifi.getNetwork', err) + } + + currentWifi = ssid + currentAddr = getIp() + log.info('wifi.getNetwork', {ssid : ssid, ip : currentAddr }) + } + private _onWrite (data : any, offset : number, withoutResponse : Function, callback : Function) { let result = {} let utf8 let obj let fn + if (offset) { log.warn(`Offset scenario`) result = bleno.Characteristic.RESULT_ATTR_NOT_LONG return callback(result) - } + } + utf8 = data.toString('utf8') obj = JSON.parse(utf8) result = bleno.Characteristic.RESULT_SUCCESS - fn = `_on${capitalize(obj.type)}` + fn = `_on${capitalize(obj.type)}` + if (obj.type && this[fn]) { return this[fn](obj, () => { callback(result) @@ -233,7 +267,7 @@ class BLE { } } - _onRead (offset, callback) { + private _onRead (offset : number, callback : Function) { const result = bleno.Characteristic.RESULT_SUCCESS const state = getState() const data = new Buffer(JSON.stringify( state )) @@ -245,7 +279,7 @@ class BLE { * @param {string} eventName Name of the event to to bind * @param {function} callback Invoked when the event is triggered */ - on (eventName, callback) { + on (eventName : string, callback : Function) { this[`_on${capitalize(eventName)}`] = callback } diff --git a/src/wifi/index.ts b/src/wifi/index.ts index 9e5a956..e5d2d38 100644 --- a/src/wifi/index.ts +++ b/src/wifi/index.ts @@ -12,9 +12,7 @@ const iwgetid : string = '/sbin/iwgetid' const log : any = require('../log')('wifi') import { exec } from 'child_process' import { readFile, writeFile } from 'fs' - -let _entry : string = null -let _ssid : string = null +import { reject } from 'q' interface Network { raw : string @@ -22,8 +20,10 @@ interface Network { } /** Class representing the wifi features */ -class Wifi { - private _cb : Function = null +export class Wifi { + private _ssid : string = null + private _entry : string = null + constructor () { } @@ -32,102 +32,110 @@ class Wifi { * * @param {function} callback Function which gets invoked after list is returned */ - list (callback : Function) { - exec(iwlist, (err, stdout, stderr) => { - if (err) { - console.error(err) - return callback(err) - } - const limit = 20; - const lines = stdout.split('\n') - let output = [] - let line - let i = 0 - for (let l of lines) { - line = l.replace('ESSID:', '').trim() - if (line !== '""' && i < limit) { - line = line.replace(quoteRe, '') - output.push(line) + public async list () { + return new Promise ((resolve : Function, reject : Function) => { + return exec(iwlist, (err, stdout, stderr) => { + if (err) { + log.error('list', err) + return reject(err) } - i++ - } - output = output.filter(ap => { - if (ap !== '') return ap + const limit : number = 20; + const lines : string[] = stdout.split('\n') + let output : string[] = [] + let line : string + let i = 0 + for (let l of lines) { + line = l.replace('ESSID:', '').trim() + if (line !== '""' && i < limit) { + line = line.replace(quoteRe, '') + output.push(line) + } + i++ + } + output = output.filter(ap => { + if (ap !== '') return ap + }) + return resolve(output) }) - return callback(null, output) }) } /** * (internal function) Invoked after config file is read, * then invokes file write on the config file * - * @param {object} err (optional) Error object only present if problem reading config file - * @param {string} data Contents of the config file */ - _readConfigCb (err : Error, data : string) { + async _readConfig () { + let data : string let parsed : Network[] let current : Network - if (err) { - console.error(err) - return this._cb(err) + + try { + data = await readFile(filePath, 'utf8') + } catch (err) { + log.error('_readConfig', err) + throw err } + parsed = this._parseConfig(data) current = parsed.find((network : Network) => { - return network.ssid === _ssid + return network.ssid === this._ssid }) if (typeof current !== 'undefined') { - data = data.replace(current.raw, _entry) + data = data.replace(current.raw, this._entry) } else { - data += '\n\n' + _entry + data += '\n\n' + this._entry } - _entry = null - writeFile(filePath, data, 'utf8', this._writeConfigCb.bind(this)) + this._entry = null + + return data + } /** * (internal function) Invoked after config file is written, * then executes reconfiguration command * - * @param {object} err (optional) Error object only present if problem writing config file */ - _writeConfigCb (err : Error) { - if (err) { - console.error(err) - return this._cb(err) + private async _writeConfig (data : string) { + try { + await writeFile(filePath, data, { encoding : 'utf-8' }) + } catch (err) { + log.error('_readConfigCb', err) + throw err } - exec(reconfigure, this._reconfigureCb.bind(this)) + } /** * (internal function) Invoked after reconfiguration command is complete * - * @param {object} err (optional) Error object only present if configuration command fails - * @param {string} stdout Standard output from reconfiguration command - * @param {string} stderr Error output from command if fails */ - _reconfigureCb (err : Error, stdout : string, stderr : string) { - if (err) { - console.error(err) - return this._cb(err) - } - log.info('Wifi reconfigured') - exec(refresh, this._refreshCb.bind(this)) + private async _reconfigure () { + return new Promise((resolve : Function, reject : Function) => { + return exec(reconfigure, (err : Error, stdout : string, stderr : string) => { + if (err) { + return reject(err) + } + log.info('Wifi reconfigured') + return resolve(true) + }) + }) } /** * (internal function) Invoked after wifi refresh command is complete * - * @param {object} err (optional) Error object only present if refresh command fails - * @param {string} stdout Standard output from refresh command - * @param {string} stderr Error output from command if fails */ - _refreshCb (err : Error, stdout : string, stderr : string) { - if (err) { - console.error(err) - return this._cb(err) - } - log.info('Wifi refreshed') - this._cb(null, { ssid : _ssid }) - this._cb = () => {} + private async _refresh () { + return new Promise((resolve : Function, reject : Function) => { + return exec(refresh, (err : Error, stdout : string, stderr : string) => { + if (err) { + return reject(err) + } + log.info('Wifi refreshed') + return resolve({ ssid : this._ssid }); + }) + }) } - _parseConfig (str : string) : Network[] { + + private _parseConfig (str : string) : Network[] { const networks : Network[] = [] const lines = str.split('\n') let network : Network = {} as Network @@ -162,21 +170,22 @@ class Wifi { * * @param {string} ssid SSID of wifi network * @param {string} pwd Plaintext passphrase of wifi network - * @param {function} callback Function called after psk hash is generated */ - createPSK (ssid : string, pwd : string, callback : Function) { + createPSK (ssid : string, pwd : string) { const cmd : string = `wpa_passphrase '${ssid.replace(/'/g, `'\\''`)}' '${pwd.replace(/'/g, `'\\''`)}' | grep "psk="` let lines : string[] let hash : string let plaintext : string - exec(cmd, (err, stdout, stderr) => { - if (err) { - return callback(err) - } - lines = stdout.replace('#psk=', '').split('psk=') - hash = lines[1] - plaintext = lines[0] - callback(null, hash.trim(), plaintext.trim()) + return new Promise ((resolve : Function, reject : Function) => { + return exec(cmd, (err, stdout, stderr) => { + if (err) { + return reject(err) + } + lines = stdout.replace('#psk=', '').split('psk=') + hash = lines[1] + plaintext = lines[0] + return resolve({ hash : hash.trim(), plaintext : plaintext.trim()}) + }) }) } /** @@ -185,30 +194,54 @@ class Wifi { * @param {string} ssid SSID of network to configure * @param {string} pwd Password of access point, plaintext to be masked * @param {string} hash Password/SSID of access point, securely hashed - * @param {function} callback Function invoked after process is complete, or fails */ - setNetwork (ssid : string, pwd : string, hash : string, callback : Function) { + async setNetwork (ssid : string, pwd : string, hash : string) { let masked : string = pwd.split('').map(char => { return char !== '"' ? '*' : '"' }).join('') - _entry = `network={\n\tssid="${ssid}"\n\t#psk=${masked}\n\tpsk=${hash}\n}\n` - this._cb = callback - _ssid = ssid - readFile(filePath, 'utf8', this._readConfigCb.bind(this)) + let data : string + this._entry = `network={\n\tssid="${ssid}"\n\t#psk=${masked}\n\tpsk=${hash}\n}\n` + this._ssid = ssid + + try { + data = await this._readConfig() + } catch (err) { + log.error(err) + } + try { + await this._writeConfig(data) + } catch (err) { + log.error(err) + } + try { + await this._reconfigure() + } catch (err) { + log.error(err) + } + try { + await this._refresh() + } catch (err) { + log.error(err) + } + + return { ssid : this._ssid } } /** * Executes command which gets the currently connected network * * @param {function} callback Function which is invoked after command is completed */ - getNetwork (callback : Function) { - let output - exec(iwgetid, (err, stdout, stderr) => { - if (err) { - return callback(err) - } - output = stdout.split('ESSID:')[1].replace(quoteRe, '').trim() - callback(null, output) - }) + public async getNetwork () { + let output : string + return new Promise((resolve : Function, reject : Function) => { + return exec(iwgetid, (err : Error, stdout : string, stderr : string) => { + if (err) { + return reject(err) + } + output = stdout.split('ESSID:')[1].replace(quoteRe, '').trim() + return resolve(output) + }) + }) + } } -module.exports = new Wifi() \ No newline at end of file +module.exports.Wifi = Wifi \ No newline at end of file