55
66#include " JsonWrapper.h"
77#include " Logging.h"
8+ #include " LuaEvaluator.h"
89#include " Reasons.h"
910#include " Result.h"
1011
@@ -25,11 +26,14 @@ using std::string;
2526Evaluator::Evaluator (std::string ruleName, const struct json_object_t * json, const ParameterMap& parameters, ContextInterface& context)
2627 : mJson (json),
2728 mParameters (parameters),
28- mContext(context)
29+ mContext(context),
30+ mLuaEvaluator(std::unique_ptr<LuaEvaluator>(new LuaEvaluator()))
2931{
3032 mIndicators .Push (std::move (ruleName));
3133}
3234
35+ Evaluator::~Evaluator () = default ;
36+
3337Result<AuditResult> Evaluator::ExecuteAudit (const PayloadFormatter& formatter)
3438{
3539 auto result = EvaluateProcedure (mJson , Action::Audit);
@@ -109,6 +113,20 @@ Result<Status> Evaluator::EvaluateProcedure(const JSON_Object* object, const Act
109113 return result.Value ();
110114 }
111115
116+ if (!strcmp (name, " lua" ))
117+ {
118+ mIndicators .Push (" lua" );
119+ const auto result = EvaluateLua (value, action);
120+ if (!result.HasValue ())
121+ {
122+ OsConfigLogError (mContext .GetLogHandle (), " Evaluation failed: %s" , result.Error ().message .c_str ());
123+ return result;
124+ }
125+ mIndicators .Back ().status = result.Value ();
126+ mIndicators .Pop ();
127+ return result.Value ();
128+ }
129+
112130 mIndicators .Push (name);
113131 auto result = EvaluateBuiltinProcedure (name, value, action);
114132 if (!result.HasValue ())
@@ -206,6 +224,49 @@ Result<Status> Evaluator::EvaluateNot(const json_value_t* value, const Action ac
206224 return Status::Compliant;
207225}
208226
227+ Result<Status> Evaluator::EvaluateLua (const json_value_t * value, const Action action)
228+ {
229+ OsConfigLogDebug (mContext .GetLogHandle (), " Evaluating lua operator" );
230+
231+ if (nullptr == value)
232+ {
233+ OsConfigLogError (mContext .GetLogHandle (), " invalid argument" );
234+ return Error (" invalid argument" , EINVAL );
235+ }
236+
237+ if (json_value_get_type (value) != JSONObject)
238+ {
239+ OsConfigLogError (mContext .GetLogHandle (), " lua value is not an object" );
240+ return Error (" lua value is not an object" , EINVAL );
241+ }
242+
243+ // Lua can be used for both audit and remediation
244+ // Get the arguments from the JSON object
245+ auto arguments = GetBuiltinProcedureArguments (value);
246+ if (!arguments.HasValue ())
247+ {
248+ OsConfigLogError (mContext .GetLogHandle (), " Failed to get lua arguments: %s" , arguments.Error ().message .c_str ());
249+ return arguments.Error ();
250+ }
251+
252+ // Call the lua evaluation function using our LuaEvaluator instance
253+ auto scriptIt = arguments.Value ().find (" script" );
254+ if (scriptIt == arguments.Value ().end ())
255+ {
256+ OsConfigLogError (mContext .GetLogHandle (), " No script content provided" );
257+ return Error (" No script content provided" , EINVAL );
258+ }
259+
260+ auto result = mLuaEvaluator ->Evaluate (scriptIt->second , mIndicators , mContext , action);
261+ if (!result.HasValue ())
262+ {
263+ OsConfigLogError (mContext .GetLogHandle (), " Lua evaluation failed: %s" , result.Error ().message .c_str ());
264+ return result.Error ();
265+ }
266+
267+ return result.Value ();
268+ }
269+
209270Result<map<string, string>> Evaluator::GetBuiltinProcedureArguments (const json_value_t * value) const
210271{
211272 map<string, string> result;
0 commit comments