forked from nodester/nodester
-
Notifications
You must be signed in to change notification settings - Fork 1
/
chroot.js
70 lines (67 loc) · 2.18 KB
/
chroot.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/*
* Nodester :: Open Source Node.JS PaaS
* chroot.js
* @license GNU Affero
* @latestUpdate: 30-03-2012
*/
(function() {
var lib = require('./lib.js');
var path = require('path');
var fs = require('fs');
var chroot = function(target) {
this._setup(target);
};
chroot.prototype._setup = function(target_path) {
this.errors = [];
this.target_path = target_path;
this.mounted = false;
this.proc_path = path.join(this.target_path, 'proc');
this.dev_path = path.join(this.target_path, 'dev');
};
chroot.prototype.start = function(cb) {
if (!path.existsSync(this.proc_path)) fs.mkdirSync(this.proc_path, '0777');
if (!path.existsSync(this.dev_path)) fs.mkdirSync(this.dev_path, '0777');
lib.ensure_mounted('/dev', this.dev_path, '--bind', function(respA) {
if (respA === true) {
lib.ensure_mounted('proc', this.proc_path, '-t proc', function(respB) {
if (respB === true) {
this.mounted = true;
cb(undefined, true);
} else {
this.errors.push(this.proc_path + ' is not mounted');
cb(this.errors, undefined);
}
}.bind(this));
} else {
this.errors.push(this.dev_path + ' is not mounted');
cb(this.errors, undefined);
}
}.bind(this));
};
chroot.prototype.stop = function(cb) {
if (this.mounted === true) {
var arr = ['sudo umount ' + this.dev_path, 'sudo umount ' + this.proc_path];
lib.exec_array(arr, function() {
lib.is_mounted(this.dev_path, function(respA) {
if (respA !== false) {
this.errors.push(this.dev_path + ' is still mounted');
cb(this.errors, undefined);
} else {
lib.is_mounted(this.proc_path, function(respB) {
if (respB !== false) {
this.errors.push(this.proc_path + ' is still mounted');
cb(this.errors, undefined);
} else {
this.mounted = false;
cb(undefined, true);
}
}.bind(this));
}
}.bind(this));
}.bind(this));
} else {
cb('not_mounted', undefined);
}
};
exports.chroot = chroot;
})();