feat(apisix): add Cloudron package
- Implements Apache APISIX packaging for Cloudron platform. - Includes Dockerfile, CloudronManifest.json, and start.sh. - Configured to use Cloudron's etcd addon. 🤖 Generated with Gemini CLI Co-Authored-By: Gemini <noreply@google.com>
This commit is contained in:
189
CloudronPackages/APISIX/apisix-source/apisix/cli/util.lua
Normal file
189
CloudronPackages/APISIX/apisix-source/apisix/cli/util.lua
Normal file
@@ -0,0 +1,189 @@
|
||||
--
|
||||
-- Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
-- contributor license agreements. See the NOTICE file distributed with
|
||||
-- this work for additional information regarding copyright ownership.
|
||||
-- The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
-- (the "License"); you may not use this file except in compliance with
|
||||
-- the License. You may obtain a copy of the License at
|
||||
--
|
||||
-- http://www.apache.org/licenses/LICENSE-2.0
|
||||
--
|
||||
-- Unless required by applicable law or agreed to in writing, software
|
||||
-- distributed under the License is distributed on an "AS IS" BASIS,
|
||||
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
-- See the License for the specific language governing permissions and
|
||||
-- limitations under the License.
|
||||
--
|
||||
|
||||
local require = require
|
||||
local pcall = pcall
|
||||
local open = io.open
|
||||
local popen = io.popen
|
||||
local close = io.close
|
||||
local exit = os.exit
|
||||
local stderr = io.stderr
|
||||
local str_format = string.format
|
||||
local tonumber = tonumber
|
||||
local io = io
|
||||
local ipairs = ipairs
|
||||
local assert = assert
|
||||
|
||||
local _M = {}
|
||||
|
||||
|
||||
-- Note: The `execute_cmd` return value will have a line break at the end,
|
||||
-- it is recommended to use the `trim` function to handle the return value.
|
||||
local function execute_cmd(cmd)
|
||||
local t, err = popen(cmd)
|
||||
if not t then
|
||||
return nil, "failed to execute command: "
|
||||
.. cmd .. ", error info: " .. err
|
||||
end
|
||||
|
||||
local data, err = t:read("*all")
|
||||
t:close()
|
||||
|
||||
if not data then
|
||||
return nil, "failed to read execution result of: "
|
||||
.. cmd .. ", error info: " .. err
|
||||
end
|
||||
|
||||
return data
|
||||
end
|
||||
_M.execute_cmd = execute_cmd
|
||||
|
||||
|
||||
-- For commands which stdout would be always be empty,
|
||||
-- forward stderr to stdout to get the error msg
|
||||
function _M.execute_cmd_with_error(cmd)
|
||||
return execute_cmd(cmd .. " 2>&1")
|
||||
end
|
||||
|
||||
|
||||
function _M.trim(s)
|
||||
return (s:gsub("^%s*(.-)%s*$", "%1"))
|
||||
end
|
||||
|
||||
|
||||
function _M.split(self, sep)
|
||||
local sep, fields = sep or ":", {}
|
||||
local pattern = str_format("([^%s]+)", sep)
|
||||
|
||||
self:gsub(pattern, function(c) fields[#fields + 1] = c end)
|
||||
|
||||
return fields
|
||||
end
|
||||
|
||||
|
||||
function _M.read_file(file_path)
|
||||
local file, err = open(file_path, "rb")
|
||||
if not file then
|
||||
return false, "failed to open file: " .. file_path .. ", error info:" .. err
|
||||
end
|
||||
|
||||
local data, err = file:read("*all")
|
||||
file:close()
|
||||
if not data then
|
||||
return false, "failed to read file: " .. file_path .. ", error info:" .. err
|
||||
end
|
||||
|
||||
return data
|
||||
end
|
||||
|
||||
|
||||
function _M.die(...)
|
||||
stderr:write(...)
|
||||
exit(1)
|
||||
end
|
||||
|
||||
|
||||
function _M.is_32bit_arch()
|
||||
local ok, ffi = pcall(require, "ffi")
|
||||
if ok then
|
||||
-- LuaJIT
|
||||
return ffi.abi("32bit")
|
||||
end
|
||||
|
||||
local ret = _M.execute_cmd("getconf LONG_BIT")
|
||||
local bits = tonumber(ret)
|
||||
return bits <= 32
|
||||
end
|
||||
|
||||
|
||||
function _M.write_file(file_path, data)
|
||||
local file, err = open(file_path, "w+")
|
||||
if not file then
|
||||
return false, "failed to open file: "
|
||||
.. file_path
|
||||
.. ", error info:"
|
||||
.. err
|
||||
end
|
||||
|
||||
local ok, err = file:write(data)
|
||||
file:close()
|
||||
if not ok then
|
||||
return false, "failed to write file: "
|
||||
.. file_path
|
||||
.. ", error info:"
|
||||
.. err
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
|
||||
function _M.file_exists(file_path)
|
||||
local f = open(file_path, "r")
|
||||
return f ~= nil and close(f)
|
||||
end
|
||||
|
||||
do
|
||||
local trusted_certs_paths = {
|
||||
"/etc/ssl/certs/ca-certificates.crt", -- Debian/Ubuntu/Gentoo
|
||||
"/etc/pki/tls/certs/ca-bundle.crt", -- Fedora/RHEL 6
|
||||
"/etc/ssl/ca-bundle.pem", -- OpenSUSE
|
||||
"/etc/pki/tls/cacert.pem", -- OpenELEC
|
||||
"/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem", -- CentOS/RHEL 7
|
||||
"/etc/ssl/cert.pem", -- OpenBSD, Alpine
|
||||
}
|
||||
|
||||
-- Check if a file exists using Lua's built-in `io.open`
|
||||
local function file_exists(path)
|
||||
local file = io.open(path, "r")
|
||||
if file then
|
||||
file:close()
|
||||
return true
|
||||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
function _M.get_system_trusted_certs_filepath()
|
||||
for _, path in ipairs(trusted_certs_paths) do
|
||||
if file_exists(path) then
|
||||
return path
|
||||
end
|
||||
end
|
||||
|
||||
return nil,
|
||||
"Could not find trusted certs file in " ..
|
||||
"any of the `system`-predefined locations. " ..
|
||||
"Please install a certs file there or set " ..
|
||||
"`lua_ssl_trusted_certificate` to a " ..
|
||||
"specific file path instead of `system`"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
function _M.gen_trusted_certs_combined_file(combined_filepath, paths)
|
||||
local combined_file = assert(io.open(combined_filepath, "w"))
|
||||
for _, path in ipairs(paths) do
|
||||
local cert_file = assert(io.open(path, "r"))
|
||||
combined_file:write(cert_file:read("*a"))
|
||||
combined_file:write("\n")
|
||||
cert_file:close()
|
||||
end
|
||||
combined_file:close()
|
||||
end
|
||||
|
||||
|
||||
return _M
|
Reference in New Issue
Block a user