masq
Version:
A simple local dns server extracted from Pow
178 lines (160 loc) • 5.06 kB
JavaScript
// Generated by CoffeeScript 2.0.0-beta2
(function() {
var Stream, async, exec, execFile, fs, getUserLocale, getUserShell, loginExec, makeTemporaryFilename, parseEnv, path, quote, readAndUnlink;
fs = require("fs");
path = require("path");
async = require("async");
({execFile} = require("child_process"));
({Stream} = require("stream"));
exports.chown = function(path, owner, callback) {
var error;
error = "";
return exec(["chown", owner, path], function(err, stdout, stderr) {
if (err) {
return callback(err, stderr);
} else {
return callback(null);
}
});
};
exports.sourceScriptEnv = function(script, env, options, callback) {
var command, cwd, filename, ref;
if (options.call) {
callback = options;
options = {};
} else {
if (options == null) {
options = {};
}
}
cwd = path.dirname(script);
filename = makeTemporaryFilename();
command = `${(ref = options.before) != null ? ref : "true"} &&\nsource ${quote(script)} > /dev/null &&\nenv > ${quote(filename)}`;
return exec(["bash", "-c", command], {cwd, env}, function(err, stdout, stderr) {
if (err) {
err.message = `'${script}' failed to load:\n${command}`;
err.stdout = stdout;
err.stderr = stderr;
return callback(err);
} else {
return readAndUnlink(filename, function(err, result) {
if (err) {
return callback(err);
} else {
return callback(null, parseEnv(result));
}
});
}
});
};
exports.getUserEnv = function(callback, defaultEncoding = "UTF-8") {
var filename;
filename = makeTemporaryFilename();
return loginExec(`exec env > ${quote(filename)}`, function(err) {
if (err) {
return callback(err);
} else {
return readAndUnlink(filename, function(err, result) {
if (err) {
return callback(err);
} else {
return getUserLocale(function(locale) {
var env;
env = parseEnv(result);
if (env.LANG == null) {
env.LANG = `${locale}.${defaultEncoding}`;
}
return callback(null, env);
});
}
});
}
});
};
exec = function(command, options, callback) {
if (callback == null) {
callback = options;
options = {};
}
return execFile("/usr/bin/env", command, options, callback);
};
quote = function(string) {
return "'" + string.replace(/\'/g, "'\\''") + "'";
};
makeTemporaryFilename = function() {
var filename, random, ref, timestamp, tmpdir;
tmpdir = (ref = process.env.TMPDIR) != null ? ref : "/tmp";
timestamp = new Date().getTime();
random = parseInt(Math.random() * Math.pow(2, 16));
filename = `masq.${process.pid}.${timestamp}.${random}`;
return path.join(tmpdir, filename);
};
readAndUnlink = function(filename, callback) {
return fs.readFile(filename, "utf8", function(err, contents) {
if (err) {
return callback(err);
} else {
return fs.unlink(filename, function(err) {
if (err) {
return callback(err);
} else {
return callback(null, contents);
}
});
}
});
};
loginExec = function(command, callback) {
return getUserShell(function(shell) {
var login;
login = ["login", "-qf", process.env.LOGNAME, shell];
return exec([...login, "-i", "-c", command], function(err, stdout, stderr) {
if (err) {
return exec([...login, "-c", command], callback);
} else {
return callback(null, stdout, stderr);
}
});
});
};
getUserShell = function(callback) {
var command;
command = ["dscl", ".", "-read", `/Users/${process.env.LOGNAME}`, "UserShell"];
return exec(command, function(err, stdout, stderr) {
var match, matches, shell;
if (err) {
return callback(process.env.SHELL);
} else {
if (matches = stdout.trim().match(/^UserShell: (.+)$/)) {
[match, shell] = matches;
return callback(shell);
} else {
return callback(process.env.SHELL);
}
}
});
};
getUserLocale = function(callback) {
return exec(["defaults", "read", "-g", "AppleLocale"], function(err, stdout, stderr) {
var locale, ref;
locale = (ref = stdout != null ? stdout.trim() : void 0) != null ? ref : "";
if (!locale.match(/^\w+$/)) {
locale = "en_US";
}
return callback(locale);
});
};
parseEnv = function(stdout) {
var env, i, len, line, match, matches, name, ref, value;
env = {};
ref = stdout.split("\n");
for (i = 0, len = ref.length; i < len; i++) {
line = ref[i];
if (matches = line.match(/([^=]+)=(.+)/)) {
[match, name, value] = matches;
env[name] = value;
}
}
return env;
};
}).call(this);