iobroker.js-controller
Version: 
Updated by reinstall.js on 2018-06-11T15:19:56.688Z
209 lines (186 loc) • 6.7 kB
JavaScript
/**
 * @fileOverview restart the controller
 * @author bluefox
 * @version 0.1
 */
'use strict';
/** @module restart */
// const fs    = require('fs-extra');
// const tools = require('./tools.js');
const { spawn } = require('child_process');
const os = require('os');
function restart(callback) {
    let cmd;
    let args;
    if (os.platform() === 'win32') {
        // On Windows, we execute the controller entry point directly
        cmd = 'iobroker.bat';
        args = ['restart'];
    } else {
        // Unix has a global iobroker binary that delegates to the init system
        // We need to call that, so we don't have two instances of ioBroker running
        cmd = 'iobroker';
        args = ['restart'];
    }
    const child = spawn(cmd, args, {
        detached: true,
        stdio: ['ignore', 'ignore', 'ignore'],
        windowsHide: true
    });
    child.unref();
    if (typeof callback === 'function') {
        setTimeout(() => callback(), 500);
    } else {
        setTimeout(() => process.exit(), 500);
    }
}
if (require.main !== module) {
    module.exports = restart;
} else {
    restart();
}
/*
let logFile;
try {
    const dir = `${__dirname}/../${tools.getDefaultDataDir()}../log`;
    if (!fs.existsSync(dir)) {
        fs.mkdirSync(dir);
    }
    logFile = dir + '/restart.log';
    console.log(require('path').normalize(logFile));
    if (fs.existsSync(logFile)) {
        fs.unlinkSync(logFile);
    }
    fs.writeFileSync(logFile, 'started\n');
} catch (err) {
    console.error(err);
}
function log(text) {
    const t = new Date().toString() + text;
    console.log(t);
    fs.appendFileSync(logFile, t + '\n');
}
function checkRoot(callback) {
    let data = '';
    const child = require('child_process').spawn('whoami', [], {windowsHide: true});
    child.stdout.on('data', text => data += text.toString().replace(/\n/g, ''));
    child.stderr.on('data', text => data += text.toString().replace(/\n/g, ''));
    child.on('exit', _exitCode => callback(data.trim() === 'root'));
}
function killPidsScript(callback) {
    checkRoot(isRoot => {
        let data = '';
        try {
            fs.chmodSync(__dirname + '/../killall.sh', '777');
            if (isRoot) {
                fs.writeFileSync(__dirname + '/../killall.sh', "sudo pgrep -f '^io.*' | sudo xargs kill -9\nsudo pgrep -f '^node-red*' | sudo xargs kill -9");
            } else {
                fs.writeFileSync(__dirname + '/../killall.sh', "pgrep -f '^io.*' | xargs kill -9\npgrep -f '^node-red*' | xargs kill -9");
            }
            const child = require('child_process').spawn(__dirname + '/../killall.sh', [], {windowsHide: true});
            child.stdout.on('data', text => data += text.toString().replace(/\n/g, ''));
            child.stderr.on('data', text => data += text.toString().replace(/\n/g, ''));
            child.on('exit', exitCode => {
                if (exitCode) {
                    log(`Exit code for "killall.sh": ${exitCode}`);
                }
                callback(exitCode, data);
            });
        } catch {
            log(`Cannot create "${__dirname}/../killall.sh"`);
            callback(-1);
        }
    });
}
function killPid(pid, callback) {
    let data = '';
    const child = require('child_process').spawn('kill', ['-KILL', pid], {windowsHide: true});
    child.stdout.on('data', text => data += text.toString().replace(/\n/g, ''));
    child.stderr.on('data', text => data += text.toString().replace(/\n/g, ''));
    child.on('exit', exitCode => {
        if (exitCode) {
            log(`Exit code for "kill -KILL ${pid}": ${exitCode}`);
        }
        callback(exitCode, data);
    });
}
function killPids(pids, callback) {
    if (pids && pids.length) {
        killPid(pids.pop(), () => killPids(pids, callback));
    } else {
        callback();
    }
}
if (require('os').platform().match(/^win/) && fs.existsSync(`${__dirname}/../_service_${tools.appName}.bat`)) {
    log(`Restarting service ${tools.appName}...`);
    const spawn = require('child_process').spawn;
    let fileName;
    if (fs.existsSync(__dirname + '/../../../log')) {
        fileName = __dirname + '/../../../log/restart.log';
    } else {
        fileName = `${__dirname}/../${tools.getDefaultDataDir()}../log/restart.log`;
        if (!fs.existsSync(fileName)) {
            fileName = __dirname + '/../log/restart.log';
        }
    }
    const stat = fs.statSync(fileName);
    if (stat.size > 1024 * 1024) {
        try {
            fs.unlinkSync(fileName);
        } catch (e) {
            console.log(`File is too big, but cannot delete restart.log: ${e.message}`);
        }
    }
    const out = fs.openSync(fileName, 'a');
    const err = out;
    log(`Starting ${__dirname}/../_service_${tools.appName}.bat`);
    const child = spawn('cmd.exe', ['/c', `${__dirname}/../_service_${tools.appName}.bat`], {
        detached: true,
        stdio: ['ignore', out, err],
        windowsHide: true
    });
    child.unref();
    process.exit();
} else if (!fs.existsSync(`${__dirname}/${tools.appName}.pid`)) {
    log(`${tools.appName} was started manually or was not running. Please restart it manually.`);
} else {
    log(`Restarting ${tools.appName}...`);
    const daemon = require('daemonize2').setup({
        main:       '../controller.js',
        name:       `${tools.appName} controller`,
        pidfile:     `${__dirname}/${tools.appName}.pid`,
        stopTimeout: 5000
    });
    log(`Stopping daemon ${tools.appName}...`);
    daemon.stop((_err, _pid) => {
        // force to stop all adapters
        if (fs.existsSync(__dirname + '/../pids.txt')) {
            try {
                const pids = fs.readJSONSync(__dirname + '/../pids.txt');
                killPids(pids, () => {
                    killPidsScript(() => {
                        log(`Starting daemon ${tools.appName}...`);
                        daemon.start((_err, _pid) => {
                            log(`Daemon ${tools.appName} started`);
                            process.exit();
                        });
                    });
                });
            } catch (e) {
                log('Error by pids.txt: ' + e);
                log(`Starting daemon ${tools.appName}...`);
                daemon.start((_err, _pid) => {
                    log(`Daemon ${tools.appName} started`);
                    process.exit();
                });
            }
        } else {
            log(`Starting daemon ${tools.appName}...`);
            daemon.start((_err, _pid) => {
                log(`Daemon ${tools.appName} started`);
                process.exit();
            });
        }
    });
}
*/