Files
RaspiWifi-Node/src/lib/utils.js
2022-08-26 12:49:14 +02:00

174 lines
5.8 KiB
JavaScript

const child_process = require('child_process');
const execSync = child_process.execSync;
const _consoleColorCodes = {
Reset: "\x1b[0m",
Bright: "\x1b[1m",
Dim: "\x1b[2m",
Underscore: "\x1b[4m",
Blink: "\x1b[5m",
Reverse: "\x1b[7m",
Hidden: "\x1b[8m",
FgBlack: "\x1b[30m",
FgRed: "\x1b[31m",
FgGreen: "\x1b[32m",
FgYellow: "\x1b[33m",
FgBlue: "\x1b[34m",
FgMagenta: "\x1b[35m",
FgCyan: "\x1b[36m",
FgWhite: "\x1b[37m",
BgBlack: "\x1b[40m",
BgRed: "\x1b[41m",
BgGreen: "\x1b[42m",
BgYellow: "\x1b[43m",
BgBlue: "\x1b[44m",
BgMagenta: "\x1b[45m",
BgCyan: "\x1b[46m",
BgWhite: "\x1b[47m",
}
function Utils() {
this.consoleColorCodes = _consoleColorCodes;
}
Utils.prototype.isCurrentUserRoot = function () {
return process.getuid() == 0; // UID 0 is always root
}
Utils.prototype.printWelcomeMessage = function () {
console.log("###################################")
console.log("##### RaspiWiFi Intial Setup #####")
console.log("###################################")
}
Utils.prototype.printSetupCanceledMessage = function () {
console.log("")
console.log("")
console.log("===================================================")
console.log("---------------------------------------------------")
console.log("")
console.log("RaspiWiFi installation cancelled. Nothing changed...")
console.log("")
console.log("---------------------------------------------------")
console.log("===================================================")
console.log("")
console.log("")
}
Utils.prototype.printFinishedMessage = function () {
console.log("")
console.log("")
console.log("#####################################")
console.log("##### RaspiWiFi Setup Complete #####")
console.log("#####################################")
console.log("")
console.log("")
}
Utils.prototype.checkForYN = function (input) {
if (input.toLowerCase() !== 'y' && input.toLowerCase() !== 'n') {
this.printColor(this.consoleColorCodes.FgRed, 'Please enter y or n!');
return false;
}
return true;
}
Utils.prototype.printColor = function (color, ...args) {
console.log(color, ...args, this.consoleColorCodes.Reset);
}
Utils.prototype.clearConsole = () => {
//process.stdout.write('\033c');
process.stdout.write('\x1bc');
}
Utils.prototype.installSystemDependencies = function () {
this.clearConsole();
execSync('apt update');
this.clearConsole();
execSync('apt install python3 python3-rpi.gpio python3-pip dnsmasq hostapd -y')
}
Utils.prototype.copyConfigs = function (isWpaEabled) {
/* Creating application directories */
this.printColor(null, 'Creating application directories');
execSync('mkdir /usr/lib/raspiwifi');
execSync('mkdir /etc/raspiwifi');
execSync('mkdir /etc/cron.raspiwifi');
/* Copy application files */
this.printColor(null, 'Copy application files');
execSync('cp -a libs/* /usr/lib/raspiwifi/');
/* Backing up current files */
this.printColor(null, 'Backing up current files');
execSync('mv /etc/wpa_supplicant/wpa_supplicant.conf /etc/wpa_supplicant/wpa_supplicant.conf.original');
execSync('mv /etc/dnsmasq.conf /etc/dnsmasq.conf.original');
execSync('mv /etc/dhcpcd.conf /etc/dhcpcd.conf.original');
/* Copy default files for basic device setup*/
this.printColor(null, 'Copy default files for basic device setup');
execSync('cp /usr/lib/raspiwifi/reset_device/static_files/dnsmasq.conf /etc/');
execSync('cp /usr/lib/raspiwifi/reset_device/static_files/dhcpcd.conf /etc/');
if (isWpaEabled)
execSync('cp /usr/lib/raspiwifi/reset_device/static_files/hostapd.conf.wpa /etc/hostapd/hostapd.conf');
else
execSync('cp /usr/lib/raspiwifi/reset_device/static_files/hostapd.conf.nowpa /etc/hostapd/hostapd.conf');
execSync('cp /usr/lib/raspiwifi/reset_device/static_files/aphost_bootstrapper /etc/cron.raspiwifi')
execSync('chmod +x /etc/cron.raspiwifi/aphost_bootstrapper');
execSync('mv /usr/lib/raspiwifi/reset_device/static_files/raspiwifi.conf /etc/raspiwifi');
/* TODO: Setting up CRON for running monitoring jobs */
this.printColor(null, 'Setting up CRON for running monitoring jobs');
execSync('echo "# RaspiWiFi Startup" >> /etc/crontab');
execSync('echo "@reboot root run-parts /etc/cron.raspiwifi/" >> /etc/crontab');
/* Finishing things up */
this.printColor(null, 'Finishing things up');
execSync('touch /etc/raspiwifi/host_mode');
}
Utils.prototype.updateMainConfigFile = function ({ ssid, autoConfig, autoConfigDelay, sslEnabled, serverPort, wpaEnabled, wpaSecret }) {
console.log(this);
const outputString = this.serializeMainConfigFile({ ssid, autoConfig, autoConfigDelay, sslEnabled, serverPort, wpaEnabled, wpaSecret });
const fileName = '/etc/raspiwifi/raspiwifi.conf'
execSync('cat <<EOF >' + fileName + '\n' + outputString)
}
Utils.prototype.reboot = function () {
execSync('reboot');
}
Utils.prototype.serializeMainConfigFile = function ({ ssid, autoConfig, autoConfigDelay, sslEnabled, serverPort, wpaEnabled, wpaSecret }) {
const output = {
'SSID': ssid,
'AutoReconfig': autoConfig,
'AutoReconfigDelay': autoConfigDelay,
'SSLEnabled': sslEnabled,
'ServerPort': serverPort,
'WPAEnabled': wpaEnabled,
'PSK': wpaSecret ?? '',
}
return JSON.stringify(output, null, 2);
}
Utils.prototype.deserializeMainConfigFile = (input) => {
const obj = JSON.parse(input);
return {
ssid: obj['SSID'],
autoConfig: obj['AutoReconfig'],
autoConfigDelay: obj['AutoReconfigDelay'],
sslEnabled: obj['SSLEnabled'],
serverPort: obj['ServerPort'],
wpaEnabled: obj['WPAEnabled'],
wpaSecret: obj['PSK'] ?? '',
}
}
module.exports = Utils;