var spawn = require('child_process').spawn, exec = require('child_process').exec, db = require('../../models/webideModel'), net = require('net'), path = require('path'), ws_helper = require('../websocket_helper'), debug_program, debug_client, client_connected = false, HOST = '127.0.0.1', PORT = 5000, buffer = '', enable_debug = false, VALID_COMMANDS = ['NEXT', 'STEP', 'RUN', 'QUIT', 'LOCALS', 'GLOBALS', 'ADD_BP', 'REMOVE_BP']; exports.kill_debug = function kill_debug(should_enable, cb) { if (debug_program && debug_program.pid) { enable_debug = should_enable; var killer = exec('sudo kill ' + debug_program.pid, function(err, stdout, stderr) { console.log(err, stdout, stderr); console.log("Killed Debugger"); cb(); }); } return; }; exports.start_debug = function start_debug(file, socket) { var self = this; console.log("start_debug"); console.log(!debug_program); if (!debug_program) { console.log('spawn debugger'); db.findOne({type: "editor:settings"}, function(err, settings) { var command = 'python'; if (typeof settings !== 'undefined' && settings.python_version === '3') { command = 'python3'; } debug_program = spawn("sudo", [command, "debugger.py"], {cwd: __dirname}); var buffer = ""; debug_program.stdout.on('data', function(data) { console.log(data.toString()); buffer += data.toString(); if (buffer.indexOf("DEBUGGER READY") !== -1 && !client_connected) { console.log("DEBUGGER READY"); connect_client(file, socket); console.log("after connect_client"); } }); debug_program.stderr.on('data', function(data) { console.log(data.toString()); ws_helper.send_message(socket, 'debug-error', {file: file, error: data}); }); debug_program.on('error', function(data) { console.log("DEBUG PROGRAM ERROR:"); console.log(data); }); debug_program.on('exit', function(code) { console.log('Debug Program Exit'); console.log(code); debug_program = null; if (enable_debug) { self.start_debug(file, socket); } }); }); } else { //console.log('resetting debugger'); self.kill_debug(true, function() { //nothing to wait for here...exit will start a new process to debug }); } }; function get_file_path(file) { return path.resolve(__dirname + "/../../repositories/" + file.path.replace('/filesystem/', '')); } function connect_client(file, socket) { var file_path = get_file_path(file); console.log("connect_client"); if (!debug_client) { debug_client = new net.Socket(); debug_client.connect(PORT, HOST, function() { socket.emit('debug-client-connected'); ws_helper.send_message(socket, 'debug-client-connected', ""); client_connected = true; console.log('connected to python debugger: ' + HOST + ':' + PORT); console.log(file_path); debug_client.write('DEBUG\t' + file_path + '\n'); }); debug_client.on('data', function(data) { buffer += data.toString(); if (buffer.indexOf('\n')) { var temp_buff = buffer.split('\n'); for (var i=0; i