РЕШЕНО: urfaclient: set_radius_attr (как заполнить массив? )

Технические вопросы по UTM 5.0
Ответить
Leonid Ryzhik
Сообщения: 61
Зарегистрирован: Вт сен 18, 2007 17:18
Откуда: St. Petersburg, Russia

РЕШЕНО: urfaclient: set_radius_attr (как заполнить массив? )

Сообщение Leonid Ryzhik »

коллеги, пожалуйста, снимите с ручника...

функция в api.xml:

Код: Выделить всё

  <function name="rpcf_set_radius_attr" id="0x10100">
    <input>
      <integer name="sid" />
      <integer name="st" />
      <integer name="cnt" />
      <for name="i" from="0" count="cnt">
        <integer name="vendor" array_index="i" />
        <integer name="attr" array_index="i" />
        <integer name="param1" array_index="i" />
        <if variable="param1" value="1" condition="eq">
          <string name="cval" array_index="i" />
        </if>
        <if variable="param1" value="1" condition="ne">
          <integer name="ival" array_index="i" />
        </if>
      </for>
    </input>
    <output/>
  </function>
пытаюсь построить простой вызов:

Код: Выделить всё

<?xml version="1.0"?>
<urfa>
        <call function="rpcf_set_radius_attr">
                <parameter name="sid"/>
                <!-- <parameter name="iattr"/>
                <parameter name="oattr"/> -->
                <parameter name="st" value="3" />
                <parameter name="cnt" value="1" />
                <array name="i">
                        <item>
                                <integer name="vendor" value="9"/>
                                <integer name="attr" value="1"/>
                                <integer name="param1" value="1"/>
                                <string name="cval" value="xxx"/>
                        </item>
                        <item>
                                <integer name="vendor" value="9"/>
                                <integer name="attr" value="1"/>
                                <integer name="param1" value="1"/>
                                <string name="cval" value="yyy"/>
                        </item>

                </array>
        </call>

</urfa>

запускаю с -sid=202 ( реальный service id ).

получаю:

Код: Выделить всё

 Notice&#58; May 12 21&#58;15&#58;34 UTM5 Config&#58; Processing config file&#58; /netup/utm5/utm5_u                                              rfaclient.cfg
Processing action&#58; set_radattr
  st=>3
  cnt=>2
Mandatory parameter vendor value not specified
ERROR&#58; Mandatory parameter value not specified
&#91;root@radius /netup/utm5/xml&#93;# ../bin/utm5_urfaclient -a set_radattr -sid 202 -d                                              ebug
 Notice&#58; May 12 21&#58;15&#58;41 UTM5 Config&#58; Processing config file&#58; /netup/utm5/utm5_u                                              rfaclient.cfg
Processing action&#58; set_radattr
  st=>3
  cnt=>2
<call> tag&#58; rpcf_set_radius_attr
Processing call rpcf_set_radius_attr
URFA Call&#58; 0x10100
  cnt=>'2';
  sid=>'202';
  st=>'3';
process_input start
INDEXES &#40;0&#41; &#58; 0

get_var_value&#58; curr index 0 var.list.size 0 var.size 1
Passing int <sid> value <202>
INDEXES &#40;0&#41; &#58; 0

get_var_value&#58; curr index 0 var.list.size 0 var.size 1
Passing int <st> value <3>
INDEXES &#40;0&#41; &#58; 0

get_var_value&#58; curr index 0 var.list.size 0 var.size 1
Passing int <cnt> value <2>
input loop begin
from <0> count <2> counter <i>
FAILED TO PARSE INDEXES&#58;
for&#58; counter&#58; i  value&#58; 0
process_input start
Mandatory parameter vendor value not specified
ERROR&#58; Mandatory parameter value not specified
что я делаю не так с заполнением массива? почему FAIELD TO PARSE INDEXES?

гугл не помог. документации на урфу нормальной тоже не видно ( ау, нетап -- где описание? лицензию я купил, между прочим... )
Последний раз редактировалось Leonid Ryzhik Чт май 13, 2010 19:28, всего редактировалось 1 раз.

Pulse
Сообщения: 945
Зарегистрирован: Вт окт 03, 2006 12:58

Сообщение Pulse »

пример массива teldata.xml

Leonid Ryzhik
Сообщения: 61
Зарегистрирован: Вт сен 18, 2007 17:18
Откуда: St. Petersburg, Russia

Сообщение Leonid Ryzhik »

Pulse писал(а):пример массива teldata.xml
безусловно, grep array *.xml | grep -v api.xml я сделал.

массивы в teldata.xml -- а) многомерные, и б) с анонимными ( или однородными ) членами.

мне для заполнения радиусных атрибутов надо сделать одномерный массив, членами которого являются наборы полей.
вот и непонятно,

а) почему все-таки FAILED на тему индекса
б) если делать как в teldata.xml -- как присвоить нужные значения нужным полям?

Leonid Ryzhik
Сообщения: 61
Зарегистрирован: Вт сен 18, 2007 17:18
Откуда: St. Petersburg, Russia

Решение

Сообщение Leonid Ryzhik »

русские программисты пишут документацию к коду. только к чужому. после тыкания и реверса :-)

итак, чего я не знал:

1. в <call> массива быть, как оказалось, не может.
2. он может быть в datafile.

итак:

sr.xml:

Код: Выделить всё

<?xml version="1.0"?>
<urfa>
	<call function="rpcf_set_radius_attr">
		<parameter name="sid"/>
		<parameter name="st" value="3" />
		<parameter name="cnt" value="2" />
	</call>

</urfa>
файл с данными:

Код: Выделить всё

<?xml version="1.0"?>
<urfa>
		<array name="vendor" dimension="1">
			<dim>9</dim>
			<dim>9</dim>
		</array>
		<array name="attr" dimension="1">
			<dim>1</dim>
			<dim>1</dim>
		</array>
		<array name="param1" dimension="1">
			<dim>1</dim>
			<dim>1</dim>
		</array>
		<array name="cval" dimension="1">
			<dim>lcp&#58;interface-config#1=rate-limit input 16777216 3145728 6291456 conform-action transmit exceed-action drop
</dim>
			<dim>lcp&#58;interface-config#1=rate-limit output 16777216 3145728 6291456 conform-action transmit exceed-action drop
</dim>
		</array>

</urfa>
строка запуска:

Код: Выделить всё

/netup/utm5/bin/utm5_urfaclient -a sr -datafile srdata.tmp -sid 202
и все работает.

конечно, остались вопросы:

1. написать целиковый скрипт, который возьмет из данных и sid, и сможет взять в цикле серию sid
2. а как задать массив из командной строки?

но -- я его победил ! :-)

Pulse
Сообщения: 945
Зарегистрирован: Вт окт 03, 2006 12:58

Сообщение Pulse »

моя секретная переписка с хотлайном
> скажите пожалуйста, массив в скрипт можно передать только через datafile?
> параметрами через строку запуска нельзя?
>

Можно. Например:

cat test.xml

<urfa>
<parameter name="test"/>
<out var="test"/>
</urfa>

./utm5_urfaclient -x . -a test -test 123 -test 456
и ещё секретные коды запуска
urfa позволяет выполнять арифметические действия, например:

<urfa>
<set dst="a" value="2"/>
<set dst="b" value="1"/>
<add dst="c" arg1="a" arg2="b"/> <!--c=a+b-->
<div dst="c" arg1="c" arg2="2"/><!--c=c/2-->
<mul dst="c" arg1="c" arg2="b"/><!--c=b*c-->
<sub dst="c" arg1="0" arg2="c"/><!--c=0-c-->
<out var="c"/>
</urfa>

dwemer
Сообщения: 276
Зарегистрирован: Чт янв 25, 2007 05:59

Сообщение dwemer »

Pulse писал(а): urfa позволяет выполнять арифметические действия, например:

<urfa>
<set dst="a" value="2"/>
<set dst="b" value="1"/>
<add dst="c" arg1="a" arg2="b"/> <!--c=a+b-->
<div dst="c" arg1="c" arg2="2"/><!--c=c/2-->
<mul dst="c" arg1="c" arg2="b"/><!--c=b*c-->
<sub dst="c" arg1="0" arg2="c"/><!--c=0-c-->
<out var="c"/>
</urfa>
огромное СПАСИБО за это :) Мне без оплаты поддержка не хотела это говорить. Печально, нетап просит деньги за раскрытие информации, которая обязана быть отражена в документации .

Leonid Ryzhik
Сообщения: 61
Зарегистрирован: Вт сен 18, 2007 17:18
Откуда: St. Petersburg, Russia

Сообщение Leonid Ryzhik »

Pulse писал(а):моя секретная переписка с хотлайном

> скажите пожалуйста, массив в скрипт можно передать только через datafile?
> параметрами через строку запуска нельзя?
>

Можно. Например:
спасибо огромное!

крайне ПЕЧАЛЬНО, что это не отражено в документации. при стоимости урфа модуля больше чем ядра.

Pulse
Сообщения: 945
Зарегистрирован: Вт окт 03, 2006 12:58

Сообщение Pulse »

тссс!! тиха тиха! я вам по секрету же!

shoorickello
Сообщения: 134
Зарегистрирован: Ср июн 29, 2005 13:08

Сообщение shoorickello »

Высылаю в сторону компании «НетАп» очередной луч добра. За отсутствие вменяемой документации, за ошибки в api.xml — компонента, который стоит больше, чем само ядро.

Итак, возникла задача устанавливать пачку RADIUS-атрибутов к сервисной связке, причём разного типа: строка, число, IP-адрес. Спасибо топикстартеру и его трудам, но urfaclient упорно отказывался делать нужное мне: одинаковые атрибуты (все числовые, например) — пожалуйста, а разные — ни в какую.

Полдня провёл в поисках вариантов, как это сделать и выяснилось, что в api.xml ошибка в описании функции rpcf_set_radius_attr. Описание необходимо заменить на следующее:

Код: Выделить всё

    <function name="rpcf_set_radius_attr" id="0x10100">
        <input>
            <integer name="sid" />
            <integer name="st" />
            <integer name="cnt" />
            <for name="i" from="0" count="cnt">
                <integer name="vendor" array_index="i" />
                <integer name="attr" array_index="i" />
                <integer name="param1" array_index="i" />
                <set dst="param1_tmp" src_index="i" src="param1" />
                <if variable="param1_tmp" value="1" condition="eq">
                    <string name="cval" array_index="i" />
                </if>
                <if variable="param1_tmp" value="1" condition="ne">
                    <integer name="ival" array_index="i" />
                </if>
            </for>
        </input>
        <output>
        </output>
    </function>
В сток-варианте всегда проверялось значение param1[0], поэтому urfaclient хотел все радиус-атрибуты с типом, равным первому.

Ну, и до кучи, чтобы суммировать вышенаписанное, вызов urfaclient:

Код: Выделить всё

/netup/utm5/bin/utm5_urfaclient -a utm_set_radius_attr -datafile \ 
    /tmp/xmlV5NFeJ -sid 53936 -st 10000 -cnt 4
/netup/utm5/xml/utm_set_radius_attr.xml:

Код: Выделить всё

<?xml version="1.0"?>
<urfa>
    <call function="rpcf_set_radius_attr">
        <parameter name="sid"/>
        <parameter name="st"/>
        <parameter name="cnt"/>
    </call>
</urfa>
/tmp/xmlV5NFeJ:

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?>
<urfa>
    <array name="vendor" dimension="1" comment="">
        <dim>14988</dim>
        <dim>14988</dim>
        <dim>14988</dim>
        <dim>14988</dim>
    </array>
    <array name="attr" dimension="1" comment="">
        <dim>99</dim>
        <dim>55</dim>
        <dim>56</dim>
        <dim>57</dim>
    </array>
    <array name="param1" dimension="1" comment="">
        <dim>1</dim>
        <dim>0</dim>
        <dim>1</dim>
        <dim>2</dim>
    </array>
    <array name="cval" dimension="1" comment="">
        <dim>limit-128k</dim>
        <dim>1</dim>
        <dim>2</dim>
        <dim>50529027</dim>
    </array>
    <array name="ival" dimension="1" comment="">
        <dim>limit-128k</dim>
        <dim>1</dim>
        <dim>2</dim>
        <dim>50529027</dim>
    </array>
</urfa>
Значения param1:

0 (в таблице "radius_data": 1): число, значение атрибута берётся из ival
1 (в таблице "radius_data": 2): строка, значение атрибута берётся из cval
2 (в таблице "radius_data": 3): IP адрес, значение атрибута берётся из ival, формат конвертируется между числом и IP-адресом функциями PHP ip2long() и long2ip(), например

Значение st:

10000: владелец — сервисная связка
значение остальных чисел значений st для меня туманно.

Pulse
Сообщения: 945
Зарегистрирован: Вт окт 03, 2006 12:58

Сообщение Pulse »

Потому что st паходу сокращение от owner_type! а вы что подумали?

Ответить