intval3/lib/wifi/index.js

145 lines
4.0 KiB
JavaScript

'use strict'
const networkPattern = /network[\s\S]*?=[\s\S]*?{([\s\S]*?)}/gi
const quoteRe = new RegExp('"', 'g')
const filePath = '/etc/wpa_supplicant/wpa_supplicant.conf'
const reconfigure = '/sbin/wpa_cli reconfigure'
const refresh = '/sbin/ifdown wlan0 && /sbin/ifup --force wlan0'
const iwlist = '/sbin/iwlist wlan0 scanning | grep "ESSID:"'
const iwgetid = '/sbin/iwgetid'
const exec = require('child_process').exec
const fs = require('fs')
/** Class representing the wifi features */
class Wifi {
constructor () {
this._callback = () => {}
this._entry = null
this._ssid = null
}
/**
* Wifi.list() -
* List available wifi access points
*
* @param {function} callback Function which gets invoked after list is returned
*/
list (callback) {
exec(iwlist, (err, stdout, stderr) => {
if (err) {
console.error(err)
return callback(err)
}
const lines = stdout.split('\n')
const output = []
let line
for (let l of lines) {
line = l.replace('ESSID:', '').trim()
if (line !== '""') {
line = line.replace(quoteRe, '')
output.push(line)
}
}
return callback(null, output)
})
}
/**
* Wifi._readConfigCb() -
* (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) {
if (err) {
console.error(err)
return this._callback(err)
}
if (data.search(networkPattern) === -1) {
data += `\n${this._entry}`
} else {
data = data.replace(networkPattern, this._entry)
}
this._entry = null
fs.writeFile(filePath, data, 'utf8', this._writeConfigCb)
}
/**
* Wifi._writeConfigCb() -
* (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._callback(err)
}
exec(reconfigure, this._reconfigureCb)
}
/**
* Wifi._reconfigureCb() -
* (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._callback(err)
}
console.log('Wifi reconfigured')
exec(refresh, this._refreshCb)
}
/**
* Wifi._refreshCb() -
* (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._callback(err)
}
console.log('Wifi refreshed')
//this._callback(null, { ssid : ssid, pwd : pwd.length })
this._callback = () => {}
}
/**
* Wifi.setNetwork() -
* Function which initializes the processes for adding a wifi access point authentication
*
* @param {string} ssid SSID of network to configure
* @param {string} pwd Password of access point, plaintext
* @param {function} callback Function invoked after process is complete, or fails
*/
setNetwork (ssid, pwd, callback) {
this._entry = `network={\n\tssid="${ssid}"\n\tpsk="${pwd}"\n}\n`
this._callback = callback
this._ssid = ssid
fs.readFile(filePath, 'utf8', this._readConfigCb)
}
/**
* Wifi.getNetwork() -
* Executes command which gets the currently connected network
*
* @param {function} callback Function which is invoked after command is completed
*/
getNetwork (callback) {
exec(iwgetid, (err, stdout, stderr) => {
if (err) {
return callback(err)
}
callback(null, stdout)
})
}
}
module.exports = new Wifi()