vantage, 分布式实时 node 应用的分布式实时 CLI

分享于 

21分钟阅读

GitHub

  繁體 雙語
A new take on interactive CLI for Node
  • 源代码名称:vantage
  • 源代码网址:http://www.github.com/dthree/vantage
  • vantage源代码文档
  • vantage源代码下载
  • Git URL:
    git://www.github.com/dthree/vantage.git
    Git Clone代码到本地:
    git clone http://www.github.com/dthree/vantage
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/dthree/vantage
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    

    vantage

    Build StatusGitterNPM Version


    Vantage = CLI + SSH + REPL,适用于你的live node 应用程序。 在一行中:

    require("vantage")().listen(4000);


    vantage.js demo

    电子邮件内容

    简介

    Vantage使你可以在以前的node 应用程序中获得新的视角。

    扩展了 Vorpal,Vantage将你的live node 应用变成身临其境的CLI。 for可以为你的应用程序构建自己的API,并导入社区扩展,介绍 devprod 环境的新手段。

    • 第一个类 CLI: tab完成,历史记录,你将它的命名为。
    • 用熟悉的commander.js 语法构建你自己的API。
    • ssh与远程访问 node 应用的客户端/服务器设置类似。
    • 生产就绪,带有认证中间件和基本防火墙。
    • 内置替换。

    它的他,或者CLI模块不同,voiceover允许远程连接到你的实时应用程序并透明访问 CLI。 Vantage可以通过跨多台机器。管道命令和信息的无限数量的实时 node 实例连接到本地终端。

    通知

    这现在是一个开放源码的开放源代码插件项目。 我无法投入大量的时间来维护利益,因这里寻找愿望成为项目活动维护者的志愿者。 如果你有兴趣,请给我一张便条。

    正在启动

    在这个有利的位置,我们将为你提供一个有利的Vantage。

    $ npm install -g vantage
    $ vantage tour
    示例社区快速启动

    首先,全局安装 Vantage:

    $ npm install -g vantage

    现在,将以下内容添加到名为 server.js的文件中。

    // Create a new instance of vantage.var vantage =require("vantage")();// Add the command"foo", which logs"bar".vantage
    . command("foo")
    . description("Outputs 'bar'.")
    . action(function(args, callback) {
     this.log("bar");
     callback();
     });// Name your prompt delimiter //"websvr~$", listen on port 80 // and show the Vantage prompt.vantage
    . delimiter("websvr~$")
    . listen(80)
    . show();

    运行 server.js 你的node 应用程序已经成为一个 CLI。

    $ node server.js
    websvr~$ 

    打开另一个终端因为Vantage正在侦听端口 80,你可以远程连接到它:

    $ vantage 80
    $ Connecting to 127.0.0.1:80 using http...
    websvr~$ 

    尝试"foo"命令。

    websvr~$ foo
    bar
    websvr~$

    现在键入"帮助"以查看除"foo"之外的命令中的vantage:

    websvr~$ help Commands
     help [command] Provides helpfor a given command.
     exit [options] Exits instance of Vantage.
     use <module> Installs a vantage extension in realtime.
     vantage [server] Connects to another application running vantage.
     foo Outputs "bar".
    websvr~$

    这是一个基本的想法。一旦你获得了它的挂起,阅读一些有利的东西可以。

    API

    Vantage是 Vorpal扩展,因此继承了它的所有属性和方法。 有关所有命令创建和CLI语法,请参见vorpal的API。

    . listen(app, [options or callback], [callback] )

    作为服务器启动。

    作为独立网络服务器的 Vantage

    如果只希望它在独立于web应用程序的端口上侦听,那么只需传入端口和,即可以。 每次客户端连接到Vantage时,将引发连接回调,并包含 socket.io 连接对象。

    var vantage =newVantage();vantage.listen(80, function(socket){
     this.log("Accepted a connection.")
    });
    与现有web服务器的优势

    如果你想要在与web应用程序相同的端口上进行侦听,可以使用of函数的listen 来代替现有的web listen

    当运行服务器的集群实例时,这很有用,例如 behind 一个反向代理,每个实例都有一个单独的端口。 这样,你可以跳入任何正在运行的实例而不用 Having 来记住一组单独的端口。

    带 Koa.js的
    var koa =require('koa');var Vantage =require('vantage');var vantage =newVantage();var app =koa();vantage.listen(app, 80);
    带 Express.js的
    var express =require('express');var Vantage =require('vantage');var vantage =newVantage();var app =express();vantage.listen(app, 80);
    带 Hapi.js的
    var Hapi =require('hapi');var Vantage =require('vantage');var vantage =newVantage();var server =newHapi.Server();vantage.listen(server, 80);server.start();
    带有 ssl/advance选项的

    你可以使用第二个参数将详细选项传递给你的web服务器,而不是端口。 这些选项与你将传入web服务器的选项相同,有几个例外:

    • options.port: 告诉vantage要监听哪个端口。
    • options.ssl: 表示是否要生成HTTP或者HTTPs服务器的布尔值。
    • options.logActivity: 当 true,当接收连接的有利服务器时,它将记录客户端登录和出站的时间。 默认为 false

    默认的HTTPs服务器示例:

    var vantage =newVantage();vantage.listen(someMiddleware, {
     port:443,
     ssl:true,
     key:fs.readFileSync('./../../server.key'),
     cert:fs.readFileSync('./../../server.crt'),
     ca:fs.readFileSync('./../../ca.crt'),
     requestCert:true,
     rejectUnauthorized:false,
    });

    . banner(string )

    设置登录到给定Vantage服务器时显示的横幅。

    var banner ="######################################################################"+"# Welcome to joescrabshack.com #"+"# #"+"# All connections are monitored and recorded #"+"# Disconnect IMMEDIATELY if you are not an authorized user #"+"######################################################################";
    vantage
    . delimiter('appsvr:3000~$')
    . banner(banner)
    . listen(3000);
    $ vantage 3000
    $ Connecting to 127.0.0.1:3000...
    $ Connected successfully.####################################################################### Welcome to joescrabshack.com # # ## All connections are monitored and recorded # # Disconnect IMMEDIATELY if you are not an authorized user # ######################################################################? user: 

    注:请参见身份验证详细信息的身份验证部分。

    防火墙

    如果你的有利服务器正在监听公共面向对象的web端口,例如 80或者 443,你的组织防火墙将不会帮助你。 这是一个用于限制连接到你的内部子网的骨干IP防火墙。 对于敏感应用程序,这显然不能取代认证。

    。防火墙。策略( 字符串)

    将防火墙的默认策略设置为 ACCEPT 或者 REJECT。 任何与规则不匹配的请求都将返回这里策略。 返回 vantage.firewall

    默认值为 ACCEPT

    // This will reject all remote connections.vantage.firewall.policy("REJECT");

    。firewall ( 地址,[subnet] )

    允许特定地址/子网连接到 Vantage。 返回 vantage.firewall 如果没有传递参数,则返回当前应用的策略。

    vantage.firewall. policy("REJECT")
    . accept("10.0.0.0/8")
    . accept("192.168.0.0", 24);console.log(vantage.firewall.policy()) // -> REJECT 

    。firewall。拒绝( 地址,[subnet] )

    拒绝访问特定地址/子网。 返回 vantage.firewall

    vantage.firewall. policy("ACCEPT")
    . reject("64.0.0.0", 8)
    . reject("192.168.0.0/16");

    有关详细信息,请参阅

    返回应用规则的array。

    console.log(vantage.firewall.rules());// -> [{ ip:"64.0.0.0", subnet: 8, rule:"REJECT" }]

    返回 。( )。

    vantage.firewall 恢复为 ACCEPT 策略并清除所有规则。

    身份验证

    Vantage支持作为中间件的身份验证策略。 它带有一个默认的基本认证模块。

    vantage.auth(middleware, options )

    使用给定的身份验证策略。 将所需的中间件传递到第一个变量,并将该中间件的任何选项/配置传递给选项参数。

    var pam =require("vantage-auth-pam");vantage.auth(pam, options);

    Vantage基本认证,因此可以与"基本"字符串一起使用,而不需要模块。

    var users = [
     { user:"admin", pass:"4k#842jx!%s" },
     { user:"user", pass:"Unicorn11" }
    ];var vantage =require("vantage")();vantage.auth("basic", {
     "users": users,
     "retry":3,
     "retryTime":500,
     "deny":1,
     "unlockTime":3000});
    安全注意事项

    如果未声明 vantage.auth 函数,则应用程序将不需要身份验证。 作为安全措施,如果 NODE_ENV 环境变量没有设置为"开发"并且没有身份验证,则,将禁止远程连接。 若要允许不进行身份验证的远程连接,只需将 NODE_ENV 设置为"开发"。

    构建认证策略

    你可以为 Vantage.js 发布自己的自定义身份验证策略,作为它自己的node 模块。

    现在我正在寻找一个火箭科学家和你一起建立一个基于pam的认证策略,以有利的地位。 如果你有兴趣,请给我一张便条 !

    发布策略的格式很简单:

    module.exports=function(vantage, options) {
     // The Vantage instance is exposed through// the `vantage` parameter. `options` exposes// options passed in by the strategy's user, and// is defined by you.// This is where you can persist the log on state of // the users attempting to log in, etc.// You return a function, which executes// in the same context as a vantage command.// Every time the user attempts to connect,// this function runs. In it you can prompt// the user, etc.returnfunction(args, callback) {
     /** * Args exposes several pieces of data * you can use: * { *//If the user pre-passes auth data, it will be *//available here. Otherwise, prompt him for it. * user:"admin",  * pass:"Unicorn11", *//This is based on socket.io's connection handshake, *//and has a lot more data than this. * handshake: {  * host:"192.168.0.1", * port:"800" * } * }*/// Prompt user/look up credentials, etc.// Authentication is determined by your// callback: `callback(message, authenticated)`.// Example of rejected auth.callback("Invalid credentials.", false);
     // Example of accepted auth.// callback(void 0, true); }
    }

    事件

    Vantage扩展 EventEmitter.prototype。只需使用 vantage.on('event', fn)vantage.emit('event', data)。 支持以下事件:

    socket.io 客户端/服务器事件

    Vantage使用 socket.io 处理实例之间的所有通信。 以下事件将映射到默认的socket.io 事件:

    • client_connect: 映射到 connectsocket.io-client

    • client_connect_error: 映射到 connect_errorsocket.io-client

    • client_error: 映射到 errorsocket.io-client

    • client_disconnect: 映射到 disconnectsocket.io-client

    • server_connection: 映射到 connectionsocket.io

    • server_disconnect: 映射到 disconnectsocket.io

    客户机/服务器事件
    • client_keypress: 在本地客户端终端按按键触发。

    • client_prompt_submit: 在使用命令提交CLI提示时激发,包括''。

    • client_command_executed: 当命令被执行后,在客户机上激发。

    • client_command_error: 如果命令返回错误,则在客户端激发。

    • server_command_received: 在结束服务器上激发实际执行命令的命令接收命令。

    • server_command_executed: 当命令成功执行后,在终端服务器上激发。

    • server_command_error: 如果命令抛出错误,则在终端服务器上激发。

    自动化

    Vantage允许你使用回调或者承诺同步从javascript执行你的API命令。

    . connect(server, port, [options or callback], [callback] )

    连接到另一个Vantage实例。 返回回调或者 promise。

    // With a promisevantage.connect('127.0.0.1', 8001).then(function(data){
     //.. . }).catch(function(err){
     console.log('Error connecting: '+ err);
    });// With a callbackvantage.connect('127.0.0.1', 8001, function(err) {
     if (!err) {
     //.. . connected }
    });
    命令行选项
    • 如果要连接的服务器使用 HTTPS,则将 ssl 设置为 true。

    . exec(command, [callback] )

    执行API命令字符串。 返回一个回调或者 Promise。

    // Using Promises:vantage.exec("vantage 8001").then(function(data){
     returnvantage.exec("roll dough");
    }).then(function(data){
     returnvantage.exec("add cheese");
    }).then(function(data){
     returnvantage.exec("add pepperoni");
    }).then(function(data){
     returnvantage.exec("shape crust");
    }).then(function(data){
     returnvantage.exec("insert into oven");
    }).then(function(data){
     returnvantage.exec("wait 480000");
    }).then(function(data){
     returnvantage.exec("remove from oven");
    }).then(function(data){
     returnvantage.exec("enjoy");
    }).catch(function(err){
     console.log("Error baking pizza: "+ err);
     app.orderOut();
    });// Using callbacks:vantage.exec("vantage 8001", function(err, data) {
     if (!err) {
     vantage.exec("bake pizza", function(err, pizza){
     if (!err) {
     app.eat(pizza);
     }
     });
     }
    });

    扩展

    Vorpal一样,Vantage支持扩展。 创建扩展很简单,并在vorpal文档中介绍。

    许可证

    MIT

    脚注

    那个 gif。 我很困惑。

    行了,这就是发生的事情:

    • 在我的终端中,我启动了一个本地 node 网络服务器:
    $ node websvr.js

    通常,你只会看到你记录的内容,并且没有与 node的交互。 相反,Vantage给了我们一个提示:

    websvr~$ 

    我键入了 help,它给了我一个所有内置命令的列表以及我添加的命令。

    在我的websvr.js 中,我给出了一个命令,该命令可以打开日志记录,只适用于基于web的web请求。 通过记录活动域,可以帮助提高调试效率。 为了运行这个命令,我输入了 debug web,它开始记录所有的。

    然后我键入 debug off,它禁用了日志输出。

    进入 REPL 命令之后,我输入了一个特殊的REPL"模式",在这里我可以访问应用程序中的原始javascript和对象,而它正在运行。 这与在终端中运行 $ node 相当,只是它位于你的实时应用程序的上下文中 !

    REPL 模式满意,我用 exit 命令退出了它。

    这很好,你可以访问终端中的本地 node 实例。 但是远程或者daemonized应用? 通过使用内置 Vantage 命令,远程连接到监听端口 5001的node 数据库 API,通过运行 vantage 127.0.0.1:5001

    就像SSH一样,我现在是"in"的新实例,提示符更改为 dbsvr~$

    这里服务器支持其他Vantage模式。 通过键入 sql,我输入"sql模式"。 我使用这个命令输入任意SQL命令并连接到我的数据库并执行它。 完成后,我输入 exit

    我想看看黑客新闻的最新趋势。 我输入 help 并失望地发现没有 hacker-news API命令。

    幸好有人做了一个扩展- 一个叫做 vantage-hacker-news的NPM模块。 要下载并将命令实时导入到Vantage中,我键入 use vantage-hacker-news

    在这个命令中,Vantage 在模块上执行一个临时 npm install,并将它的加载到应用程序的内存中。 通过再次键入 help,我可以看到现在已经注册了一个新的Vantage命令: hacker-news

    我使用了命令:hacker-news --length 3,这向我展示了黑客新闻的最高 3项趋势。 其中之一显然是关于 node 事件循环的文章,因为 node 非常棒。

    我输入了 exit,这使我回到了我的web服务器。

    然后我键入 exit -f ( 用于 --force ) 来实际退出web服务器,该服务器在我的终端中运行。



    vantage.js

    Bitdeli Badge


    LIVE  分布式  
    相关文章