【发布时间】:2017-08-16 02:30:09
【问题描述】:
我想知道您是否可以为我指明正确的方向。我想编写一个基于规则的系统来审计一组机器——例如
- 检查配置参数是否设置正确
- 检查机器的状态,看看它们是否在可接受的范围内
我正在努力解决的问题是为审计规则提出一个语法,这样我就不必编写 defrules 代码了。我创建了一些简单的审计规则,但我正在努力想出一个通用的表格。
这是我目前的尝试。
首先,我目前使用一个模板来表示配置参数和运行状态(由于缺乏想象力,我称之为审计事实),以便我的审计语言可以同时用于配置和状态。我使用域槽来指定配置与状态。
(deftemplate audit-fact
(slot domain (allowed-values config state)) ;; config vs. state
(slot machine) ;; machine to audit
(slot name) ;; parameter or state to check/audit
(slot value) ;; parameter value
(slot already-checked (default FALSE))
)
接下来,我编写了一个程序来读取机器配置和状态并将其断言为审计事实。以下是示例配置和状态审计事实
(assert (audit-fact
(domain config)
(machine drl-a-15_0)
(name os-version) (value 5.5))
)
(assert (audit-fact
(domain state)
(machine drl-a-15_0)
(name rpm) (value 5023))
)
这是我目前对审计语法/语言的尝试 ---
(deftemplate rule
(slot domain)
(slot name)
(slot constraint (default ?NONE) (allowed-values should-remain-at-default should-equal should-be-between ignore-if-ends-with))
(multislot values)
(multislot reasons)
(multislot references)
(slot criticality (allowed-values critical info suggestion warning))
(slot already-checked (default FALSE))
)
以下规则用于检查状态或参数是否在一定范围内
(assert (rule
(domain state)
(name rpm)
(constraint should-be-between)
(values 5000 5500)
(criticality critical)
(reasons "Low values could cause engine to stall. Prolonged high value could cause engine to heat up") )
)
接下来,我使用以下规则来检查状态或参数是否等于特定值
(assert (rule
(domain config)
(name os-version)
(constraint should-equal)
(values 5.5)
(criticality critical)
(reasons "OS version must be at 5.5 – no other levels are currently certified.") )
)
以下规则实现了相等和之间的检查
(defrule rule-should-eq
(rule (domain ?d) (name ?n) (constraint should-equal) (values ?cv) (reasons ?r))
?p <- (audit-fact (domain ?d) (name ?n) (value ?v) (already-checked FALSE))
=>
(if (eq ?v ?cv)
then
(printout t "checking " ?d ": " ?n ". Passed " crlf)
else
(printout t "checking " ?d “: “ ?n " should be set to " ?cv ". " ?r ". Warning" crlf)
)
(modify ?p (already-checked TRUE))
)
(defrule rule-should-be-between
(rule (domain ?d) (name ?n) (constraint should-be-between) (values ?cv-low ?cv-high) (reasons ?r))
?p <- (audit-fact (domain ?d) (name ?n) (value ?v) (already-checked FALSE))
=>
(if (and (>= ?v ?cv-low) (<= ?v ?cv-high))
then
(printout t "checking " ?n ". Passed " crlf)
else
(printout t "checking " ?n " should be between " ?cv-low " and " ?cv-high ". " ?r ". Warning" crlf)
)
(modify ?p (already-checked TRUE))
)
使用上面的方法,我可以实现简单的检查——例如,must-be-set-to、must-be-between、must-not-equal、must-remain-at-default-value、must-be-高于、必须低于等。
但是我想不出一种简单的方法来使语法处理带有ands或ors等的多个条件。
问题---
- 是否有一篇论文描述了上述审计规则的设计模式。我目前正在研究示例(CLIPS)中的wine.clp。
- 我是否应该放弃并只对简单的审计规则使用简单的语法,而对任何复杂的事情都使用 defrules - 例如,如果 config-A 设置为 X,然后检查其他五个配置以确保它们也设置正确,然后断言状态检查。一旦断言,然后检查状态是否在一定范围内。
提前致谢。
伯尼
【问题讨论】:
-
旁注:rule-should-eq 可以省略;使用 should-be-between 和相同的界限。给错误信息加糖。
-
您研究过不同的方法吗?如果您的机器数据是 XML 格式的,那么您可以在 XML 模式定义中使用构面和断言,而验证解析器就可以解决问题。 - 您还可以查看 Java 注释以定义字段值的约束。 IIRC,那里不止一个库。
-
Laune -- 不错的建议。我想让审计员进行更复杂的检查——例如,如果 configA=xx,然后检查 configB>n、configC=m 等,或者如果设置了 configA,那么检查其他配置是否设置了某个方式和机器状态均在安全水平范围内。此外,当我报告问题时,我想打印一个排序列表——例如,按关键性,然后是参数名称。 CLIPS 或 JESS 似乎给了我灵活性。但我确实喜欢你的建议。谢谢。