UNPKG

nda-installer

Version:

An application to deploy NodeJS projects from an internet browser

106 lines (100 loc) 4.21 kB
'use strict'; /** * NDA is protected by DMCA (2022). * It's source code is licensed under GNU AGPL 3.0 */ const { stopAllProjects, _projects } = require('../models/process'); const os = require('os'); const fs = require('fs'); const path = require('path'); const { exec } = require('child_process'); const projectConfig = require('../../config/project-configs'); const utils = require('../helpers/utilities'); const CONFIG_PATH = projectConfig.CHILD_PROCESS_BASE_CONFIG_PATH; const vbsPath = path.resolve(CONFIG_PATH, 'executer.vbs'); const { getSSLConfig } = require('../helpers/nda-config'); async function stopNDA(isLinux) { await stopAllProjects(); let pidPath = path.resolve(CONFIG_PATH, 'pid.txt'); let portPath = path.resolve(CONFIG_PATH, 'port.txt'); let pid = fs.existsSync(pidPath) ? fs.readFileSync(pidPath) : null; if (pid && pidPath) { if (isLinux) { exec(`kill -9 ${pid.toString().trim()}`, {}); } else { fs.writeFileSync(vbsPath, `CreateObject("WScript.Shell").Run "taskkill /F /PID ${pid.toString().trim()}", 0`); exec(vbsPath, {}); } fs.unlinkSync(pidPath); fs.unlinkSync(portPath); console.log('NDA is stopped now.\n'); } else { console.log('NDA is not running.'); } } async function handleCommands(isLinux) { switch (true) { case process.argv.slice(2)[0].toString().trim() === 'run': let port = process.argv.slice(3)[0]; process.env.openInBrowser = 'true'; process.env.port = port ? parseInt(port.toString().trim()) : 8055; console.log(`Starting NDA in port ${process.env.port}..\n`); if (isLinux) { require('../../bin/start-linux'); } else { require('../../bin/start'); } break; case process.argv.slice(2)[0].toString().trim() === 'sleep': await stopNDA(isLinux); break; case process.argv.slice(2)[0].toString().trim() === 'status': let pidPath = path.resolve(CONFIG_PATH, 'pid.txt'); let previousPid = fs.existsSync(pidPath) ? fs.readFileSync(pidPath) : null; if (previousPid && utils.isPidRunning(previousPid)) { let portPath = path.resolve(CONFIG_PATH, 'port.txt'); let previousPort = fs.existsSync(portPath) ? fs.readFileSync(portPath) : null; const { protocol } = getSSLConfig(); console.log(`NDA is running on port - ${previousPort}. Open ${protocol}://localhost:${previousPort} in an internet browser.`); } else { console.log('NDA is not running.'); } break; case process.argv.slice(2)[0].toString().trim() === 'respawn': let pidIdPath = path.resolve(CONFIG_PATH, 'pid.txt'); let previousPidId = fs.existsSync(pidIdPath) ? fs.readFileSync(pidIdPath) : null; if (previousPidId && utils.isPidRunning(previousPidId)) { let ndaPort = fs.readFileSync(path.resolve(CONFIG_PATH, 'port.txt')); let projects = await _projects(); let runningProjects = []; for (let i = 0; i < projects.length; i++) { if (projects[i].pid && parseInt(projects[i].pid) > 0) { runningProjects.push(projects[i].UID); } } await stopNDA(isLinux); process.env.openInBrowser = 'true'; process.env.port = ndaPort.toString().trim(); fs.writeFileSync(path.resolve(CONFIG_PATH, 'runningPids.txt'), runningProjects.toString()); console.log(`Starting NDA in port ${process.env.port}..\n`); let startInterval = setInterval(function () { utils.isPortInUse(process.env.port, (data) => { if (data && !data.inUse) { clearInterval(startInterval); if (isLinux) { require('../../bin/start-linux'); } else { require('../../bin/start'); } } }); }, 2000); } else { console.log('NDA is not running. Respawn option will work only when it is in running state'); } break; }; } if (process.argv.slice(2).length > 0) { handleCommands(os.type().indexOf('Windows') > -1 ? false : true); }