UNPKG

blynk-cli

Version:

An utility to manage your Blynk server

314 lines (257 loc) 7 kB
'use strict' const u = require('./utils') const os = require('os') const fs = require('fs-extra') const request = require('request') const chalk = require('chalk') const MESSAGE_JAVA_MISSING = 'Please, install java first or make sure your PATH is valid.' var isJava8 = null fs.ensureDirSync(u.config.server.data) module.exports = { install: () => { if (_isInstalled()) { u.error('Blynk server already installed') } if (!_hasJava()) { u.error(MESSAGE_JAVA_MISSING) } fs.ensureDirSync(u.config.server.folder) let downloadURL = `https://github.com/blynkkk/blynk-server/releases/download/${u.config.server.version}` if(_isJava8()) { downloadURL += `/${_filenameJava8()}`; } else { downloadURL += `/${_filename()}` } u.info(`Downloading Blynk server ${u.config.server.version}`) request.get({ url: downloadURL, encoding: null }, (err, res, data) => { if (err) { u.error(err) } else if (res.statusCode !== 200) { u.error(res.statusCode) } else { // Write downloaded file to server path fs.writeFileSync(_path(), data, { encoding: null, mode: 0o755 }) u.info('Creating default configuration') fs.writeFileSync(u.config.server.properties, 'admin.email=admin@blynk.cc\nadmin.pass=fablab\nlogs.folder=' + u.config.server.logs, { mode: 0o644 }) u.success('Installation complete') } }) }, isInstalled: displayError => { return _isInstalled(displayError) }, isStarted: () => { return _isStarted() }, restart: () => { _isInstalled(true) _stop() _start() }, start: () => { _isInstalled(true) _start() }, status: () => { _isInstalled(true) if (_isStarted()) { u.info('Blynk server is ' + chalk.green('online')) } else { u.info('Blynk server is ' + chalk.red('offline')) } }, stop: () => { _isInstalled(true) _stop() }, uninstall: () => { _isInstalled(true) const enquirer = require('enquirer')() enquirer.register('confirm', require('prompt-confirm')) enquirer.question('confirm', 'Are you sure you want to uninstall Blynk server? ', { type: 'confirm' }) enquirer .ask('confirm') .then(answers => { if (answers.confirm) { _stop() fs.removeSync(u.config.server.folder) u.success('Uninstall complete') } else { u.info('Aborting...') } }) }, update: () => { _isInstalled(true) var lastAPIURL = 'https://api.github.com/repos/blynkkk/blynk-server/releases/latest' request.get({ url: lastAPIURL, json: true, headers: {'User-Agent': 'request'} }, (err, res, data) => { if (err) { u.error(err) } else if (res.statusCode !== 200) { u.error('Status: ' + res.statusCode) } else { let asset = _isJava8() ? 1 : 0 let newVersion = data.tag_name let newDownloadURL = data.assets[asset].browser_download_url let newFilename = data.assets[asset].name if (newVersion === u.config.server.version && fs.existsSync(_path(newFilename))) { u.info('Your Blynk server is already up to date.') return } u.info(`Update ${newVersion} available. Downloading...`) request.get({ url: newDownloadURL, encoding: null }, (err, res, data) => { if (err) { u.error(err) } else if (res.statusCode !== 200) { u.error(res.statusCode) } else { let isStarted = _isStarted() if (isStarted) { _stop() } require('./backup').create({name: 'auto-update'}) fs.writeFile(_path(newFilename), data, { encoding: null, mode: 0o755 }, (err) => { if (err) { u.error(err) } else { // Remove old server fs.unlink(_path(), (err) => { if (err) { u.error(err) } }) // Update config file u.config.server.version = newVersion fs.writeJson(u.configPath, u.config, {spaces: 2}, (err) => { if (err) { u.error(err) } }) u.success('Update complete') if (isStarted) { _start() } } }) } }) } }) }, version: () => { _isInstalled(true) console.log(u.config.server.version) } } function _filename () { return `server-${u.config.server.version.substr(1)}.jar` } function _filenameJava8() { return `server-${u.config.server.version.substr(1)}-java8.jar` } function _isInstalled (displayError) { if (!fs.existsSync(_path())) { if (displayError) { u.error('You must install Blynk server first') } else { return false } } return true } function _hasJava() { var spawn = require('child_process').spawnSync('java', ['-version']) if (spawn.error) { return false } return true } function _isJava8() { if (null === isJava8) { if(!_hasJava()) { u.error(MESSAGE_JAVA_MISSING) } var version = require('child_process').execSync('java -version 2>&1 | head -n 1', {'stdio': 'pipe'}).toString() if ("1.8" === version.split(' ')[2].substr(1, 3)) { isJava8 = true } else { isJava8 = false } } return isJava8 } function _isStarted () { if (fs.existsSync(u.PIDFile)) { let pid = fs.readFileSync(u.PIDFile, 'utf-8') if (!isNaN(pid)) { try { process.kill(pid, 0) return pid } catch (err) {} } } return false } function _path (filename = null) { if (null === filename) { var name = _isJava8() ? _filenameJava8() : _filename() } return `${u.config.server.folder}/${name}` } function _start () { var spawn = require('child_process').spawn if (!_isStarted()) { var java = spawn('java', [ '-jar', _path(), '-dataFolder', u.config.server.data, '-serverConfig', u.config.server.properties ], { stdio: [ 'ignore', fs.openSync(os.tmpdir() + '/blynk.log', 'a'), fs.openSync(os.tmpdir() + '/blynk.log', 'a') ], detached: true }) fs.writeFileSync(u.PIDFile, java.pid) java.unref() u.success('Blynk server started') } else { u.info('Server already started') } } function _stop () { var pid = _isStarted() if (pid) { try { process.kill(pid, 'SIGTERM') // Remove PID file fs.removeSync(u.PIDFile) u.success('Blynk server stopped') } catch (err) { u.error(err) } } else { u.info('Blynk server already stopped.') } }