|
@@ -13,8 +13,8 @@ no warnings 'utf8';
|
|
|
|
|
|
|
|
use strict;
|
|
use strict;
|
|
|
use English;
|
|
use English;
|
|
|
|
|
+use lib "/opt/Eye/scripts";
|
|
|
use FindBin '$Bin';
|
|
use FindBin '$Bin';
|
|
|
-use lib "$Bin/";
|
|
|
|
|
use eyelib::config;
|
|
use eyelib::config;
|
|
|
use Data::Dumper;
|
|
use Data::Dumper;
|
|
|
use File::Find;
|
|
use File::Find;
|
|
@@ -35,17 +35,23 @@ my $api_base = $config_ref{api_base} || 'http://localhost/api.php';
|
|
|
my $api_key = $config_ref{api_key} || die "Ошибка: не настроен параметр api_key в конфигурации\n";
|
|
my $api_key = $config_ref{api_key} || die "Ошибка: не настроен параметр api_key в конфигурации\n";
|
|
|
my $api_login = $config_ref{api_login} || die "Ошибка: не настроен параметр api_login в конфигурации\n";
|
|
my $api_login = $config_ref{api_login} || die "Ошибка: не настроен параметр api_login в конфигурации\n";
|
|
|
|
|
|
|
|
|
|
+# Базовые параметры аутентификации для всех запросов
|
|
|
|
|
+my $auth_params = "api_key=" . uri_escape($api_key) . "&api_login=" . uri_escape($api_login);
|
|
|
|
|
+
|
|
|
# Инициализация HTTP-клиента
|
|
# Инициализация HTTP-клиента
|
|
|
my $ua = LWP::UserAgent->new(
|
|
my $ua = LWP::UserAgent->new(
|
|
|
- timeout => 60,
|
|
|
|
|
- agent => 'EyeWikiUpdater/1.0'
|
|
|
|
|
|
|
+ timeout => 30,
|
|
|
|
|
+ agent => 'EyeWikiSync/1.0'
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
-# Базовые параметры аутентификации для всех запросов
|
|
|
|
|
-my $auth_params = "api_key=" . uri_escape($api_key) . "&login=" . uri_escape($api_login);
|
|
|
|
|
|
|
+my $api_request_url = $api_base."?".$auth_params;
|
|
|
|
|
+
|
|
|
|
|
+my $option_filter = encode_json({ option_id => '61' });
|
|
|
|
|
|
|
|
# === Получение пути к вики из таблицы config (id=61) ===
|
|
# === Получение пути к вики из таблицы config (id=61) ===
|
|
|
-my $config_record = api_call('GET', "$api_base?get_table_record&table=config&id=61&$auth_params");
|
|
|
|
|
|
|
+my $api_request = $api_request_url."&get=table_record&table=config&filter=".uri_escape($option_filter);
|
|
|
|
|
+
|
|
|
|
|
+my $config_record = api_call('GET', $api_request);
|
|
|
if (!$config_record || $config_record->{error}) {
|
|
if (!$config_record || $config_record->{error}) {
|
|
|
die "Ошибка: не удалось получить путь к вики из таблицы config (id=61)\n";
|
|
die "Ошибка: не удалось получить путь к вики из таблицы config (id=61)\n";
|
|
|
}
|
|
}
|
|
@@ -65,6 +71,7 @@ my $processed = 0;
|
|
|
my $errors = 0;
|
|
my $errors = 0;
|
|
|
|
|
|
|
|
foreach my $fname (sort keys %content) {
|
|
foreach my $fname (sort keys %content) {
|
|
|
|
|
+ print "Analyze $content{$fname}...";
|
|
|
# Чтение файла
|
|
# Чтение файла
|
|
|
open(my $fh, '<:encoding(UTF-8)', $content{$fname}) or do {
|
|
open(my $fh, '<:encoding(UTF-8)', $content{$fname}) or do {
|
|
|
warn "Не удалось открыть файл $content{$fname}: $!\n";
|
|
warn "Не удалось открыть файл $content{$fname}: $!\n";
|
|
@@ -85,17 +92,18 @@ foreach my $fname (sort keys %content) {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+ print "IP not found!\n" and next unless $ip && is_valid_ipv4($ip);
|
|
|
|
|
|
|
|
- next unless $ip && is_valid_ipv4($ip);
|
|
|
|
|
|
|
+ print "$ip \n";
|
|
|
|
|
|
|
|
# Получение записи из user_auth по IP через API
|
|
# Получение записи из user_auth по IP через API
|
|
|
- my $auth = api_call('GET', "$api_base/user_auth.php?get=user_auth&ip=" . uri_escape($ip) . "&$auth_params");
|
|
|
|
|
- if (!$auth || $auth->{error} || !$auth->{WikiName}) {
|
|
|
|
|
|
|
+ my $auth = api_call('GET', $api_request_url. "&get=user_auth&ip=" . uri_escape($ip));
|
|
|
|
|
+ if (!$auth || $auth->{error} || !$auth->{wikiname}) {
|
|
|
next;
|
|
next;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
# Пропускаем шлюзы
|
|
# Пропускаем шлюзы
|
|
|
- next if $auth->{WikiName} =~ /^Gateway/;
|
|
|
|
|
|
|
+ next if $auth->{wikiname} =~ /^Gateway/;
|
|
|
|
|
|
|
|
print "Found: $auth->{ip} $auth->{mac} ";
|
|
print "Found: $auth->{ip} $auth->{mac} ";
|
|
|
|
|
|
|
@@ -104,72 +112,42 @@ foreach my $fname (sort keys %content) {
|
|
|
|
|
|
|
|
# Определение типа устройства и получение родительских данных
|
|
# Определение типа устройства и получение родительских данных
|
|
|
eval {
|
|
eval {
|
|
|
- if ($auth->{WikiName} =~ /^(Switch|Router)/) {
|
|
|
|
|
|
|
+ if ($auth->{wikiname} =~ /^(Switch|Router)/) {
|
|
|
# Для коммутаторов/маршрутизаторов: получаем данные через цепочку устройств
|
|
# Для коммутаторов/маршрутизаторов: получаем данные через цепочку устройств
|
|
|
- my $device = api_call('GET', "$api_base/user_auth.php?get_table_list&table=devices&filter=" .
|
|
|
|
|
- uri_escape(encode_json({ ip => $ip })) . "&$auth_params");
|
|
|
|
|
-
|
|
|
|
|
- die "Unknown device" unless $device && ref($device) eq 'ARRAY' && @{$device} > 0;
|
|
|
|
|
- $device = $device->[0];
|
|
|
|
|
-
|
|
|
|
|
|
|
+ my $device = api_call('GET', $api_request_url. "&get=table_record&table=devices&filter=" . uri_escape(encode_json({ ip => $ip })));
|
|
|
|
|
+ die "Unknown device" unless $device;
|
|
|
# Получаем аплинк-порт
|
|
# Получаем аплинк-порт
|
|
|
- my $uplink_ports = api_call('GET', "$api_base/user_auth.php?get_table_list&table=device_ports&filter=" .
|
|
|
|
|
- uri_escape(encode_json({ device_id => $device->{id}, uplink => 1 })) . "&$auth_params");
|
|
|
|
|
-
|
|
|
|
|
- die "Unknown connection" unless $uplink_ports && ref($uplink_ports) eq 'ARRAY' && @{$uplink_ports} > 0;
|
|
|
|
|
- my $parent_connect = $uplink_ports->[0];
|
|
|
|
|
-
|
|
|
|
|
|
|
+ my $uplink_ports = api_call('GET', $api_request_url . "&get=table_record&table=device_ports&filter=" . uri_escape(encode_json({ device_id => $device->{id}, uplink => 1 })));
|
|
|
|
|
+ die "Unknown connection" unless $uplink_ports;
|
|
|
|
|
+ my $parent_connect = $uplink_ports;
|
|
|
# Получаем целевой порт
|
|
# Получаем целевой порт
|
|
|
- my $parent_port = api_call('GET', "$api_base/user_auth.php?get_table_record&table=device_ports&id=" .
|
|
|
|
|
- $parent_connect->{target_port_id} . "&$auth_params");
|
|
|
|
|
-
|
|
|
|
|
|
|
+ my $parent_port = api_call('GET', $api_request_url . "&get=table_record&table=device_ports&id=" . $parent_connect->{target_port_id});
|
|
|
die "Unknown port connection" unless $parent_port;
|
|
die "Unknown port connection" unless $parent_port;
|
|
|
-
|
|
|
|
|
# Получаем родительское устройство
|
|
# Получаем родительское устройство
|
|
|
- my $device_parent = api_call('GET', "$api_base/user_auth.php?get_table_record&table=devices&id=" .
|
|
|
|
|
- $parent_port->{device_id} . "&$auth_params");
|
|
|
|
|
-
|
|
|
|
|
|
|
+ my $device_parent = api_call('GET', $api_request_url . "&get=table_record&table=devices&id=" . $parent_port->{device_id});
|
|
|
die "Unknown parent device" unless $device_parent;
|
|
die "Unknown parent device" unless $device_parent;
|
|
|
-
|
|
|
|
|
# Получаем авторизацию родительского устройства
|
|
# Получаем авторизацию родительского устройства
|
|
|
- my $auth_parent = api_call('GET', "$api_base/user_auth.php?get=user_auth&ip=" .
|
|
|
|
|
- uri_escape($device_parent->{ip}) . "&$auth_params");
|
|
|
|
|
-
|
|
|
|
|
- die "Unknown auth for device" unless $auth_parent && $auth_parent->{WikiName};
|
|
|
|
|
-
|
|
|
|
|
- $device_name = $auth_parent->{WikiName};
|
|
|
|
|
|
|
+ my $auth_parent = api_call('GET', $api_request_url . "&get=user_auth&ip=" . uri_escape($device_parent->{ip}));
|
|
|
|
|
+ die "Unknown auth for device" unless $auth_parent && $auth_parent->{wikiname};
|
|
|
|
|
+ $device_name = $auth_parent->{wikiname};
|
|
|
$device_port = $parent_port->{port};
|
|
$device_port = $parent_port->{port};
|
|
|
}
|
|
}
|
|
|
else {
|
|
else {
|
|
|
# Для других устройств: получаем данные через соединения
|
|
# Для других устройств: получаем данные через соединения
|
|
|
- my $connections = api_call('GET', "$api_base/user_auth.php?get_table_list&table=connections&filter=" .
|
|
|
|
|
- uri_escape(encode_json({ auth_id => $auth->{id} })) . "&$auth_params");
|
|
|
|
|
-
|
|
|
|
|
- die "Unknown connection" unless $connections && ref($connections) eq 'ARRAY' && @{$connections} > 0;
|
|
|
|
|
- my $conn = $connections->[0];
|
|
|
|
|
-
|
|
|
|
|
|
|
+ my $conn = api_call('GET', $api_request_url . "&get=table_record&table=connections&filter=" . uri_escape(encode_json({ auth_id => $auth->{id} })));
|
|
|
|
|
+ die "Unknown connection" unless $conn;
|
|
|
# Получаем порт устройства
|
|
# Получаем порт устройства
|
|
|
- my $device_port_rec = api_call('GET', "$api_base/user_auth.php?get_table_record&table=device_ports&id=" .
|
|
|
|
|
- $conn->{port_id} . "&$auth_params");
|
|
|
|
|
-
|
|
|
|
|
|
|
+ my $device_port_rec = api_call('GET', $api_request_url . "&get=table_record&table=device_ports&id=" . $conn->{port_id});
|
|
|
die "Unknown device port" unless $device_port_rec;
|
|
die "Unknown device port" unless $device_port_rec;
|
|
|
-
|
|
|
|
|
# Получаем устройство
|
|
# Получаем устройство
|
|
|
- my $device = api_call('GET', "$api_base/user_auth.php?get_table_record&table=devices&id=" .
|
|
|
|
|
- $device_port_rec->{device_id} . "&$auth_params");
|
|
|
|
|
-
|
|
|
|
|
|
|
+ my $device = api_call('GET', $api_request_url . "&get=table_record&table=devices&id=" . $device_port_rec->{device_id});
|
|
|
die "Unknown device" unless $device && $device->{user_id};
|
|
die "Unknown device" unless $device && $device->{user_id};
|
|
|
-
|
|
|
|
|
# Получаем авторизацию устройства по user_id и IP
|
|
# Получаем авторизацию устройства по user_id и IP
|
|
|
- my $device_auth_list = api_call('GET', "$api_base/user_auth.php?get_table_list&table=user_auth&filter=" .
|
|
|
|
|
- uri_escape(encode_json({ user_id => $device->{user_id}, ip => $device->{ip} })) . "&$auth_params");
|
|
|
|
|
-
|
|
|
|
|
|
|
+ my $device_auth_list = api_call('GET', $api_request_url . "&get=table_list&table=user_auth&filter=" . uri_escape(encode_json({ user_id => $device->{user_id}, ip => $device->{ip} })));
|
|
|
die "Unknown device auth" unless $device_auth_list && ref($device_auth_list) eq 'ARRAY' && @{$device_auth_list} > 0;
|
|
die "Unknown device auth" unless $device_auth_list && ref($device_auth_list) eq 'ARRAY' && @{$device_auth_list} > 0;
|
|
|
my $device_auth = $device_auth_list->[0];
|
|
my $device_auth = $device_auth_list->[0];
|
|
|
-
|
|
|
|
|
- die "Device auth has no WikiName" unless $device_auth->{WikiName};
|
|
|
|
|
-
|
|
|
|
|
- $device_name = $device_auth->{WikiName};
|
|
|
|
|
|
|
+ die "Device auth has no wikiname" unless $device_auth->{wikiname};
|
|
|
|
|
+ $device_name = $device_auth->{wikiname};
|
|
|
$device_port = $device_port_rec->{port};
|
|
$device_port = $device_port_rec->{port};
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
@@ -248,14 +226,10 @@ exit 0;
|
|
|
|
|
|
|
|
sub api_call {
|
|
sub api_call {
|
|
|
my ($method, $url) = @_;
|
|
my ($method, $url) = @_;
|
|
|
-
|
|
|
|
|
my $req = HTTP::Request->new($method => $url);
|
|
my $req = HTTP::Request->new($method => $url);
|
|
|
my $res = $ua->request($req);
|
|
my $res = $ua->request($req);
|
|
|
-
|
|
|
|
|
return undef unless $res->is_success;
|
|
return undef unless $res->is_success;
|
|
|
-
|
|
|
|
|
- my $content = decode_utf8($res->decoded_content);
|
|
|
|
|
- return decode_json($content);
|
|
|
|
|
|
|
+ return decode_json($res->decoded_content);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
sub is_valid_ipv4 {
|
|
sub is_valid_ipv4 {
|
|
@@ -267,7 +241,6 @@ sub is_valid_ipv4 {
|
|
|
sub wanted {
|
|
sub wanted {
|
|
|
my $filename = $File::Find::name;
|
|
my $filename = $File::Find::name;
|
|
|
my $dev_name = basename($filename);
|
|
my $dev_name = basename($filename);
|
|
|
-
|
|
|
|
|
if ($dev_name =~ /\.txt$/ && $dev_name =~ /^(Device|Switch|Ups|Sensor|Gateway|Router|Server|Bras)/) {
|
|
if ($dev_name =~ /\.txt$/ && $dev_name =~ /^(Device|Switch|Ups|Sensor|Gateway|Router|Server|Bras)/) {
|
|
|
$dev_name =~ s/\.txt$//;
|
|
$dev_name =~ s/\.txt$//;
|
|
|
$content{$dev_name} = $filename;
|
|
$content{$dev_name} = $filename;
|