- 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>
190 lines
5.0 KiB
Lua
190 lines
5.0 KiB
Lua
--
|
|
-- 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
|