urfaclient на C

Технические вопросы по UTM 5.0
Ответить
Аватара пользователя
marvin
Сообщения: 77
Зарегистрирован: Сб мар 24, 2007 11:18
Откуда: Нижняя Тура

Неправильная обработка хеша, включающего список хешей

Сообщение marvin »

В процессе подготовки к миграции из UTM4 в UTM5, похоже, обнаружил ошибку в обработке хеша, содержащего список хешей в ourfa-perl.

Скрипт utm_import_tclasses.pl:

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

#!/usr/bin/perl

use Ourfa;
use Socket;
use Mysql;
use Data::Dumper;

$prefix="/netup/utm";
open (CONFIG, "$prefix/utm.cfg");
@config = <CONFIG>;
close &#40;CONFIG&#41;;
foreach $line &#40;@config&#41; &#123;
  if &#40;$line =~ m/^&#40;&#91;^#&#93;.+?&#41;=&#40;.*&#41;$/&#41; &#123;
      $$1 = $2;
    &#125;
&#125;

my $ourfa = Ourfa->new&#40;
      api_xml_dir=>"/netup/utm5/xml",
      server=>'localhost',
      login=>$ENV&#123;OURFA_LOGIN&#125; || 'init',
      password=>$ENV&#123;OURFA_PASSWORD&#125; || 'init',
      ssl_cert => '/netup/utm5/admin.crt',
      ssl_key  => '/netup/utm5/admin.crt',
      ssl => 'rsa_cert',
      debug=>1
    &#41;;

$result = $ourfa->rpcf_get_tclasses&#40;&#41;; foreach my $tcls &#40;@&#123;$result->&#123;'array-1'&#125;&#125;&#41;&#123; $ourfa->rpcf_remove_tclass&#40;tclass_id=>$tcls->&#123;tclass_id&#125;&#41;; &#125; # remove previously existing traffic classes

$dbh = Mysql->connect&#40;$database_host,$database,$database_login,$database_password&#41;; $dbh->Query&#40;"SET NAMES utf8"&#41;;
$sth1 = $dbh->query&#40;"SELECT cid, value FROM traffic_classes WHERE tag LIKE 'name' AND cid=10"&#41;;

while&#40;my %tclass1 = $sth1->fetchhash&#41;&#123;

    my @list;
    my $graph = 0;
    my $graph_color = 0;
    my $cid = $tclass1&#123;cid&#125;;
    my $tclass_name = $tclass1&#123;value&#125;;

        $sth2 = $dbh->query&#40;"SELECT value FROM traffic_classes WHERE cid = $cid AND tag LIKE 'graph'"&#41;;       if&#40;my %tclass2 = $sth2->fetchhash&#41;&#123; $graph       = $tclass2&#123;value&#125;; &#125;
        $sth2 = $dbh->query&#40;"SELECT value FROM traffic_classes WHERE cid = $cid AND tag LIKE 'graph_color'"&#41;; if&#40;my %tclass2 = $sth2->fetchhash&#41;&#123; $graph_color = $tclass2&#123;value&#125;; &#125;
        $sth2 = $dbh->query&#40;"SELECT * FROM traffic_classes_nets WHERE cid = $cid"&#41;;

        while&#40;my %tclass2 = $sth2->fetchhash&#41;&#123;

            push&#40;@list, &#123;   saddr         => inet_aton&#40;%tclass2->&#123;ip_from&#125;&#41;,
                            saddr_mask    => inet_aton&#40;%tclass2->&#123;netmask_from&#125;&#41;,
                            daddr         => inet_aton&#40;%tclass2->&#123;ip_to&#125;&#41;,
                            daddr_mask    => inet_aton&#40;%tclass2->&#123;netmask_to&#125;&#41;,
                            src_as        => inet_aton&#40;%tclass2->&#123;src_as&#125;&#41;,
                            dst_as        => inet_aton&#40;%tclass2->&#123;dst_as&#125;&#41;,
                            sport         => %tclass2->&#123;srcport&#125;,
                            dport         => %tclass2->&#123;dstport&#125;,
                            input         => %tclass2->&#123;input&#125;,
                            output        => %tclass2->&#123;output&#125;,
                            tcp_flags     => %tclass2->&#123;tcp_flags&#125;,
                            proto         => %tclass2->&#123;prot&#125;,
                            tos           => %tclass2->&#123;tos&#125;,
                            nexthop       => %tclass2->&#123;nexthop&#125;,
                            ip_from       => inet_aton&#40;'0.0.0.0'&#41;,
                            use_src_as    => 0,
                            use_dst_as    => 0,
                            use_sport     => 0,
                            use_dport     => 0,
                            use_input     => 0,
                            use_output    => 0,
                            use_tcp_flags => 0,
                            use_proto     => 0,
                            use_tos       => 0,
                            use_nexthop   => 0,
                            skip          => 0
                        &#125;
                &#41;;
        &#125;

    my %tclass=&#40;tclass_id         => $cid,
                tclass_name       => $tclass_name,
                graph_color       => 0,
                is_display        => $graph,
                is_fill           => 0,
                time_range_id     => 0,
                dont_save         => 0,
                local_traf_policy => 0,
                tclass_count      => $#list+1,
                'array-1'         => &#91;@list&#93;
                &#41;;

    $ourfa->rpcf_add_tclass2&#40;%tclass&#41;;

# print Dumper \%tclass, "\n";

&#125;
Считывает данные из базы UTM4 и заполняет список классов в UTM5. Несмотря на правильное (насколько я могу судить по выводу дампера) заполнение хеша %tclass уникальными подклассами, при вызове rpcf_add_tclass2 в базу заносятся множественные одинаковые подклассы, повторяющие первый элемент списка.

Буду признателен, если мне укажут на мою ошибку, или подтвердят и исправят баг в Ourfa.xs :oops:

Содержимое debug.log:

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

?Debug &#58; Jan 17 23&#58;50&#58;33 b43bab90 RPCConn&#91;SSL&#93;<init@127.0.0.1>&#58; Stream cleared
?Debug &#58; Jan 17 23&#58;50&#58;33 b43bab90 RPCConn&#91;SSL&#93;<init@127.0.0.1>&#58; Call&#58; 0x2301 &#40;rpcf_add_tclass2&#41;
?Debug &#58; Jan 17 23&#58;50&#58;33 b43bab90 RPCConn&#91;SSL&#93;<init@127.0.0.1>&#58; Real Call&#58; 0x2301 &#40;rpcf_add_tclass2&#41;
?Debug &#58; Jan 17 23&#58;50&#58;33 b43bab90 DBCtx&#58; <144160944> SQL SELECT query&#58; SELECT t_class_name FROM t_class WHERE id='10' AND is_deleted=0
?Debug &#58; Jan 17 23&#58;50&#58;33 b43bab90 DBCtx&#58; <144160944> SQL query&#58; DELETE FROM t_class WHERE id='10'
?Debug &#58; Jan 17 23&#58;50&#58;33 b43bab90 DBCtx&#58; <144160944> SQL SELECT query&#58; SELECT t_class_name FROM t_class WHERE id='10' AND is_deleted=1
?Debug &#58; Jan 17 23&#58;50&#58;33 b43bab90 DBCtx&#58; <144160944> SQL query&#58; INSERT INTO t_class&#40;id,t_class_name,graph_color,is_display,is_fill,time_range_id,dont_save,local_traf_policy&#41; VALUES&#40;'10','Входящий интернет','0','0','0','0','0','0'&#41;
?Debug &#58; Jan 17 23&#58;50&#58;33 b43bab90 DBCtx&#58; <144160944> SQL query&#58; INSERT INTO t_class_detail&#40;t_class_id,saddr,saddr_mask,daddr,daddr_mask,sport,dport,input,output,src_as,dst_as,nexthop,tcp_flags,proto,tos,use_sport,use_dport,use_input,use_output,use_src_as,use_dst_as,use_nexthop,use_tcp_flags,use_proto,use_tos,skip, ip_from&#41; VALUES&#40;'10','0','0','167772160','-16777216','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'&#41;
?Debug &#58; Jan 17 23&#58;50&#58;33 b43bab90 DBCtx&#58; <144160944> SQL query&#58; INSERT INTO t_class_detail&#40;t_class_id,saddr,saddr_mask,daddr,daddr_mask,sport,dport,input,output,src_as,dst_as,nexthop,tcp_flags,proto,tos,use_sport,use_dport,use_input,use_output,use_src_as,use_dst_as,use_nexthop,use_tcp_flags,use_proto,use_tos,skip, ip_from&#41; VALUES&#40;'10','0','0','167772160','-16777216','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'&#41;
?Debug &#58; Jan 17 23&#58;50&#58;33 b43bab90 DBCtx&#58; <144160944> SQL query&#58; INSERT INTO t_class_detail&#40;t_class_id,saddr,saddr_mask,daddr,daddr_mask,sport,dport,input,output,src_as,dst_as,nexthop,tcp_flags,proto,tos,use_sport,use_dport,use_input,use_output,use_src_as,use_dst_as,use_nexthop,use_tcp_flags,use_proto,use_tos,skip, ip_from&#41; VALUES&#40;'10','0','0','167772160','-16777216','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'&#41;
?Debug &#58; Jan 17 23&#58;50&#58;33 b43bab90 DBCtx&#58; <144160944> SQL query&#58; INSERT INTO t_class_detail&#40;t_class_id,saddr,saddr_mask,daddr,daddr_mask,sport,dport,input,output,src_as,dst_as,nexthop,tcp_flags,proto,tos,use_sport,use_dport,use_input,use_output,use_src_as,use_dst_as,use_nexthop,use_tcp_flags,use_proto,use_tos,skip, ip_from&#41; VALUES&#40;'10','0','0','167772160','-16777216','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'&#41;
?Debug &#58; Jan 17 23&#58;50&#58;33 b43bab90 DBCtx&#58; <144160944> SQL query&#58; INSERT INTO t_class_detail&#40;t_class_id,saddr,saddr_mask,daddr,daddr_mask,sport,dport,input,output,src_as,dst_as,nexthop,tcp_flags,proto,tos,use_sport,use_dport,use_input,use_output,use_src_as,use_dst_as,use_nexthop,use_tcp_flags,use_proto,use_tos,skip, ip_from&#41; VALUES&#40;'10','0','0','167772160','-16777216','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'&#41;
?Debug &#58; Jan 17 23&#58;50&#58;33 b43bab90 DBCtx&#58; <144160944> SQL query&#58; INSERT INTO t_class_detail&#40;t_class_id,saddr,saddr_mask,daddr,daddr_mask,sport,dport,input,output,src_as,dst_as,nexthop,tcp_flags,proto,tos,use_sport,use_dport,use_input,use_output,use_src_as,use_dst_as,use_nexthop,use_tcp_flags,use_proto,use_tos,skip, ip_from&#41; VALUES&#40;'10','0','0','167772160','-16777216','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'&#41;
?Debug &#58; Jan 17 23&#58;50&#58;33 b43bab90 RPCConn&#91;SSL&#93;<init@127.0.0.1>&#58; Call 0x2301 &#40;rpcf_add_tclass2&#41; finished...
?Debug &#58; Jan 17 23&#58;50&#58;33 b43bab90 RPCConn&#91;SSL&#93;<init@127.0.0.1>&#58; Stream cleared
 Info  &#58; Jan 17 23&#58;50&#58;33 b43bab90 RPCConn&#91;SSL&#93;<init@127.0.0.1>&#58; Connection terminated by peer

dk
Сообщения: 424
Зарегистрирован: Чт авг 10, 2006 08:52

Re: Неправильная обработка хеша, включающего список хешей

Сообщение dk »

marvin писал(а):Буду признателен, если мне укажут на мою ошибку
Сразу бросается в глаза: $tclass2{value} и %tclass2->{ip_from}, Query и query.
Проблема, скорее всего, в "push(@list, {", хэша там быть не должно:

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

            push @list, 
                saddr         => inet_aton&#40; $tclass2&#123;ip_from&#125; &#41;, 
                .....
            ;

Аватара пользователя
marvin
Сообщения: 77
Зарегистрирован: Сб мар 24, 2007 11:18
Откуда: Нижняя Тура

Сообщение marvin »

Насчёт "push(@list" и "push @list" - это просто разные варианты синтаксиса, одинаково перевариваемые перлом. А вот избавиться от хеша не получается, rpcf_add_tclass2 сразу начинает блажить. Кроме того, я ведь старался привести к тому-же формату данных, в котором возвращает родственная функция rpcf_get_tclass (она возвращает список из хешей), а также ориентировался на скрипт add_to_ipgroup.pl в качестве примера.

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

Хотелось бы всё таки найти решение через ourfa-perl, чтобы не громоздить лишних костылей.

P.S. А по поводу query и Query - для меня самого стало сюрпризом, что они равнозначны :D

Аватара пользователя
marvin
Сообщения: 77
Зарегистрирован: Сб мар 24, 2007 11:18
Откуда: Нижняя Тура

Сообщение marvin »

При попытке, вопреки логике, передавать вместо списка хешей, хеш со списками, получаем, извините, "те-же яйца, вид сбоку". То есть функция успешно отрабатывает и мы имеет те-же 6 (в моём случае) подклассов трафика, повторяющих содержимое первого подкласса, как и в варианте со скриптом из предыдущего поста. Уже не знаю, что и думать...

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

&#91;удалено&#93;
Последний раз редактировалось marvin Сб янв 28, 2012 11:56, всего редактировалось 1 раз.

dk
Сообщения: 424
Зарегистрирован: Чт авг 10, 2006 08:52

Сообщение dk »

Последняя версия некорректна вообще. Как-то смахивает на значения по умолчанию, странно что в логах пробегает айпишка ненулевая.

Судя по примерам, array-1 используется только при чтении, при записи именованные параметры. Попробуйте добавит в хэш (предыдущей версии) tclass => \@list

Аватара пользователя
marvin
Сообщения: 77
Зарегистрирован: Сб мар 24, 2007 11:18
Откуда: Нижняя Тура

Сообщение marvin »

Увы! Ни на что не ругается и результат всё тот-же.

Но что интересно, передача списка хешей в параметрах rpcf_search_users_new работает!

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

$search = $ourfa->rpcf_search_users_new&#40; poles_count=>1, poles=>&#91; &#123;pole_code_array=>2&#125; &#93;, select_type=>1, patterns_count=>2, patterns=>&#91;&#123;what_id=>2, criteria_id=>3, pattern=>'alfa'&#125;, &#123;what_id=>2, criteria_id=>3, pattern=>'beta'&#125;&#93;&#41;;
Причём имя списка (patterns) может быть произвольным. Я в ступоре.

littlesavage
Сообщения: 120
Зарегистрирован: Вс ноя 22, 2009 02:41
Откуда: Чебоксары

Сообщение littlesavage »

marvin, я не проверял, но возможно, это просто опечатка в api.xml

Сейчас там:

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

<for name="x" from="0" count="tclass_count">
   <ip_address name="saddr" array_index="i"/>
   <ip_address name="saddr_mask" array_index="i"/>
...
А должно быть:

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

<for name="i" from="0" count="tclass_count">
   <ip_address name="saddr" array_index="i"/>
   <ip_address name="saddr_mask" array_index="i"/>
...
Переменная цикла в for должна быть i, а не x

Передавать нужно список хешей. Ключ списка, действительно, может быть любой. Работа основанно это на том, что в текущей реализации все переменные вызова - глобальные (как и по официальным докам). Т.е. для этой функции, у всех ее переменных: tclass_id, tclass_name, graph_color, ..., i, saddr, saddr_mask, sport, input, ..., одна - глобальная область видимости. только saddr, saddr_mask, ... - это массивы.

Аватара пользователя
marvin
Сообщения: 77
Зарегистрирован: Сб мар 24, 2007 11:18
Откуда: Нижняя Тура

Сообщение marvin »

Да вы просто волшебник!!!

Мне и в голову не пришло пытаться искать ошибки в api.xml!

Аватара пользователя
marvin
Сообщения: 77
Зарегистрирован: Сб мар 24, 2007 11:18
Откуда: Нижняя Тура

Сообщение marvin »

Хочу выразить огромную благодарность сообществу в целом и ещё большую - littlesavage персонально, за этот замечательный инструмент и помощь в работе с ним!

Со своей стороны хочу поделиться и своими наработками - скриптом для миграции из UTM4. Выложил в теме viewtopic.php?t=9014

lexab
Сообщения: 21
Зарегистрирован: Пт сен 17, 2010 11:52

Сообщение lexab »

Вопрос к уважаемому littlesavage :
Поставил ubuntu 12.04 x86_64
Стал пересобрать ourf`у
сама библиотека собралась нормально, клиент ( ourfa_client) вызов get_core_version тоже отработал.
А вот перловые модули тест (make test) не проходят

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

Failed test 'use Ourfa;'
#   at t/000_Const.t line 9.
#     Tried to use 'Ourfa'.
#     Error&#58;  Can't load '/home/lexab/work/ourfa/ourfa-perl/blib/arch/auto/Ourfa/Ourfa.so' for module Ourfa&#58; /home/lexab/work/ourfa/ourfa-perl/blib/arch/auto/Ourfa/Ourfa.so&#58; undefined symbol&#58; xmlFree at /usr/lib/perl/5.14/DynaLoader.pm line 184.
Хотя все необходимое вроде установлено:

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

Home&#58;~/work/ourfa/ourfa-perl$ ldconfig -p |grep libxml
	libxml2.so.2 &#40;libc6,x86-64&#41; => /usr/lib/x86_64-linux-gnu/libxml2.so.2
	libxml2.so.2 &#40;libc6&#41; => /usr/lib/i386-linux-gnu/libxml2.so.2
	libxml2.so &#40;libc6,x86-64&#41; => /usr/lib/x86_64-linux-gnu/libxml2.so
В make файле путь к библиотеке указан,
результат make:

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

/usr/bin/perl /usr/share/perl/5.14/ExtUtils/xsubpp  -typemap /usr/share/perl/5.14/ExtUtils/typemap -typemap typemap  Ourfa.xs > Ourfa.xsc && mv Ourfa.xsc Ourfa.c
cc -c   -D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -O2 -g   -DVERSION=\"521008.2.0\" -DXS_VERSION=\"521008.2.0\" -fPIC "-I/usr/lib/perl/5.14/CORE"  -I/usr/include/libxml2 Ourfa.c
Ourfa.xs&#58; В функции «ourfa_err_f_warn»&#58;
Ourfa.xs&#58;337&#58;4&#58; предупреждение&#58; формат не является строковой константой, и не заданы аргументы форматирования &#91;-Wformat-security&#93;
Ourfa.xs&#58; В функции «ourfa_exec»&#58;
Ourfa.xs&#58;361&#58;7&#58; предупреждение&#58; формат не является строковой константой, и не заданы аргументы форматирования &#91;-Wformat-security&#93;
Ourfa.xs&#58;361&#58;7&#58; предупреждение&#58; формат не является строковой константой, и не заданы аргументы форматирования &#91;-Wformat-security&#93;
Running Mkbootstrap for Ourfa &#40;&#41;
chmod 644 Ourfa.bs
rm -f blib/arch/auto/Ourfa/Ourfa.so
cc  -shared -O2 -g -L/usr/local/lib -fstack-protector Ourfa.o  -o blib/arch/auto/Ourfa/Ourfa.so 	\
	   -lssl -lcrypto -L/usr/lib/x86_64-linux-gnu -lxml2 -lourfa  	\
символы в либе присутствуют:

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

Home&#58;~/work/ourfa/ourfa-perl$ nm -D /usr/lib/x86_64-linux-gnu/libxml2.so.2 |grep xmlFre
0000000000358a08 D xmlFree
000000000006aa20 T xmlFreeAttributeTable
00000000000b30c0 T xmlFreeAutomata
Подскажите куда копать ?
Кстати perl тут

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

/work/ourfa/ourfa-perl$ perl -v 
This is perl 5, version 14, subversion 2 &#40;v5.14.2&#41; built for x86_64-linux-gnu-thread-multi
может из за этого ?

lexab
Сообщения: 21
Зарегистрирован: Пт сен 17, 2010 11:52

Сообщение lexab »

lexab писал(а):Вопрос
This is perl 5, version 14, subversion 2 (v5.14.2) built for x86_64-linux-gnu-thread-multi[/code]
может из за этого ?
В общем проблема решилась.
В Makefile.PL
cтроку:

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

$make_conf&#123;LIBS&#125; = "-lssl -lcrypto $xml2_libs -lourfa";
нужно выразить так:

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

$make_conf&#123;LIBS&#125; = "-lssl -lcrypto -lourfa $xml2_libs";
чудеса gcc 4.6.3, в gcc 4.4.3 все было нормально.

gravis
Сообщения: 562
Зарегистрирован: Ср мар 16, 2005 15:31
Откуда: Село Красноярск

Сообщение gravis »

littlesavage, не работает auto_reconnect (auto_reconnect => 1) при ошибке, приходится вручную обрабатывать эксепшен (модуль croak'ает) и вызывать Ourfa->new().

Вот такое бывает, к сожалению в данном случае это ошибка в ядре, а не на стороне Ourfa:

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

Received ATTR_TERMINATION instead of ATTR_DATA attribute at /usr/local/lib/perl5/site_perl/5.8.8/mach/Ourfa.pm line 383.
Function `rpcf_get_groups_for_user` node `integer`. Can not get integer value for node 'groups_size&#40;0&#41;'
Ourfa&#58;&#58;ScriptCall&#58;&#58;call&#58; Function `rpcf_get_groups_for_user` node `integer`. Can not get integer value for node 'groups_size&#40;0&#41;'

littlesavage
Сообщения: 120
Зарегистрирован: Вс ноя 22, 2009 02:41
Откуда: Чебоксары

Сообщение littlesavage »

gravis писал(а):littlesavage, не работает auto_reconnect (auto_reconnect => 1) при ошибке, приходится вручную обрабатывать эксепшен (модуль croak'ает) и вызывать Ourfa->new().
С auto_reconnect есть такая проблема. Я, на самом деле, тоже так у себя делаю.

Аватара пользователя
hellard
Сообщения: 52
Зарегистрирован: Вт апр 05, 2005 05:59
Откуда: Абакан
Контактная информация:

Сообщение hellard »

кто то может подсказать, что я делаю не так?

utm 5.2.1-007

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

#./utm5_urfaclient -a change_user_tariff --user_id=1 --tariff_next=114
 Notice&#58; May 12 22&#58;55&#58;14 UTM5 Config&#58; Processing config file&#58; /netup/utm5/utm5_urfaclient.cfg
Processing action&#58; change_user_tariff
Mandatory parameter user_id value not specified
ERROR&#58; Mandatory parameter value not specified
--------------------------------------------
Нашел свою ошибку, для оригинального URFA клиента должно быть так:

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

#./utm5_urfaclient -a change_user_tariff -user_id "1" -tariff_next "114"

Аватара пользователя
sclif
Сообщения: 88
Зарегистрирован: Ср янв 25, 2006 07:53
Контактная информация:

Сообщение sclif »

Пытаюсь подключить пользователю тариф с помощью ourfa-client на C. Как можно задать recalc.type тип перерасчета "Пересчитывать и возвращать всегда" ? По умолчанию выставляется тип "Ничего не делать". Соответственно абонентская плата в заблокированном состоянии списывается.
/usr/bin/ourfa_client -a link_tariff_with_services -user_id ".$user_id." -account_id ".$account." -discount_period_id ".$discount_period." -tariff_current 1 -tariff_next 1 -dialup_login ".$login." -dialup_password ".$pass." -unabon 1 -unprepay 1 -S rsa_cert
Версия utm5-2.1.009

Ответить