denis-sokolov/remote-dotfiles

View on GitHub
src/ssh.js

Summary

Maintainability
A
1 hr
Test Coverage
'use strict';

var is = require('is');
var Vinyl = require('vinyl');

var contents = function(servers, proxies, custom, target){
    return (servers || []).filter(function(server){
        return server.alias !== target.alias;
    }).map(function(server){
        var rules = [];

        if (server.alias !== server.host)
            rules.push('HostName ' + server.host);

        if (server.forwardAgent)
            rules.push('ForwardAgent yes');

        if (server.port)
            rules.push('Port ' + server.port);

        if (server.user)
            rules.push('User ' + server.user);

        var proxy = proxies && proxies(target, server);
        if (proxy && proxy !== target.alias)
            rules.push('ProxyCommand ssh ' + proxy + ' -W %h:%p 2>/dev/null');

        return 'Host ' + server.alias + '\n' +
            rules.map(function(rule){ return '\t' + rule + '\n'; }).join('');
    }).join('\n') + 'Host *\n' + (custom || '') + '\n';
};

module.exports = function(util, app){
    var custom = util.setting(app, 'ssh', is.string);
    var proxies = util.setting(app, 'proxies', is.function);

    return function(stream, servers, target){
        if (!servers && !custom()) return;

        stream.push(new Vinyl({
            path: '.ssh/config',
            contents: new Buffer(
                util.comment('# ') +
                contents(servers, proxies(), custom(), target)
            )
        }));
    };
};