├── 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 | [](cqc@vip.qq.com)  [](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 | 
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 | [](cqc@vip.qq.com)  [](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 | 
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 |
--------------------------------------------------------------------------------