Преглед на файлове

the algorithm for processing dns records on the command queue has been changed

root преди 2 години
родител
ревизия
1f2eb0f147
променени са 7 файла, в които са добавени 386 реда и са изтрити 184 реда
  1. 1 2
      html/admin/users/edit_alias.php
  2. 114 15
      html/inc/common.php
  3. 262 144
      scripts/eyelib/mysql.pm
  4. 7 17
      scripts/stat-sync.pl
  5. 1 0
      updates/2-4-14/dns_queue.sql
  6. 1 3
      updates/2-4-14/user_auth.sql
  7. 0 3
      updates/2-4-14/user_auth_alias.sql

+ 1 - 2
html/admin/users/edit_alias.php

@@ -42,7 +42,6 @@ if (isset($_POST["s_create"])) {
     if (isset($new_alias)) {
         $new_rec['alias'] = trim($new_alias);
         $new_rec['auth_id'] = $id;
-        $new_rec['dns_changed'] = 1;
         LOG_INFO($db_link, "Create new alias $new_alias");
         insert_record($db_link, "User_auth_alias", $new_rec);
     }
@@ -67,7 +66,7 @@ require_once ($_SERVER['DOCUMENT_ROOT']."/inc/header.php");
 	<td><input type="submit" onclick="return confirm('<?php echo WEB_msg_delete; ?>?')" name="s_remove" value="<?php echo WEB_btn_delete; ?>"></td>
 </tr>
 <?php
-$t_User_auth_alias = get_records($db_link,'User_auth_alias',"deleted=0 AND auth_id=$id ORDER BY alias");
+$t_User_auth_alias = get_records($db_link,'User_auth_alias',"auth_id=$id ORDER BY alias");
 if (!empty($t_User_auth_alias)) {
 foreach ( $t_User_auth_alias as $row ) {
     print "<tr align=center>\n";

+ 114 - 15
html/inc/common.php

@@ -4060,6 +4060,13 @@ function copy_auth($db, $id, $new_auth)
     return $new_id;
 }
 
+function get_dns_name($db,$id)
+{
+    $auth_record = get_record_sql($db,"SELECT dns_name FROM User_auth WHERE id=".$id);
+    if (!empty($auth_record) and !empty($auth_record['dns_name'])) { return $auth_record['dns_name']; }
+    return '';
+}
+
 function update_record($db, $table, $filter, $newvalue)
 {
     if (isRO($db, $table)) {
@@ -4082,9 +4089,14 @@ function update_record($db, $table, $filter, $newvalue)
         LOG_WARNING($db, "Change record ($table [ $filter ]) with empty data! Skip command.");
         return;
     }
+
     $old_sql = "SELECT * FROM $table WHERE $filter";
     $old_record = mysqli_query($db, $old_sql) or LOG_ERROR($db, "SQL: $old_sql :" . mysqli_error($db));
     $old = mysqli_fetch_array($old_record, MYSQLI_ASSOC);
+
+    $rec_id = NULL;
+    if (!empty($old['id'])) { $rec_id = $old['id']; }
+
     $changed_log = '';
     $run_sql = '';
     $network_changed = 0;
@@ -4112,6 +4124,7 @@ function update_record($db, $table, $filter, $newvalue)
     ];
 
     $dns_fields = [
+        'ip' => '1',
         'dns_name' => '1',
         'alias' => '1',
     ];
@@ -4133,20 +4146,63 @@ function update_record($db, $table, $filter, $newvalue)
             }
             if (!empty($dns_fields["$key"])) {
                 $dns_changed = 1;
-                $run_sql = $run_sql . " `old_dns_name`='" . mysqli_real_escape_string($db, trim($newvalue['dns_name'])) . "',";
             }
         }
         if ($table === "User_auth_alias") {
             if (!empty($dns_fields["$key"])) {
                 $dns_changed = 1;
-                $run_sql = $run_sql . " `old_alias`='" . mysqli_real_escape_string($db, trim($newvalue['alias'])) . "',";
             }
         }
         if (!preg_match('/password/i',$key)) {
             $changed_log = $changed_log . " $key => $value (old: $old[$key]),";
-            }
+        }
         $run_sql = $run_sql . " `" . $key . "`='" . mysqli_real_escape_string($db, $value) . "',";
     }
+
+    if ($table === "User_auth" and $dns_changed) {
+                if (!empty($old['dns_name']) and !empty($old['ip'])) {
+                    $del_dns['name_type']='A';
+                    $del_dns['name']=$old['dns_name'];
+                    $del_dns['value']=$old['ip'];
+                    $del_dns['type']='del';
+                    if (!empty($rec_id)) { $del_dns['auth_id']=$rec_id; }
+                    insert_record($db,'dns_queue',$del_dns);
+                    }
+                if (!empty($newvalue['dns_name']) and !empty($newvalue['ip'])) {
+                    $new_dns['name_type']='A';
+                    $new_dns['name']=$newvalue['dns_name'];
+                    $new_dns['value']=$newvalue['ip'];
+                    $new_dns['type']='add';
+                    if (!empty($rec_id)) { $new_dns['auth_id']=$rec_id; }
+                    insert_record($db,'dns_queue',$new_dns);
+                    }
+    }
+
+    if ($table === "User_auth_alias" and $dns_changed) {
+                $auth_id = NULL;
+                if ($old['auth_id']) { $auth_id = $old['auth_id']; }
+                if (!empty($old['alias'])) {
+                    $del_dns['name_type']='CNAME';
+                    $del_dns['name']=$old['alias'];
+                    $del_dns['type']='del';
+                    if (!empty($auth_id)) {
+                        $del_dns['auth_id']=$auth_id; 
+                        $del_dns['value']=get_dns_name($db,$auth_id);
+                        }
+                    insert_record($db,'dns_queue',$del_dns);
+                    }
+                if (!empty($newvalue['alias'])) {
+                    $new_dns['name_type']='CNAME';
+                    $new_dns['name']=$newvalue['alias'];
+                    $new_dns['type']='add';
+                    if (!empty($auth_id)) { 
+                        $new_dns['auth_id']=$auth_id; 
+                        $new_dns['value']=get_dns_name($db,$auth_id);
+                        }
+                    insert_record($db,'dns_queue',$new_dns);
+                    }
+    }
+
     if (empty($run_sql)) {
         return;
     }
@@ -4159,10 +4215,6 @@ function update_record($db, $table, $filter, $newvalue)
         $run_sql = $run_sql . " `dhcp_changed`='1',";
     }
 
-    if ($dns_changed) {
-        $run_sql = $run_sql . " `dns_changed`='1',";
-    }
-
     $changed_log = substr_replace($changed_log, "", -1);
     $run_sql = substr_replace($run_sql, "", -1);
 
@@ -4202,9 +4254,14 @@ function delete_record($db, $table, $filter)
         LOG_WARNING($db, "Change record ($table) with illegal filter $filter! Skip command.");
         return;
     }
+
     $old_sql = "SELECT * FROM $table WHERE $filter";
     $old_record = mysqli_query($db, $old_sql) or LOG_ERROR($db, "SQL: $old_sql :" . mysqli_error($db));
     $old = mysqli_fetch_array($old_record, MYSQLI_ASSOC);
+
+    $rec_id = NULL;
+    if (!empty($old['id'])) { $rec_id = $old['id']; }
+
     $changed_log = 'record: ';
     if (!empty($old)) {
         foreach ($old as $key => $value) {
@@ -4214,7 +4271,9 @@ function delete_record($db, $table, $filter)
             $changed_log = $changed_log . " $key => $value,";
         }
     }
+
     $delete_it = 1;
+
     //never delete user ip record or dns alias record
     if ($table === 'User_auth') {
         $delete_it = 0;
@@ -4226,17 +4285,31 @@ function delete_record($db, $table, $filter)
             LOG_ERROR($db, "UPDATE Request (from delete): " . mysqli_error($db));
             return;
             }
+        //dns
+        if (!empty($old['dns_name']) and !empty($old['ip'])) {
+                    $del_dns['name_type']='A';
+                    $del_dns['name']=$old['dns_name'];
+                    $del_dns['value']=$old['ip'];
+                    $del_dns['type']='del';
+                    if (!empty($rec_id)) { $del_dns['auth_id']=$rec_id; }
+                    insert_record($db,'dns_queue',$del_dns);
+                    }
+
         }
 
     if ($table === 'User_auth_alias') {
-        $delete_it = 0;
-        $new_sql = "UPDATE $table SET `deleted`=1, `old_alias` = `alias`, `dns_changed`=1 WHERE $filter";
-        LOG_DEBUG($db, "Run sql: $new_sql");
-        $sql_result = mysqli_query($db, $new_sql) or LOG_ERROR($db, "SQL: $new_sql :" . mysqli_error($db));
-        if (!$sql_result) {
-            LOG_ERROR($db, "UPDATE Request (from delete): " . mysqli_error($db));
-            return;
-            }
+        //dns
+        if (!empty($old['alias'])) {
+                    $del_dns['name_type']='CNAME';
+                    $del_dns['name']=$old['alias'];
+                    $del_dns['value']='';
+                    $del_dns['type']='del';
+                    if (!empty($old['auth_id'])) {
+                        $del_dns['auth_id']=$old['auth_id'];
+                        $del_dns['value']=get_dns_name($db,$old['auth_id']);
+                        }
+                    insert_record($db,'dns_queue',$del_dns);
+                    }
         }
 
     if ($delete_it) {
@@ -4287,6 +4360,7 @@ function insert_record($db, $table, $newvalue)
     if (empty($value_list)) {
         return;
     }
+
     $changed_log = substr_replace($changed_log, "", -1);
     $field_list = substr_replace($field_list, "", -1);
     $value_list = substr_replace($value_list, "", -1);
@@ -4304,6 +4378,31 @@ function insert_record($db, $table, $newvalue)
     if ($table === 'User_auth') {
         run_sql($db, "UPDATE User_auth SET changed=1, dhcp_changed=1 WHERE id=" . $last_id);
     }
+
+    if ($table === 'User_auth_alias') {
+        //dns
+        if (!empty($newvalue['alias'])) {
+                    $add_dns['name_type']='CNAME';
+                    $add_dns['name']=$newvalue['alias'];
+                    $add_dns['value']=get_dns_name($db,$last_id);
+                    $add_dns['type']='add';
+                    $add_dns['auth_id']=$newvalue['auth_id'];
+                    insert_record($db,'dns_queue',$add_dns);
+                    }
+        }
+
+    if ($table === 'User_auth') {
+        //dns
+        if (!empty($newvalue['dns_name']) and !empty($newvalue['ip'])) {
+                    $add_dns['name_type']='A';
+                    $add_dns['name']=$newvalue['dns_name'];
+                    $add_dns['value']=$newvalue['ip'];
+                    $add_dns['type']='add';
+                    $add_dns['auth_id']=$last_id;
+                    insert_record($db,'dns_queue',$add_dns);
+                    }
+        }
+
     return $last_id;
 }
 

+ 262 - 144
scripts/eyelib/mysql.pm

@@ -62,11 +62,11 @@ StrToIp
 get_first_line
 update_dns_record
 update_dns_record_by_dhcp
-update_dns_cname
+create_dns_cname
 delete_dns_cname
-update_dns_hostname
+create_dns_hostname
 delete_dns_hostname
-update_dns_ptr
+create_dns_ptr
 delete_dns_ptr
 update_record
 write_db_log
@@ -115,6 +115,12 @@ our %dhcp_fields = (
 'mac'=>'1',
 );
 
+our %dns_fields = (
+'ip' => '1',
+'dns_name'=>'1',
+'alias'=>'1',
+);
+
 #---------------------------------------------------------------------------------------------------------------
 
 sub StrToIp{
@@ -394,25 +400,41 @@ return $result;
 
 #---------------------------------------------------------------------------------------------------------------
 
+sub get_dns_name {
+my $db = shift;
+my $id = shift;
+my $auth_record = get_record_sql($db,"SELECT dns_name FROM User_auth WHERE id=".$id);
+if ($auth_record and $auth_record->{'dns_name'}) { return $auth_record->{'dns_name'}; }
+return;
+}
+
+#---------------------------------------------------------------------------------------------------------------
+
 sub update_record {
 my $db = shift;
 my $table = shift;
 my $record = shift;
 my $filter = shift;
+
 return if (!$db);
 return if (!$table);
 return if (!$filter);
+
 my $old_record = get_record_sql($db,"SELECT * FROM $table WHERE $filter");
 my $diff='';
 my $change_str='';
 my $found_changed=0;
-my $auth_id = 0;
+
+my $rec_id = 0;
+my $dns_changed = 0;
+
+$rec_id = $old_record->{'id'} if ($old_record->{'id'});
 
 if ($table eq "User_auth") {
-    $auth_id = $old_record->{'id'};
     foreach my $field (keys %$record) {
         if (exists $acl_fields{$field}) { $record->{changed}="1"; }
         if (exists $dhcp_fields{$field}) { $record->{dhcp_changed}="1"; }
+        if (exists $dns_fields{$field}) { $dns_changed=1; }
         }
     }
 
@@ -433,9 +455,63 @@ foreach my $field (keys %$record) {
 if ($found_changed) {
     $change_str=~s/\,$//;
     $diff=~s/\,$//;
-    if ($table eq 'User_auth') { $change_str .= ", `changed_time`='".GetNowTime()."'"; }
+    if ($table eq 'User_auth') {
+        $change_str .= ", `changed_time`='".GetNowTime()."'"; 
+        if ($dns_changed) {
+                my $del_dns;
+                if ($old_record->{'dns_name'} and $old_record->{'ip'}) {
+                    $del_dns->{'name_type'}='A';
+                    $del_dns->{'name'}=$old_record->{'dns_name'};
+                    $del_dns->{'value'}=$old_record->{'ip'};
+                    $del_dns->{'type'}='del';
+                    if ($rec_id) { $del_dns->{'auth_id'}=$rec_id; }
+                    insert_record($db,'dns_queue',$del_dns);
+                    }
+                my $new_dns;
+                my $dns_rec_ip = $old_record->{ip};
+                my $dns_rec_name = $old_record->{dns_name};
+                if ($record->{'dns_name'}) { $dns_rec_name = $record->{'dns_name'}; }
+                if ($record->{'ip'}) { $dns_rec_ip = $record->{'ip'}; }
+                if ($dns_rec_name and $dns_rec_ip) {
+                    $new_dns->{'name_type'}='A';
+                    $new_dns->{'name'}=$dns_rec_name;
+                    $new_dns->{'value'}=$dns_rec_ip;
+                    $new_dns->{'type'}='add';
+                    if ($rec_id) { $new_dns->{'auth_id'}=$rec_id; }
+                    insert_record($db,'dns_queue',$new_dns);
+                    }
+                }
+        }
+    if ($table eq 'User_auth_alias') {
+        if ($dns_changed) {
+                my $del_dns;
+                if ($old_record->{'alias'}) {
+                    $del_dns->{'name_type'}='CNAME';
+                    $del_dns->{'name'}=$old_record->{'alias'};
+                    $del_dns->{'type'}='del';
+                    if ($rec_id) {
+                        $del_dns->{'value'}=get_dns_name($db,$rec_id);
+                        $del_dns->{'auth_id'}=$rec_id; 
+                        }
+                    insert_record($db,'dns_queue',$del_dns);
+                    }
+                my $new_dns;
+                my $dns_rec_name = $old_record->{alias};
+                if ($record->{'alias'}) { $dns_rec_name = $record->{'alias'}; }
+                if ($dns_rec_name) {
+                    $new_dns->{'name_type'}='CNAME';
+                    $new_dns->{'name'}=$dns_rec_name;
+                    $new_dns->{'type'}='add';
+                    if ($rec_id) {
+                        $new_dns->{'value'}=get_dns_name($db,$rec_id);
+                        $new_dns->{'auth_id'}=$rec_id; 
+                        }
+                    insert_record($db,'dns_queue',$new_dns);
+                    }
+                }
+        }
     my $sSQL = "UPDATE $table SET $change_str WHERE $filter";
-    db_log_debug($db,'Change table '.$table.' for '.$filter.' set: '.$diff,$auth_id);
+    db_log_debug($db,'Change table '.$table.' for '.$filter.' set: '.$diff, $rec_id);
     do_sql($db,$sSQL);
     } else {
     db_log_debug($db,'Nothing change. Skip update.');
@@ -456,10 +532,13 @@ my $fields='';
 my $values='';
 my $new_str='';
 
-if ($table eq 'User_auth') {
+my $dns_changed = 0;
+
+if ($table eq "User_auth") {
     foreach my $field (keys %$record) {
         if (exists $acl_fields{$field}) { $record->{changed}="1"; }
         if (exists $dhcp_fields{$field}) { $record->{dhcp_changed}="1"; }
+        if (exists $dns_fields{$field}) { $dns_changed=1; }
         }
     }
 
@@ -468,16 +547,43 @@ foreach my $field (keys %$record) {
     my $new_value = $record->{$field};
     $new_value=~s/\'//g;
     $new_value=~s/\"//g;
+    $record->{$field} = $new_value;
     $fields = $fields."`$field`,";
-    $values = $values." ".$db->quote($new_value).",";
-    $new_str = $new_str." $field => $new_value,";
+    $values = $values." ".$db->quote($record->{$field}).",";
+    $new_str = $new_str." $field => $record->{$field},";
     }
+
 $fields=~s/,$//;
 $values=~s/,$//;
 $new_str=~s/,$//;
+
 my $sSQL = "INSERT INTO $table($fields) VALUES($values)";
 my $result = do_sql($db,$sSQL);
-if ($result) { $new_str='id: '.$result.' '.$new_str; }
+if ($result) {
+    $new_str='id: '.$result.' '.$new_str;
+    if ($table eq 'User_auth_alias' and $dns_changed) {
+        if ($record->{'alias'}) {
+                    my $add_dns;
+                    $add_dns->{'name_type'}='CNAME';
+                    $add_dns->{'name'}=$record->{'alias'};
+                    $add_dns->{'value'}=get_dns_name($db,$result);
+                    $add_dns->{'type'}='add';
+                    $add_dns->{'auth_id'}=$record->{'auth_id'};
+                    insert_record($db,'dns_queue',$add_dns);
+                    }
+        }
+    if ($table eq 'User_auth' and $dns_changed) {
+        if ($record->{'dns_name'} and $record->{'ip'} and $dns_changed) {
+                    my $add_dns;
+                    $add_dns->{'name_type'}='A';
+                    $add_dns->{'name'}=$record->{'dns_name'};
+                    $add_dns->{'value'}=$record->{'ip'};
+                    $add_dns->{'type'}='add';
+                    $add_dns->{'auth_id'}=$record->{'auth_id'};
+                    insert_record($db,'dns_queue',$add_dns);
+                    }
+        }
+    }
 db_log_debug($db,'Add record to table '.$table.' '.$new_str);
 return $result;
 }
@@ -491,7 +597,13 @@ my $filter = shift;
 return if (!$db);
 return if (!$table);
 return if (!$filter);
+
+my $rec_id = 0;
+
 my $old_record = get_record_sql($db,"SELECT * FROM $table WHERE $filter");
+
+$rec_id = $old_record->{'id'} if ($old_record->{'id'});
+
 my $diff='';
 foreach my $field (keys %$old_record) {
     if (!$old_record->{$field}) { $old_record->{$field}=''; }
@@ -503,10 +615,31 @@ db_log_debug($db,'Delete record from table  '.$table.' value: '.$diff);
 if ($table eq 'User_auth') {
     my $sSQL = "UPDATE User_auth SET changed=1, deleted=1, changed_time='".GetNowTime()."' WHERE ".$filter;
     do_sql($db,$sSQL);
-    } else {
-    my $sSQL = "DELETE FROM ".$table." WHERE ".$filter;
-    do_sql($db,$sSQL);
+    if ($old_record->{'dns_name'} and $old_record->{'ip'}) {
+            my $del_dns;
+            $del_dns->{'name_type'}='A';
+            $del_dns->{'name'}=$old_record->{'dns_name'};
+            $del_dns->{'value'}=$old_record->{'ip'};
+            $del_dns->{'type'}='del';
+            if ($rec_id) { $del_dns->{'auth_id'}=$rec_id; }
+            insert_record($db,'dns_queue',$del_dns);
+            }
+    }
+
+if ($table eq 'User_auth_alias') {
+    if ($old_record->{'dns_name'} and $old_record->{'ip'}) {
+            my $del_dns;
+            $del_dns->{'name_type'}='CNAME';
+            $del_dns->{'name'}=$old_record->{'dns_name'};
+            $del_dns->{'value'}=$old_record->{'ip'};
+            $del_dns->{'type'}='del';
+            if ($rec_id) { $del_dns->{'auth_id'}=$rec_id; }
+            insert_record($db,'dns_queue',$del_dns);
+            }
     }
+
+my $sSQL = "DELETE FROM ".$table." WHERE ".$filter;
+return do_sql($db,$sSQL);
 }
 
 #---------------------------------------------------------------------------------------------------------------
@@ -631,135 +764,111 @@ update_record($db,'User_auth',$update_record,"id=$id");
 sub update_dns_record {
 
 my $hdb = shift;
-my $auth_record = shift;
+my $auth_id = shift;
+
+return if (!$config_ref{enable_dns_updates});
 
 #get domain
 my $ad_zone = get_option($hdb,33);
 
-#get current and old dns name
-my $fqdn_static=lc($auth_record->{dns_name});
-$fqdn_static=~s/\.$ad_zone$//i;
-$fqdn_static=~s/\.$//;
-
-my $old_fqdn_static=lc($auth_record->{old_dns_name});
-$old_fqdn_static=~s/\.$ad_zone$//i;
-$old_fqdn_static=~s/\.$//;
-
 #get dns server
 my $ad_dns = get_option($hdb,3);
 
 my $enable_ad_dns_update = ($ad_zone and $ad_dns and $config_ref{enable_dns_updates});
 
-log_debug("Auth record: ".Dumper($auth_record));
+log_debug("Auth id: ".$auth_id);
 log_debug("enable_ad_dns_update: ".$enable_ad_dns_update);
 log_debug("DNS update flags - zone: ".$ad_zone.", dns: ".$ad_dns.", enable_ad_dns_update: ".$enable_ad_dns_update);
 
-#dns update disabled?
-my $maybe_update_dns=( $enable_ad_dns_update and $office_networks->match_string($auth_record->{ip}) );
-if (!$maybe_update_dns) {
-        db_log_info($hdb,"FOUND Auth_id: $auth_record->{id}. DNS update disabled.");
-        do_sql($hdb,"UPDATE User_auth_alias SET old_alias='', dns_changed=0 WHERE auth_id=".$auth_record->{id});
-        do_sql($hdb,"DELETE FROM User_auth_alias WHERE deleted=1 AND auth_id=".$auth_record->{id});
-        do_sql($hdb,"UPDATE User_auth SET dns_changed=0 WHERE auth_id=".$auth_record->{id});
-        return 0;
-    }
+my @dns_queue = get_records_sql($hdb,"SELECT * FROM dns_queue WHERE auth_id=".$auth_id." ORDER BY id ASC");
 
-#skip update unknown domain
-if ($fqdn_static =~/\./) {
-        do_sql($hdb,"UPDATE User_auth_alias SET old_alias='', dns_changed=0 WHERE auth_id=".$auth_record->{id});
-        do_sql($hdb,"DELETE FROM User_auth_alias WHERE deleted=1 AND auth_id=".$auth_record->{id});
-        do_sql($hdb,"UPDATE User_auth SET dns_changed=0 WHERE auth_id=".$auth_record->{id});
-        return 0;
-    }
+if (!@dns_queue or !scalar @dns_queue) { return; }
 
-if (!$auth_record->{dns_name} or $auth_record->{deleted}) { 
-    #remove dns records
-    #get and remove aliases
-    my @aliases = get_records_sql($hdb,"SELECT * FROM User_auth_alias WHERE auth_id=".$auth_record->{id});
-    if (@aliases and scalar @aliases) {
-        foreach my $alias (@aliases) {
-            delete_dns_cname($fqdn_static,$alias->{alias},$ad_zone,$ad_dns,$hdb) if ($alias->{alias});
-            delete_dns_cname($fqdn_static,$alias->{old_alias},$ad_zone,$ad_dns,$hdb) if ($alias->{old_alias});
-            do_sql($hdb,"DELETE FROM User_auth_alias WHERE id=".$alias->{id});
-            }
+foreach my $dns_cmd (@dns_queue) {
+
+my $fqdn = '';
+my $fqdn_ip = '';
+my $fqdn_parent = '';
+my $static_exists = 0;
+my $static_ref = '';
+my $static_ok = 0;
+
+eval {
+
+if ($dns_cmd->{name_type}=~/^cname$/i) {
+    $fqdn=lc($dns_cmd->{name});
+    $fqdn=~s/\.$ad_zone$//i;
+    $fqdn=~s/\.$//;
+    if ($dns_cmd->{value}) {
+        $fqdn_parent=lc($dns_cmd->{value});
+        $fqdn_parent=~s/\.$ad_zone$//i;
+        $fqdn_parent=~s/\.$//;
         }
-    delete_dns_hostname($fqdn_static,$auth_record->{ip},$ad_zone,$ad_dns,$hdb) if (!$fqdn_static);
-    delete_dns_hostname($old_fqdn_static,$auth_record->{ip},$ad_zone,$ad_dns,$hdb) if (!$old_fqdn_static);
-    delete_dns_ptr($fqdn_static,$auth_record->{ip},$ad_zone,$ad_dns,$hdb);
-    do_sql($hdb,"UPDATE User_auth SET old_dns_name='', dns_changed=0 WHERE auth_id=".$auth_record->{id});
-    return 0;
-    }
+    #skip update unknown domain
+    if ($fqdn =~/\./ or $fqdn_parent =~/\./) { next; }
 
-log_debug("DNS update enabled.");
+    $fqdn = $fqdn.".".$ad_zone;
+    $fqdn_parent = $fqdn_parent.".".$ad_zone;
 
-$fqdn_static=lc($fqdn_static.'.'.$ad_zone);
-$old_fqdn_static=lc($old_fqdn_static.'.'.$ad_zone);
+    #remove cname
+    if ($dns_cmd->{type} eq 'del') {
+        delete_dns_cname($fqdn_parent,$fqdn,$ad_zone,$ad_dns,$hdb);
+        }
+    #create cname
+    if ($dns_cmd->{type} eq 'add') {
+        create_dns_cname($fqdn_parent,$fqdn,$ad_zone,$ad_dns,$hdb);
+        }
+    }
 
-db_log_info($hdb,"Update dns request for auth_id: $auth_record->{id} $fqdn_static => $auth_record->{ip}");
+if ($dns_cmd->{name_type}=~/^a$/i) {
+    $fqdn=lc($dns_cmd->{name});
+    $fqdn=~s/\.$ad_zone$//i;
+    $fqdn=~s/\.$//;
 
-#check exists static dns name
-my $static_exists = 0;
-my $static_ok = 0;
-my $static_ref = '';
+    if (!$dns_cmd->{value}) { next; }
+    $fqdn_ip=lc($dns_cmd->{value});
+    #skip update unknown domain
+    if ($fqdn =~/\./) { next; }
 
-my @dns_record=ResolveNames($fqdn_static,$dns_server);
-$static_exists = (scalar @dns_record>0);
-if ($static_exists) {
-        $static_ref = join(' ',@dns_record);
-        foreach my $dns_a (@dns_record) {
-            if ($dns_a=~/^$auth_record->{ip}$/) { $static_ok = 1; }
-            }
+    $fqdn = $fqdn.".".$ad_zone;
+
+    #dns update disabled?
+    my $maybe_update_dns=( $enable_ad_dns_update and $office_networks->match_string($fqdn_ip) );
+    if (!$maybe_update_dns) {
+        db_log_info($hdb,"FOUND Auth_id: $auth_id. DNS update disabled.");
+        next;
         }
 
-db_log_debug($hdb,"Dns record for static record $fqdn_static: $static_ok");
+    #remove A & PTR
+    if ($dns_cmd->{type} eq 'del') {
+        delete_dns_hostname($fqdn,$fqdn_ip,$ad_zone,$ad_dns,$hdb);
+        delete_dns_ptr($fqdn,$fqdn_ip,$ad_zone,$ad_dns,$hdb);
+        }
 
-if (!$static_ok) {
-        if (!$static_exists) {
-                db_log_info($hdb,"Static dns hostname defined but not found. Create it ($fqdn_static => $auth_record->{ip})!");
-                } else {
-                db_log_warning($hdb,"Static record mismatch! Expected $fqdn_static => $auth_record->{ip}, recivied: $static_ref");
-                }
-        delete_dns_hostname($old_fqdn_static,$auth_record->{ip},$ad_zone,$ad_dns,$hdb) if ($old_fqdn_static);
-        #get and remove aliases
-        my @aliases = get_records_sql($hdb,"SELECT * FROM User_auth_alias WHERE auth_id=".$auth_record->{id});
-        if (@aliases and scalar @aliases) {
-            foreach my $alias (@aliases) {
-                delete_dns_cname($fqdn_static,$alias->{alias},$ad_zone,$ad_dns,$hdb) if ($alias->{alias});
-                delete_dns_cname($fqdn_static,$alias->{old_alias},$ad_zone,$ad_dns,$hdb) if ($alias->{old_alias});
-                if ($alias->{deleted}) {
-                    do_sql($hdb,"DELETE FROM User_auth_alias WHERE id=".$alias->{id});
-                    }
-                }
-            }
-        update_dns_hostname($fqdn_static,$auth_record->{ip},$ad_zone,$ad_dns,$hdb);
-        update_dns_ptr($fqdn_static,$auth_record->{ip},$ad_zone,$ad_dns,$hdb);
-        do_sql($hdb,"UPDATE User_auth SET old_dns_name='', dns_changed=0 WHERE auth_id=".$auth_record->{id});
-        #get and remove aliases
-        my @aliases = get_records_sql($hdb,"SELECT * FROM User_auth_alias WHERE auth_id=".$auth_record->{id});
-        if (@aliases and scalar @aliases) {
-            foreach my $alias (@aliases) {
-                update_dns_cname($fqdn_static,$alias->{alias},$ad_zone,$ad_dns,$hdb) if ($alias->{alias});
-                do_sql($hdb,"UPDATE User_auth_alias SET old_alias='', dns_changed=0 WHERE id=".$alias->{id});
+    #create A & PTR
+    if ($dns_cmd->{type} eq 'add') {
+        my @dns_record=ResolveNames($fqdn,$dns_server);
+        $static_exists = (scalar @dns_record>0);
+        if ($static_exists) {
+            $static_ref = join(' ',@dns_record);
+            foreach my $dns_a (@dns_record) {
+                if ($dns_a=~/^$fqdn_ip$/) { $static_ok = 1; }
                 }
+            db_log_debug($hdb,"Dns record for static record $fqdn: $static_ref");
             }
-        } else {
-	db_log_debug($hdb,"Static record for $fqdn_static [$static_ok] correct. Checking aliases");
-        #get aliases
-        my @aliases = get_records_sql($hdb,"SELECT * FROM User_auth_alias WHERE dns_changed=1 AND auth_id=".$auth_record->{id});
-        if (@aliases and scalar @aliases) {
-            foreach my $alias (@aliases) {
-                if ($alias->{deleted}) {
-                    delete_dns_cname($fqdn_static,$alias->{alias},$ad_zone,$ad_dns,$hdb) if ($alias->{alias});
-                    delete_dns_cname($fqdn_static,$alias->{old_alias},$ad_zone,$ad_dns,$hdb) if ($alias->{old_alias});
-                    do_sql($hdb,"DELETE FROM User_auth_alias WHERE id=".$alias->{id});
-                    } else {
-                    delete_dns_cname($fqdn_static,$alias->{old_alias},$ad_zone,$ad_dns,$hdb) if ($alias->{old_alias});
-                    update_dns_cname($fqdn_static,$alias->{alias},$ad_zone,$ad_dns,$hdb) if ($alias->{alias});
-                    do_sql($hdb,"UPDATE User_auth_alias SET old_alias='', dns_changed=0 WHERE id=".$alias->{id});
-                    }
-                }
+        #skip update if already exists
+        if ($static_ok) {
+            db_log_debug($hdb,"Static record for $fqdn [$static_ok] correct.");
+            next;
             }
+        create_dns_hostname($fqdn,$fqdn_ip,$ad_zone,$ad_dns,$hdb);
+        create_dns_ptr($fqdn,$fqdn_ip,$ad_zone,$ad_dns,$hdb);
         }
+    }
+};
+if ($@) { log_error("Error dns commands: $@"); }
+}
+
 }
 
 #---------------------------------------------------------------------------------------------------------------
@@ -770,6 +879,8 @@ my $hdb = shift;
 my $dhcp_record = shift;
 my $auth_record = shift;
 
+return if (!$config_ref{enable_dns_updates});
+
 my $ad_zone = get_option($hdb,33);
 my $ad_dns = get_option($hdb,3);
 
@@ -845,7 +956,7 @@ if ($fqdn_static ne '') {
         db_log_info($hdb,"Static record mismatch! Expected $fqdn_static => $dhcp_record->{ip}, recivied: $static_ref");
         if (!$static_exists) {
                 db_log_info($hdb,"Static dns hostname defined but not found. Create it ($fqdn_static => $dhcp_record->{ip})!");
-                update_dns_hostname($fqdn_static,$dhcp_record->{ip},$ad_zone,$ad_dns,$hdb);
+                create_dns_hostname($fqdn_static,$dhcp_record->{ip},$ad_zone,$ad_dns,$hdb);
                 }
         } else {
 	db_log_debug($hdb,"Static record for $fqdn_static [$static_ok] correct.");
@@ -874,19 +985,23 @@ if ($fqdn ne '' and !$dynamic_ok) {
             if ($fqdn_static and $fqdn_static ne '') {
                     if ($fqdn_static!~/$fqdn/) {
                         db_log_info($hdb,"Hostname from dhcp request $fqdn differs from static dns hostanme $fqdn_static. Ignore dynamic binding!");
-#                        update_dns_hostname($fqdn,$dhcp_record->{ip},$ad_zone,$ad_dns,$hdb);
+#                        delete_dns_hostname($fqdn,$dhcp_record->{ip},$ad_zone,$ad_dns,$hdb);
+#                        create_dns_hostname($fqdn,$dhcp_record->{ip},$ad_zone,$ad_dns,$hdb);
                         }
                     } else {
-        	    db_log_info($hdb,"Static dns hostname not defined. Create dns record by dhcp request. $fqdn => $dhcp_record->{ip}");
-        	    update_dns_hostname($fqdn,$dhcp_record->{ip},$ad_zone,$ad_dns,$hdb);
-        	    db_log_info($hdb,"Clear aliases if exists for $fqdn => $dhcp_record->{ip}");
+        	    db_log_info($hdb,"Rewrite aliases if exists for $fqdn => $dhcp_record->{ip}");
                     #get and remove aliases
                     my @aliases = get_records_sql($hdb,"SELECT * FROM User_auth_alias WHERE auth_id=".$auth_record->{id});
                     if (@aliases and scalar @aliases) {
                             foreach my $alias (@aliases) {
                                 delete_dns_cname($fqdn_static,$alias->{alias},$ad_zone,$ad_dns,$hdb) if ($alias->{alias});
-                                delete_dns_cname($fqdn_static,$alias->{old_alias},$ad_zone,$ad_dns,$hdb) if ($alias->{old_alias});
-                                do_sql($hdb,"DELETE FROM User_auth_alias WHERE id=".$alias->{id});
+                            }
+                        }
+        	    db_log_info($hdb,"Static dns hostname not defined. Create dns record by dhcp request. $fqdn => $dhcp_record->{ip}");
+        	    update_dns_hostname($fqdn,$dhcp_record->{ip},$ad_zone,$ad_dns,$hdb);
+                    if (@aliases and scalar @aliases) {
+                            foreach my $alias (@aliases) {
+                                create_dns_cname($fqdn_static,$alias->{alias},$ad_zone,$ad_dns,$hdb) if ($alias->{alias});
                             }
                         }
         	    }
@@ -943,7 +1058,7 @@ sub unset_lock_discovery {
 
 #------------------------------------------------------------------------------------------------------------
 
-sub update_dns_cname {
+sub create_dns_cname {
 my $fqdn = shift;
 my $alias = shift;
 my $zone = shift;
@@ -962,7 +1077,6 @@ if ($config_ref{dns_server_type}=~/windows/i) {
     push(@add_dns,"gsstsig");
     push(@add_dns,"server $server");
     push(@add_dns,"zone $zone");
-    push(@add_dns,"update delete $alias cname");
     push(@add_dns,"update add $alias 3600 cname $fqdn.");
     push(@add_dns,"send");
     write_to_file($nsupdate_file,\@add_dns);
@@ -972,7 +1086,6 @@ if ($config_ref{dns_server_type}=~/windows/i) {
 if ($config_ref{dns_server_type}=~/bind/i) {
     push(@add_dns,"server $server");
     push(@add_dns,"zone $zone");
-    push(@add_dns,"update delete $alias cname");
     push(@add_dns,"update add $alias 3600 cname $fqdn.");
     push(@add_dns,"send");
     write_to_file($nsupdate_file,\@add_dns);
@@ -1022,7 +1135,7 @@ if (-e "$nsupdate_file") { unlink "$nsupdate_file"; }
 
 #------------------------------------------------------------------------------------------------------------
 
-sub update_dns_hostname {
+sub create_dns_hostname {
 my $fqdn = shift;
 my $ip = shift;
 my $zone = shift;
@@ -1042,7 +1155,6 @@ if ($config_ref{dns_server_type}=~/windows/i) {
     push(@add_dns,"gsstsig");
     push(@add_dns,"server $server");
     push(@add_dns,"zone $zone");
-    push(@add_dns,"update delete $fqdn A");
     push(@add_dns,"update add $fqdn 3600 A $ip");
     push(@add_dns,"send");
     write_to_file($nsupdate_file,\@add_dns);
@@ -1052,7 +1164,6 @@ if ($config_ref{dns_server_type}=~/windows/i) {
 if ($config_ref{dns_server_type}=~/bind/i) {
     push(@add_dns,"server $server");
     push(@add_dns,"zone $zone");
-    push(@add_dns,"update delete $fqdn A");
     push(@add_dns,"update add $fqdn 3600 A $ip");
     push(@add_dns,"send");
     write_to_file($nsupdate_file,\@add_dns);
@@ -1104,13 +1215,16 @@ if (-e "$nsupdate_file") { unlink "$nsupdate_file"; }
 
 #---------------------------------------------------------------------------------------------------------------
 
-sub update_dns_ptr {
+sub create_dns_ptr {
 my $fqdn = shift;
 my $ip = shift;
+my $ad_zone = shift;
 my $server = shift;
 my $db = shift;
+
 my $radr;
 my $zone;
+
 #skip update domain controllers
 if ($fqdn=~/^dc[0-9]{1,2}\./i) { return; }
 if ($ip =~ /([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})(\/[0-9]{1,2}){0,1}/) {
@@ -1118,20 +1232,21 @@ if ($ip =~ /([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})(\/[0-9]{1,2})
     $radr = "$4.$3.$2.$1.in-addr.arpa";
     $zone = "$3.$2.$1.in-addr.arpa";
     }
+
 if (!$radr or !$zone) { return 0; }
-if (!$db) { 
-    log_info("DNS-UPDATE: Zone $zone Server: $server A: $fqdn PTR: $ip"); 
-    } else {
-    db_log_info($db,"DNS-UPDATE: Zone $zone Server: $server A: $fqdn PTR: $ip");
-    }
-my $ad_zone = get_option($db,33);
+
+if (!$db) { return 0; }
+
+db_log_info($db,"DNS-UPDATE: Zone $zone Server: $server A: $fqdn PTR: $ip");
+
 my $nsupdate_file = "/tmp/".$radr."-nsupdate";
+
 my @add_dns;
+
 if ($config_ref{dns_server_type}=~/windows/i) {
     push(@add_dns,"gsstsig");
     push(@add_dns,"server $server");
     push(@add_dns,"zone $zone");
-    push(@add_dns,"update delete $radr PTR");
     push(@add_dns,"update add $radr 3600 PTR $fqdn.");
     push(@add_dns,"send");
     write_to_file($nsupdate_file,\@add_dns);
@@ -1142,7 +1257,6 @@ if ($config_ref{dns_server_type}=~/windows/i) {
 if ($config_ref{dns_server_type}=~/bind/i) {
     push(@add_dns,"server $server");
     push(@add_dns,"zone $zone");
-    push(@add_dns,"update delete $radr PTR");
     push(@add_dns,"update add $radr 3600 PTR $fqdn.");
     push(@add_dns,"send");
     write_to_file($nsupdate_file,\@add_dns);
@@ -1158,10 +1272,13 @@ if (-e "$nsupdate_file") { unlink "$nsupdate_file"; }
 sub delete_dns_ptr {
 my $fqdn = shift;
 my $ip = shift;
+my $ad_zone = shift;
 my $server = shift;
 my $db = shift;
+
 my $radr;
 my $zone;
+
 #skip update domain controllers
 if ($fqdn=~/^dc[0-9]{1,2}\./i) { return; }
 if ($ip =~ /([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})(\/[0-9]{1,2}){0,1}/) {
@@ -1170,14 +1287,15 @@ if ($ip =~ /([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})(\/[0-9]{1,2})
     $zone = "$3.$2.$1.in-addr.arpa";
     }
 if (!$radr or !$zone) { return 0; }
-if (!$db) { 
-    log_info("DNS-UPDATE: Delete => Zone $zone Server: $server A: $fqdn PTR: $ip"); 
-    } else {
-    db_log_info($db,"DNS-UPDATE: Delete => Zone $zone Server: $server A: $fqdn PTR: $ip");
-    }
-my $ad_zone = get_option($db,33);
+
+if (!$db) { return 0 ; }
+
+db_log_info($db,"DNS-UPDATE: Delete => Zone $zone Server: $server A: $fqdn PTR: $ip");
+
 my $nsupdate_file = "/tmp/".$radr."-nsupdate";
+
 my @add_dns;
+
 if ($config_ref{dns_server_type}=~/windows/i) {
     push(@add_dns,"gsstsig");
     push(@add_dns,"server $server");

+ 7 - 17
scripts/stat-sync.pl

@@ -91,13 +91,13 @@ if (!$pid) {
 	    #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);
-	    do_sql($hdb,"UPDATE User_auth SET dns_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 OR dhcp_changed = 1 OR dns_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, dhcp_changed = 0, dns_changed = 0  WHERE id=".$row->{id});
+		    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) {
@@ -109,22 +109,12 @@ if (!$pid) {
 	        }
 
             #dns changed records
-            my @dns_changed = get_records_sql($hdb,"SELECT id,dns_name,ip,old_dns_name,deleted from User_auth WHERE dns_changed=1");
-            if (@dns_changed and scalar @dns_changed) {
-                    foreach my $auth (@dns_changed) {
-                        update_dns_record($hdb,$auth);
-        	        do_sql($hdb,"UPDATE User_auth SET dns_changed=0 WHERE id=".$auth->{id});
-                        log_info("Clear changed dns for auth id: ".$auth->{id});
-                    }
-	        }
-
-            #dns changed alias records
-            @dns_changed = get_records_sql($hdb,"SELECT id,dns_name,ip,old_dns_name,deleted FROM User_auth WHERE User_auth.id IN (SELECT auth_id FROM User_auth_alias WHERE dns_changed=1);");
+            my @dns_changed = get_records_sql($hdb,"SELECT auth_id FROM `dns_queue` GROUP BY auth_id");
             if (@dns_changed and scalar @dns_changed) {
                     foreach my $auth (@dns_changed) {
-                        update_dns_record($hdb,$auth);
-        	        do_sql($hdb,"UPDATE User_auth SET dns_changed=0 WHERE id=".$auth->{id});
-                        log_info("Clear changed dns for auth id: ".$auth->{id});
+                        update_dns_record($hdb,$auth->{auth_id});
+                        log_info("Clear changed dns for auth id: ".$auth->{auth_id});
+                        do_sql($hdb,"DELETE FROM `dns_queue` WHERE auth_id=".$auth->{auth_id});
                     }
 	        }
 

+ 1 - 0
updates/2-4-14/dns_queue.sql

@@ -0,0 +1 @@
+CREATE TABLE `dns_queue` ( `id` INT NOT NULL AUTO_INCREMENT , `auth_id` INT NULL DEFAULT NULL , `name_type` VARCHAR(10) NOT NULL DEFAULT 'A' , `name` VARCHAR(200) NULL DEFAULT NULL , `type` VARCHAR(10) NOT NULL DEFAULT 'add' , `ip` VARCHAR(16) NULL DEFAULT NULL , PRIMARY KEY (`id`)) ENGINE = InnoDB;

+ 1 - 3
updates/2-4-14/user_auth.sql

@@ -1,4 +1,2 @@
-ALTER TABLE `User_auth` ADD `dns_changed` INT NOT NULL DEFAULT '0' AFTER `dhcp_changed`;
 ALTER TABLE `User_auth` CHANGE `dhcp_changed` `dhcp_changed` INT(11) NOT NULL DEFAULT '0';
-ALTER TABLE `User_auth` ADD `old_dns_name` VARCHAR(100) NULL DEFAULT NULL AFTER `dns_name`;
-ALTER TABLE `User_auth` CHANGE `dns_name` `dns_name` VARCHAR(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL;
+ALTER TABLE `User_auth` CHANGE `dns_name` `dns_name` VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL;

+ 0 - 3
updates/2-4-14/user_auth_alias.sql

@@ -1,3 +0,0 @@
-ALTER TABLE `User_auth_alias` ADD `dns_changed` INT NOT NULL DEFAULT '0' AFTER `timestamp`;
-ALTER TABLE `User_auth_alias` ADD `old_alias` VARCHAR(100) NULL DEFAULT NULL AFTER `alias`;
-ALTER TABLE `User_auth_alias` ADD `deleted` INT NOT NULL DEFAULT '0' AFTER `changed`;