ソースを参照

fixed processing of the macro table of microtics depending on the version of the running software

root 3 年 前
コミット
6f9bac7ddb

+ 31 - 0
docs/addons/print_dns_commands.pl

@@ -0,0 +1,31 @@
+#!/usr/bin/perl
+
+#
+# Copyright (C) Roman Dmitiriev, rnd@rajven.ru
+#
+
+use utf8;
+use English;
+use base;
+use FindBin '$Bin';
+use lib "$Bin/";
+use strict;
+use DBI;
+use Time::Local;
+use Rstat::config;
+use Rstat::main;
+use Rstat::mysql;
+use Rstat::net_utils;
+
+my @devices=get_records_sql($dbh,'SELECT * FROM devices WHERE deleted=0 and (vendor_id=3 or vendor_id=8 or vendor_id=9) and device_type<=2 ORDER BY device_name');
+foreach my $device (@devices) {
+print "./set_dns_record.pl '$device->{device_name}' '$device->{ip}' 1\n";
+}
+
+
+my @devices=get_records_sql($dbh,'SELECT * FROM User_auth WHERE deleted=0 and dns_name IS NOT NULL and dns_name >"" ORDER BY dns_name');
+foreach my $device (@devices) {
+print "./set_dns_record.pl '$device->{dns_name}' '$device->{ip}' 1\n";
+}
+
+exit 0;

+ 156 - 0
docs/addons/set_port_descr.pl

@@ -0,0 +1,156 @@
+#!/usr/bin/perl
+
+#
+# Copyright (C) Roman Dmitiriev, rnd@rajven.ru
+#
+
+use utf8;
+use English;
+use base;
+use FindBin '$Bin';
+use lib "$Bin/";
+use strict;
+use Time::Local;
+use FileHandle;
+use Data::Dumper;
+use Rstat::config;
+use Rstat::main;
+use Rstat::net_utils;
+use Rstat::mysql;
+use Rstat::snmp;
+use Rstat::cmd;
+use Net::SNMP qw(:snmp);
+use Fcntl qw(:flock);
+no if $] >= 5.018, warnings =>  "experimental::smartmatch";
+
+
+open(SELF,"<",$0) or die "Cannot open $0 - $!";
+flock(SELF, LOCK_EX|LOCK_NB) or exit 1;
+
+my @auth_list = get_records_sql($dbh,"SELECT A.id,A.ip,A.mac,A.dns_name,A.comments,A.dhcp_hostname,A.WikiName,K.login,K.ou_id FROM User_auth as A, User_list as K WHERE K.id=A.user_id AND A.deleted=0 ORDER BY A.id");
+
+my %auth_ref;
+foreach my $auth (@auth_list) {
+$auth_ref{$auth->{id}}{id}=$auth->{id};
+$auth_ref{$auth->{id}}{ou_id}=$auth->{ou_id};
+$auth_ref{$auth->{id}}{ip}=$auth->{ip};
+$auth_ref{$auth->{id}}{mac}=$auth->{mac};
+$auth_ref{$auth->{id}}{dns_name}=$auth->{dns_name};
+$auth_ref{$auth->{id}}{comments}=$auth->{comments};
+$auth_ref{$auth->{id}}{dhcp_hostname}=$auth->{dhcp_hostname};
+$auth_ref{$auth->{id}}{WikiName}=$auth->{WikiName};
+$auth_ref{$auth->{id}}{login}=$auth->{login};
+if ($auth->{dns_name}) { $auth_ref{$auth->{id}}{description} = $auth->{dns_name}; }
+if (!$auth_ref{$auth->{id}}{description} and $auth->{WikiName}) { $auth_ref{$auth->{id}}{description} = $auth->{WikiName}; }
+if (!$auth_ref{$auth->{id}}{description} and $auth->{comments}) { $auth_ref{$auth->{id}}{description} = translit($auth->{comments}); }
+if (!$auth_ref{$auth->{id}}{description} and $auth->{dhcp_hostname}) { $auth_ref{$auth->{id}}{description} = $auth->{dhcp_hostname}; }
+if (!$auth_ref{$auth->{id}}{description}) { $auth_ref{$auth->{id}}{description} = translit($auth->{login})."_".$auth->{ip}; }
+$auth_ref{$auth->{id}}{description}=~s/\./-/g;
+$auth_ref{$auth->{id}}{description}=~s/\(/_/g;
+$auth_ref{$auth->{id}}{description}=~s/\)/_/g;
+}
+
+my %port_info;
+
+my $d_sql="SELECT DP.id, D.ip, D.device_name, D.device_model_id, DP.port, DP.snmp_index, DP.comment, D.community, D.snmp_version, DP.target_port_id, D.vendor_id, D.device_type
+FROM devices AS D, device_ports AS DP
+WHERE D.snmp_version>0 and D.id = DP.device_id AND D.community IS NOT NULL AND (D.device_type = 1 OR D.device_type=2) AND D.deleted=0
+ORDER BY D.device_name,DP.port";
+
+my @port_list = get_records_sql($dbh,$d_sql);
+
+foreach my $port (@port_list) {
+$port_info{$port->{id}}{id}=$port->{id};
+$port_info{$port->{id}}{device_name}=$port->{device_name};
+$port_info{$port->{id}}{ip}=$port->{ip};
+$port_info{$port->{id}}{device_model_id}=$port->{device_model_id};
+$port_info{$port->{id}}{port}=$port->{port};
+$port_info{$port->{id}}{snmp_index}=$port->{snmp_index};
+$port_info{$port->{id}}{community}=$port->{community};
+$port_info{$port->{id}}{comment}=$port->{comment};
+$port_info{$port->{id}}{snmp_version}=$port->{snmp_version};
+$port_info{$port->{id}}{target_port_id}=$port->{target_port_id};
+$port_info{$port->{id}}{vendor_id}=$port->{vendor_id};
+$port_info{$port->{id}}{device_type}=$port->{device_type};
+}
+
+my %conn_info;
+
+$d_sql="SELECT C.id, C.port_id, C.auth_id FROM connections AS C, User_auth as A WHERE A.id=C.auth_id AND A.deleted=0 ORDER BY C.id";
+my @conn_list = get_records_sql($dbh,$d_sql);
+
+foreach my $conn (@conn_list) {
+$conn_info{$conn->{id}}{id}=$conn->{id};
+$conn_info{$conn->{id}}{port_id}=$conn->{port_id};
+if ($conn->{auth_id}) {
+    $conn_info{$conn->{id}}{auth_id}=$conn->{auth_id};
+    $conn_info{$conn->{id}}{description}=$auth_ref{$conn->{auth_id}}->{description}."==ID:".$conn->{auth_id};
+    $conn_info{$conn->{id}}{ou_id}=$auth_ref{$conn->{auth_id}}->{ou_id};
+    }
+}
+
+
+foreach my $conn_id (keys %conn_info) {
+if (exists $port_info{$conn_info{$conn_id}{port_id}}{count}) {
+    $port_info{$conn_info{$conn_id}{port_id}}{count}++;
+    #OU: Switches, Routers, WiFi AP
+    if ($conn_info{$conn_id}{ou_id}~~[7,10,12] and $conn_info{$conn_id}{description}) {
+        $port_info{$conn_info{$conn_id}{port_id}}{description} = $conn_info{$conn_id}{description};
+        }
+    next;
+    } else { $port_info{$conn_info{$conn_id}{port_id}}{count}=1; }
+
+if (!exists $port_info{$conn_info{$conn_id}{port_id}}{description} and $conn_info{$conn_id}{description}) {
+    $port_info{$conn_info{$conn_id}{port_id}}{description} = $conn_info{$conn_id}{description};
+    }
+}
+
+my %devices;
+
+foreach my $port_id (keys %port_info) {
+if ($port_info{$port_id}{target_port_id}) {
+    $port_info{$port_id}{description}=$port_info{$port_info{$port_id}{target_port_id}}{device_name}."-port-".$port_info{$port_info{$port_id}{target_port_id}}{port};
+    }
+if (!$port_info{$port_id}{description} and $port_info{$port_id}{comment}) { $port_info{$port_id}{description}=translit($port_info{$port_id}{comment}); }
+$devices{$port_info{$port_id}{device_name}}{ports}{$port_info{$port_id}{port}}{description}=$port_info{$port_id}{description};
+$devices{$port_info{$port_id}{device_name}}{ports}{$port_info{$port_id}{port}}{snmp_index}=$port_info{$port_id}{snmp_index};
+$devices{$port_info{$port_id}{device_name}}{device_name}=$port_info{$port_id}{device_name};
+$devices{$port_info{$port_id}{device_name}}{ip}=$port_info{$port_id}{ip};
+$devices{$port_info{$port_id}{device_name}}{device_model_id}=$port_info{$port_id}{device_model_id};
+$devices{$port_info{$port_id}{device_name}}{vendor_id}=$port_info{$port_id}{vendor_id};
+$devices{$port_info{$port_id}{device_name}}{device_type}=$port_info{$port_id}{device_type};
+$devices{$port_info{$port_id}{device_name}}{community}=$port_info{$port_id}{community};
+$devices{$port_info{$port_id}{device_name}}{snmp_version}=$port_info{$port_id}{snmp_version};
+}
+
+foreach my $device_name (keys %devices) {
+my $device = $devices{$device_name};
+
+#skip unknown vendor
+next if (!$switch_auth{$device->{vendor_id}});
+
+my $ip = $device->{ip};
+my $community = $device->{community};
+my $snmp_version = $device->{snmp_version};
+
+print "Device: $device_name IP: $ip community: $community version: $snmp_version\n";
+
+#get interface names
+my $int = get_interfaces($ip,$community,$snmp_version,0);
+
+$device = netdev_set_auth($device);
+my $session = netdev_login($device);
+
+if ($session) {
+    netdev_set_hostname($session,$device);
+    foreach my $port (sort  { $a <=> $b } keys %{$device->{ports}}) {
+        my $descr = $device->{ports}{$port}{description};
+        my $index = $device->{ports}{$port}{snmp_index};
+        print "Port: $port index: $index Descr: $descr\n";
+        netdev_set_port_descr($session,$device,$int->{$index}->{name},$port,$descr);
+        }
+    netdev_wr_mem($session,$device);
+    }
+}
+
+exit;

+ 2 - 0
html/inc/authidfilter.php

@@ -1,4 +1,6 @@
 <?php
+if (! defined("CONFIG")) die("Not defined");
+
 if (isset($_GET['auth_id'])) { $auth_id = $_GET["auth_id"] * 1; }
 if (isset($_POST['auth_id'])) { $auth_id = $_POST["auth_id"] * 1; }
 if (!isset($auth_id)) {

+ 95 - 0
html/inc/languages/russian2.php

@@ -0,0 +1,95 @@
+<?php
+define("WEB_MONTHS", array(
+1 => "Январь",
+2 => "Февраль",
+3 => "Март",
+4 => "Апрель",
+5 => "Май",
+6 => "Июнь",
+7 => "Июль",
+8 => "Август",
+9 => "Сентябрь",
+10 => "Октябрь",
+11 => "Ноябрь",
+12 => "Декабрь"
+));
+
+/* header title */
+define("WEB_title_reports","Отчёт");
+define("WEB_title_groups","Группы");
+define("WEB_title_users","Пользователи");
+define("WEB_title_users_ips","Все адреса");
+define("WEB_title_filters","Фильтры");
+define("WEB_title_shapers","Шейперы");
+define("WEB_title_devices","Инфраструктура");
+
+/* traffic headers */
+define("WEB_title_ip","Адрес");
+define("WEB_title_date","Дата");
+define("WEB_title_input","Входящий");
+define("WEB_title_output","Исходящий");
+define("WEB_title_pktin","IN, pkt/s");
+define("WEB_title_pktout","OUT, pkt/s");
+define("WEB_title_maxpktin","Max IN, pkt/s");
+define("WEB_title_maxpktout","Max OUT, pkt/s");
+define("WEB_title_sum","Суммарно");
+define("WEB_title_itog","Итого");
+
+/* table cell names */
+define("WEB_cell_login","Логин");
+define("WEB_cell_fio","ФИО");
+define("WEB_cell_ou","Группа");
+define("WEB_cell_enabled","Включен");
+define("WEB_cell_blocked","Блокировка");
+define("WEB_cell_perday","В день");
+define("WEB_cell_permonth","В месяц");
+define("WEB_cell_report","Отчёт");
+define("WEB_cell_name","Название");
+define("WEB_cell_ip","IP");
+define("WEB_cell_mac","MAC");
+define("WEB_cell_clientid","Client-id");
+define("WEB_cell_host_firmware","Прошивка");
+define("WEB_cell_comment","Комментарий");
+define("WEB_cell_wikiname","Wiki Name");
+define("WEB_cell_filter","Фильтр");
+define("WEB_cell_proxy","Proxy");
+define("WEB_cell_dhcp","Dhcp");
+define("WEB_cell_nat","НАТ");
+define("WEB_cell_transparent","Transparent");
+define("WEB_cell_shaper","Шейпер");
+define("WEB_cell_connection","Подключен");
+define("WEB_cell_dns_name","Имя в dns");
+define("WEB_cell_host_model","Модель устройства");
+define("WEB_cell_nagios","Мониторинг");
+define("WEB_cell_nagios_handler","Реакция на событие");
+define("WEB_cell_link","Линк");
+define("WEB_cell_traf","Запись трафика");
+define("WEB_cell_acl","dhcp acl");
+define("WEB_cell_le","Правил");
+
+/* lists name */
+define("WEB_list_ou","Список групп");
+define("WEB_list_subnet","Список подсетей");
+define("WEB_list_customers","Список администраторов");
+define("WEB_list_filters","Список фильтров");
+define("WEB_list_users","Список полльзователей");
+
+/* button names */
+define("WEB_btn_remove","Удалить");
+define("WEB_btn_add","Добавить");
+define("WEB_btn_save","Сохранить");
+define("WEB_btn_move","Переместить");
+define("WEB_btn_apply","Применить конфигурацию");
+define("WEB_btn_device","+Устройство");
+define("WEB_btn_mac_add","+MAC");
+define("WEB_btn_mac_del","-MAC");
+define("WEB_btn_ip_add","+IP");
+define("WEB_btn_ip_del","-IP");
+
+/* error messages */
+define("WEB_msg_exists","уже существует!");
+define("WEB_msg_ip_error","Формат адреса не верен!");
+
+/* log messages */
+
+?>

+ 2 - 0
html/inc/oufilter.php

@@ -1,4 +1,6 @@
 <?php
+if (! defined("CONFIG")) die("Not defined");
+
 if (!isset($default_ou)) { $default_ou = 0; }
 if (isset($_GET['ou'])) { $rou = $_GET["ou"] * 1; }
 if (isset($_POST['ou'])) { $rou = $_POST["ou"] * 1; }

+ 1 - 0
html/inc/sortfilter.php

@@ -1,4 +1,5 @@
 <?php
+if (! defined("CONFIG")) die("Not defined");
 
 if (!isset($default_sort)) { $default_sort=''; }
 if (!isset($default_order)) { $default_order='ASC'; }

+ 2 - 0
html/inc/sql.php

@@ -1,4 +1,6 @@
 <?php
+if (! defined("CONFIG")) die("Not defined");
+
 if (! defined("SQL")) { die("Not defined"); }
 
 $db_link = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);

+ 2 - 0
html/inc/subnetfilter.php

@@ -1,4 +1,6 @@
 <?php
+if (! defined("CONFIG")) die("Not defined");
+
 if (!isset($default_subnet)) { $default_subnet = 0; }
 if (isset($_GET['subnet'])) { $rsubnet = $_GET["subnet"] * 1; }
 if (isset($_POST['subnet'])) { $rsubnet = $_POST["subnet"] * 1; }

+ 16 - 7
scripts/Rstat/snmp.pm

@@ -85,8 +85,9 @@ my ($session, $error) = Net::SNMP->session(
    -community => $community,
    -port      => $port,
    -version   => $snmp_version,
-   -timeout   => $snmp_timeout
+   -timeout   => 5
 );
+return if (!defined($session));
 my $result = $session->get_request( -varbindlist => [$oid]);
 $session->close;
 return if (!$result->{$oid});
@@ -110,6 +111,7 @@ my ($session, $error) = Net::SNMP->session(
    -version   => $snmp_version,
    -timeout   => $snmp_timeout
 );
+return if (!defined($session));
 my $result = $session->set_request( -varbindlist => [$oid,INTEGER,$value]);
 $session->close;
 return $result->{$oid};
@@ -203,9 +205,19 @@ my $version = shift;
 my $ifmib_map;
 my $index_table =  snmp_get_oid($ip, $community, $ifIndex_map, $version);
 if (!%$index_table) { $index_table =  snmp_walk_oid($ip, $community, $ifIndex_map, $version); }
-my $is_mikrotik = snmp_get_oid($ip, $community, '.1.3.6.1.2.1.9999.1.1.1.1.0', $version);
-if (%$index_table and $is_mikrotik) {
-	if ($is_mikrotik) {
+return if (!$index_table);
+my $is_mikrotik = snmp_get_request($ip, '.1.3.6.1.2.1.9999.1.1.1.1.0', $community, 161, $version);
+my $mk_ros_version = 6491;
+
+if ($is_mikrotik) {
+    my $mikrotik_version = snmp_get_request($ip, '.1.0.8802.1.1.2.1.3.4.0', $community, 161, $version);
+    #"MikroTik RouterOS 6.46.8 (long-term) CRS326-24S+2Q+"
+    if ($mikrotik_version =~/RouterOS\s+(\d)\.(\d{1,3})\.(\d{1,3})\s+/) {
+        $mk_ros_version = $1*1000 + $2*10 + $3;
+        }
+    }
+
+if ($is_mikrotik and ($mk_ros_version > 6468)) {
             foreach my $row (keys(%$index_table)) {
 	        my $port_index = $index_table->{$row};
 	        next if (!$port_index);
@@ -214,10 +226,7 @@ if (%$index_table and $is_mikrotik) {
 	        next if (!$value);
     	        $ifmib_map->{$value}=$port_index;
         	}
-	    }
         } else {
-#        $index_table =  snmp_get_oid($ip, $community, $ifIndex, $version);
-#        if (!%$index_table) { $index_table =  snmp_walk_oid($ip, $community, $ifIndex, $version); }
         if (%$index_table) {
             foreach my $row (keys(%$index_table)) {
 	        my $port_index = $index_table->{$row};

+ 2 - 0
scripts/fetch_new_arp.pl

@@ -30,6 +30,8 @@ flock(SELF, LOCK_EX|LOCK_NB) or exit 1;
 
 setpriority(0,0,19);
 
+$debug = 1;
+
 my %mac_history;
 
 my ($sec,$min,$hour,$day,$month,$year,$zone) = localtime(time());