首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >If语句的计算结果不一致

If语句的计算结果不一致
EN

Stack Overflow用户
提问于 2019-05-13 10:05:48
回答 1查看 393关注 0票数 6

下面是我在copy-acct-to-home-server中部署的代码片段。它主要是检查用户名是否有"@“符号...如果是,则从mysql表中提取huntgroup,比较NAS-IP-Address。最后,如果查询的结果不为空,则更新代理到领域。

代码语言:javascript
复制
if(request:User-Name =~ /@/){
                            update control {
                                    SQLQueryResult := "%{sql:SELECT `groupname` FROM `radhuntgroup` WHERE nasipaddress='%{NAS-IP-Address}'}" }
                            if( %{control:SQLQueryResult} != '') {
                                    update control {
                                    Proxy-To-Realm := SQLQueryResult } }
                    }

这段代码并没有像我期望的那样工作。下面是true和false条件下的调试消息片段结果

当从数据库中提取一些值时,代理到领域应该已经分配了适当的值(但它不起作用)

代码语言:javascript
复制
 Acct-Session-Id = "5CD8CA8B-0012B000"
    Framed-IP-Address = host.ip.address.local
    Acct-Multi-Session-Id = "24c9a18012b85c514f44f9715cd8ca8b085b"
    Acct-Link-Count = 1
    Acct-Status-Type = Start
    Acct-Authentic = RADIUS
    User-Name = "user@domain.com"
    NAS-IP-Address = some.ip.add.NAS
    NAS-Identifier = "CustomNASID"

   .........



    --> user@domain.com
(6)         SQL-User-Name set to 'user@domain.com'
rlm_sql (sql): Reserved connection (5)
(6)         EXPAND /var/log/freeradius/sqllog.sql
(6)            --> /var/log/freeradius/sqllog.sql
(6)         Executing select query: SELECT `groupname` FROM `radhuntgroup` WHERE nasipaddress='some.ip.add.NAS'
rlm_sql (sql): Released connection (5)
(6)         EXPAND %{sql:SELECT `groupname` FROM `radhuntgroup` WHERE nasipaddress='%{NAS-IP-Address}'}
(6)            --> customRealm
(6)         SQLQueryResult := customRealm
(6)       } # update control = noop
(6)       if ( %{control:SQLQueryResult} != '') {
(6)       if ( %{control:SQLQueryResult} != '')  -> TRUE
(6)       if ( %{control:SQLQueryResult} != '')  {
(6)         update control {
(6)           No attributes updated
(6)         } # update control = noop
(6)       } # if ( %{control:SQLQueryResult} != '')  = noop
(6)     } # if (request:User-Name =~ /@/) = noop
(6)   } # preacct = ok

从日志中可以看出,即使两个if条件都为真(用户名包含@且SQLQueryResult不为空),它也没有使用从数据库获取的值更新属性proxy-to-realm

If条件似乎为真,即使没有从数据库中提取任何值。这是日志片段。

代码语言:javascript
复制
 Acct-Session-Id = "5CD8C9F7-C1DA2D04"
    Framed-IP-Address = host.ip.address.local
    Acct-Multi-Session-Id = "441e98b16388185680b4a7355cd8c9f7000a"
    Acct-Link-Count = 5
    Acct-Status-Type = Interim-Update
    Acct-Authentic = RADIUS
    User-Name = "user@somedomain"
    NAS-IP-Address = some.ip.address.nas


   ...........



    Executing section preacct from file /etc/freeradius/3.0/sites-enabled/copy-acct-to-home-server
(8)   preacct {
(8)     [preprocess] = ok
(8)     if (request:User-Name =~ /@/){
(8)     if (request:User-Name =~ /@/) -> TRUE
(8)     if (request:User-Name =~ /@/) {
(8)       update control {
(8)         EXPAND %{User-Name}
(8)            --> user@domain.com
(8)         SQL-User-Name set to 'user@domain.com'
rlm_sql (sql): Reserved connection (6)
(8)         EXPAND /var/log/freeradius/sqllog.sql
(8)            --> /var/log/freeradius/sqllog.sql
(8)         Executing select query: SELECT `groupname` FROM `radhuntgroup` WHERE nasipaddress='nas.ip.address.local'
(8)         SQL query returned no results
rlm_sql (sql): Released connection (6)
(8)         EXPAND %{sql:SELECT `groupname` FROM `radhuntgroup` WHERE nasipaddress='%{NAS-IP-Address}'}
(8)            --> 
(8)         SQLQueryResult := 
(8)       } # update control = noop
(8)       if ( %{control:SQLQueryResult} != '') {
(8)       if ( %{control:SQLQueryResult} != '')  -> TRUE
(8)       if ( %{control:SQLQueryResult} != '')  {
(8)         update control {
(8)           No attributes updated
(8)         } # update control = noop
(8)       } # if ( %{control:SQLQueryResult} != '')  = noop
(8)     } # if (request:User-Name =~ /@/) = noop
(8)   } # preacct = ok

奇怪的是,如果(SQLQueryResult != '')在这种情况下应该为假,那么它不会从db第二个if条件中提取任何值。

属性SQLQueryResult已在字典中定义为字符串。

我不确定我在这里错过了什么。这似乎是一个简单的逻辑。请求专家的帮助。

EN

回答 1

Stack Overflow用户

发布于 2019-10-31 07:45:18

这里有几个问题。

首先,部分的右大括号应该始终在新行上。配置解析器不是很好,这可能会让它出错。

其次,您混合了属性引用和扩展语法。

代码语言:javascript
复制
if( %{control:SQLQueryResult} != '') {

以上内容无效。老实说,我很惊讶表达式解析器没有抛出错误。这可能是因为%{control:SQLQueryResult}中没有空格,所以它将其视为字符串文字,然后将字符串文字与空字符串进行比较。

您需要将展开括在双引号中

代码语言:javascript
复制
if ("%{control:SQLQueryResult}" != '') {

或使用属性引用表单

代码语言:javascript
复制
if (&control:SQLQueryResult != '') {

我很确定这就是你的问题所在。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56104984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档