1
0

import_auth.pl 5.2 KB

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