Биллинговая система Nodeny

Главная категория => Nodeny 50 => Тема начата: Demeo от 02 Июня 2016, 18:23:44



Название: MAC в списке авторизаций
Отправлено: Demeo от 02 Июня 2016, 18:23:44
Доброго времени суток.

Чешется добавить в лог авторизаций в клиентской статистике МАС, с которого собственно авторизация пришла.
Сейчас МАС-и пишутся в таблицу dblogin процедурой radreply из запросов радиуса. Как заставить их переноситься в таблицу login и высветить в админке?


Название: Re: MAC в списке авторизаций
Отправлено: ser970 от 02 Июня 2016, 21:03:50
а зачем что то куда то переносить .

select  и вставть куда нужно в админку.


Название: Re: MAC в списке авторизаций
Отправлено: Demeo от 02 Июня 2016, 21:09:57
Я так понял, что данные авторизации периодически из таблицы dblogin обрабатываются и переносятся в таблицу login, а с нее уже выводится информация в список авторизаций


Название: Re: MAC в списке авторизаций
Отправлено: ser970 от 02 Июня 2016, 21:48:49
Я так понял, что данные авторизации периодически из таблицы dblogin обрабатываются и переносятся в таблицу login, а с нее уже выводится информация в список авторизаций
ну зачем что то кудато переносить?
вам надо отобразить в веб морде - то не все равно  с какой таблицы брать данные ?
или если уж хочтся то измените процедуру радиуса стоп


Название: Re: MAC в списке авторизаций
Отправлено: Demeo от 03 Июня 2016, 10:45:47
Так все процедуры пишут в dblogin.
Мне переносить не надо - ядро все само переносит. Пусть будет stop - но как мне сказать ядру записать мас в таблицу?

Я так понял, что этот кусок
Код:
# ==========================================================
# На основе хеша %AuthQueue
# - установка в таблице users состояния авторизации клиентов
# - запись в таблицу логинов
# - установка состояния now_on в таблице users_trf
sub SetAuthInDB
{
 my ($cod,$err,$i,$id,$insert,$now_on,$rows,$st,$sql,$sql0,$sql1,$time);
 my %f;
 $i=0;
 $sql=$sql0=$sql1='';
 $insert="INSERT INTO login (mid,act,time) VALUES";
 foreach $id (keys %AuthQueue)
 {
    ($st,$cod,$now_on,$time,$err)=@{$AuthQueue{$id}};
    next if ($Uauth{$id} eq $st) && !$err; # Текущее состояние авторизации такое же как и заказанное и не было ошибок записи текущего состояния
    $Uauth{$id}=$st;
    unless( $err )
    {  # если была ошибка - в логи не пишем - использовались групповые запросы
       $sql.="($id,$cod,$time),";
       if ($i++>50)
       {  # формируем групповые insert
          $i=0;
          chop $sql;
          &sqldo("$insert $sql");
          $sql='';
       }
    }
    $now_on? ($sql1.="$id,") : ($sql0.="$id,"); # скобки не убирать. $err не имеет значение - групповой запрос не insert, а update
    next if &sqldo("UPDATE users SET auth='$st' WHERE id=$id LIMIT 1");
    @{$f{$id}}=($st,$cod,$now_on,$time,1);
 }

 if ($sql)
 {
    chop $sql;
    &sqldo("$insert $sql",'Записи о текущих авторизациях');
 }

 chop $sql0;
 chop $sql1;
 $sql0 && &sqldo("UPDATE users_trf SET now_on=0 WHERE uid IN ($sql0)");
 $sql1 && &sqldo("UPDATE users_trf SET now_on=1 WHERE uid IN ($sql1)");

 %AuthQueue=%f;
}
Но что надо добавить?


Название: Re: MAC в списке авторизаций
Отправлено: Demeo от 03 Июня 2016, 11:26:56
Так уже делал - выдает ошибку

sub SetAuthInDB
{
 my ($cod,$err,$i,$id,$insert,$now_on,$rows,$st,$sql,$sql0,$sql1,$time,$mac);
 my %f;
 $i=0;
 $sql=$sql0=$sql1='';
 $insert="INSERT INTO login (mid,act,time,mac) VALUES";
 foreach $id (keys %AuthQueue)
 {
    ($st,$cod,$now_on,$time,$mac,$err)=@{$AuthQueue{$id}};
    next if ($Uauth{$id} eq $st) && !$err; # Текущее состояние авторизации такое же как и заказанное и не было ошибок записи текущего состояния
    $Uauth{$id}=$st;
    unless( $err )
    {  # если была ошибка - в логи не пишем - использовались групповые запросы
       $sql.="($id,$cod,$time,$mac),";
       if ($i++>50)
       {  # формируем групповые insert
          $i=0;
          chop $sql;
          &sqldo("$insert $sql");
          $sql='';
       }
    }
    $now_on? ($sql1.="$id,") : ($sql0.="$id,"); # скобки не убирать. $err не имеет значение - групповой запрос не insert, а update
    next if &sqldo("UPDATE users SET auth='$st' WHERE id=$id LIMIT 1");
    @{$f{$id}}=($st,$cod,$now_on,$time,$mac,1);
 }

 if ($sql)
 {
    chop $sql;
    &sqldo("$insert $sql",'Записи о текущих авторизациях');
 }

 chop $sql0;
 chop $sql1;
 $sql0 && &sqldo("UPDATE users_trf SET now_on=0 WHERE uid IN ($sql0)");
 $sql1 && &sqldo("UPDATE users_trf SET now_on=1 WHERE uid IN ($sql1)");

 %AuthQueue=%f;
}

Мож я чего упустил?


Название: Re: MAC в списке авторизаций
Отправлено: ser970 от 03 Июня 2016, 11:38:11
$insert="INSERT INTO login (mid,act,time,mac) VALUES";

а  

show create table login;

+


после
foreach $id (keys %AuthQueue)
 {
    ($st,$cod,$now_on,$time,$mac,$err)=@{$AuthQueue{$id}};

сделайте вывод на екран переменых $st,$cod,$now_on,$time,$mac,$err




Название: Re: MAC в списке авторизаций
Отправлено: Demeo от 03 Июня 2016, 13:23:05
Код:
| login | CREATE TABLE `login` (
  `mid` mediumint(9) NOT NULL DEFAULT '0',
  `act` tinyint(4) NOT NULL DEFAULT '0',
  `time` int(11) DEFAULT NULL,
  `mac` char(32) NOT NULL,
  KEY `mid` (`mid`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 |

Цитировать
после
foreach $id (keys %AuthQueue)
 {
    ($st,$cod,$now_on,$time,$mac,$err)=@{$AuthQueue{$id}};

сделайте вывод на екран переменых $st,$cod,$now_on,$time,$mac,$err

В этом я не силен


Название: Re: MAC в списке авторизаций
Отправлено: ser970 от 03 Июня 2016, 16:12:19
на глаз  тут

$sql.="($id,$cod,$time,$mac),";
на

$sql.="($id,$cod,$time,'$mac'),";

и какую ошибку выдает ?


Название: Re: MAC в списке авторизаций
Отправлено: Demeo от 04 Июня 2016, 09:51:01
В случае с $sql.="($id,$cod,$time,$mac),"; выдает ошибки:

Код:
DBD::mysql::db do failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1 at /usr/local/nodeny/nodeny.pl line 517.
DBD::mysql::db do failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1 at /usr/local/nodeny/nodeny.pl line 512.

Иногда такое...

Код:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '),(43,47,1465026380,)' at line 1 at /usr/local/nodeny/nodeny.pl line 517.

С кавычками ошибок не выдает, но в таблицу нифига не пишет


Название: Re: MAC в списке авторизаций
Отправлено: ser970 от 04 Июня 2016, 09:57:31
ну значит $mac пустое
надо смотреть выще
где формируется
@{$AuthQueue{$id}};

поэтому и говорил сделать вывод на екран .
посмотрите как оформленно дебаг



Название: Re: MAC в списке авторизаций
Отправлено: Demeo от 04 Июня 2016, 11:20:58
Код:
$V && $V<$debug && &debug(sprintf("*>*>*>*",$st,$cod,$now_on,$time,$mac,$err));

Так пишет только *>*>*>*


Название: Re: MAC в списке авторизаций
Отправлено: ser970 от 04 Июня 2016, 11:34:38
Код:
$V && $V<$debug && &debug(sprintf("*>*>*>*",$st,$cod,$now_on,$time,$mac,$err));

Так пишет только *>*>*>*
не верно оформленно.


@{$AuthQueue{$id}};

ну не тут тут мака . ищите выше  где формируется...
 


Название: Re: MAC в списке авторизаций
Отправлено: Demeo от 04 Июня 2016, 14:04:13
По ходу пишет только числовые значения...

$AuthQueue{$id}[4]='0'; - работает
$AuthQueue{$id}[4]='noop'; - не работает


Название: Re: MAC в списке авторизаций
Отправлено: ser970 от 04 Июня 2016, 18:41:16
По ходу пишет только числовые значения...

$AuthQueue{$id}[4]='0'; - работает
$AuthQueue{$id}[4]='noop'; - не работает

почему так решили ?
это же просто массив

#!/usr/local/bin/perl

$id=123;
$AuthQueue{$id}[4]='noop';
print $AuthQueue{$id}[4]."\n";
1;

./t.pl
noop

вот запись в мускул тут есть разница писать инт или стринг
стринг должен быть экранирован


Название: Re: MAC в списке авторизаций
Отправлено: Demeo от 05 Июня 2016, 09:52:55
Вот кусок загрузки строк в массив

Цитировать
sub LoadAuth
{
 my($dbh,$num_db,$a)=@_;
 my($id,$max_id,$p,$rows,$sth);

 $max_id=0;
 $RowId_in_auth_tbl[$num_db]||=0; # id ������, �� ������� ������� ��� ������������, �.� ���� ���� ������ ��� ����������� ��� ����������
 # ��������� ������ �� ������, ������� ����� �� �������������� � �������������� � ��������� 120 ���
 # ����������� �� ������� ��� ������������� - ����� ���� ����� �� ���� ��������, � �� ����� ���� ���������� ���������� ���������� �������
 $sth=$dbh->prepare("SELECT * FROM dblogin WHERE id>$RowId_in_auth_tbl[$num_db] AND time>($ut-120) ORDER BY id DESC");
 $sth->execute or return;
 while( $p=$sth->fetchrow_hashref )
 {
    $max_id||=$p->{id};
    $id=$p->{mid};
    if( !$id )
    {  # ��������� ������
       $id=$p->{act};
       # ������ ���� ������ �� ����������� (����� ���� ������� ������������, �� �� ����� ������)
       $rows=$dbh->do("DELETE FROM dblogin WHERE id=".$p->{id}." LIMIT 1");
       next if $rows<1;
       &ServiceWork($id);
       next;
  }
    next if defined $a->{$id};                  # ����� ������� ����������� ������������
    $a->{$id}=[$p->{act},$p->{time},$p->{mac}];               # ����� � ����� �����������
 }

 $RowId_in_auth_tbl[$num_db]=$max_id if $max_id;# � ��������� ��� ��� ����������� ���� ����� id �� ��������� �� ��������

 $p=time+$tt;
 if( $p>$When_clean_auth_tbl{$num_db} )
 {  # ���� ������ ����� - ������ ��� ������������ ������
    $When_clean_auth_tbl{$num_db}=$p+58;        # ������ 58 ���. ����� ������� ������������
    $id=$RowId_in_auth_tbl[$num_db]? "DELETE FROM dblogin WHERE id<=$RowId_in_auth_tbl[$num_db]" : "DELETE FROM dblogin WHERE time<($ut-120)";
    $dbh->do($id);
 }
}

Что я здесь упустил?


Название: Re: MAC в списке авторизаций
Отправлено: ser970 от 05 Июня 2016, 10:54:25
сделате вывод в дебаг

 $a->{$id}=[$p->{act},$p->{time},$p->{mac}]



Название: Re: MAC в списке авторизаций
Отправлено: Demeo от 05 Июня 2016, 11:52:22
$V && &debug($a->{$id}=[$p->{act},$p->{time},$p->{mac}]);

Код:
ARRAY(0x1b519a0)
ARRAY(0x1b51b20)

$a->{$id}=[$p->{act},$p->{time},$p->{mac}];
$V && &debug($a->{$id});

То же самое


Название: Re: MAC в списке авторизаций
Отправлено: ser970 от 05 Июня 2016, 11:54:05
да понятно что ... массив
$a->{$id}=[$p->{act},$p->{time},$p->{mac}];

это не верно
$V && &debug($a->{$id});

или дамп массива или вывод элеметов массива 

ох.
это тестовый сервер ?
если да то дайте доступ по ssh и web


Название: Re: MAC в списке авторизаций
Отправлено: Demeo от 05 Июня 2016, 11:55:57
не тест, но абонов мало пока перенесено.

Подскажите как правильно оформить дебаг


Название: Re: MAC в списке авторизаций
Отправлено: ser970 от 05 Июня 2016, 11:57:21
не тест, но абонов мало пока перенесено
ну если на нем можно пробовать ... то давайте


Название: Re: MAC в списке авторизаций
Отправлено: Demeo от 05 Июня 2016, 11:59:53
не получится - серв в локалке, а пробросить порт у меня нет прав на железке


Название: Re: MAC в списке авторизаций
Отправлено: ser970 от 05 Июня 2016, 12:01:17
не получится - серв в локалке, а пробросить порт у меня нет прав на железке
аска скайп ?
теавиер ?


Название: Re: MAC в списке авторизаций
Отправлено: Demeo от 05 Июня 2016, 12:02:43
265985746
alex_demeo

вьювера нет


Название: Re: MAC в списке авторизаций
Отправлено: ser970 от 05 Июня 2016, 12:18:48
постучал в аську и тишина....


Название: Re: MAC в списке авторизаций
Отправлено: Demeo от 05 Июня 2016, 12:29:10
не пришло нифига  :o
Аська в профиле работает?