update_eye_wiki.pl 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. #!/usr/bin/perl
  2. #
  3. # Синхронизация записей пользователей с файлами документации Wiki
  4. # через вызовы к PHP API (без прямого доступа к БД)
  5. #
  6. # Запуск: perl /path/to/update_eye_wiki.pl
  7. #
  8. use utf8;
  9. use warnings;
  10. use Encode;
  11. use open qw(:std :encoding(UTF-8));
  12. no warnings 'utf8';
  13. use strict;
  14. use English;
  15. use FindBin '$Bin';
  16. use lib "$Bin/";
  17. use Data::Dumper;
  18. use eyelib::config;
  19. use File::Find;
  20. use File::Basename;
  21. use Fcntl qw(:flock);
  22. use LWP::UserAgent;
  23. use HTTP::Request;
  24. use JSON::XS;
  25. use URI::Escape;
  26. use Encode qw(decode_utf8 encode_utf8);
  27. # Блокировка для предотвращения параллельных запусков
  28. open(SELF, "<", $0) or die "Cannot open $0 - $!";
  29. flock(SELF, LOCK_EX | LOCK_NB) or exit 1;
  30. # Настройка API - аутентификация через параметры
  31. my $api_base = $config_ref{api_base} || 'http://localhost/api.php';
  32. my $api_key = $config_ref{api_key} || die "Ошибка: не настроен параметр api_key в конфигурации\n";
  33. my $api_login = $config_ref{api_login} || die "Ошибка: не настроен параметр api_login в конфигурации\n";
  34. # Базовые параметры аутентификации для всех запросов
  35. my $auth_params = "api_key=" . uri_escape($api_key) . "&login=" . uri_escape($api_login);
  36. # Инициализация HTTP-клиента
  37. my $ua = LWP::UserAgent->new(
  38. timeout => 30,
  39. agent => 'WikiSync/1.0'
  40. );
  41. # === Получение пути к вики из таблицы config (id=61) ===
  42. my $config_record = api_call('GET', "$api_base?get_table_record&table=config&id=61&$auth_params");
  43. if (!$config_record || $config_record->{error}) {
  44. die "Ошибка: не удалось получить путь к вики из таблицы config (id=61)\n";
  45. }
  46. my $wiki_path = $config_record->{value};
  47. if (!$wiki_path || !-d $wiki_path) {
  48. die "Ошибка: путь к вики не настроен или директория не существует: $wiki_path\n";
  49. }
  50. print "Путь к вики: $wiki_path\n\n";
  51. # Поиск подходящих файлов
  52. my %content;
  53. find(\&wanted, $wiki_path);
  54. my $updated = 0;
  55. my $errors = 0;
  56. foreach my $fname (sort keys %content) {
  57. # Чтение файла
  58. open(my $fh, '<:encoding(UTF-8)', $content{$fname}) or do {
  59. warn "Не удалось открыть файл $content{$fname}: $!\n";
  60. $errors++;
  61. next;
  62. };
  63. my @lines = <$fh>;
  64. close($fh);
  65. chomp(@lines);
  66. # Извлечение IP из метаданных
  67. my $ip;
  68. foreach my $line (@lines) {
  69. if ($line =~ /\%META\:FIELD\{name="DeviceIP"/) {
  70. if ($line =~ /value="([0-9]{1,3}(?:\.[0-9]{1,3}){3})"/) {
  71. $ip = $1;
  72. last;
  73. }
  74. }
  75. }
  76. next unless $ip && is_valid_ipv4($ip);
  77. # Получение записи из БД через API
  78. my $auth = api_call('GET', "$api_base/user_auth.php?get=user_auth&ip=" . uri_escape($ip) . "&$auth_params");
  79. if (!$auth || $auth->{error}) {
  80. print "Запись не найдена для IP $ip (файл: $fname)\n";
  81. next;
  82. }
  83. # Обновление поля WikiName через метод обновления user_auth
  84. my $update_data = {
  85. wiki_name => $fname # Используем нижний регистр как принято в БД
  86. };
  87. my $json_data = encode_json($update_data);
  88. my $update_url = "$api_base/user_auth.php?send=update_user_auth&id=$auth->{id}&$auth_params";
  89. my $update_req = HTTP::Request->new(POST => $update_url);
  90. $update_req->header('Content-Type' => 'application/json');
  91. $update_req->content($json_data);
  92. my $update_res = $ua->request($update_req);
  93. if ($update_res->is_success) {
  94. my $result = decode_json(decode_utf8($update_res->decoded_content));
  95. if (!$result->{error}) {
  96. print "Обновлено: id=$auth->{id} IP=$ip => WikiName=$fname\n";
  97. $updated++;
  98. } else {
  99. warn "Ошибка обновления id=$auth->{id}: $result->{error}\n";
  100. $errors++;
  101. }
  102. } else {
  103. warn "HTTP ошибка при обновлении id=$auth->{id}: " . $update_res->status_line . "\n";
  104. $errors++;
  105. }
  106. }
  107. print "\n=== ИТОГИ ===\n";
  108. print "Обработано файлов: " . scalar(keys %content) . "\n";
  109. print "Успешно обновлено записей: $updated\n";
  110. print "Ошибок: $errors\n";
  111. print "Синхронизация завершена.\n";
  112. exit 0;