mirror of
https://github.com/falcosecurity/falco.git
synced 2025-09-29 14:18:01 +00:00
Instead of having .lua files external to the program responsible for loading rules, embed the contents of those files into the executable and load them as strings instead of as files: Add a cmake custom command below userspace/engine/lua that calls a bash script lua-to-cpp.sh to generate falco_engine_lua_files.{cpp,hh} that are compiled into the falco engine library. The script creates a .cpp file that has const char * symbols for each file, as well as lists of files that should be loaded when the falco engine is loaded. There are actually two lists: - lua_module_strings: these are loaded and also added to the lua runtime package.preload table, so they are available when lua code require()s them. - lua_code_strings: these are loaded *and* evaluated, so the functions in them are availble to be called from C++. This simplifies some of the falco_common methods, as there's no need to keep track of a "main" lua file to load or paths from which the lua loader should find files for modules, and there's no need to keep track of an "alternate" lua directory that occurs for debug builds. Also, there's no need to include any .lua files in the installed packages, as they're built into the falco binary. Signed-off-by: Mark Stemm <mark.stemm@gmail.com>
85 lines
2.4 KiB
Bash
85 lines
2.4 KiB
Bash
#!/bin/bash
|
|
|
|
set -euo pipefail
|
|
|
|
LUA_FILE_DIR=$1
|
|
LYAML_LUA_DIR=$2
|
|
OUTPUT_DIR=$3
|
|
|
|
MODULE_SYMS=()
|
|
CODE_SYMS=()
|
|
|
|
function add_lua_file {
|
|
filename=$1
|
|
is_module=$2
|
|
|
|
# Take the basename of the file
|
|
BASE_NAME=$(basename ${file} .lua)
|
|
SYMBOL_NAME="${BASE_NAME}_lua_file_contents"
|
|
FILE_CONTENTS=$(<${file})
|
|
|
|
# Add a symbol to the .cc file containing the contents of the file
|
|
echo "const char *${SYMBOL_NAME}=R\"LUAFILE(${FILE_CONTENTS})LUAFILE\";" >> ${OUTPUT_DIR}/falco_engine_lua_files.cpp
|
|
|
|
# Add an extern reference to the .hh file
|
|
echo "extern const char *${SYMBOL_NAME};" >> ${OUTPUT_DIR}/falco_engine_lua_files.hh
|
|
|
|
if [[ "${is_module}" == "true" ]]; then
|
|
# Determine the module name for the file
|
|
if [[ "${file}" == *"/"* ]]; then
|
|
MODULE_NAME=$(echo ${file} | tr / . | sed -e 's/.lua//')
|
|
else
|
|
MODULE_NAME=$(basename ${file} .lua)
|
|
fi
|
|
|
|
# Add the pair (string contents, module name) to MODULE_SYMS
|
|
PAIR=$(echo "{${SYMBOL_NAME},\"${MODULE_NAME}\"}")
|
|
MODULE_SYMS+=(${PAIR})
|
|
else
|
|
# Add the string to CODE_SYMS
|
|
CODE_SYMS+=(${SYMBOL_NAME})
|
|
fi
|
|
}
|
|
|
|
cat <<EOF > ${OUTPUT_DIR}/falco_engine_lua_files.cpp
|
|
// Automatically generated. Do not edit
|
|
#include "falco_engine_lua_files.hh"
|
|
EOF
|
|
|
|
cat <<EOF > ${OUTPUT_DIR}/falco_engine_lua_files.hh
|
|
#pragma once
|
|
// Automatically generated. Do not edit
|
|
#include <list>
|
|
#include <utility>
|
|
EOF
|
|
|
|
# lyaml and any files in the "modules" subdirectory are treated as lua
|
|
# modules.
|
|
pushd ${LYAML_LUA_DIR}
|
|
for file in *.lua */*.lua; do
|
|
add_lua_file $file "true"
|
|
done
|
|
popd
|
|
|
|
pushd ${LUA_FILE_DIR}/modules
|
|
for file in *.lua; do
|
|
add_lua_file $file "true"
|
|
done
|
|
popd
|
|
|
|
# Any .lua files in this directory are treated as code with functions
|
|
# to execute.
|
|
pushd ${LUA_FILE_DIR}
|
|
for file in ${LUA_FILE_DIR}/*.lua; do
|
|
add_lua_file $file "false"
|
|
done
|
|
popd
|
|
|
|
# Create a list of lua module (string, module name) pairs from MODULE_SYMS
|
|
echo "extern std::list<std::pair<const char *,const char *>> lua_module_strings;" >> ${OUTPUT_DIR}/falco_engine_lua_files.hh
|
|
echo "std::list<std::pair<const char *,const char *>> lua_module_strings = {$(IFS=, ; echo "${MODULE_SYMS[*]}")};" >> ${OUTPUT_DIR}/falco_engine_lua_files.cpp
|
|
|
|
# Create a list of lua code strings from CODE_SYMS
|
|
echo "extern std::list<const char *> lua_code_strings;" >> ${OUTPUT_DIR}/falco_engine_lua_files.hh
|
|
echo "std::list<const char *> lua_code_strings = {$(IFS=, ; echo "${CODE_SYMS[*]}")};" >> ${OUTPUT_DIR}/falco_engine_lua_files.cpp
|