Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
131 changes: 131 additions & 0 deletions bin/cmds/register.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
local logger = require("bin.utils.logger")
local http = require("resty.http")
local io = require("orange.utils.io")
local json = require("orange.utils.json")

local _M = {}


_M.help = [[
Usage: orange register

Register current node to cluster

Examples:
orange register
]]


local function base64_encode(source_str)
local b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
local s64 = ''
local str = source_str

while #str > 0 do
local bytes_num = 0
local buf = 0

for byte_cnt = 1, 3 do
buf = (buf * 256)
if #str > 0 then
buf = buf + string.byte(str, 1, 1)
str = string.sub(str, 2)
bytes_num = bytes_num + 1
end
end

for group_cnt = 1, (bytes_num + 1) do
local b64char = math.fmod(math.floor(buf / 262144), 64) + 1
s64 = s64 .. string.sub(b64chars, b64char, b64char)
buf = buf * 64
end

for fill_cnt = 1, (3 - bytes_num) do
s64 = s64 .. '='
end
end

return s64
end

function _M.execute(origin_args)

local err

-- format and parse args
local args = {
orange_conf = origin_args.orange_conf,
prefix = origin_args.prefix
}
for i, v in pairs(origin_args) do
if i == "o" and not args.orange_conf then args.orange_conf = v end
if i == "p" and not args.prefix then args.prefix = v end
end

-- use default args if not exist
-- if not args.prefix then args.prefix = command_util.pwd() end
if not args.prefix then args.prefix = "/usr/local/orange" end
if not args.orange_conf then args.orange_conf = args.prefix .. "/conf/orange.conf" end

if args then
logger:info("args:")
for i, v in pairs(args) do
logger:info("\t%s:%s", i, v)
end
logger:info("args end.")
end

xpcall(function()

-- 读取 orange 配置文件
local orange_conf_text = io.read_file(args.orange_conf)
local orange_conf = json.decode(orange_conf_text)

if #orange_conf.api.credentials[1] ~= 0 then
logger:error("not configure api username and password")
return
end

local credential = orange_conf.api.credentials[1]

local httpc = http.new()

-- 设置超时时间 200 ms
httpc:set_timeout(200)

local url = "http://127.0.0.1:7777"
local authorization = base64_encode(string.format("%s:%s", credential.username, credential.password))
local path = '/node/register'

local resp, err = httpc:request_uri(url, {
method = "POST",
path = path,
headers = {
["Authorization"] = authorization
}
})

httpc:close()

if not err then
if resp.status == 200 then
logger:success("Orange register to cluster.")
else
logger:error(resp.body)
end
else
logger:error(err)
end

end, function(e)
logger:error("Could not register Orange, error: %s", e)
err = e
end)

if err then
error(err)
end
end


return _M
1 change: 1 addition & 0 deletions bin/main.lua
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ local cmds = {
reload = "Reload the config of Orange",
store = "Init/Update/Backup Orange store",
version = "Show the version of Orange",
register = "Register the node",
help = "Show help tips"
}

Expand Down
128 changes: 128 additions & 0 deletions dashboard/model/node.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
local DB = require("dashboard.model.db")
local json = require("orange.utils.json")

return function(config)

local node_model = {}
local mysql_config = config.store_mysql
local db = DB:new(mysql_config)

local table_name = 'cluster_node'
local stat_table_name = 'cluster_node_stat'

function node_model:new(name, ip, port, api_username, api_password)
return db:query("insert into " .. table_name .. "(name,ip,port,api_username,api_password) values(?,?,?,?,?)",
{ name, ip, port, api_username, api_password })
end

function node_model:query_all()
local result, err = db:query("select * from " .. table_name .. " order by ip asc")

if not result or err or type(result) ~= "table" or #result < 1 then
return nil, err
else
return result, err
end
end

function node_model:get_stat(limit)

local result, err = db:query("select op_time,sum(request_2xx) as request_2xx,sum(request_3xx) as request_3xx," ..
" sum(request_4xx) as request_4xx," ..
" sum(request_5xx) as request_5xx," ..
" sum(total_request_count) as total_request_count," ..
" sum(total_success_request_count) as total_success_request_count," ..
" sum(traffic_read) as traffic_read," ..
" sum(traffic_write) as traffic_write," ..
" sum(total_request_time) as total_request_time" ..
" from " .. stat_table_name ..
" group by minute(op_time)" ..
" order by op_time asc limit ?", { limit })

if not result or err or type(result) ~= "table" or #result < 1 then
return nil, err
else
return result, err
end
end

function node_model:get_stat_by_ip(ip, limit)

local result, err = db:query("select * from " .. stat_table_name .. " where ip = ? order by op_time asc limit ?", { ip, limit })

if not result or err or type(result) ~= "table" or #result < 1 then
return nil, err
else
return result, err
end
end


function node_model:query_by_id(id)
local result, err = db:query("select * from " .. table_name .. " where id=?", { tonumber(id) })
if not result or err or type(result) ~= "table" or #result ~= 1 then
return nil, err
else
return result[1], err
end
end

function node_model:query_by_ip(ip)
local result, err = db:query("select * from " .. table_name .. " where ip=?", { ip })
if not result or err or type(result) ~= "table" or #result ~= 1 then
return nil, err
else
return result[1], err
end
end

function node_model:update_node(id, name, ip, port, api_username, api_password)
local res, err = db:query("update " .. table_name .. " set name=?,ip=?,port=?,api_username=?,api_password=? where id=?", { name, ip, port, api_username, api_password, tonumber(id) })
if not res or err then
return false
else
return true
end
end

function node_model:update_node_status(id, status)
local res, err = db:query("update " .. table_name .. " set sync_status=? where id=?", { status, tonumber(id) })
if not res or err then
return false
else
return true
end
end

function node_model:delete(id)
local res, err = db:query("delete from " .. table_name .. " where id=?", { tonumber(id) })
if not res or err then
return false
else
return true
end
end

function node_model:remove_error_nodes()
local res, err = db:query("delete from " .. table_name .. " where sync_status=? ", { json.encode({ ERROR = false }) })
if not res or err then
return false
else
return true
end
end

function node_model:registry(ip, port, credentials)
local local_node = self:query_by_ip(ip)

if not local_node then
self:new(ip, ip, port, credentials.username, credentials.password)
local_node = self.query_by_ip(ip)
end

return local_node
end

return node_model
end

4 changes: 4 additions & 0 deletions dashboard/routes/dashboard.lua
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,10 @@ return function(config, store)
res:render("status")
end)

dashboard_router:get("/node", function(req, res, next)
res:redirect("/admin/node/manage")
end)

dashboard_router:get("/monitor", function(req, res, next)
res:render("monitor")
end)
Expand Down
Loading