spacewander commented on a change in pull request #2395:
URL: https://github.com/apache/apisix/pull/2395#discussion_r507376609
##########
File path: bin/apisix
##########
@@ -798,333 +41,30 @@ version: print the version of apisix
end
-local checked_admin_key = false
-local function init()
- if is_root_path then
- print('Warning! Running apisix under /root is only suitable for
development environments'
- .. ' and it is dangerous to do so. It is recommended to run APISIX
in a directory other than /root.')
- end
-
- -- read_yaml_conf
- local yaml_conf, err = read_yaml_conf()
- if not yaml_conf then
- error("failed to read local yaml config of apisix: " .. err)
- end
- -- print("etcd: ", yaml_conf.etcd.host)
-
- -- check the Admin API token
- if yaml_conf.apisix.enable_admin and yaml_conf.apisix.allow_admin then
- for _, allow_ip in ipairs(yaml_conf.apisix.allow_admin) do
- if allow_ip == "127.0.0.0/24" then
- checked_admin_key = true
- end
- end
- end
-
- if yaml_conf.apisix.enable_admin and not checked_admin_key then
- checked_admin_key = true
- local help = [[
-
-%s
-Please modify "admin_key" in conf/config.yaml .
-
-]]
- if type(yaml_conf.apisix.admin_key) ~= "table" or
- #yaml_conf.apisix.admin_key == 0
- then
- io.stderr:write(help:format("ERROR: missing valid Admin API
token."))
- os.exit(1)
- end
-
- for _, admin in ipairs(yaml_conf.apisix.admin_key) do
- if type(admin.key) == "table" then
- admin.key = ""
- else
- admin.key = tostring(admin.key)
- end
-
- if admin.key == "" then
- io.stderr:write(help:format("ERROR: missing valid Admin API
token."), "\n")
- os.exit(1)
- end
-
- if admin.key == "edd1c9f034335f136f87ad84b625c8f1" then
- io.stderr:write(
- help:format([[WARNING: using fixed Admin API token has
security risk.]]),
- "\n"
- )
- end
- end
- end
-
- local or_ver = execute_cmd("openresty -V 2>&1")
- local with_module_status = true
- if or_ver and not or_ver:find("http_stub_status_module", 1, true) then
- io.stderr:write("'http_stub_status_module' module is missing in ",
- "your openresty, please check it out. Without this ",
- "module, there will be fewer monitoring indicators.\n")
- with_module_status = false
- end
-
- local enabled_plugins = {}
- for i, name in ipairs(yaml_conf.plugins) do
- enabled_plugins[name] = true
- end
-
- if enabled_plugins["proxy-cache"] and not yaml_conf.apisix.proxy_cache then
- error("missing apisix.proxy_cache for plugin proxy-cache")
- end
-
- -- Using template.render
- local sys_conf = {
- lua_path = pkg_path_org,
- lua_cpath = pkg_cpath_org,
- os_name = trim(execute_cmd("uname")),
- apisix_lua_home = apisix_home,
- with_module_status = with_module_status,
- error_log = {level = "warn"},
- enabled_plugins = enabled_plugins,
- }
-
- if not yaml_conf.apisix then
- error("failed to read `apisix` field from yaml file")
- end
-
- if not yaml_conf.nginx_config then
- error("failed to read `nginx_config` field from yaml file")
- end
-
- if is_32bit_arch() then
- sys_conf["worker_rlimit_core"] = "4G"
- else
- sys_conf["worker_rlimit_core"] = "16G"
- end
-
- for k,v in pairs(yaml_conf.apisix) do
- sys_conf[k] = v
- end
- for k,v in pairs(yaml_conf.nginx_config) do
- sys_conf[k] = v
- end
-
- local wrn = sys_conf["worker_rlimit_nofile"]
- local wc = sys_conf["event"]["worker_connections"]
- if not wrn or wrn <= wc then
- -- ensure the number of fds is slightly larger than the number of conn
- sys_conf["worker_rlimit_nofile"] = wc + 128
- end
-
- if(sys_conf["enable_dev_mode"] == true) then
- sys_conf["worker_processes"] = 1
- sys_conf["enable_reuseport"] = false
- elseif tonumber(sys_conf["worker_processes"]) == nil then
- sys_conf["worker_processes"] = "auto"
- end
-
- local dns_resolver = sys_conf["dns_resolver"]
- if not dns_resolver or #dns_resolver == 0 then
- local dns_addrs, err = local_dns_resolver("/etc/resolv.conf")
- if not dns_addrs then
- error("failed to import local DNS: " .. err)
- end
-
- if #dns_addrs == 0 then
- error("local DNS is empty")
- end
- sys_conf["dns_resolver"] = dns_addrs
- end
-
- local conf_render = template.compile(ngx_tpl)
- local ngxconf = conf_render(sys_conf)
-
- local ok, err = write_file(apisix_home .. "/conf/nginx.conf", ngxconf)
- if not ok then
- error("failed to update nginx.conf: " .. err)
- end
-
- local op_ver = get_openresty_version()
- if op_ver == nil then
- io.stderr:write("can not find openresty\n")
- return
- end
-
- local need_ver = "1.15.8"
- if not check_version(op_ver, need_ver) then
- io.stderr:write("openresty version must >=", need_ver, " current ",
op_ver, "\n")
- return
- end
-end
-_M.init = init
-
-local function init_etcd(show_output)
- -- read_yaml_conf
- local yaml_conf, err = read_yaml_conf()
- if not yaml_conf then
- error("failed to read local yaml config of apisix: " .. err)
- end
-
- if not yaml_conf.apisix then
- error("failed to read `apisix` field from yaml file when init etcd")
- end
-
- if yaml_conf.apisix.config_center ~= "etcd" then
- return true
- end
-
- if not yaml_conf.etcd then
- error("failed to read `etcd` field from yaml file when init etcd")
- end
-
- local etcd_conf = yaml_conf.etcd
-
- local timeout = etcd_conf.timeout or 3
- local uri
- --convert old single etcd config to multiple etcd config
- if type(yaml_conf.etcd.host) == "string" then
- yaml_conf.etcd.host = {yaml_conf.etcd.host}
- end
-
- local cluster_version
- local host_count = #(yaml_conf.etcd.host)
- local dkjson = require("dkjson")
-
- -- check the etcd cluster version
- for index, host in ipairs(yaml_conf.etcd.host) do
- uri = host .. "/version"
- local cmd = string.format("curl -s -m %d %s", timeout * 2, uri)
- local res = execute_cmd(cmd)
- local errmsg = string.format("got malformed version message: \"%s\"
from etcd\n", res)
- local body, _, err = dkjson.decode(res)
- if err then
- io.stderr:write(errmsg)
- os.exit(1)
- end
-
- local cluster_version = body["etcdcluster"]
- if not cluster_version then
- io.stderr:write(errmsg)
- os.exit(1)
- end
-
- if compare_semantic_version(cluster_version, min_etcd_version) then
- io.stderr:write("etcd cluster version ".. cluster_version ..
- " is less than the required version "..
min_etcd_version ..
- ", please upgrade your etcd cluster\n")
- os.exit(1)
- end
- end
-
- local etcd_ok = false
- for index, host in ipairs(yaml_conf.etcd.host) do
- local is_success = true
-
- for _, dir_name in ipairs({"/routes", "/upstreams", "/services",
- "/plugins", "/consumers", "/node_status",
- "/ssl", "/global_rules", "/stream_routes",
- "/proto"}) do
- local key = (etcd_conf.prefix or "") .. dir_name .. "/"
-
- local base64_encode = require("base64").encode
- local uri = host .. "/v3/kv/put"
- local post_json = '{"value":"' .. base64_encode("init_dir") ..
'", "key":"' .. base64_encode(key) .. '"}'
- local cmd = "curl " .. uri .. " -X POST -d '" .. post_json
- .. "' --connect-timeout " .. timeout
- .. " --max-time " .. timeout * 2 .. " --retry 1 2>&1"
-
- local res = execute_cmd(cmd)
- if (etcd_version == "v3" and not res:find("OK", 1, true)) then
- is_success = false
- if (index == host_count) then
- error(cmd .. "\n" .. res)
- end
-
- break
- end
-
- if show_output then
- print(cmd)
- print(res)
- end
- end
-
- if is_success then
- etcd_ok = true
- break
- end
- end
-
- if not etcd_ok then
- error("none of the configured etcd works well")
- end
-end
-_M.init_etcd = init_etcd
-
-local openresty_args = [[openresty -p ]] .. apisix_home .. [[ -c ]]
- .. apisix_home .. [[/conf/nginx.conf]]
-
-function _M.start(...)
- -- check running
- local pid_path = apisix_home .. "/logs/nginx.pid"
- local pid, err = read_file(pid_path)
- if pid then
- local hd = io.popen("lsof -p " .. pid)
- local res = hd:read("*a")
- if res and res ~= "" then
- print("APISIX is running...")
- return nil
- end
- end
-
- init(...)
- init_etcd(...)
-
- local cmd = openresty_args
- -- print(cmd)
- os.execute(cmd)
-end
-
-function _M.stop()
- local cmd = openresty_args .. [[ -s stop]]
- -- print(cmd)
- os.execute(cmd)
-end
-
-function _M.restart()
- _M.stop()
- _M.start()
+local function version()
+ print(ver['VERSION'])
end
-function _M.reload()
- -- reinit nginx.conf
- init()
-
- local test_cmd = openresty_args .. [[ -t -q ]]
- -- When success,
- -- On linux, os.execute returns 0,
- -- On macos, os.execute returns 3 values: true, exit, 0, and we need the
first.
- local test_ret = os.execute((test_cmd))
- if (test_ret == 0 or test_ret == true) then
- local cmd = openresty_args .. [[ -s reload]]
- -- print(cmd)
- os.execute(cmd)
- return
- end
- print("test openresty failed")
-end
-function _M.version()
- local ver = require("apisix.core.version")
- print(ver['VERSION'])
-end
+local command = {
+ version = version,
+ help = help,
+ init = ops.init,
+ init_etcd = etcd.init,
+ start = ops.start,
+ stop = ops.stop,
+ restart = ops.restart,
+ reload = ops.reload,
+}
-local cmd_action = arg[1]
-if not cmd_action then
- return _M.help()
+local action = arg[1]
+if not action then
+ return help()
end
-if not _M[cmd_action] then
- print("invalid argument: ", cmd_action, "\n")
+if not command[action] then
+ util.die("unknown sub-command: ", action, "\n")
Review comment:
Please also integrate
https://github.com/apache/apisix/commit/1fe4e50f5a153edc738efbe92aba3f910e5c888e
into this refactor.
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]