mirror of https://github.com/Icinga/icinga2.git
Merge pull request #7449 from Icinga/feature/warn-set-global-var
DSL: warn on x=y if x is a global variable
This commit is contained in:
commit
b75e1585d6
|
@ -1,7 +1,7 @@
|
||||||
/* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
|
/* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
|
||||||
|
|
||||||
if (!globals.contains("NscpPath")) {
|
if (!globals.contains("NscpPath")) {
|
||||||
NscpPath = dirname(msi_get_component_path("{5C45463A-4AE9-4325-96DB-6E239C034F93}"))
|
globals.NscpPath = dirname(msi_get_component_path("{5C45463A-4AE9-4325-96DB-6E239C034F93}"))
|
||||||
}
|
}
|
||||||
|
|
||||||
object CheckCommand "nscp-local" {
|
object CheckCommand "nscp-local" {
|
||||||
|
|
|
@ -552,6 +552,58 @@ ExpressionResult GetScopeExpression::DoEvaluate(ScriptFrame& frame, DebugHint *d
|
||||||
VERIFY(!"Invalid scope.");
|
VERIFY(!"Invalid scope.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
void WarnOnImplicitlySetGlobalVar(const std::unique_ptr<Expression>& setLhs, const Value& setLhsParent, CombinedSetOp setOp, const DebugInfo& debug)
|
||||||
|
{
|
||||||
|
auto var (dynamic_cast<VariableExpression*>(setLhs.get()));
|
||||||
|
|
||||||
|
if (var && setLhsParent.IsObject()) {
|
||||||
|
auto ns (dynamic_pointer_cast<Namespace>(setLhsParent.Get<Object::Ptr>()));
|
||||||
|
|
||||||
|
if (ns && ns == ScriptGlobal::GetGlobals()) {
|
||||||
|
const char *opStr = nullptr;
|
||||||
|
|
||||||
|
switch (setOp) {
|
||||||
|
case OpSetLiteral:
|
||||||
|
opStr = "=";
|
||||||
|
break;
|
||||||
|
case OpSetAdd:
|
||||||
|
opStr = "+=";
|
||||||
|
break;
|
||||||
|
case OpSetSubtract:
|
||||||
|
opStr = "-=";
|
||||||
|
break;
|
||||||
|
case OpSetMultiply:
|
||||||
|
opStr = "*=";
|
||||||
|
break;
|
||||||
|
case OpSetDivide:
|
||||||
|
opStr = "/=";
|
||||||
|
break;
|
||||||
|
case OpSetModulo:
|
||||||
|
opStr = "%=";
|
||||||
|
break;
|
||||||
|
case OpSetXor:
|
||||||
|
opStr = "^=";
|
||||||
|
break;
|
||||||
|
case OpSetBinaryAnd:
|
||||||
|
opStr = "&=";
|
||||||
|
break;
|
||||||
|
case OpSetBinaryOr:
|
||||||
|
opStr = "|=";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
VERIFY(!"Invalid opcode.");
|
||||||
|
}
|
||||||
|
|
||||||
|
auto varName (var->GetVariable());
|
||||||
|
|
||||||
|
Log(LogWarning, "config")
|
||||||
|
<< "Global variable '" << varName << "' has been set implicitly via '" << varName << ' ' << opStr << " ...' " << debug << "."
|
||||||
|
" Please set it explicitly via 'globals." << varName << ' ' << opStr << " ...' instead.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ExpressionResult SetExpression::DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const
|
ExpressionResult SetExpression::DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const
|
||||||
{
|
{
|
||||||
if (frame.Sandboxed)
|
if (frame.Sandboxed)
|
||||||
|
@ -610,6 +662,8 @@ ExpressionResult SetExpression::DoEvaluate(ScriptFrame& frame, DebugHint *dhint)
|
||||||
delete psdhint;
|
delete psdhint;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WarnOnImplicitlySetGlobalVar(m_Operand1, parent, m_Op, m_DebugInfo);
|
||||||
|
|
||||||
return Empty;
|
return Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue