我在 CentOS 7 服务器上使用 FreeRADIUS 3.0.13 从电话设备获取记帐数据,我们希望简单地删除某些记录类型 - 具体来说,对于此应用程序,我只想记录 Stop 消息。
我们专门写入详细日志,然后使用 bufferedsql 模块从该日志中读取数据,然后写入数据库服务器。一切都正常工作,直到我收到诸如“Accounting-On”或“Start”之类的记录。我已经通过将不需要的记录写入数据库并简单地清除来解决了其中的一些问题,但我更喜欢更优雅的解决方案。
我在文档中看到的一件事是用 a 替换查询SELECT TRUE;
,但由于这不会更新记录,FreeRADIUS 似乎对此感到窒息。它报告“对请求没有响应”并将记录保留在详细文件中,尝试每 30 秒重新处理一次。
当我运行时radiusd -X
,我看到类似以下的输出。此输出来自收到的 Accounting-On 数据包,我只想丢弃该消息:
(22) accounting {
(22) sql: EXPAND %{tolower:type.%{Acct-Status-Type}.query}
(22) sql: --> type.accounting-on.query
(22) sql: Using query template 'query'
rlm_sql (sql): Reserved connection (0)
(22) sql: EXPAND %{User-Name}
(22) sql: -->
(22) sql: SQL-User-Name set to ''
(22) sql: EXPAND SELECT TRUE;
(22) sql: --> SELECT TRUE;
(22) sql: Executing query: SELECT TRUE;
(22) sql: SQL query returned: success
(22) sql: -1 record(s) updated
(22) sql: No additional queries configured
rlm_sql (sql): Released connection (0)
(22) [sql] = noop
(22) } # accounting = noop
(22) detail (/var/log/radius/radacct/detail-ca-fallback/detail-ca-fallback-log): No response to request. Will retry in 30 seconds
(22) Finished request
(22) Cleaning up request packet ID 0 with timestamp +660
Ready to process requests
如何配置 dialup.conf 以简单地删除这些类型的记帐记录?生成计费数据的设备不支持任何类型的仅发送特定计费消息的配置。
这是我的自定义 dialup.conf 文件的相关部分:
accounting {
reference = "%{tolower:type.%{Acct-Status-Type}.query}"
type {
accounting-on {
# This is a no-op. We don't log this anywhere.
query = "SELECT TRUE;"
}
accounting-off {
# This is a no-op. We don't log this anywhere.
query = "SELECT TRUE;"
}
start {
# This is a no-op. We don't log this anywhere.
query = "INSERT INTO blackhole \
(<snip - fields>) \
VALUES (<snip - values>)"
}
interim-update {
# This is a no-op. We don't log this anywhere.
uery = "INSERT INTO blackhole \
(<snip - fields>) \
VALUES (<snip - values>)"
}
stop {
query = "INSERT INTO ${....acct_table1} \
(<fields>) \
VALUES (<values>)"
}
#
# No Acct-Status-Type == ignore the packet
#
none {
query = "SELECT true"
}
}
}
答案1
注释掉(或删除)这些部分,以便维护您的配置的其他人清楚您没有处理这些消息类型。然后,在会计部分,仅当 Acct-Status-Type 值与您要处理的类型之一匹配时才调用 SQL 模块。
在您的示例中,您似乎忽略了所有不是很有用的类型。这是一个仅处理开始和停止的示例。
accounting {
switch "%{Acct-Status-Type}" {
case 'Start' {
sql
}
case 'Stop' {
sql
}
# Do nothing for other types
}
}
请参阅man unlang
参考资料 策略语言文档。