浏览代码

add urgent sync dhcp server config after change user ip or mac

Roman Dmitriev 2 年之前
父节点
当前提交
bd1b040825
共有 5 个文件被更改,包括 60 次插入24 次删除
  1. 13 12
      docs/mysql/mysql.sql
  2. 16 1
      html/inc/common.php
  3. 11 4
      scripts/Rstat/mysql.pm
  4. 19 7
      scripts/stat-sync.pl
  5. 1 0
      updates/2-4-12/mysql-devices-patch.sql

+ 13 - 12
docs/mysql/mysql.sql

@@ -48868,35 +48868,36 @@ CREATE TABLE `User_auth` (
   `id` int(11) NOT NULL,
   `user_id` bigint(20) UNSIGNED NOT NULL DEFAULT 0,
   `ou_id` int(11) DEFAULT NULL,
-  `ip` varchar(18) NOT NULL DEFAULT '',
+  `ip` varchar(18) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
   `ip_int` bigint(10) UNSIGNED NOT NULL DEFAULT 0,
   `save_traf` tinyint(1) NOT NULL DEFAULT 0,
   `enabled` tinyint(1) NOT NULL DEFAULT 0,
   `dhcp` tinyint(1) NOT NULL DEFAULT 1,
   `filter_group_id` tinyint(1) NOT NULL DEFAULT 0,
   `deleted` tinyint(4) NOT NULL DEFAULT 0,
-  `comments` varchar(250) DEFAULT NULL,
-  `dns_name` varchar(60) NOT NULL DEFAULT '',
-  `WikiName` varchar(250) DEFAULT NULL,
-  `dhcp_acl` text DEFAULT NULL,
+  `comments` varchar(250) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
+  `dns_name` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
+  `WikiName` varchar(250) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
+  `dhcp_acl` text COLLATE utf8mb4_unicode_ci DEFAULT NULL,
   `queue_id` int(11) NOT NULL DEFAULT 0,
-  `mac` varchar(20) NOT NULL DEFAULT '',
-  `dhcp_action` varchar(10) NOT NULL DEFAULT '',
+  `mac` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
+  `dhcp_action` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
   `dhcp_time` datetime NOT NULL DEFAULT current_timestamp(),
-  `dhcp_hostname` varchar(60) DEFAULT NULL,
+  `dhcp_hostname` varchar(60) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
   `last_found` datetime NOT NULL DEFAULT current_timestamp(),
   `blocked` tinyint(1) NOT NULL DEFAULT 0,
   `day_quota` int(11) NOT NULL DEFAULT 0,
   `month_quota` int(11) NOT NULL DEFAULT 0,
   `device_model_id` int(11) DEFAULT 87,
-  `firmware` varchar(100) DEFAULT NULL,
+  `firmware` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
   `timestamp` timestamp NOT NULL DEFAULT current_timestamp(),
-  `clientid` varchar(50) NOT NULL DEFAULT '',
+  `clientid` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
   `nagios` tinyint(1) NOT NULL DEFAULT 0,
-  `nagios_status` varchar(10) NOT NULL DEFAULT '',
-  `nagios_handler` varchar(50) NOT NULL DEFAULT '',
+  `nagios_status` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
+  `nagios_handler` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
   `link_check` tinyint(1) NOT NULL DEFAULT 0,
   `changed` tinyint(1) NOT NULL DEFAULT 0,
+  `dhcp_changed` int(11) DEFAULT NULL,
   `changed_time` datetime NOT NULL DEFAULT current_timestamp()
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 

+ 16 - 1
html/inc/common.php

@@ -3305,6 +3305,7 @@ function update_record($db, $table, $filter, $newvalue)
     $changed_log = '';
     $run_sql = '';
     $network_changed = 0;
+    $dhcp_changed = 0;
 
     $acl_fields = [
         'ip' => '1',
@@ -3319,6 +3320,13 @@ function update_record($db, $table, $filter, $newvalue)
         'blocked' => '1',
     ];
 
+    $dhcp_fields = [
+        'ip' => '1',
+        'dhcp' => '1',
+        'deleted' => '1',
+        'mac' => '1',
+    ];
+
     foreach ($newvalue as $key => $value) {
         if (!isset($value)) {
             $value = '';
@@ -3331,6 +3339,9 @@ function update_record($db, $table, $filter, $newvalue)
             if (!empty($acl_fields["$key"])) {
                 $network_changed = 1;
             }
+            if (!empty($dhcp_fields["$key"])) {
+                $dhcp_changed = 1;
+            }
         }
         if (!preg_match('/password/i',$key)) {
             $changed_log = $changed_log . " $key => $value (old: $old[$key]),";
@@ -3345,6 +3356,10 @@ function update_record($db, $table, $filter, $newvalue)
         $run_sql = $run_sql . " `changed`='1',";
     }
 
+    if ($dhcp_changed) {
+        $run_sql = $run_sql . " `dhcp_changed`='1',";
+    }
+
     $changed_log = substr_replace($changed_log, "", -1);
     $run_sql = substr_replace($run_sql, "", -1);
 
@@ -3467,7 +3482,7 @@ function insert_record($db, $table, $newvalue)
         LOG_VERBOSE($db, "Create record in table $table: $changed_log with id: $last_id");
     }
     if ($table === 'User_auth') {
-        run_sql($db, "UPDATE User_auth SET changed=1 WHERE id=" . $last_id);
+        run_sql($db, "UPDATE User_auth SET changed=1, dhcp_changed=1 WHERE id=" . $last_id);
     }
     return $last_id;
 }

+ 11 - 4
scripts/Rstat/mysql.pm

@@ -100,6 +100,13 @@ our %acl_fields = (
 'blocked'=>'1'
 );
 
+our %dhcp_fields = (
+'ip' => '1',
+'dhcp'=>'1',
+'deleted'=>'1',
+'mac'=>'1',
+);
+
 #---------------------------------------------------------------------------------------------------------------
 
 sub StrToIp{
@@ -386,8 +393,8 @@ my $auth_id = 0;
 if ($table eq "User_auth") {
     $auth_id = $old_record->{'id'};
     foreach my $field (keys %$record) {
-        next if (!exists $acl_fields{$field});
-        $record->{changed}="1";
+        if (exists $acl_fields{$field}) { $record->{changed}="1"; }
+        if (exists $dhcp_fields{$field}) { $record->{dhcp_changed}="1"; }
         }
     }
 
@@ -432,8 +439,8 @@ my $new_str='';
 
 if ($table eq 'User_auth') {
     foreach my $field (keys %$record) {
-        next if (!exists $acl_fields{$field});
-        $record->{changed}="1";
+        if (exists $acl_fields{$field}) { $record->{changed}="1"; }
+        if (exists $dhcp_fields{$field}) { $record->{dhcp_changed}="1"; }
         }
     }
 

+ 19 - 7
scripts/stat-sync.pl

@@ -90,16 +90,28 @@ if (!$pid) {
         if ($urgent_sync) {
     	    #clean changed for dynamic clients or hotspot
     	    do_sql($hdb,"UPDATE User_auth SET changed=0 WHERE ou_id=".$default_user_ou_id." OR ou_id=".$default_hotspot_ou_id);
+    	    do_sql($hdb,"UPDATE User_auth SET dhcp_changed=0 WHERE ou_id=".$default_user_ou_id." OR ou_id=".$default_hotspot_ou_id);
     	    #clean unmanagment ip changed
-    	    my @all_changed = get_records_sql($hdb,"SELECT id, ip FROM User_auth WHERE changed = 1");
+    	    my @all_changed = get_records_sql($hdb,"SELECT id, ip FROM User_auth WHERE changed = 1 OR dhcp_changed = 1");
     	    foreach my $row(@all_changed) {
-    		next if ($office_networks->match_string($row->{ip}));
-    		do_sql($hdb,"UPDATE User_auth SET changed = 0 WHERE id=".$row->{id});
-    		}
-            my $changed = get_record_sql($hdb,"SELECT COUNT(*) as c_count from User_auth WHERE changed=1");
-	    if ($changed->{"c_count"}>0) {
+    		    next if ($office_networks->match_string($row->{ip}));
+    		    do_sql($hdb,"UPDATE User_auth SET changed = 0, dhcp_changed = 0 WHERE id=".$row->{id});
+    		    }
+            #dhcp changed records
+            my $changed = get_record_sql($hdb,"SELECT COUNT(*) as c_count from User_auth WHERE dhcp_changed=1");
+	        if ($changed->{"c_count"}>0) {
+        	    do_sql($hdb,"UPDATE User_auth SET dhcp_changed=0");
+                log_info("Found changed dhcp variables in records: ".$changed->{'c_count'});
+                my $dhcp_exec=get_option($hdb,38);
+    	        my %result=do_exec_ref($HOME_DIR."/".$dhcp_exec);
+    	        if ($result{status} ne 0) { log_error("Error sync dhcp config"); }
+    	    	}
+            #acl & dhcp changed records 
+            $changed = get_record_sql($hdb,"SELECT COUNT(*) as c_count from User_auth WHERE changed=1");
+	        if ($changed->{"c_count"}>0) {
                 log_info("Found changed records: ".$changed->{'c_count'});
-    	        my %result=do_exec_ref($HOME_DIR."/sync_mikrotik.pl");
+                my $acl_exec=get_option($hdb,37);
+    	        my %result=do_exec_ref($HOME_DIR."/".$acl_exec);
     	        if ($result{status} ne 0) { log_error("Error sync status at gateways"); }
     	    	}
     	    }

+ 1 - 0
updates/2-4-12/mysql-devices-patch.sql

@@ -23,3 +23,4 @@ DELETE FROM `config_options` WHERE `config_options`.`id` = 19;
 DELETE FROM `config` WHERE `option_id` = 17;
 DELETE FROM `config` WHERE `option_id` = 19;
 INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES (68, 'config_mode', 'Режим конфигурирования. Скрипт опроса устройств не выполняется.', 'Configuration mode. The device polling script is not running.', '1', 'bool', '0', '0', '1');
+ALTER TABLE `User_auth` ADD `dhcp_changed` INT NULL DEFAULT NULL AFTER `changed`;