UNPKG

masq

Version:

A simple local dns server extracted from Pow

178 lines (160 loc) 5.06 kB
// 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);