├── README.md ├── README_cn.md ├── conf ├── ModuleSwitch.json ├── NebulaBeacon.json ├── NebulaInterface.json ├── NebulaLogic.json └── ssl │ ├── certificate.pem │ └── key.pem ├── configure.sh ├── deploy.sh ├── image └── nebula_cluster.png ├── plugins └── logic │ └── Hello.so ├── script ├── bash_lib.sh └── json.bash ├── shutdown.sh └── startup.sh /README.md: -------------------------------------------------------------------------------- 1 | English | [中文](/README_cn.md)                 [Bwar's blog](https://www.bwar.tech). 2 | # NebulaBootstrap: a distributed systems solution build on nebula. 3 | [![Author](https://img.shields.io/badge/author-@Bwar-blue.svg?style=flat)](cqc@vip.qq.com) ![Platform](https://img.shields.io/badge/platform-Linux-green.svg?style=flat) [![License](https://img.shields.io/github/license/mashape/apistatus.svg)](LICENSE)
4 | 5 | 1. [Overview](#Overview) 6 | 2. [License](#License) 7 | 3. [Getting start](#GettingStart) 8 | 4. [Documentation](#Documentation) 9 | 5. [Depend on](#DependOn) 10 | 6. [Todo list](#TODO) 11 | 7. [Change log](#ChangeLog) 12 | 13 | 14 | ## Overview 15 | 16 | NebulaBootstrap provides service for developers to quickly build a distributed systems (including configuration management, service discovery, routing, load balancing, leadership election, distributed sessions, cluster state and so on). 17 | ![nebula_cluster](image/nebula_cluster.png) 18 | 19 | 20 | ## License 21 | 22 | MIT License 23 | 24 | > Copyright (c) 2018 Bwar 25 | > 26 | > Permission is hereby granted, free of charge, to any person obtaining a copy 27 | > of this software and associated documentation files (the "Software"), to deal 28 | > in the Software without restriction, including without limitation the rights 29 | > to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 30 | > copies of the Software, and to permit persons to whom the Software is 31 | > furnished to do so, subject to the following conditions: 32 | > 33 | > The above copyright notice and this permission notice shall be included in 34 | > all copies or substantial portions of the Software. 35 | > 36 | > THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 37 | > IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 38 | > FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 39 | > AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 40 | > LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 41 | > OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 42 | > THE SOFTWARE. 43 | 44 | 45 | ## Getting start 46 | NebulaBootstrap was consist of [NebulaBeacon](https://github.com/Bwar/NebulaBeacon), [NebulaInterface](https://github.com/Bwar/NebulaHttp), [NebulaAccess](https://github.com/Bwar/NebulaAccess), [NebulaLogic](https://github.com/Bwar/NebulaLogic), NebulaMydis, NebulaDbAgent and [NebulaLogger](https://github.com/Bwar/NebulaLogger), and they were builded passing with gcc6.4 on centos6.5(upgrade binutils to 2.22 or later) and centos7.4. 47 | NebulaBootstrap provides automate building and deploying. 48 | 49 | automate building and deploying follow these step: 50 | 1. wget https://github.com/Bwar/NebulaBootstrap/archive/master.zip 51 | 2. unzip master.zip; rm master.zip; mv NebulaBootstrap-master NebulaBootstrap 52 | 3. cd NebulaBootstrap 53 | 4. chmod u+x deploy.sh 54 | 5. ./deploy.sh 55 | 56 | Run deploy.sh, the NebulaBootstrap distributed services were build completed. The reliance of Nebula was also automatically downloaded and compiled by deploy from the Internet before the construction of Nebula. The deploy path as follows: 57 | * NebulaBootstrap 58 | + bin         server bin location。 59 | + build        build path,created by deploy.sh, if you do not need to build again, just delete it.(optional)。 60 | + conf        configuration path. 61 | + data        application data path. e.g. [Nebio](https://github.com/Bwar/Nebio) which is a data collect and real-time analysis application, write it's data to this path (optional). 62 | + lib         library path. 63 | + log         program logs path. 64 | + plugins       plugins path. 65 | - logic       plugins for logic server(optional). 66 | + script       script path. deploy.sh, startup.sh and shutdown.sh were depend on this path. 67 | + temp        temp file path(optional). 68 | - configure.sh     run configure.sh for a simple configuration when deploy for the first time. 69 | - deploy.sh      auto build and deploy. 70 | - shutdown.sh      shutdown one or more server. 71 | - startup.sh      startup one or more server. 72 | - README_cn.md 73 | - README.md 74 | 75 | build completed, you can start the server: 76 | ``` 77 | ./configure.sh 78 | ./startup.s 79 | ``` 80 | 81 | 82 | ## Documentation 83 | The complete documentation for NebulaBootstrap is coming... 84 | 85 | 86 | ## Depend on 87 | * [protobuf](https://github.com/google/protobuf) 88 | * [libev](http://software.schmorp.de/pkg/libev.html) or [libev](https://github.com/kindy/libev) 89 | * [hiredis](https://github.com/redis/hiredis) 90 | * [crypto++](http://www.cryptopp.com) 91 | * [http_parse](https://github.com/nodejs/http-parser) integrate into Nebula/src/util/http 92 | * [CJsonObject](https://github.com/Bwar/CJsonObject) integrate into Nebula/src/util/json 93 | 94 | 95 | ## Todo list 96 | - NebulaMydis Data Agency Service. 97 | - Developing an IM with the Nebula. 98 | 99 | 100 | ## Change log 101 | #### v0.8 102 | - compatible with gcc4.8 compiler. 103 | - add cpu affinity inorder to support cpu binding. 104 | - add dynamic library unload. 105 | #### v0.7 106 | - add configuration management(check [Nebcli](https://github.com/Bwar/Nebcli) for detail). 107 | #### v0.6 108 | - NebulaBeacon adds node status information query, registration center leader-fllower election. 109 | - NebulaInterface adds hello demo. 110 | #### v0.5 111 | - add node info to worker the worker process terminated unexpectedly and restarted by the Manager. 112 | - ipv6 support. 113 | #### v0.4 114 | - distributed log service test passing. 115 | - add https support. 116 | - add keep alive settings to http channel. 117 | - replace repeated http headers with proto3 map. 118 | - provides a symmetric encryption key setup interface for channel. 119 | - bug fix. 120 | #### v0.3 121 | - rewrite with C++14 122 | - create actors by reflection (using template) 123 | - add distributed trace log 124 | #### v0.2 125 | - the first runable version 126 | 127 |
128 | 129 | -------------------------------------------------------------------------------- /README_cn.md: -------------------------------------------------------------------------------- 1 | [English](/README.md) | 中文                 [Bwar的技术博客](https://www.bwar.tech). 2 | # NebulaBootstrap : 基于Nebula的分布式集群 3 | [![Author](https://img.shields.io/badge/author-@Bwar-blue.svg?style=flat)](cqc@vip.qq.com) ![Platform](https://img.shields.io/badge/platform-Linux-green.svg?style=flat) [![License](https://img.shields.io/github/license/mashape/apistatus.svg)](LICENSE)
4 | 5 | 1. [概述](#Overview) 6 | 2. [许可证](#License) 7 | 3. [编译](#Building) 8 | 4. [文档](#Documentation) 9 | 5. [依赖](#DependOn) 10 | 6. [开发任务](#TODO) 11 | 7. [版本历史](#ChangeLog) 12 | 13 | 14 | ## 概述 15 | 16 | NebulaBootstrap是为开发人员提供快速构建分布式系统(包括配置管理,服务发现,路由,负载平衡,领导选举,分布式会话,集群状态等)的服务解决方案。 17 | ![nebula_cluster](image/nebula_cluster.png) 18 | 19 | 20 | ## 许可证 21 | > Copyright(c)2018 Bwar 22 | > 23 | > 特此免费授予任何人获得本软件及相关文档文件(“软件”)的副本,以无限制地处理本软件,包括但不限于使用,复制,修改和合并,发布,分发,再许可和/或销售本软件的副本,并允许本软件提供给其的人员遵守以下条件: 24 | > 25 | > 上述版权声明和本许可声明应包含在本软件的所有副本或主要部分中。 26 | > 27 | > 本软件按“原样”提供,不附有任何形式的明示或暗示保证,包括但不限于适销性,适用于特定用途和不侵权的保证。在任何情况下,作者或版权所有者都不承担任何索赔,损害或其他责任,无论是在合同,侵权或其他方面的行为,不论是由软件或其使用或其他交易引起或与之相关的行为。 28 | 29 | 30 | ## 编译 31 | Nebula需要gcc4.8以上的编译器。 32 | 33 | 自动构建和部署步骤: 34 | 1. wget https://github.com/Bwar/NebulaBootstrap/archive/master.zip 35 | 2. unzip master.zip; rm master.zip; mv NebulaBootstrap-master NebulaBootstrap 36 | 3. cd NebulaBootstrap 37 | 4. chmod u+x deploy.sh 38 | 5. ./deploy.sh 39 | 40 |   执行deploy脚本后即完成了Nebula及NebulaBootstrap分布式服务的编译和部署,Nebula的依赖也由deploy在构建Nebula前自动从网上下载并编译部署。虽然不像autoconf、automake那样众所周知,但deploy脚本完成的不止是autoconf、automake的工作。deploy之后的目录结构如下: 41 | * NebulaBootstrap 42 | + bin         server的bin文件存放路径。 43 | + build        构建路径,由deploy.sh生成,如果部署完后不需要再构建,可以直接删掉(可选)。 44 | + conf        配置文件存放路径。 45 | + data        数据文件存放路径,比如基于Nebula开发的页面埋点数据采集和实时分析[Nebio](https://github.com/Bwar/Nebio)项目,将采集的数据落地到这个路径(可选)。 46 | + lib         运行所需的库文件存放路径。 47 | + log         程序日志存放路径。 48 | + plugins       插件(动态加载的业务逻辑so)存放路径。 49 | - logic       逻辑Server插件存放路径,插件按server存放只是为了好区分,也可直接存放在plugins下,具体规则可自定义(可选)。 50 | + script       脚本库存放路径,deploy.sh startup.sh shutdown.sh等脚本都需要依赖这个路径。 51 | + temp        临时文件存放路径(可选)。 52 | - configure.sh     配置脚本,deploy之后第一次启动server之前先执行该脚本做简单的配置修改,也可以逐个配置文件打开直接修改。 53 | - deploy.sh      自动构建和部署脚本,自动下载并安装依赖,自动构建和部署,执行./deploy.sh --help查看帮助。 54 | - shutdown.sh      关闭server,可以指定关闭一个或多个server,也可关闭所有server,不带参数时关闭所有server(需用户确认)。 55 | - startup.sh      启动server,可以指定启动一个或多个server,也可启动所有server。 56 | - README_cn.md 57 | - README.md 58 | 59 |   构建完成后,可以开始启动服务集群了: 60 | ``` 61 | ./configure.sh 62 | ./startup.sh 63 | ``` 64 |   server应该已经启动成功了,startup.sh会打印已启动的server。如果没有启动成功,可以到log目录查看原因。执行grep "ERROR" log/*和grep "FATAL" log/* 先看看是否有错误,再到具体日志文件查看错误详情。注意,Nebula的默认配置文件对IP单位时间连接次数做了限制,如果在测试量较大发生莫名奇妙的问题,可以修改配置限制,通过查看日志中的WARNING信息通常有助于定位这种不是错误的“错误”。如果server已启动成功,那么可以用postman、curl等做测试,看看结果。 65 | ``` 66 | # 只启动NebulaInterface即可完成http的hello测试 67 | curl -H "Content-Type:application/json" -X POST -d '{"name": "Nebula", "address":"https://github.com/Bwar/Nebula"}' http://${your_ip}:16003/hello 68 | 69 | # 启动NebulaInterface、NebulaLogic和NebulaBeacon完成分布式服务http的hello测试。 70 | curl -H "Content-Type:application/json" -X POST -d '{"name": "Nebula", "address":"https://github.com/Bwar/Nebula"}' http://${your_ip}:16003/hello_nebula 71 | ``` 72 |   这个简单的测试可以只启动一个NebulaInterface即可完成,也可以启动分布式服务完成。NebulaBootstrap提供基于集群和单个Server的HelloWorld,基于集群的HelloWorld启动了NebulaBeacon、NebulaInterface、NebulaLogic三个server。下面是一张集群架构图: 73 | 74 | 75 | ## 文档 76 | Nebula 完成的文档在 [Nebula documentation](https://github.com/Bwar/Nebula/wiki),持续更新中。 77 | 78 | 79 | ## 依赖 80 | * [protobuf](https://github.com/google/protobuf) 81 | * [libev](http://software.schmorp.de/pkg/libev.html) 或 [libev](https://github.com/kindy/libev) 82 | * [hiredis](https://github.com/redis/hiredis) 83 | * [crypto++](http://www.cryptopp.com) 84 | * [http_parse](https://github.com/nodejs/http-parser) 已集成到 Nebula/src/util/http 85 | * [CJsonObject](https://github.com/Bwar/CJsonObject) 已集成到 Nebula/src/util/json 86 | 87 | 88 | ## 开发任务 89 | - NebulaMydis数据代理服务 90 | - 应用Nebula开发IM项目 91 | 92 | 93 | ## 版本历史 94 | #### v0.8 95 | - 兼容gcc4.8编译器(从这个版本起无须另行安装5以上gcc版本,可以无障碍无等待地在个人机器上部署和测试,也为应用于生产铺平道路。之前Bwar的埋点数据采集和实时分析的生产项目Nebio是在服务器上安装了gcc6才部署的。) 96 | - 增加CPU亲和度设置以支持将Worker进程绑定CPU功能。(有人测试过繁忙的多核服务器,绑定CPU比不绑定CPU有20%左右的性能提升,现在Nebua可以让开发者自行选择是否绑定CPU) 97 | - 增加动态库(业务插件)卸载功能。(支持不停服务升级的重要功能) 98 | #### v0.7 99 | - 添加配置管理,NebulaBeacon为配置中心,使用说明见命令行管理工具[Nebcli](https://github.com/Bwar/Nebcli)的get和set命令。 100 | #### v0.6 101 | - NebulaBeacon增加节点状态信息查询,注册中心主从高可用选举 102 | - NebulaInterface提供HelloWorld示例。 103 | #### v0.5 104 | - 增加worker进程意外终止并被Manager重新拉起时的节点信息下发 105 | - 增加ipv6支持 106 | #### v0.4 107 | - 分布式日志服务测试通过 108 | - 增加https支持 109 | - http通道增加keep alive设置 110 | - 用proto3中的map将http header替换掉原repeated数据类型 111 | - Channel增加设置对称加密密钥接口 112 | - 缺陷修复 113 | #### v0.3 114 | - 用C++14标准改写整个项目 115 | - 用模板实现反射机制创建actor实例 116 | - 增加分布式追踪日志 117 | #### v0.2 118 | - 第一个可运行并http测试通过的版本 119 |
120 | 121 | -------------------------------------------------------------------------------- /conf/ModuleSwitch.json: -------------------------------------------------------------------------------- 1 | { 2 | "module":[ 3 | { 4 | "node_type":["DEMO"], 5 | "url_path":"/hello_switch", 6 | "cmd":1001, 7 | "session_id":{"position":"header", "key_in":"cookie", "key":"imid"} 8 | }, 9 | { 10 | "node_type":["OSSI","INTERFACE"], 11 | "url_path":"/hello_switch", 12 | "cmd":65531 13 | } 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /conf/NebulaBeacon.json: -------------------------------------------------------------------------------- 1 | { 2 | "node_type":"BEACON", 3 | "//host":"系统内各Server之间通信绑定的IP(Server to Server)", 4 | "host":"192.168.157.130", 5 | "//port":"系统内各Server之间通信监听的端口", 6 | "port":16000, 7 | "//server_name":"异步事件驱动Server", 8 | "server_name":"neb_Beacon", 9 | "//worker_num":"进程数量", 10 | "worker_num":1, 11 | "//worker_capacity":"子进程最大工作负荷", 12 | "worker_capacity":1000000, 13 | "//config_path":"配置文件路径(相对路径)", 14 | "config_path":"conf/", 15 | "beacon": [ 16 | { "host": "192.168.1.11", "port": 16000 }, 17 | { "host": "192.168.1.12", "port": 16000 } 18 | ], 19 | "//log_path":"日志文件路径(相对路径)", 20 | "log_path":"log/", 21 | "//max_log_file_num":"最大日志文件数量,用于日志文件滚动", 22 | "max_log_file_num":5, 23 | "//max_log_file_size":"单个日志文件大小限制", 24 | "max_log_file_size":20480000, 25 | "//io_timeout":"网络IO(连接)超时设置(单位:秒)小数点后面至少保留一位", 26 | "io_timeout":300.0, 27 | "//step_timeout":"步骤超时设置(单位:秒)小数点后面至少保留一位", 28 | "step_timeout":1.5, 29 | "log_levels": { "FATAL": 0, "CRITICAL": 1, "ERROR": 2, "NOTICE": 3, "WARNING": 4, "INFO": 5, "DEBUG": 6, "TRACE": 7 }, 30 | "log_level": 7, 31 | "net_log_level": 6, 32 | "boot_load":{ 33 | "cmd":[ 34 | {"cmd":11, "class":"beacon::CmdNodeReport"}, 35 | {"cmd":13, "class":"beacon::CmdNodeRegister"}, 36 | {"cmd":19, "class":"beacon::CmdNodeDisconnect"} 37 | ], 38 | "module":[] 39 | }, 40 | "//refresh_interval":"刷新Server配置,检查、加载插件动态库时间周期(周期时间长短视服务器忙闲而定)", 41 | "refresh_interval":60, 42 | "dynamic_loading":{}, 43 | "//custom":"自定义配置,用于通过框架层带给业务", 44 | "custom":{ 45 | "//config_choice":"db_config or local_config", 46 | "config_choice":"local_config", 47 | "db_config":{ 48 | "host":"192.168.157.130", 49 | "port":3306, 50 | "db_name":"db_beacon", 51 | "user":"neb_beacon", 52 | "password":"That's a cat!", 53 | "charset":"utf8" 54 | }, 55 | "local_config":{ 56 | "ipwhite":["192.168.157.130"], 57 | "node_type":[ 58 | {"level":0, "node_type":"BEACON", "subscribe":[]}, 59 | {"level":1, "node_type":"ACCESS", "subscribe":["LOGIC", "LOGGER"]}, 60 | {"level":2, "node_type":"LOGIC", "subscribe":["LOGIC", "STORAGE", "LOGGER"]}, 61 | {"level":3, "node_type":"STORAGE", "subscribe":["DBAGENT_W", "DBAGENT_R", "LOGGER"]}, 62 | {"level":4, "node_type":"DBAGENT_W", "subscribe":["LOGGER"]}, 63 | {"level":4, "node_type":"DBAGENT_R", "subscribe":["LOGGER"]}, 64 | {"level":1, "node_type":"INTERFACE", "subscribe":["LOGIC", "STORAGE", "LOGGER"]}, 65 | {"level":1, "node_type":"ENTRANCE", "subscribe":["LOGIC", "STORAGE", "LOGGER"]}, 66 | {"level":1, "node_type":"LOGGER", "subscribe":[]} 67 | ] 68 | } 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /conf/NebulaInterface.json: -------------------------------------------------------------------------------- 1 | { 2 | "node_type":"INTERFACE", 3 | "//access_host":"对系统外提供服务绑定的IP(Client to Server),若不提供对外服务,则无需配置", 4 | "access_host":"192.168.157.130", 5 | "//access_port":"对系统外提供服务监听的端口", 6 | "access_port":16003, 7 | "//access_codec":"接入端编解码器,目前支持CODEC_PRIVATE(4),CODEC_HTTP(3),CODEC_PROTOBUF(2)", 8 | "access_codec":3, 9 | "gateway":"113.102.157.188", 10 | "gateway_port":16003, 11 | "//host":"系统内各Server之间通信绑定的IP(Server to Server)", 12 | "host":"192.168.157.130", 13 | "//port":"系统内各Server之间通信监听的端口", 14 | "port":16004, 15 | "//server_name":"异步事件驱动Server", 16 | "server_name":"neb_Interface", 17 | "//worker_num":"进程数量", 18 | "worker_num":1, 19 | "//worker_capacity":"子进程最大工作负荷", 20 | "worker_capacity":1000000, 21 | "//config_path":"配置文件路径(相对路径)", 22 | "config_path":"conf/", 23 | "//log_path":"日志文件路径(相对路径)", 24 | "log_path":"log/", 25 | "//max_log_file_num":"最大日志文件数量,用于日志文件滚动", 26 | "max_log_file_num":5, 27 | "//max_log_file_size":"单个日志文件大小限制", 28 | "max_log_file_size":20480000, 29 | "//io_timeout":"网络IO(连接)超时设置(单位:秒)小数点后面至少保留一位", 30 | "io_timeout":300.0, 31 | "//step_timeout":"步骤超时设置(单位:秒)小数点后面至少保留一位", 32 | "step_timeout":1.5, 33 | "log_levels": { "FATAL": 0, "CRITICAL": 1, "ERROR": 2, "NOTICE": 3, "WARNING": 4, "INFO": 5, "DEBUG": 6, "TRACE": 7 }, 34 | "log_level": 7, 35 | "net_log_level": 6, 36 | "//beacon":"控制中心", 37 | "beacon":[ 38 | {"host":"192.168.157.130","port":16000} 39 | ], 40 | "boot_load":{ 41 | "cmd":[], 42 | "module":[ 43 | {"path":"switch", "class":"inter::ModuleSwitch"} 44 | ] 45 | }, 46 | "//refresh_interval":"刷新Server配置,检查、加载插件动态库时间周期(周期时间长短视服务器忙闲而定)", 47 | "refresh_interval":60, 48 | "dynamic_loading":[], 49 | "//permission":"限制。addr_permit为连接限制,限制每个IP在统计时间内连接次数;uin_permit为消息数量限制,限制每个用户在单位统计时间内发送消息数量。", 50 | "permission":{ 51 | "addr_permit":{"stat_interval":60.0, "permit_num":10}, 52 | "uin_permit":{"stat_interval":60.0, "permit_num":60} 53 | }, 54 | "//custom":"自定义配置,用于通过框架层带给业务", 55 | "custom":{ 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /conf/NebulaLogic.json: -------------------------------------------------------------------------------- 1 | { 2 | "node_type":"LOGIC", 3 | "//host":"系统内各Server之间通信绑定的IP(Server to Server)", 4 | "host":"192.168.157.130", 5 | "//port":"系统内各Server之间通信监听的端口", 6 | "port":16005, 7 | "//server_name":"异步事件驱动Server", 8 | "server_name":"neb_Logic", 9 | "//worker_num":"进程数量", 10 | "worker_num":1, 11 | "//worker_capacity":"子进程最大工作负荷", 12 | "worker_capacity":1000000, 13 | "//config_path":"配置文件路径(相对路径)", 14 | "config_path":"conf/", 15 | "//log_path":"日志文件路径(相对路径)", 16 | "log_path":"log/", 17 | "//max_log_file_num":"最大日志文件数量,用于日志文件滚动", 18 | "max_log_file_num":5, 19 | "//max_log_file_size":"单个日志文件大小限制", 20 | "max_log_file_size":20480000, 21 | "//io_timeout":"网络IO(连接)超时设置(单位:秒)小数点后面至少保留一位", 22 | "io_timeout":300.0, 23 | "//step_timeout":"步骤超时设置(单位:秒)小数点后面至少保留一位", 24 | "step_timeout":1.5, 25 | "log_levels": { "FATAL": 0, "CRITICAL": 1, "ERROR": 2, "NOTICE": 3, "WARNING": 4, "INFO": 5, "DEBUG": 6, "TRACE": 7 }, 26 | "log_level": 7, 27 | "net_log_level": 6, 28 | "//beacon":"控制中心", 29 | "beacon":[ 30 | {"host":"192.168.157.130","port":16000} 31 | ], 32 | "boot_load":{ 33 | "cmd":[], 34 | "module":[] 35 | }, 36 | "//refresh_interval":"刷新Server配置,检查、加载插件动态库时间周期(周期时间长短视服务器忙闲而定)", 37 | "refresh_interval":60, 38 | "dynamic_loading":[ 39 | { 40 | "so_path":"plugins/logic/Hello.so", "load":true, "version":1, 41 | "cmd":[ 42 | {"cmd":65531, "class":"logic::CmdHello"} 43 | ], 44 | "module":[ 45 | ] 46 | } 47 | ], 48 | "//custom":"自定义配置,用于通过框架层带给业务", 49 | "custom":{ 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /conf/ssl/certificate.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIID2DCCAsCgAwIBAgIJAL1AhboZaHLOMA0GCSqGSIb3DQEBCwUAMIGAMQswCQYD 3 | VQQGEwJDTjESMBAGA1UECAwJR3VhbmdEb25nMREwDwYDVQQHDAhTaGVuWmhlbjEN 4 | MAsGA1UECgwEYndhcjENMAsGA1UECwwEYndhcjENMAsGA1UEAwwEYndhcjEdMBsG 5 | CSqGSIb3DQEJARYOY3FjQHZpcC5xcS5jb20wHhcNMTgwNjI3MDkzODI0WhcNMTkw 6 | NjI3MDkzODI0WjCBgDELMAkGA1UEBhMCQ04xEjAQBgNVBAgMCUd1YW5nRG9uZzER 7 | MA8GA1UEBwwIU2hlblpoZW4xDTALBgNVBAoMBGJ3YXIxDTALBgNVBAsMBGJ3YXIx 8 | DTALBgNVBAMMBGJ3YXIxHTAbBgkqhkiG9w0BCQEWDmNxY0B2aXAucXEuY29tMIIB 9 | IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAo3LDhxifF3yOjnd5d53kC3HN 10 | 86uIR2MByXx7ZmClmFDjsZjyZjhe+CT3YpiDZefisfR1jX7PoIK9vO7jaLweOMPO 11 | Lpxg/fgn+ujtF7qCfSOt6pBuSacZ+SXVnL8JNnG1s9tkez2yIW8dcFkAPjOEpMw5 12 | NNOIfT9zyI1RbvcovB0TZSyMVZH5PzSobcZRVOx4KhSR48DEC9qHnp4u0ceNx6Cx 13 | BKOO3cJybnKyrGyYPKtNIVVL6hpZh3qKOirtz7qFnqoFgzvYnKN7Hd1Y0EvmjG3I 14 | kn+O77d4viPTGXML4ly7DiU6gkGAMPXu+SzOBWr3ahnhh+1HZ7cgek1cBiV98QID 15 | AQABo1MwUTAdBgNVHQ4EFgQUCqBy6dgN7/52bTvE4EFRyFPNt5QwHwYDVR0jBBgw 16 | FoAUCqBy6dgN7/52bTvE4EFRyFPNt5QwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG 17 | 9w0BAQsFAAOCAQEANGtHgKhSPlD/jswgbekTsLvwq6qmh2rHy6lg/heuPf2JtVWL 18 | Q+uZENAO3b3864zn0B2G6zihw4MMez2z2eZ78VXIacYKvWZBMtCcNIIqNJGQXT+e 19 | fCTteVBbNOq5+5rIjyJQec2VKEZNHg28eJhbSnSczGNOxo+RYNz7hOufO8fHMjHX 20 | VSJmSN2awGWW7NLkygYJ9uCYPm+m2GSK4UkjtFwhRetF3lmJ6KOHx4mDI6AWAB5u 21 | TNA0l4MZd7BNDF6Ycuy6x+CWND6xyneQ/xJEcW04tbp1msHvpJCVIiEk6L0+Go1v 22 | AFqA4REWPWPFZbViTSTljqR/Q60kUufc/L0T7w== 23 | -----END CERTIFICATE----- 24 | -------------------------------------------------------------------------------- /conf/ssl/key.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN PRIVATE KEY----- 2 | MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCjcsOHGJ8XfI6O 3 | d3l3neQLcc3zq4hHYwHJfHtmYKWYUOOxmPJmOF74JPdimINl5+Kx9HWNfs+ggr28 4 | 7uNovB44w84unGD9+Cf66O0XuoJ9I63qkG5Jpxn5JdWcvwk2cbWz22R7PbIhbx1w 5 | WQA+M4SkzDk004h9P3PIjVFu9yi8HRNlLIxVkfk/NKhtxlFU7HgqFJHjwMQL2oee 6 | ni7Rx43HoLEEo47dwnJucrKsbJg8q00hVUvqGlmHeoo6Ku3PuoWeqgWDO9ico3sd 7 | 3VjQS+aMbciSf47vt3i+I9MZcwviXLsOJTqCQYAw9e75LM4FavdqGeGH7UdntyB6 8 | TVwGJX3xAgMBAAECggEAIntZqKyXE5thb8jgxU14CLoPmvJ7I6RNgjZSyjxlcwbN 9 | onAD43DNCEi0MAbA4cTT3HsYOauhHdm3MZ6sNzJIpe0ZGFhBVhL+TD7Llg/w63mV 10 | fUDPI5avMhK7SAA9b1D55mHIhv9zDv6kFUmRdY3k0+eJwg1GZDX4tTyrC1/1Jgod 11 | 1XdcTKSJb2dWt5SFa7XWM2pKpsKU44ZBeOiqDbLA9kujxET8fp4DDaiRg8MBwxOi 12 | ZgsF+911ZxHi6GTlpmcb6koWqD1R3nlI0Vvxrprr3+SqqAS11WPwopKXwo9N9eol 13 | jLwnGcdlW9iNCWo+o1p7my08/ILou8iRsFd60t324QKBgQDYW2vLrtckR+OTi2lh 14 | vvJF0wvVrhvBLtqEYfB19fl+FzZo5ij/cF51186PhkoRke7SzD/Y2C3Fk1ic6X8l 15 | TLL74rG25Lom/8k5oRAVsMmZPwoYjPF48Hwrhsj2e8ebQFHN8j/g2M2V8JD/oYSU 16 | dfLnI8arhTLbDfGm5i+h2rcazQKBgQDBZZHDgK7Lj6aV4rXeEMnCxwJA3+S2URw2 17 | WzCvciN7LDNvyBtf7EnsJwjg950JIMRzCwf4LrVEI/2ZbuR6WdYOzNs4PvcehtWa 18 | WgPT3qfE5kh/BB9dK4aWKL3g2mtBIsNHopXrmuPgth6h6OifOEaSTJrTxS751f0R 19 | uZIPJqO3tQKBgQCDp94Iq/QvF6/ccNFHsbIr2ykwdipde+1s8Uwp++w+VlG9s5Dv 20 | H6nbe98uZ0FbP7pce/2+Lo5r1CXwFgZQ5ENmE6Sg7r54TN5eOyxWhqWmoz25gsrO 21 | FUj6E6Lmmpv0VUdyUx+b61HvE9yoMdlDniKZlKOoa/1uXyXVsez6SOVzYQKBgDQS 22 | kxLe3TG2NhZ5epqWTp0BVJv/LOfiIwSHvS4gP2l010yrxqMnTiglwoBAa6n/hqWr 23 | PLQYb3ovbqMXdrFy6u4FPqmAWq1/hJgQ0KMFeorLro10oLVHeO+JfMbESMi7AXWS 24 | U2eixuTEZK8XtTrZvja6JZ4Lo8BlW8SgALHPp5lZAoGAKMlJY70U775riX00TAO2 25 | E5jo6H+Ptw26phxlb6JO3aoLc0r+G90wVQu7rkt3xJsr5XNOvdtqguDKo4U1rKuk 26 | bc0YChlf8B3nQ3cLb3Ik0aolU2cXi/a3AOoRCgk7cMxSfy1z8XegU4Pp8dpRLbBy 27 | 5AT0ZnXlYGxrrqzgFEwXNCA= 28 | -----END PRIVATE KEY----- 29 | -------------------------------------------------------------------------------- /configure.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | NEB_HOME=`dirname $0` 4 | SCRIPT_NAME=`basename $0` 5 | cd ${NEB_HOME} 6 | NEB_HOME=`pwd` 7 | 8 | NEB_BIN=${NEB_HOME}/bin 9 | NEB_CONF=${NEB_HOME}/conf 10 | NEB_LIB=${NEB_HOME}/lib 11 | NEB_LOG=${NEB_HOME}/log 12 | NEB_TEMP=${NEB_HOME}/temp 13 | export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${NEB_LIB} 14 | 15 | LOG_FILE="${NEB_HOME}/log/${SCRIPT_NAME}.log" 16 | 17 | . ${NEB_HOME}/script/bash_lib.sh 18 | source ${NEB_HOME}/script/json.bash 19 | 20 | echo "Please input the IP address you want to bind to:" 21 | read bind_ip_address 22 | ifconfig >> /dev/null 2>&1 23 | if [ $? -eq 0 ] 24 | then 25 | valid_ip_list=`ifconfig | awk '/inet/{print $2}'` 26 | if [[ "$valid_ip_list" =~ "$bind_ip_address" ]] 27 | then 28 | echo "\"$bind_ip_address\" is valid." 29 | else 30 | echo "\"$bind_ip_address\" is invalid, please type \"ifconfig\" to get the valid address." 31 | exit 1 32 | fi 33 | fi 34 | 35 | server_conf_list="" 36 | if [ $# -ge 1 ] 37 | then 38 | for neb_bin in $@ 39 | do 40 | if [ ! -f "${NEB_BIN}/$neb_bin" ] 41 | then 42 | echo "error: ${NEB_BIN}/$neb_bin not exist!" 43 | elif [ ! -f "${NEB_CONF}/${neb_bin}.json" ] 44 | then 45 | echo "error: ${NEB_CONF}/${neb_bin}.json not exist!" 46 | else 47 | json_tree=$(cat ${NEB_CONF}/${neb_bin}.json | JSON.load) 48 | #JSON.put /host $bind_ip_address json_tree 49 | #JSON.dump json_tree > ${neb_bin}.json 50 | original_host=$(JSON.get /host json_tree) 51 | sed -i "s/$original_host/\"$bind_ip_address\"/g" ${NEB_CONF}/${neb_bin}.json 52 | server_conf_list="$server_conf_list ${neb_bin}.json" 53 | fi 54 | done 55 | echo "the \"host\" field in \"$server_conf_list\" had been changed." 56 | exit 0 57 | fi 58 | 59 | 60 | neb_servre_bin_files=`ls ${NEB_BIN}/` 61 | for neb_bin in $neb_servre_bin_files 62 | do 63 | if [ -f "${NEB_CONF}/${neb_bin}.json" ] 64 | then 65 | json_tree=$(cat ${NEB_CONF}/${neb_bin}.json | JSON.load) 66 | #JSON.put /host $bind_ip_address json_tree >> /dev/null 2>&1 67 | #JSON.dump json_tree > ${neb_bin}.json 68 | original_host=$(JSON.get /host json_tree) 69 | sed -i "s/$original_host/\"$bind_ip_address\"/g" ${NEB_CONF}/${neb_bin}.json 70 | server_conf_list="$server_conf_list ${neb_bin}.json" 71 | fi 72 | done 73 | echo "the \"host\" field in \"$server_conf_list\" had been changed." 74 | echo "Successful." 75 | 76 | -------------------------------------------------------------------------------- /deploy.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | DEPLOY_PATH="." 4 | cd $DEPLOY_PATH 5 | DEPLOY_PATH=`pwd` 6 | BUILD_PATH="${DEPLOY_PATH}/build" 7 | NEBULA_BOOTSTRAP="NebulaBeacon NebulaInterface NebulaLogic" 8 | CPU_NUM=`lscpu | awk '/^CPU\(s\)/{print $2}'` 9 | CPU_NUM=1 10 | chmod u+x *.sh 11 | 12 | mkdir -p ${DEPLOY_PATH}/lib >> /dev/null 2>&1 13 | mkdir -p ${DEPLOY_PATH}/bin >> /dev/null 2>&1 14 | mkdir -p ${DEPLOY_PATH}/conf >> /dev/null 2>&1 15 | mkdir -p ${DEPLOY_PATH}/log >> /dev/null 2>&1 16 | mkdir -p ${DEPLOY_PATH}/data >> /dev/null 2>&1 17 | mkdir -p ${DEPLOY_PATH}/plugins/logic >> /dev/null 2>&1 18 | mkdir -p ${DEPLOY_PATH}/conf/ssl >> /dev/null 2>&1 19 | mkdir -p ${DEPLOY_PATH}/temp >> /dev/null 2>&1 20 | mkdir -p ${DEPLOY_PATH}/build >> /dev/null 2>&1 21 | 22 | function Usage() 23 | { 24 | echo "Usage: $0 [OPTION]..." 25 | echo "options:" 26 | echo -e " -h, --help\t\t\tdisplay this help and exit." 27 | echo -e " -v, --version\t\t\tdisplay nebula version and exit." 28 | echo -e " -L, --local\t\t\tdeploy from local without download any files from internet." 29 | echo -e " --demo\t\tbuild NebulaDemo and NebulaDepend." 30 | echo -e " --only-nebula\t\tonly build Nebula and NebulaBootstrap." 31 | echo -e " --build-path\t\tset the compilation path." 32 | echo -e " --with-ssl\t\tinclude openssl for ssl and crypto. [default: without ssl]" 33 | echo -e " --with-custom-ssl\t\tinclude openssl for ssl and crypto, the openssl is a custom installation version. [default: without ssl]" 34 | echo -e " --with-ssl-include\tthe openssl include path." 35 | echo -e " --with-ssl-lib\t\tthe openssl library path." 36 | echo "example:" 37 | echo " $0 --local --with-ssl --with-ssl-lib /usr/local/lib64 --with-ssl-include /usr/local/include" 38 | echo "" 39 | } 40 | 41 | DEPLOY_ONLY_NEBULA=false 42 | DEPLOY_LOCAL=false 43 | DEPLOY_WITH_SSL=false 44 | DEPLOY_WITH_CUSTOM_SSL=false 45 | SSL_INCLUDE_PATH="" 46 | SSL_LIB_PATH="" 47 | ARGV_DEFINE=`getopt \ 48 | -o hvL \ 49 | --long help,version,local,demo,only-nebula,with-ssl,with-custom-ssl,build-path:,with-ssl-include:,with-ssl-lib: \ 50 | -n 'deploy.bash' \ 51 | -- "$@"` 52 | if [ $? != 0 ] 53 | then 54 | echo "Terminated!" >&2 55 | exit 1 56 | fi 57 | eval set -- "$ARGV_DEFINE" 58 | 59 | while : 60 | do 61 | case "$1" in 62 | -h|--help) 63 | Usage 64 | exit 0 65 | ;; 66 | -v|--version) 67 | echo "0.3" 68 | exit 0 69 | ;; 70 | --demo) 71 | echo "build NebulaDemo and NebulaDepend." 72 | NEBULA_BOOTSTRAP="NebulaDemo" 73 | shift 74 | ;; 75 | --only-nebula) 76 | echo "Only build Nebula and NebulaBootstrap." 77 | DEPLOY_ONLY_NEBULA=true 78 | shift 79 | ;; 80 | -L|--local) 81 | echo "Deploy from local without download any files from internet." 82 | DEPLOY_LOCAL=true 83 | shift 84 | ;; 85 | --with-ssl) 86 | DEPLOY_WITH_SSL=true 87 | shift 88 | ;; 89 | --with-custom-ssl) 90 | DEPLOY_WITH_CUSTOM_SSL=true 91 | shift 92 | ;; 93 | --build-path) 94 | BUILD_PATH=$2 95 | shift 2 96 | ;; 97 | --with-ssl-include) 98 | SSL_INCLUDE_PATH=$2 99 | DEPLOY_WITH_SSL=true 100 | shift 2 101 | ;; 102 | --with-ssl-lib) 103 | SSL_LIB_PATH=$2 104 | DEPLOY_WITH_SSL=true 105 | shift 2 106 | ;; 107 | --) 108 | shift 109 | break 110 | ;; 111 | *) 112 | echo "invalid argument!" 113 | break 114 | ;; 115 | esac 116 | done 117 | 118 | replace_config="yes" 119 | build_dir_num=`ls -l ${DEPLOY_PATH}/build | wc -l` 120 | if $DEPLOY_ONLY_NEBULA 121 | then 122 | echo "do you want to replace all the config files with the original config files in build path? [yes | no]" 123 | read replace_config 124 | else # deploy remote 125 | cd ${BUILD_PATH} 126 | if ! $DEPLOY_LOCAL 127 | then 128 | mkdir NebulaDepend lib_build >> /dev/null 2>&1 129 | fi 130 | 131 | # install protobuf 132 | cd ${BUILD_PATH}/lib_build 133 | if ! $DEPLOY_LOCAL 134 | then 135 | if [ -f v3.6.0.zip ] 136 | then 137 | echo "protobuf-3.6.0 exist, skip download." 138 | else 139 | wget https://github.com/google/protobuf/archive/v3.6.0.zip 140 | if [ $? -ne 0 ] 141 | then 142 | echo "failed to download protobuf!" >&2 143 | exit 2 144 | fi 145 | fi 146 | 147 | unzip v3.6.0.zip 148 | cd protobuf-3.6.0 149 | chmod u+x autogen.sh 150 | ./autogen.sh 151 | ./configure --prefix=${BUILD_PATH}/NebulaDepend 152 | make -j$CPU_NUM 153 | make install 154 | if [ $? -ne 0 ] 155 | then 156 | echo "failed, teminated!" >&2 157 | exit 2 158 | fi 159 | cd ${BUILD_PATH}/lib_build 160 | rm -rf protobuf-3.6.0 161 | fi 162 | 163 | # install libev 164 | cd ${BUILD_PATH}/lib_build 165 | if ! $DEPLOY_LOCAL 166 | then 167 | if [ -f libev.zip ] 168 | then 169 | echo "libev exist, skip download." 170 | else 171 | wget https://github.com/kindy/libev/archive/master.zip 172 | if [ $? -ne 0 ] 173 | then 174 | echo "failed to download libev!" >&2 175 | exit 2 176 | fi 177 | mv master.zip libev.zip 178 | fi 179 | 180 | unzip libev.zip 181 | mv libev-master libev 182 | cd libev/src 183 | chmod u+x autogen.sh 184 | ./autogen.sh 185 | ./configure --prefix=${BUILD_PATH}/NebulaDepend 186 | make -j$CPU_NUM 187 | make install 188 | if [ $? -ne 0 ] 189 | then 190 | echo "failed, teminated!" >&2 191 | exit 2 192 | fi 193 | cd ${BUILD_PATH}/lib_build 194 | rm -rf libev 195 | fi 196 | 197 | # install hiredis 198 | cd ${BUILD_PATH}/lib_build 199 | if ! $DEPLOY_LOCAL 200 | then 201 | if [ -f hiredis_v0.13.0.zip ] 202 | then 203 | echo "directory hiredis exist, skip download." 204 | else 205 | wget https://github.com/redis/hiredis/archive/v0.13.0.zip 206 | if [ $? -ne 0 ] 207 | then 208 | echo "failed to download hiredis!" >&2 209 | exit 2 210 | fi 211 | mv v0.13.0.zip hiredis_v0.13.0.zip 212 | fi 213 | 214 | unzip hiredis_v0.13.0.zip 215 | mv hiredis-0.13.0 hiredis 216 | cd hiredis 217 | make -j$CPU_NUM 218 | mkdir -p ../../NebulaDepend/include/hiredis 219 | cp -r adapters *.h ../../NebulaDepend/include/hiredis/ 220 | cp libhiredis.so ../../NebulaDepend/lib/libhiredis.so.0.13 221 | cd ../../NebulaDepend/lib/ 222 | ln -s libhiredis.so.0.13 libhiredis.so 223 | cd - 224 | if [ $? -ne 0 ] 225 | then 226 | echo "failed, teminated!" >&2 227 | exit 2 228 | fi 229 | cd ${BUILD_PATH}/lib_build 230 | rm -rf hiredis 231 | fi 232 | 233 | # install openssl 234 | if $DEPLOY_WITH_CUSTOM_SSL 235 | then 236 | cd ${BUILD_PATH}/lib_build 237 | if ! $DEPLOY_LOCAL 238 | then 239 | if [ -f OpenSSL_1_1_0.zip ] 240 | then 241 | echo "openssl-OpenSSL_1_1_0 exist, skip download." 242 | else 243 | wget https://github.com/openssl/openssl/archive/OpenSSL_1_1_0.zip 244 | if [ $? -ne 0 ] 245 | then 246 | echo "failed to download openssl!" >&2 247 | exit 2 248 | fi 249 | fi 250 | 251 | unzip OpenSSL_1_1_0.zip 252 | cd openssl-OpenSSL_1_1_0 253 | ./config --prefix=${BUILD_PATH}/NebulaDepend 254 | make -j$CPU_NUM 255 | make install 256 | if [ $? -ne 0 ] 257 | then 258 | echo "failed, teminated!" >&2 259 | exit 2 260 | fi 261 | cd ${BUILD_PATH}/lib_build 262 | rm -rf openssl-OpenSSL_1_1_0 263 | fi 264 | fi 265 | 266 | # install crypto++ 267 | cd ${BUILD_PATH}/lib_build 268 | if ! $DEPLOY_LOCAL 269 | then 270 | if [ -f CRYPTOPP_8_0_0.zip ] 271 | then 272 | echo "cryptopp-CRYPTOPP_8_0_0 exist, skip download." 273 | else 274 | wget https://github.com/weidai11/cryptopp/archive/CRYPTOPP_8_0_0.zip 275 | if [ $? -ne 0 ] 276 | then 277 | echo "failed to download crypto++!" >&2 278 | exit 2 279 | fi 280 | fi 281 | 282 | unzip CRYPTOPP_8_0_0.zip 283 | cd cryptopp-CRYPTOPP_8_0_0 284 | make -j$CPU_NUM libcryptopp.so 285 | mkdir -p ../../NebulaDepend/include/cryptopp 286 | cp *.h ../../NebulaDepend/include/cryptopp/ 287 | cp libcryptopp.so ../../NebulaDepend/lib/libcryptopp.so.8 288 | cd ../../NebulaDepend/lib 289 | ln -s libcryptopp.so.8 libcryptopp.so 290 | cd - 291 | if [ $? -ne 0 ] 292 | then 293 | echo "failed, teminated!" >&2 294 | exit 2 295 | fi 296 | cd ${BUILD_PATH}/lib_build 297 | rm -rf cryptopp-CRYPTOPP_8_0_0 298 | fi 299 | 300 | # copy libs to deploy path 301 | if ! $DEPLOY_LOCAL 302 | then 303 | cd ${BUILD_PATH}/NebulaDepend/lib 304 | tar -zcvf neb_depend.tar.gz lib*.so lib*.so.* 305 | mv neb_depend.tar.gz ${DEPLOY_PATH}/lib/ 306 | cd ${DEPLOY_PATH}/lib 307 | rm -r lib* >> /dev/null 2>&1 308 | tar -zxvf neb_depend.tar.gz 309 | rm neb_depend.tar.gz 310 | fi 311 | fi 312 | 313 | 314 | # shutdown running nebula server 315 | if $DEPLOY_LOCAL -a $DEPLOY_ONLY_NEBULA 316 | then 317 | cd ${DEPLOY_PATH} 318 | echo "yes" | ./shutdown.sh 319 | rm log/* >> /dev/null 2>&1 320 | fi 321 | 322 | 323 | # download Nebula 324 | cd ${BUILD_PATH} 325 | if ! $DEPLOY_LOCAL 326 | then 327 | if [ -f Nebula.zip ] 328 | then 329 | echo "Nebula exist, skip download." 330 | else 331 | wget https://github.com/Bwar/Nebula/archive/master.zip 332 | if [ $? -ne 0 ] 333 | then 334 | echo "failed to download Nebula!" >&2 335 | exit 2 336 | fi 337 | mv master.zip Nebula.zip 338 | fi 339 | fi 340 | if [ -d Nebula ] 341 | then 342 | echo "Nebula directory exist." 343 | else 344 | unzip Nebula.zip 345 | mv Nebula-master Nebula 346 | mkdir Nebula/include 347 | mkdir Nebula/lib 348 | fi 349 | cd Nebula/proto 350 | ${BUILD_PATH}/NebulaDepend/bin/protoc *.proto --cpp_out=../src/pb 351 | if [ $? -ne 0 ] 352 | then 353 | echo "failed, teminated!" >&2 354 | exit 2 355 | fi 356 | 357 | # modify Nebula Makefile and make 358 | cd ${BUILD_PATH}/Nebula/src 359 | sed -i 's/gcc-6/gcc/g' Makefile 360 | sed -i 's/g++-6/g++/g' Makefile 361 | if $DEPLOY_WITH_SSL 362 | then 363 | sed -i 's/-D__GUNC__/-D__GUNC__ -DWITH_OPENSSL/g' Makefile 364 | sed -i "/-L\$(LIB3RD_PATH)\/lib -lprotobuf/a\ -L\$(SYSTEM_LIB_PATH)\/lib -lssl \x5c" Makefile 365 | if [ ! -z "$SSL_INCLUDE_PATH" ] 366 | then 367 | sed -i "/-I \$(LIB3RD_PATH)\/include/a\ -I ${SSLINCLUDE_PATH} \x5c" Makefile 368 | fi 369 | if [ ! -z "$SSL_LIB_PATH" ] 370 | then 371 | sed -i "s/-L\$(SYSTEM_LIB_PATH)\/lib -lssl/-L${SSL_LIB_PATH} -lssl/g" Makefile 372 | fi 373 | elif $DEPLOY_WITH_CUSTOM_SSL 374 | then 375 | sed -i 's/-D__GUNC__/-D__GUNC__ -DWITH_OPENSSL/g' Makefile 376 | sed -i "/-L\$(LIB3RD_PATH)\/lib -lprotobuf/a\ -L\$(LIB3RD_PATH)\/lib -lssl \x5c" Makefile 377 | if [ ! -z "$SSL_INCLUDE_PATH" ] 378 | then 379 | sed -i "/-I \$(LIB3RD_PATH)\/include/a\ -I ${SSLINCLUDE_PATH} \x5c" Makefile 380 | fi 381 | if [ ! -z "$SSL_LIB_PATH" ] 382 | then 383 | sed -i "s/-L\$(LIB3RD_PATH)\/lib -lssl/-L${SSL_LIB_PATH} -lssl/g" Makefile 384 | fi 385 | else 386 | sed -i 's/-DWITH_OPENSSL / /g' Makefile 387 | sed -i '/-L$(LIB3RD_PATH)\/lib -lssl/d' Makefile 388 | sed -i '/-L$(SYSTEM_LIB_PATH)\/lib -lssl/d' Makefile 389 | fi 390 | make clean; make -j$CPU_NUM 391 | cp libnebula.so ${DEPLOY_PATH}/lib/ 392 | if [ $? -ne 0 ] 393 | then 394 | echo "failed, teminated!" >&2 395 | exit 2 396 | fi 397 | cd ${BUILD_PATH} 398 | 399 | # download NebulaBootstrap server 400 | cd ${BUILD_PATH} 401 | for server in $NEBULA_BOOTSTRAP 402 | do 403 | if ! $DEPLOY_LOCAL 404 | then 405 | if [ -f "${server}.zip" ] 406 | then 407 | echo "${server} exist, skip download." 408 | else 409 | wget https://github.com/Bwar/${server}/archive/master.zip 410 | if [ $? -ne 0 ] 411 | then 412 | echo "failed to download ${server}!" >&2 413 | exit 2 414 | fi 415 | mv master.zip ${server}.zip 416 | fi 417 | fi 418 | if [ -d ${server} ] 419 | then 420 | echo "${server} directory exist." 421 | else 422 | unzip ${server}.zip 423 | mv ${server}-master ${server} 424 | fi 425 | if [ -d ${server}/proto ] 426 | then 427 | cd ${server}/proto 428 | ${BUILD_PATH}/NebulaDepend/bin/protoc *.proto --cpp_out=../src 429 | if [ $? -ne 0 ] 430 | then 431 | echo "failed, teminated!" >&2 432 | exit 2 433 | fi 434 | fi 435 | cd ${BUILD_PATH}/${server}/src/ 436 | sed -i 's/gcc-6/gcc/g' Makefile 437 | sed -i 's/g++-6/g++/g' Makefile 438 | if $DEPLOY_WITH_SSL 439 | then 440 | sed -i 's/-L$(LIB3RD_PATH)\/lib -lssl/-L$(SYSTEM_LIB_PATH)\/lib -lssl/g' Makefile 441 | if [ ! -z "$SSL_INCLUDE_PATH" ] 442 | then 443 | sed -i "/-I \$(LIB3RD_PATH)\/include/i\ -I ${SSLINCLUDE_PATH} \x5c" Makefile 444 | fi 445 | if [ ! -z "$SSL_LIB_PATH" ] 446 | then 447 | sed -i "s/-L\$(SYSTEM_LIB_PATH)\/lib -lssl/-L${SSL_LIB_PATH} -lssl/g" Makefile 448 | fi 449 | elif $DEPLOY_WITH_CUSTOM_SSL 450 | then 451 | if [ ! -z "$SSL_INCLUDE_PATH" ] 452 | then 453 | sed -i "/-I \$(LIB3RD_PATH)\/include/i\ -I ${SSLINCLUDE_PATH} \x5c" Makefile 454 | fi 455 | if [ ! -z "$SSL_LIB_PATH" ] 456 | then 457 | sed -i "s/-L\$(SYSTEM_LIB_PATH)\/lib -lssl/-L${SSL_LIB_PATH} -lssl/g" Makefile 458 | fi 459 | else 460 | sed -i '/-L$(LIB3RD_PATH)\/lib -lssl/d' Makefile 461 | fi 462 | make clean; make -j$CPU_NUM 463 | if [ $? -ne 0 ] 464 | then 465 | echo "failed, teminated!" >&2 466 | exit 2 467 | fi 468 | cp ${server} ${DEPLOY_PATH}/bin/ 469 | if [[ "$replace_config" == "yes" ]] 470 | then 471 | cd ${BUILD_PATH}/${server}/conf/ 472 | cp *.json ${DEPLOY_PATH}/conf/ 473 | fi 474 | 475 | cd ${BUILD_PATH} 476 | done 477 | 478 | 479 | # download NebulaDynamic and build 480 | if ! $DEPLOY_LOCAL && [ "$NEBULA_BOOTSTRAP" != "NebulaDemo" ] 481 | then 482 | if [ -f "NebulaDynamic.zip" ] 483 | then 484 | echo "NebulaDynamic exist, skip download." 485 | else 486 | wget https://github.com/Bwar/NebulaDynamic/archive/master.zip 487 | if [ $? -ne 0 ] 488 | then 489 | echo "failed to download NebulaDynamic!" >&2 490 | exit 2 491 | fi 492 | mv master.zip NebulaDynamic.zip 493 | fi 494 | fi 495 | if [ -d NebulaDynamic ] 496 | then 497 | echo "NebulaDynamic directory exist." 498 | else 499 | unzip NebulaDynamic.zip 500 | mv NebulaDynamic-master NebulaDynamic 501 | fi 502 | if [ -d ${BUILD_PATH}/NebulaDynamic ] 503 | then 504 | cd ${BUILD_PATH}/NebulaDynamic/Hello/src/ 505 | sed -i 's/gcc-6/gcc/g' Makefile 506 | sed -i 's/g++-6/g++/g' Makefile 507 | make clean; make -j$CPU_NUM 508 | cp *.so ${DEPLOY_PATH}/plugins/logic/ >> /dev/null 509 | fi 510 | cd ${BUILD_PATH} 511 | 512 | 513 | # startup nebula server 514 | cd ${DEPLOY_PATH}/ 515 | if [[ "$replace_config" == "yes" ]] 516 | then 517 | ./configure.sh 518 | fi 519 | ./startup.sh 520 | 521 | 522 | -------------------------------------------------------------------------------- /image/nebula_cluster.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Bwar/NebulaBootstrap/5064ecbbb1be9464b176019e2fe6974acf35bce3/image/nebula_cluster.png -------------------------------------------------------------------------------- /plugins/logic/Hello.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Bwar/NebulaBootstrap/5064ecbbb1be9464b176019e2fe6974acf35bce3/plugins/logic/Hello.so -------------------------------------------------------------------------------- /script/bash_lib.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # global variable $LOG_FILE mush be defined before calling write_log() 4 | function write_log() 5 | { 6 | local log_time=`date +"%Y-%m-%d %H:%M:%S"` 7 | local log_level="INFO" 8 | local log_msg=$1 9 | if [ $# -ge 2 ] 10 | then 11 | log_level="$1" 12 | log_msg="$2" 13 | fi 14 | echo "[$log_time][$log_level] $log_msg" >> $LOG_FILE 15 | } 16 | 17 | function info_log() 18 | { 19 | write_log "INFO" "$@" 20 | } 21 | 22 | function debug_log() 23 | { 24 | write_log "DEBUG" "$@" 25 | } 26 | 27 | function error_log() 28 | { 29 | write_log "ERROR" "$@" 30 | } 31 | 32 | function warn_log() 33 | { 34 | write_log "WARN" "$@" 35 | } 36 | 37 | function fatal_log() 38 | { 39 | write_log "FATAL" "$@" 40 | } 41 | 42 | -------------------------------------------------------------------------------- /script/json.bash: -------------------------------------------------------------------------------- 1 | # json.bash - JSON Loader/Dumper for Bash 2 | # 3 | # Copyright (c) 2013-2016 Ingy döt Net 4 | 5 | JSON_VERSION=0.0.2 6 | 7 | #----------------------------------------------------------------------------- 8 | # API functions 9 | #----------------------------------------------------------------------------- 10 | JSON.load() { 11 | unset JSON__cache 12 | case $# in 13 | 0) (set -o pipefail; JSON.lex | JSON.parse) ;; 14 | 1) JSON__cache="$(set -o pipefail; echo -E "$1" | JSON.lex | JSON.parse)" 15 | [[ -n $JSON__cache ]] && JSON__cache+=$'\n' 16 | ;; 17 | 2) printf -v "$2" "%s" "$(echo -E "$1" | JSON.lex | JSON.parse)" 18 | [[ -n ${!2} ]] && printf -v "$2" "%s\n" "${!2}" 19 | ;; 20 | *) JSON.die 'Usage: JSON.load [ []]' ;; 21 | esac 22 | : 23 | } 24 | 25 | 26 | JSON.style() { 27 | local style="${1:?Style type is required}" 28 | local indent=' ' 29 | [[ $# -eq 1 ]] || indent="$2" 30 | 31 | case "$style" in 32 | minimal) 33 | JSON_INDENT="" 34 | JSON_FIELD_SEP="," 35 | JSON_KEY_SEP=":" 36 | JSON_ARR_BEGIN="[" 37 | JSON_ARR_END="]" 38 | JSON_OBJ_BEGIN="{" 39 | JSON_OBJ_END="}" 40 | ;; 41 | normal) 42 | JSON_INDENT="" 43 | JSON_FIELD_SEP=", " 44 | JSON_KEY_SEP=": " 45 | JSON_ARR_BEGIN="[" 46 | JSON_ARR_END="]" 47 | JSON_OBJ_BEGIN="{" 48 | JSON_OBJ_END="}" 49 | ;; 50 | pretty) 51 | JSON_INDENT="$indent" 52 | JSON_FIELD_SEP=$',\n' 53 | JSON_KEY_SEP=": " 54 | JSON_ARR_BEGIN=$'[\n' 55 | JSON_ARR_END=$'\nINDENT]' 56 | JSON_OBJ_BEGIN=$'{\n' 57 | JSON_OBJ_END=$'\nINDENT}' 58 | ;; 59 | *) JSON.die 'Usage: JSON.style minimal|normal|pretty []' ;; 60 | esac 61 | } 62 | JSON.style normal 63 | 64 | JSON.dump() { 65 | set -o pipefail 66 | case $# in 67 | 0) 68 | JSON._dump 69 | ;; 70 | 1) 71 | if [[ $1 == '-' ]]; then 72 | echo "$JSON__cache" | JSON.dump 73 | else 74 | echo "${!1}" | JSON.dump 75 | fi 76 | ;; 77 | *) JSON.die 'Usage: JSON.dump []' ;; 78 | esac 79 | } 80 | 81 | JSON._indent() { 82 | [ "$1" -le 0 ] || printf "$JSON_INDENT%.0s" $(seq 1 "$1") 83 | } 84 | 85 | JSON._dump() { 86 | local stack=() 87 | local prev=("/") 88 | local first="" 89 | while IFS=$'/\t' read -r -a line; do 90 | [ ${#line[@]} -gt 0 ] || continue 91 | last=$((${#line[@]}-1)) 92 | val="${line[$last]}" 93 | unset line[$last] 94 | ((last--)) 95 | for i in ${!line[@]}; do 96 | [ "${prev[$i]}" != "${line[$i]}" ] || continue 97 | while [ $i -lt ${#stack} ]; do 98 | local type="${stack:0:1}" 99 | stack="${stack:1}" 100 | if [ "$type" = "a" ]; then 101 | echo -n "${JSON_ARR_END//INDENT/$(JSON._indent ${#stack})}" 102 | else 103 | echo -n "${JSON_OBJ_END//INDENT/$(JSON._indent ${#stack})}" 104 | fi 105 | done 106 | if [ $i -gt 0 ]; then 107 | if [ -z "$first" ]; then 108 | echo -n "$JSON_FIELD_SEP" 109 | else 110 | first=""; 111 | fi 112 | echo -n "$(JSON._indent ${#stack})" 113 | [ "${stack:0:1}" = "a" ] || echo -n "\"${line[$i]}\"$JSON_KEY_SEP" 114 | fi 115 | if [ $i -eq $last ]; then 116 | echo -n "$val" 117 | else 118 | if [[ "${line[((i+1))]}" =~ [0-9]+ ]]; then 119 | stack="a$stack"; 120 | echo -n "$JSON_ARR_BEGIN" 121 | else 122 | stack="o$stack"; 123 | echo -n "$JSON_OBJ_BEGIN" 124 | fi 125 | first="1" 126 | fi 127 | done 128 | prev=("${line[@]}") 129 | done < <(sed 's/\t/\n/;' | 130 | sed '1~2{;s|[0-9]\{1,\}|00000000000&|g;s|0*\([0-9]\{12,\}\)|\1|g;}' | 131 | paste - - | 132 | sort -k '1,1' -u) 133 | local indent=$(( ${#stack} - 1 )) 134 | for (( i=0; i<${#stack}; i++ )); do 135 | if [ "${stack:$i:1}" = "a" ]; then 136 | echo -n "${JSON_ARR_END//INDENT/$(JSON._indent $indent)}" 137 | else 138 | echo -n "${JSON_OBJ_END//INDENT/$(JSON._indent $indent)}" 139 | fi 140 | (( indent-- )) 141 | done 142 | echo 143 | } 144 | 145 | JSON.get() { 146 | local flag="" 147 | if [[ $# -gt 0 && $1 =~ ^-([asnbz])$ ]]; then 148 | flag="${BASH_REMATCH[1]}" 149 | shift 150 | fi 151 | case $# in 152 | 1) 153 | grep -Em1 "^$1 " | cut -f2 | 154 | JSON.apply-get-flag "$flag" 155 | ;; 156 | 2) 157 | if [[ $2 == '-' ]]; then 158 | echo "$JSON__cache" | 159 | grep -Em1 "^$1 " | 160 | cut -f2 | 161 | JSON.apply-get-flag "$flag" 162 | else 163 | echo "${!2}" | 164 | grep -Em1 "^$1 " | 165 | cut -f2 | 166 | JSON.apply-get-flag "$flag" 167 | fi 168 | ;; 169 | *) JSON.die 'Usage: JSON.get [-a|-s|-n|-b|-z] []' ;; 170 | esac 171 | } 172 | 173 | JSON.keys() { 174 | if [[ $# -gt 2 ]]; then 175 | JSON.die 'Usage: JSON.keys []' 176 | fi 177 | JSON.object "$@" | 178 | cut -f1 | 179 | sed "s/^\///; s/\/.*//" | 180 | sort -u 181 | } 182 | 183 | JSON.object() { 184 | case $# in 185 | 1) 186 | JSON._object "$@" 187 | ;; 188 | 2) 189 | if [ "$2" == '-' ]; then 190 | echo "$JSON__cache" | JSON._object "$@" 191 | else 192 | echo "${!2}" | JSON._object "$@" 193 | fi 194 | ;; 195 | *) 196 | JSON.die 'Usage: JSON.object []' ;; 197 | esac 198 | } 199 | 200 | JSON._object() { 201 | local key=$1 202 | if [[ -n $key && $key != "/" ]]; then 203 | key=${key//\//\\/} 204 | sed -n "s/^$key//p" 205 | else 206 | cat 207 | fi 208 | } 209 | 210 | JSON.put() { 211 | set -o pipefail 212 | if [[ $# -gt 0 && $1 =~ ^-([snbz])$ ]]; then 213 | local flag="${BASH_REMATCH[1]}" 214 | shift 215 | fi 216 | case $# in 217 | 2) 218 | JSON.del "$1" 219 | printf "$1\t$2\n" 220 | ;; 221 | 3) 222 | if [[ $1 == '-' ]]; then 223 | echo "$JSON__cache" | JSON.del "$1" 224 | printf "$1\t$2\n" 225 | else 226 | echo ${!3} | JSON.del "$1" 227 | printf "$1\t$2\n" 228 | fi 229 | ;; 230 | *) JSON.die 'Usage: JSON.put [-s|-n|-b|-z] []' ;; 231 | esac 232 | } 233 | 234 | JSON.del() { 235 | set -o pipefail 236 | case $# in 237 | 1) 238 | grep -Ev "$1 " 239 | ;; 240 | 2) 241 | if [[ $1 == '-' ]]; then 242 | echo "$JSON__cache" | grep -Ev "$1 " 243 | else 244 | echo ${!1} | grep -Ev "$1 " 245 | fi 246 | ;; 247 | *) JSON.die 'Usage: JSON.get [-s|-n|-b|-z] []' ;; 248 | esac 249 | } 250 | 251 | JSON.cache() { 252 | case $# in 253 | 0) 254 | echo -n "$JSON__cache" 255 | ;; 256 | 1) 257 | printf -v "$1" "%s" "$JSON__cache" 258 | ;; 259 | *) JSON.die 'Usage: JSON.cache []' ;; 260 | esac 261 | } 262 | 263 | #----------------------------------------------------------------------------- 264 | JSON_CHR='[^"\\[:cntrl:]]' 265 | JSON_ESC='(\\["\\/bfnrt]|\\u[0-9a-fA-F]{4})' 266 | JSON_STR="\"($JSON_CHR|$JSON_ESC)*\"" 267 | JSON_NUM='-?(0|[1-9][0-9]*)([.][0-9]+)?([eE][+-]?[0-9]+)?' 268 | JSON_BOOL='null|false|true' 269 | JSON_SPACE='[[:space:]]+' 270 | JSON_PUNCT='[][{}:,]' 271 | JSON_OTHER='.' 272 | JSON_SCALAR="^($JSON_STR|$JSON_NUM|$JSON_BOOL)$" 273 | JSON_TOKEN="$JSON_STR|$JSON_NUM|$JSON_BOOL|$JSON_PUNCT|$JSON_SPACE|$JSON_OTHER" 274 | 275 | JSON.lex() { 276 | local GREP_COLORS GREP_COLOR 277 | \grep -Eo "$JSON_TOKEN" | \grep -Ev "^$JSON_SPACE$" 278 | } 279 | 280 | JSON.parse() { 281 | read -r JSON_token 282 | case "$JSON_token" in 283 | '{') JSON.parse-object '' ;; 284 | '[') JSON.parse-array '' ;; 285 | *) JSON.parse-error "'{' or '['";; 286 | esac 287 | } 288 | 289 | JSON.parse-object() { 290 | read -r JSON_token 291 | while [[ $JSON_token != '}' ]]; do 292 | [[ $JSON_token =~ ^\" ]] || JSON.parse-error STRING #" 293 | local key="${JSON_token:1:$((${#JSON_token}-2))}" 294 | read -r JSON_token 295 | [[ $JSON_token == ':' ]] || JSON.parse-error "':'" 296 | read -r JSON_token 297 | JSON.parse-value "$1/$key" 298 | read -r JSON_token 299 | if [[ $JSON_token == ',' ]]; then 300 | read -r JSON_token 301 | else 302 | [[ $JSON_token == '}' ]] || JSON.parse-error "'}'" 303 | fi 304 | done 305 | } 306 | 307 | JSON.parse-array() { 308 | local index=0 309 | read -r JSON_token 310 | while [[ $JSON_token != ']' ]]; do 311 | JSON.parse-value "$1/$((index++))" 312 | read -r JSON_token 313 | if [[ $JSON_token == ',' ]]; then 314 | read -r JSON_token 315 | else 316 | [[ $JSON_token == ']' ]] || JSON.parse-error "']'" 317 | fi 318 | done 319 | } 320 | 321 | JSON.parse-value() { 322 | case "$JSON_token" in 323 | '[') JSON.parse-array "$1";; 324 | '{') JSON.parse-object "$1";; 325 | *) 326 | [[ $JSON_token =~ $JSON_SCALAR ]] || 327 | JSON.parse-error 328 | printf "%s\t%s\n" "$1" "$JSON_token" 329 | esac 330 | } 331 | 332 | JSON.parse-error() { 333 | msg="JSON.parse error. Unexpected token: '$JSON_token'." 334 | [[ -n $1 ]] && msg+=" Expected: $1." 335 | JSON.die "$msg" 336 | } 337 | 338 | JSON.apply-get-flag() { 339 | local value 340 | read -r value 341 | # For now assume null can show up instead of string or number 342 | if [[ $value == null ]]; then 343 | echo '' 344 | return 0 345 | fi 346 | case $1 in 347 | a) 348 | [[ $value =~ ^$JSON_STR$ ]] && { 349 | value="${value:1:$((${#value}-2))}" 350 | } 351 | ;; 352 | s) 353 | [[ $value =~ ^$JSON_STR$ ]] || { 354 | echo "JSON.get -s flag used but '$value' is not a string" >&2 355 | return 1 356 | } 357 | value="${value:1:$((${#value}-2))}" 358 | ;; 359 | n) 360 | [[ $value =~ ^$JSON_NUM$ ]] || { 361 | echo "JSON.get -n flag used but '$value' is not a number" >&2 362 | return 1 363 | } 364 | ;; 365 | b) 366 | [[ $value =~ ^$JSON_BOOL$ ]] || { 367 | echo "JSON.get -b flag used but '$value' is not a boolean" >&2 368 | return 1 369 | } 370 | value=$([ $value == true ] && echo "0" || echo "1") 371 | ;; 372 | z) 373 | [[ $value =~ ^$JSON_NULL$ ]] || { 374 | echo "JSON.get -z flag used but '$value' is not a null" >&2 375 | return 1 376 | } 377 | value='' 378 | ;; 379 | *) ;; 380 | esac 381 | echo "$value" 382 | return 0 383 | } 384 | 385 | JSON.assert-cache() { 386 | [[ -n $JSON__cache ]] || JSON.die 'JSON.get error: no cached data.' 387 | } 388 | 389 | JSON.die() { 390 | echo "$*" >&2 391 | exit 1 392 | } 393 | -------------------------------------------------------------------------------- /shutdown.sh: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | NEB_HOME=`dirname $0` 4 | SCRIPT_NAME=`basename $0` 5 | cd ${NEB_HOME} 6 | NEB_HOME=`pwd` 7 | 8 | NEB_BIN=${NEB_HOME}/bin 9 | NEB_CONF=${NEB_HOME}/conf 10 | NEB_LIB=${NEB_HOME}/lib 11 | NEB_LOG=${NEB_HOME}/log 12 | NEB_TEMP=${NEB_HOME}/temp 13 | export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${NEB_LIB} 14 | 15 | LOG_FILE="${NEB_HOME}/log/${SCRIPT_NAME}.log" 16 | 17 | . ${NEB_HOME}/script/bash_lib.sh 18 | source ${NEB_HOME}/script/json.bash 19 | 20 | if [ $# -ge 1 ] 21 | then 22 | for neb_bin in $@ 23 | do 24 | if [ ! -f "${NEB_BIN}/$neb_bin" ] 25 | then 26 | echo "error: ${NEB_BIN}/$neb_bin not exist!" 27 | elif [ ! -f "${NEB_CONF}/$neb_bin.json" ] 28 | then 29 | echo "error: ${NEB_CONF}/$neb_bin.json not exist!" 30 | else 31 | json_tree=$(cat ${NEB_CONF}/$neb_bin.json | JSON.load) 32 | neb_server=$(JSON.get /server_name json_tree) 33 | neb_port=$(JSON.get /port json_tree) 34 | running_neb_pid=`netstat -apn 2>>/dev/null | grep -w "$neb_port" | awk -F/ '/^tcp/{print $1}' | awk '/LISTEN/{print $NF}'` 35 | if [ -n "$running_neb_pid" ] 36 | then 37 | echo "kill $running_neb_pid $neb_server" 38 | kill $running_neb_pid 39 | fi 40 | fi 41 | done 42 | exit 0 43 | fi 44 | 45 | 46 | echo "do you want to stop all server process? [yes|no]" 47 | read stop_neb_server 48 | if [ "yes" != "$stop_neb_server" ] 49 | then 50 | echo "cancel" 51 | exit 0 52 | fi 53 | neb_server_bin_files=`ls ${NEB_BIN}/` 54 | for neb_bin in $neb_server_bin_files 55 | do 56 | if [ -f "${NEB_CONF}/${neb_bin}.json" ] 57 | then 58 | json_tree=$(cat ${NEB_CONF}/$neb_bin.json | JSON.load) 59 | neb_server=$(JSON.get /server_name json_tree) 60 | neb_port=$(JSON.get /port json_tree) 61 | running_neb_pid=`netstat -apn 2>>/dev/null | grep -w "$neb_port" | awk -F/ '/^tcp/{print $1}' | awk '/LISTEN/{print $NF}'` 62 | if [ -n "$running_neb_pid" ] 63 | then 64 | echo "kill $running_neb_pid $neb_server" 65 | kill $running_neb_pid 66 | fi 67 | fi 68 | done 69 | 70 | 71 | -------------------------------------------------------------------------------- /startup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | NEB_HOME=`dirname $0` 4 | SCRIPT_NAME=`basename $0` 5 | cd ${NEB_HOME} 6 | NEB_HOME=`pwd` 7 | 8 | NEB_BIN=${NEB_HOME}/bin 9 | NEB_CONF=${NEB_HOME}/conf 10 | NEB_LIB=${NEB_HOME}/lib:${NEB_HOME}/plugins 11 | NEB_LOG=${NEB_HOME}/log 12 | NEB_TEMP=${NEB_HOME}/temp 13 | export LD_LIBRARY_PATH=${NEB_LIB} 14 | 15 | LOG_FILE="${NEB_HOME}/log/${SCRIPT_NAME}.log" 16 | 17 | . ${NEB_HOME}/script/bash_lib.sh 18 | source ${NEB_HOME}/script/json.bash 19 | 20 | server_list="" 21 | port_list="" 22 | if [ $# -ge 1 ] 23 | then 24 | for neb_bin in $@ 25 | do 26 | if [ ! -f "${NEB_BIN}/${neb_bin}" ] 27 | then 28 | echo "error: ${NEB_BIN}/${neb_bin} not exist!" 29 | elif [ ! -f "${NEB_CONF}/${neb_bin}.json" ] 30 | then 31 | echo "error: ${NEB_CONF}/${neb_bin}.json not exist!" 32 | else 33 | json_tree=$(cat ${NEB_CONF}/${neb_bin}.json | JSON.load) 34 | neb_server=$(JSON.get /server_name json_tree | awk -F\" '{print $2}') 35 | ${NEB_BIN}/${neb_bin} ${NEB_CONF}/${neb_bin}.json 36 | if [ $? -eq 0 ] 37 | then 38 | info_log "${NEB_HOME}/bin/${neb_bin} start successfully." 39 | server_list="$server_list $neb_server" 40 | else 41 | error_log "failed to start ${neb_bin}" 42 | echo "failed to start ${neb_bin}" 43 | fi 44 | fi 45 | done 46 | sleep 1 47 | for s in $server_list 48 | do 49 | ps -ef | awk -v pname=$s '{idx=index($8,pname); if (idx == 1)print}' 50 | done 51 | exit 0 52 | fi 53 | 54 | 55 | neb_server_bin_files=`ls ${NEB_BIN}/` 56 | neb_server_queue="" 57 | 58 | for neb_bin in $neb_server_bin_files 59 | do 60 | if [[ "$neb_bin" =~ "Beacon" || "$neb_bin" =~ "beacon" ]] 61 | then 62 | neb_server_queue="${neb_bin} ${neb_server_queue}" 63 | else 64 | neb_server_queue="${neb_server_queue} ${neb_bin}" 65 | fi 66 | done 67 | 68 | for neb_bin in $neb_server_queue 69 | do 70 | if [ -f "${NEB_CONF}/${neb_bin}.json" ] 71 | then 72 | json_tree=$(cat ${NEB_CONF}/${neb_bin}.json | JSON.load) 73 | neb_server=$(JSON.get /server_name json_tree | awk -F\" '{print $2}') 74 | neb_port=$(JSON.get /port json_tree) 75 | running_neb_pid=`netstat -apn 2>>/dev/null | grep -w "$neb_port" | awk -F/ '/^tcp/{print $1}' | awk '/LISTEN/{print $NF}'` 76 | if [ -z "$running_neb_pid" ] 77 | then 78 | ${NEB_BIN}/${neb_bin} ${NEB_CONF}/${neb_bin}.json 79 | if [ $? -eq 0 ] 80 | then 81 | info_log "${NEB_HOME}/bin/${neb_bin} start successfully." 82 | server_list="$server_list $neb_server" 83 | else 84 | error_log "failed to start ${neb_bin}" 85 | echo "failed to start ${neb_bin}" 86 | fi 87 | ps -ef | awk -v pname=$neb_server '{idx=index($8,pname); if (idx == 1)print}' 88 | else 89 | info_log "the process for ${neb_bin} was exist!" 90 | fi 91 | fi 92 | done 93 | 94 | --------------------------------------------------------------------------------