저는 CentOS 7 서버에서 FreeRADIUS 3.0.13을 사용하여 전화 장치에서 계정 데이터를 가져오고 있으며 특정 레코드 유형을 간단히 삭제하고 싶습니다. 특히 이 애플리케이션의 경우 중지 메시지만 기록하고 싶습니다.
구체적으로 자세한 로그를 작성한 다음 bufferedsql 모듈을 사용하여 해당 로그에서 데이터를 읽은 다음 데이터베이스 서버에 씁니다. "Accounting-On" 또는 "Start"와 같은 기록을 받을 때까지는 모든 것이 잘 작동합니다. 나는 원치 않는 레코드를 데이터베이스에 기록하고 간단히 삭제하여 이러한 문제 중 일부를 해결했지만 더 우아한 솔루션을 선호합니다.
내가 문서에서 본 것 중 하나는 쿼리를 로 대체하는 것입니다 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
이러한 유형의 회계 기록을 간단히 삭제하도록ialup.conf를 어떻게 구성합니까? 계정 데이터를 생성하는 장치는 특정 계정 메시지만 보내는 모든 유형의 구성을 지원하지 않습니다.
내 사용자 정의 전화 접속.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
리소스 정책 언어 문서를 참조하세요 .