Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Authorize client restart and wipe fixes #408

Merged
merged 1 commit into from
Nov 21, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 7 additions & 11 deletions lib/agent/actions/wipe/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,7 @@ exports.start = function(opts, cb) {
// run it as another process, using impersonation (to avoid permission errors)
var spawn = function() {
var wipe_opts = [
'-device-key', keys.get().device.toString(),
'-token', opts.token,
'-token', opts.token,
exports.cloud.toString(),
exports.directories.toString()
];
Expand All @@ -105,13 +104,11 @@ exports.start = function(opts, cb) {
if (typeof child == 'function') { // only for windows
os_wipe.paths.directories = exports.directories;

wipe.fetch_dirs(items, exports.directories, exports.cloud, (err, dirs_to_wipe) => {
wipe.fetch_dirs(items, exports.directories, exports.cloud, function(err, dirs_to_wipe) {
var opts = {
dirs: dirs_to_wipe,
token: token,
key: keys.get().device.toString(),
options: {
dirs: dirs_to_wipe
}
key: keys.get().device.toString()
};

child('wipe', opts, function(err) {
Expand All @@ -124,7 +121,7 @@ exports.start = function(opts, cb) {
child.stdout.on('data', function(str) {
var lines = str.toString().split(/\n/);
lines.forEach(function(line) {
if (line.toString().match('Removing file')) {
if (line.toString().match('Removing directory')) {
logger.warn(line.trim());
removed++;
} else if (line.toString().match('Error while removing dir')) {
Expand All @@ -148,14 +145,14 @@ exports.start = function(opts, cb) {
}

var finished = function(err, service) {
logger.warn('Process finished! ' + (service ? '' : removed + ' file(s) removed.'));
logger.warn('Process finished! ' + (service ? '' : removed + ' dir(s) removed.'));

if (!emitter) return;
if (service) return emitter.emit('end', err);

// if no files were removed, treat that as an error
if (!err && removed == 0) {
emitter.emit('end', new Error('No files were removed.'));
emitter.emit('end', new Error('No dirs were removed.'));
} else {
emitter.emit('end', err, { files_removed: removed });
}
Expand All @@ -164,7 +161,6 @@ exports.start = function(opts, cb) {
emitter = new Emitter;
cb(null, emitter);
fs.existsSync(node_bin) ? spawn() : finished(new Error('Node binary not present'));
if (!opts.token) return finished(new Error("Security Token necessary"))

}

Expand Down
Binary file modified lib/agent/actions/wipe/linux/wipe-linux
Binary file not shown.
Binary file modified lib/agent/actions/wipe/mac/wipe-osx
Binary file not shown.
Binary file modified lib/agent/actions/wipe/windows/wipe-win.exe
100755 → 100644
Binary file not shown.
12 changes: 9 additions & 3 deletions lib/agent/actions/wipe/wipe.js
Original file line number Diff line number Diff line change
Expand Up @@ -171,9 +171,15 @@ exports.fetch_dirs = function(items, to_erase, to_kill, cb) {
}

exports.wipeout = function(cb) {
var cmd = secure_wipe_cmd + '"' + dirs_to_wipe.join(',') + '" ' + credentials.join(' ');
exec(cmd, (err, stdout) => {
return cb(err, stdout)
var output = '';
dirs_to_wipe.forEach((dir, index) => {
var cmd = secure_wipe_cmd + '"' + dir + '" ' + credentials.join(' ');

exec(cmd, (err, stdout) => {
output += stdout;
if (index == dirs_to_wipe.length - 1)
return cb(err, output)
})
})
}

Expand Down
4 changes: 2 additions & 2 deletions lib/agent/triggers/hostname/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ var check_hostname = () => {
}

get_current_hostname()
.catch(error => { return done(new Error('Unable to get device current hostname')) })
.then(current_name => {
device_keys.exist('hostname', (err, stored) => {
if (err) return done(new Error('Error checking stored hostname'));
Expand All @@ -54,12 +53,12 @@ var check_hostname = () => {
} else device_keys.store('hostname', current_name, (err) => { done(err) });
});
})
.catch(error => { return done(new Error('Unable to get device current hostname')) })

}

exports.start = (opts, cb) => {
triggers.watch('hostname')
.catch(error => { return cb(error); })
.then((hostname) => {
hostname.on('state_changed', (info) => {
check_hostname();
Expand All @@ -69,6 +68,7 @@ exports.start = (opts, cb) => {

check_hostname();
})
.catch(error => { return cb(error); })
};

exports.stop = () => {
Expand Down
2 changes: 1 addition & 1 deletion lib/agent/triggers/power/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ var check_battery_status = () => {
exports.start = (opts, cb) => {

triggers.watch('power')
.catch(error => { return cb(error); })
.then((power) => {
power.on('state_changed', (info) => {
setTimeout(check_battery_status, 1500);
Expand All @@ -43,6 +42,7 @@ exports.start = (opts, cb) => {
emitter = new Emitter();
cb(null, emitter);
})
.catch(error => { return cb(error); })
};

exports.stop = () => {
Expand Down
2 changes: 1 addition & 1 deletion lib/agent/utils/custom-dirs.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ exports.validateCustomDirs = (dirs, should_be_home) => {
let directories = [],
cloud = {};

dirs = dirs.split(',');
dirs = dirs.split(/[\n,]+/);
dirs.forEach((dir, index) => {
dirs[index] = dir.trim();

Expand Down
29 changes: 29 additions & 0 deletions lib/conf/cli.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ common.program.logfile = system.tempfile_path(logfile);

var argv = process.argv.splice(3),
Operetta = require('./utils/operetta').Operetta,
exec = require('child_process').exec,
cli = new Operetta(argv, 'config');

var account = require('./account'),
Expand All @@ -46,6 +47,30 @@ var via_npm = function() {
return !!(process.env.npm_package_version || process.env.npm_lifecycle_script);
}

var restart_client = () => {
var client_pid = function(cb) {
var process_id;
if (os_name == 'windows') {
process_id = `for /f "tokens=2 delims=," %F in ('tasklist /nh /fi "imagename eq node.exe" /fo csv') do @echo %~F`;
} else {
var awk = os_name == 'mac' ? 2 : 1
process_id = "ps -u prey | grep prx | awk '{print $'" + awk + "'}'";
}

exec(process_id, function(err, pid) {
if (err) return cb("Error getting client process id:" + err)
pid = pid.toString().split("\r\n")[0];
cb(null, pid)
})
}

client_pid(function(err, pid) {
if (err || !pid) return;
var restart_cmd = os_name == 'windows' ? 'taskkill /F /PID ' : 'kill -9 ';
exec(restart_cmd + pid);
})
}

var start = function(cb) {

var run = function(scope, command) {
Expand Down Expand Up @@ -75,6 +100,10 @@ var start = function(cb) {
cmd.parameters(['-e', '--email'], 'Email')
cmd.parameters(['-p', '--password'], 'Password')
run_if_writable(cmd, account.authorize);

setTimeout(() => { // Wait for the key to be set
restart_client();
}, 2000)
});

sub.command('verify', 'Verifies API & Device keys, optionally saving them to config.', function(cmd) {
Expand Down
14 changes: 4 additions & 10 deletions lib/system/windows/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,7 @@ var path = require('path'),
spawn = cp.spawn,
os_name = process.platform.replace('win32', 'windows');

var LOCALHOST_SERVICE = 'http://127.0.0.1:7739',
OPEN_TIMEOUT = 1000 * 60 * 60;

var LOCALHOST_ACTION = 'http://127.0.0.1:7739/action';
exports.monitoring_service_go = false;

// add windows bin path to env
Expand Down Expand Up @@ -77,7 +75,7 @@ exports.scan_networks = function(cb) {
exports.check_service = function(data, cb) {
if (exports.monitoring_service_go) return cb(null, data);

needle.get(LOCALHOST_SERVICE + '/action', function(err, resp) {
needle.get(LOCALHOST_ACTION, function(err, resp) {
if (err) return cb(err, data);
exports.monitoring_service_go = true;
return cb(null, data);
Expand All @@ -89,14 +87,10 @@ exports.run_as_admin = function(command, opts, cb) {
action: command,
key: opts.key,
token: opts.token,
opts: opts.options
},
options = {
json: true,
open_timeout: OPEN_TIMEOUT
opts: opts.dirs
};

needle.post(LOCALHOST_SERVICE + '/action', body, options, function(err, resp, body) {
needle.post(LOCALHOST_ACTION, body, { json : true }, function(err, resp, body) {
if (err) return cb(err);
return cb(null);
});
Expand Down