import_auth.pl 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. #!/usr/bin/perl
  2. #
  3. # Copyright (C) Roman Dmitiriev, rnd@rajven.ru
  4. #
  5. use utf8;
  6. use open ":encoding(utf8)";
  7. use open ':std', ':encoding(UTF-8)';
  8. use Encode;
  9. no warnings 'utf8';
  10. use English;
  11. use FindBin '$Bin';
  12. use lib "/opt/Eye/scripts";
  13. use Data::Dumper;
  14. use eyelib::config;
  15. use eyelib::main;
  16. use eyelib::database;
  17. use eyelib::common;
  18. use eyelib::net_utils;
  19. use Net::Patricia;
  20. use strict;
  21. use warnings;
  22. sub process_file {
  23. my $fh = shift;
  24. my @data;
  25. my @headers;
  26. my $line_num = 0;
  27. while (my $line = <$fh>) {
  28. chomp $line;
  29. $line_num++;
  30. # Пропускаем пустые строки
  31. next if $line =~ /^\s*$/;
  32. # Разбиваем строку по разделителям: пробелы, табы, запятые, точки с запятой
  33. my @fields = split(/[\t,;]+/, $line);
  34. if ($line_num == 1) {
  35. # Первая непустая строка — заголовки
  36. @headers = @fields;
  37. print "Заголовки: " . join(" | ", map { "'$_'" } @headers) . "\n\n";
  38. next;
  39. }
  40. # Проверяем, совпадает ли количество полей с количеством заголовков
  41. if (@fields != @headers) {
  42. warn "Предупреждение: строка $line_num: количество полей (" . scalar(@fields) .
  43. ") не совпадает с количеством заголовков (" . scalar(@headers) . ")\n";
  44. # Дополняем или обрезаем массив, чтобы избежать ошибок
  45. @fields = @fields[0 .. $#headers] if @fields > @headers;
  46. while (@fields < @headers) {
  47. push @fields, '';
  48. }
  49. }
  50. # Создаём ассоциативный массив (hash) для текущей строки
  51. my %row;
  52. for my $i (0 .. $#headers) {
  53. $row{$headers[$i]} = $fields[$i];
  54. }
  55. # Добавляем в общий результат
  56. push @data, \%row;
  57. }
  58. return @data; # возвращаем список ссылок на хеши
  59. }
  60. my @rows=();
  61. # === Основная логика ===
  62. if (@ARGV) {
  63. foreach my $filename (@ARGV) {
  64. open(my $fh, '<', $filename) or die "Не могу открыть файл '$filename': $!";
  65. print "Обработка файла: $filename\n";
  66. @rows = process_file($fh);
  67. close($fh);
  68. }
  69. } else {
  70. @rows = process_file(\*STDIN);
  71. }
  72. foreach my $record (@rows) {
  73. next if (!exists($record->{ip}));
  74. my $auth_network = $office_networks->match_string($record->{ip});
  75. if (!$auth_network) {
  76. log_error("Unknown network in request! IP: $record->{ip}");
  77. next;
  78. }
  79. my $search_sql = 'SELECT * FROM User_auth WHERE ip="'.$record->{ip}.'" and deleted=0 ORDER BY last_found DESC';
  80. $record->{ip_int}=StrToIp($record->{ip});
  81. if (!exists($record->{'mac'})) {
  82. delete $record->{'mac'};
  83. } else {
  84. $record->{mac}=mac_splitted(isc_mac_simplify($record->{mac}));
  85. $search_sql = 'SELECT * FROM User_auth WHERE ip="'.$record->{ip}.'" and mac="'.$record->{mac}.'" and deleted=0 ORDER BY last_found DESC';
  86. }
  87. print "Импортируем:\n";
  88. for my $key (keys %{$record}) {
  89. print "\t\t$key => $record->{$key}\n";
  90. }
  91. print "\n";
  92. if (exists $record->{dns_name}) {
  93. my $auth_dns_name = lc(trim($record->{dns_name}));
  94. $auth_dns_name=~s/\./-/g;
  95. $auth_dns_name=~s/\//-/g;
  96. $record->{dns_name} = $auth_dns_name;
  97. }
  98. #search actual record
  99. my $auth_record = get_record_sql($dbh,$search_sql);
  100. if ($auth_record) {
  101. update_record($dbh,'User_auth',$record,"id=".$auth_record->{id});
  102. print "URL: <a href='".$config_ref{stat_url}."/admin/users/edituser.php?id=".$auth_record->{user_id}."'>".$auth_record->{user_id}."</a><br>\n";
  103. if (exists $record->{dns_name}) {
  104. my $user_info;
  105. $user_info->{login}=$record->{dns_name};
  106. update_record($dbh,'User_list',$user_info,"id=".$auth_record->{user_id});
  107. my $device;
  108. $device->{device_name}=$record->{dns_name};
  109. update_record($dbh,'devices',$device,"user_id=".$auth_record->{user_id});
  110. }
  111. if (exists $record->{comments}) {
  112. my $user_info;
  113. $user_info->{fio}=$record->{comments};
  114. update_record($dbh,'User_list',$user_info,"id=".$auth_record->{user_id});
  115. }
  116. next;
  117. }
  118. my $dhcp_record = {%{$record || {}}};
  119. $dhcp_record->{'type'}='add';
  120. my $res_id = resurrection_auth($dbh,$dhcp_record);
  121. if (!$res_id) {
  122. db_log_error($dbh,"Error creating an ip address record for:\t\t".Dumper($dhcp_record));
  123. next;
  124. }
  125. update_record($dbh,'User_auth',$record,"id=".$res_id);
  126. $auth_record = get_record_sql($dbh,'SELECT * FROM User_auth where id='.$res_id);
  127. if ($auth_record) {
  128. print "URL: <a href='".$config_ref{stat_url}."/admin/users/edituser.php?id=".$auth_record->{user_id}."'>".$auth_record->{user_id}."</a><br>\n";
  129. if (exists $record->{dns_name}) {
  130. my $user_info;
  131. $user_info->{login}=$record->{dns_name};
  132. update_record($dbh,'User_list',$user_info,"id=".$auth_record->{user_id});
  133. my $device;
  134. $device->{device_name}=$record->{dns_name};
  135. update_record($dbh,'devices',$device,"user_id=".$auth_record->{user_id});
  136. }
  137. if (exists $record->{comments}) {
  138. my $user_info;
  139. $user_info->{fio}=$record->{comments};
  140. update_record($dbh,'User_list',$user_info,"id=".$auth_record->{user_id});
  141. }
  142. }
  143. }
  144. exit;