Quellcode durchsuchen

bugfix: fixed save full traffic session for mysql
removed temporary postgres patch

Roman Dmitriev vor 3 Monaten
Ursprung
Commit
f5cd6f2ff0

+ 16 - 9
scripts/eye-statd.pl

@@ -713,12 +713,20 @@ my $l_src_ip_aton=StrToIp($l_src_ip);
 my $l_dst_ip_aton=StrToIp($l_dst_ip);
 
 my ($sec,$min,$hour,$day,$month,$year,$zone) = (localtime($last_time))[0,1,2,3,4,5];
-$month++;
-$year += 1900;
-my $full_time = sprintf "%04d-%02d-%02d %02d:%02d:%02d",$year,$month,$day,$hour,$min,$sec;
-
-my @detail_array = ($user_stats{$user_ip}->{auth_id},$router_id,$full_time,$traf_record->{proto},$l_src_ip_aton,$l_dst_ip_aton,$traf_record->{src_port},$traf_record->{dst_port},$traf_record->{octets},$traf_record->{pkts});
-push(@detail_traffic,\@detail_array);
+my $full_time = sprintf "%04d-%02d-%02d %02d:%02d:%02d",$year+1900,$month+1,$day,$hour,$min,$sec;
+
+push @detail_traffic, [
+    $user_stats{$user_ip}->{auth_id},
+    $router_id,
+    $full_time,
+    $traf_record->{proto},
+    $l_src_ip_aton,
+    $l_dst_ip_aton,
+    $traf_record->{src_port},
+    $traf_record->{dst_port},
+    $traf_record->{octets},
+    $traf_record->{pkts}
+    ];
 }
 
 @flush_table=();
@@ -852,7 +860,7 @@ foreach my $router_id (keys %wan_stats) {
     #last flow for user
     my ($sec,$min,$hour,$day,$month,$year) = (localtime($start_time))[0,1,2,3,4,5];
     #flow time string
-    my $flow_date = $hdb->quote(sprintf "%04d-%02d-%02d %02d:%02d:%02d",$year+1900,$month+1,$day,$hour,$min,$sec);
+    my $flow_date = sprintf "%04d-%02d-%02d %02d:%02d:%02d",$year+1900,$month+1,$day,$hour,$min,$sec;
     #per interface stats
     foreach my $int_id (keys %{$wan_stats{$router_id}}) {
 	if (!$wan_stats{$router_id}{$int_id}{in})  { $wan_stats{$router_id}{$int_id}{in} = 0; }
@@ -903,8 +911,7 @@ if ($config_ref{enable_quotes}) {
 
 if (scalar(@detail_traffic)) {
     db_log_debug($hdb,"Start write traffic detail to DB. ".scalar @detail_traffic." lines count") if ($debug);
-    #mysql dont work at parallel table lock
-    batch_db_sql_csv("traffic_detail", \@detail_traffic);
+    batch_db_sql_csv("traffic_detail",\@detail_traffic);
     @detail_traffic = ();
     db_log_debug($hdb,"Write traffic detail to DB stopped") if ($debug);
     }

+ 13 - 11
scripts/eyelib/database.pm

@@ -158,17 +158,20 @@ sub batch_db_sql_csv {
     my $db = init_db();
     if ($config_ref{DBTYPE} eq 'mysql') {
         my $fh = File::Temp->new(UNLINK => 1);
+	my $fname = $fh->filename;
         binmode($fh, ':utf8');
-        for my $row (@$data) {
-            next unless $row && @$row;
-            my $line = 'NULL';  # автоинкремент
-            for my $val (@$row) {
-                $line .= defined($val) ? ',' . $val : ',NULL';
-            }
-            print $fh $line . "\r\n";
-        }
+	foreach my $row (@$data) {
+	    next if (!$row);
+	    my @tmp = @$row;
+	    my $values = 'NULL';
+	    for (my $i = 0; $i <@tmp ; $i++) {
+		$values.=',"'.$tmp[$i].'"';
+		}
+	    $values =~s/,$//;
+	    print $fh $values."\r\n";
+	    }
         close $fh;
-        my $query = "LOAD DATA LOCAL INFILE '" . $fh->filename . "' INTO TABLE `$table` FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n'";
+	my $query = qq{ LOAD DATA LOCAL INFILE '$fname' INTO TABLE $table FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\r\n'; };
         $db->do($query);
     } else {
         # PostgreSQL: используем COPY ... FROM STDIN
@@ -184,7 +187,6 @@ sub batch_db_sql_csv {
             $db->pg_put_copy_data($line);
         }
         $db->pg_put_copy_end();  # Завершаем копирование
-
     }
     $db->disconnect();
 }
@@ -304,7 +306,7 @@ sub init_db {
 # Create new database handle. If we can't connect, die()
 my $db;
 if ($config_ref{DBTYPE} eq 'mysql') {
-$db = DBI->connect("dbi:mysql:database=$DBNAME;host=$DBHOST","$DBUSER","$DBPASS", 
+$db = DBI->connect("dbi:mysql:database=$DBNAME;host=$DBHOST;mysql_local_infile=1","$DBUSER","$DBPASS", 
     { RaiseError => 0, AutoCommit => 1, mysql_enable_utf8 => 1 });
 if ( !defined $db ) { die "Cannot connect to MySQL server: $DBI::errstr\n"; }
 $db->do('SET NAMES utf8mb4');

+ 2 - 0
scripts/updates/3-0-1/migration.msql

@@ -24,6 +24,7 @@ ALTER TABLE user_auth CHANGE COLUMN `client-id` client_id VARCHAR(250);
 
 ALTER TABLE customers CHANGE COLUMN `Login` login VARCHAR(20) DEFAULT 'NULL';
 
+
 -- Переименовываем eof → end_life в user_auth
 ALTER TABLE user_auth CHANGE COLUMN `eof` end_life TIMESTAMP NULL DEFAULT NULL;
 
@@ -94,6 +95,7 @@ ALTER TABLE user_auth ADD COLUMN mac_found TIMESTAMP NULL DEFAULT NULL;
 ALTER TABLE config_options  CHANGE COLUMN `type` option_type VARCHAR(100) NOT NULL;
 ALTER TABLE dns_queue       CHANGE COLUMN `type` operation_type VARCHAR(10) NOT NULL DEFAULT 'add';
 ALTER TABLE filter_list     CHANGE COLUMN `type` filter_type SMALLINT NOT NULL DEFAULT 0;
+ALTER TABLE auth_rules      CHANGE COLUMN `type` rule_type INT(11) NOT NULL;
 
 UPDATE user_auth SET mac_found = last_found WHERE last_found IS NOT NULL;
 

+ 0 - 102
scripts/updates/3-0-1/migration.psql

@@ -1,102 +0,0 @@
--- Переименование таблиц в нижний регистр (snake_case)
-
-ALTER TABLE "Customers" RENAME TO customers;
-ALTER TABLE "OU" RENAME TO ou;
-ALTER TABLE "User_auth" RENAME TO user_auth;
-ALTER TABLE "User_list" RENAME TO user_list;
-ALTER TABLE "User_stats" RENAME TO user_stats;
-ALTER TABLE "User_stats_full" RENAME TO user_stats_full;
-ALTER TABLE "User_auth_alias" RENAME TO user_auth_alias;
-ALTER TABLE "Wan_stats" RENAME TO wan_stats;
-ALTER TABLE "Traffic_detail" RENAME TO traffic_detail;
-ALTER TABLE "Unknown_mac" RENAME TO unknown_mac;
-ALTER TABLE "Group_filters" RENAME TO group_filters;
-ALTER TABLE "Group_list" RENAME TO group_list;
-ALTER TABLE "Filter_list" RENAME TO filter_list;
-ALTER TABLE "Queue_list" RENAME TO queue_list;
-
--- wan_stats: in/out → bytes_in/bytes_out
-ALTER TABLE wan_stats RENAME COLUMN "in" TO bytes_in;
-ALTER TABLE wan_stats RENAME COLUMN "out" TO bytes_out;
-
--- group_filters: order → rule_order
-ALTER TABLE group_filters RENAME COLUMN "order" TO rule_order;
-
--- user_auth: client-id → client_id
-ALTER TABLE user_auth RENAME COLUMN "client-id" TO client_id;
-
--- customers: Login to lower case
-ALTER TABLE customers RENAME COLUMN Login TO login;
-
--- Переименовываем eof → end_life в user_auth
-ALTER TABLE user_auth RENAME COLUMN eof TO end_life;
-
--- dhcp_log: дефисы → подчёркивания
-ALTER TABLE dhcp_log RENAME COLUMN "client-id" TO client_id;
-ALTER TABLE dhcp_log RENAME COLUMN "circuit-id" TO circuit_id;
-ALTER TABLE dhcp_log RENAME COLUMN "remote-id" TO remote_id;
-
--- Точки в именах → подчёркивания
-ALTER TABLE acl RENAME COLUMN "description.english" TO description_english;
-ALTER TABLE acl RENAME COLUMN "description.russian" TO description_russian;
-ALTER TABLE config_options RENAME COLUMN "description.english" TO description_english;
-ALTER TABLE config_options RENAME COLUMN "description.russian" TO description_russian;
-ALTER TABLE device_types RENAME COLUMN "name.russian" TO name_russian;
-ALTER TABLE device_types RENAME COLUMN "name.english" TO name_english;
-
--- timestamp → ts
-ALTER TABLE dhcp_log RENAME COLUMN timestamp TO ts;
-ALTER TABLE dhcp_queue RENAME COLUMN timestamp TO ts;
-ALTER TABLE dns_cache RENAME COLUMN timestamp TO ts;
-ALTER TABLE mac_history RENAME COLUMN timestamp TO ts;
-ALTER TABLE user_auth RENAME COLUMN timestamp TO ts;
-ALTER TABLE user_stats RENAME COLUMN timestamp TO ts;
-ALTER TABLE user_stats_full RENAME COLUMN timestamp TO ts;
-ALTER TABLE worklog RENAME COLUMN timestamp TO ts;
-ALTER TABLE user_list RENAME COLUMN timestamp TO ts;
-ALTER TABLE traffic_detail RENAME COLUMN timestamp TO ts;
-ALTER TABLE unknown_mac RENAME COLUMN timestamp TO ts;
-ALTER TABLE user_auth_alias RENAME COLUMN timestamp TO ts;
-
--- time/date → ts
-ALTER TABLE wan_stats RENAME COLUMN time TO ts;
-ALTER TABLE remote_syslog RENAME COLUMN date TO ts;
-
--- comment → description (во всех таблицах)
-ALTER TABLE acl RENAME COLUMN comment TO description;
-ALTER TABLE building RENAME COLUMN comment TO description;
-ALTER TABLE devices RENAME COLUMN comment TO description;
-ALTER TABLE filter_instances RENAME COLUMN comment TO description;
-ALTER TABLE filter_list RENAME COLUMN comment TO description;
-ALTER TABLE group_list RENAME COLUMN comment TO description;
-ALTER TABLE ou RENAME COLUMN comment TO description;
-ALTER TABLE subnets RENAME COLUMN comment TO description;
-ALTER TABLE user_auth RENAME COLUMN comments TO description;
-ALTER TABLE user_list RENAME COLUMN comment TO description;
-ALTER TABLE vendors RENAME COLUMN comment TO description;
-
--- Добавляем поле mac_found в user_auth (аналог arp_found)
-ALTER TABLE user_auth ADD COLUMN mac_found TIMESTAMP;
-
--- type → уточнённые имена
-ALTER TABLE config_options RENAME COLUMN type TO option_type;
-ALTER TABLE dns_queue RENAME COLUMN type TO operation_type;
-ALTER TABLE filter_list RENAME COLUMN type TO filter_type;
-
-UPDATE user_auth SET mac_found = last_found WHERE last_found IS NOT NULL;
-
--- user_stats - set default value 0
-
-ALTER TABLE user_stats ADD COLUMN pkt_in integer NOT NULL DEFAULT 0;
-ALTER TABLE user_stats ADD COLUMN pkt_out integer NOT NULL DEFAULT 0;
-ALTER TABLE user_stats ADD COLUMN step integer NOT NULL DEFAULT 3600;
-
--- Сначала обновите NULL-значения на 0 (если они есть)
-UPDATE user_stats_full SET pkt_in = 0 WHERE pkt_in IS NULL;
-UPDATE user_stats_full SET pkt_out = 0 WHERE pkt_out IS NULL;
-
--- Затем измените столбцы
-ALTER TABLE user_stats_full ALTER COLUMN pkt_in SET NOT NULL;
-ALTER TABLE user_stats_full ALTER COLUMN pkt_in SET DEFAULT 0;
-ALTER TABLE user_stats_full ALTER COLUMN pkt_out SET NOT NULL;
-ALTER TABLE user_stats_full ALTER COLUMN pkt_out SET DEFAULT 0;