Browse Source

last fixes

root 2 năm trước cách đây
mục cha
commit
21a49b10f9

+ 0 - 31
docs/addons/print-dns-commands.pl

@@ -1,31 +0,0 @@
-#!/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 eyelib::config;
-use eyelib::main;
-use eyelib::mysql;
-use eyelib::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;

+ 0 - 31
docs/addons/print_dns_commands.pl

@@ -1,31 +0,0 @@
-#!/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 eyelib::config;
-use eyelib::main;
-use eyelib::mysql;
-use eyelib::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;

+ 2 - 35
docs/addons/set_dns_record.pl

@@ -22,41 +22,8 @@ use eyelib::net_utils;
 use File::Basename;
 use File::Path;
 
-my $h_name = $ARGV[0];
-my $ip = $ARGV[1];
+my $auth_id = $ARGV[0];
 
-my $reverse = $ARGV[2] || '0';
-
-exit if (!$h_name and !$ip);
-
-my $ad_zone = get_option($dbh,33);
-my $ad_dns = get_option($dbh,3);
-
-my $subnets_dhcp = get_subnets_ref($dbh);
-my $enable_ad_dns_update = ($ad_zone and $ad_dns);
-
-my $subnet = GetSubNet($ip);
-
-log_debug("Subnet: $subnet");
-log_debug("DNS update flags - zone: $ad_zone dns: $ad_dns config: $update_hostname_from_dhcp subnet: $subnets_dhcp->{$subnet}->{dhcp_update_hostname}");
-
-#update dns block
-my $fqdn;
-if ($h_name) {
-    $fqdn=lc($h_name);
-    $fqdn=~s/_/-/g;
-    if ($fqdn!~/$ad_zone$/i) {
-            $fqdn=~s/\.$//;
-            $fqdn=lc($fqdn.'.'.$ad_zone);
-            }
-    }
-
-db_log_info($dbh,"Manual create dns record $fqdn");
-update_dns_hostname($fqdn,$ip,$ad_zone,$ad_dns,$dbh);
-
-if ($reverse) {
-    db_log_info($dbh,"Manual create dns ptr-record $fqdn => $ip");
-    update_dns_ptr($fqdn,$ip,$ad_dns,$dbh);
-    }
+update_dns_record($dbh,$auth->{auth_id});
 
 exit;

+ 23 - 17
docs/bind/print-dns-zones.pl

@@ -21,11 +21,14 @@ my $named_root='';
 my $named_db_fullpath=$named_root.'/etc/bind/masters';
 my $named_db_path='/etc/bind/masters';
 
-my $ns1 = 'ns1';
-
 my $DNS1=$config_ref{dns_server};
 
-exit if ($config_ref{dns_server_type!='bind');
+my $dns_server_record = get_record_sql($dbh,"SELECT id,ip,dns_name FROM User_auth WHERE deleted=0 AND ip='".$DNS1."'");
+
+my $ns1 = 'ns1';
+if ($dns_server_record and $dns_server_record->{dns_name}) { $ns1=$dns_server_record->{dns_name}; }
+
+#exit if ($config_ref{dns_server_type!='bind');
 
 my $named_conf=$named_root.'/etc/bind/named.dynamic';
 
@@ -34,7 +37,7 @@ my @authlist_ref = get_records_sql($dbh,"SELECT id,ip,dns_name FROM User_auth WH
 
 my %zones;
 
-$zones{$domain_name}{$ns1}=$dns_server;
+$zones{$domain_name}->{A}->{$ns1}=$DNS1;
 
 foreach my $row (@authlist_ref) {
 next if (!$row);
@@ -50,12 +53,12 @@ $default_name=~s/\./-/g;
 if ($dns_name) {
     $default_name=$dns_name;
     $default_name =~s/$domain_name$//g;
-    $default_name =~s/\.$/-/g;
+    $default_name =~s/\.$//g;
     $default_name =~s/_/-/g;
-    $default_name =~s/[.]/-/g;
+    $default_name =~s/[\.]/-/g;
     $default_name =~s/ /-/g;
     $default_name =~s/-$//g;
-    $zones{$domain_name}{$default_name}=$ip;
+    $zones{$domain_name}{A}{$default_name}=$ip;
     }
 
 my @dns_names=get_records_sql($dbh,"SELECT * FROM User_auth_alias WHERE auth_id=$row->{id} ORDER BY alias");
@@ -67,13 +70,13 @@ foreach my $alias (@dns_names) {
         $dns =~s/[.]/-/g;
         $dns =~s/ /-/g;
         $dns =~s/-$//g;
-        $zones{$domain_name}{$dns}=$ip;
+        $zones{$domain_name}{CNAME}{$dns}=$default_name;
         }
 
 if ($ip=~/([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\.([0-9]{1,3})/) {
     my $zone_name=$1;
     my $ip_in_zone=$2;
-    $zones{$zone_name}{$ip_in_zone}=$default_name;
+    $zones{$zone_name}{PTR}{$ip_in_zone}=$default_name;
     }
 }
 
@@ -95,8 +98,6 @@ my $zone_name=$ZONE;
 
 if ($ZONE!~/$domain_name/) {
     $reverse=1;
-    #skip reverse dns zone
-    next;
     if ($ZONE=~/([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})/) {
         $zone_name=$3.".".$2.".".$1.".in-addr.arpa";
         } else {
@@ -118,14 +119,14 @@ flock(F1,2);
 
 print F1  "\$ORIGIN .\n";
 print F1  "\$TTL 3600\t; 1 hour\n";
-print F1  "$zone_name\t\t\t\tIN SOA\t\t$DNS1. root.$DNS1. (\n";
+print F1  "$zone_name\t\tIN SOA\t\t".$ns1.".".$domain_name.". root.".$ns1.".".$domain_name.". (\n";
 printf F1 "\t\t\t\t%04d%02d%02d%02d ; serial\n",$year,$mon,$mday,$hour;
 print F1  "\t\t\t\t900\t; refresh (15 minutes)\n";
 print F1  "\t\t\t\t600\t; retry (10 minutes)\n";
 print F1  "\t\t\t\t86400\t; expire (1 day)\n";
 print F1  "\t\t\t\t3600\t; minimum (1 hour)\n";
 print F1  "\t\t\t\t)\n";
-print F1  "\t\t\t\tNS\t $DNS1.\n";
+print F1  "\t\t\t\tNS\t $DNS1\n";
 if ($dns_server) {
 print F1  "\t\t\t\tA\t $dns_server\n";
 }
@@ -134,14 +135,19 @@ print F1  "\$TTL 3600\t; 1 hour\n";
 print F1  "; host list\n";
 print F1  "\$ORIGIN $zone_name.\n";
 
-foreach my $record (sort keys %{$zones{$ZONE}}) {
 if ($reverse) {
-    print  F1 "$record\t\t\tIN\tPTR\t$zones{$ZONE}->{$record}.$domain_name.\n";
+    foreach my $record (sort keys %{$zones{$ZONE}->{PTR}}) {
+        print  F1 "$record\t\t\tIN\tPTR\t$zones{$ZONE}->{PTR}->{$record}.$domain_name.\n";
+        }
     } else {
-    print  F1 "$record\t\t\t\tA\t$zones{$ZONE}->{$record}\n";
+    foreach my $record (sort keys %{$zones{$ZONE}->{A}}) {
+        print  F1 "$record\t\t\t\tA\t$zones{$ZONE}->{A}->{$record}\n";
+        };
+    foreach my $record (sort keys %{$zones{$ZONE}->{CNAME}}) {
+        print  F1 "$record\t\t\t\tCNAME\t$zones{$ZONE}->{CNAME}->{$record}.$domain_name.\n";
+        };
     }
 }
-}
 
 close(F1);
 close(F2);

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

@@ -9,6 +9,13 @@ $msg_error = "";
 $sSQL = "SELECT * FROM User_auth WHERE id=$id";
 $auth_info = get_record_sql($db_link, $sSQL);
 
+if (empty($auth_info['dns_name']) or $auth_info['deleted']) {
+    header("Location: /admin/users/editauth.php?id=".$id);
+    exit;
+    }
+
+run_sql($db_link,"DELETE FROM User_auth_alias WHERE auth_id in (SELECT id FROM User_auth WHERE deleted=1)");
+
 if (isset($_POST["s_remove"])) {
     $s_id = $_POST["s_id"];
     foreach ($s_id as $key => $val) {
@@ -23,12 +30,21 @@ if (isset($_POST["s_remove"])) {
 
 if (isset($_POST['s_save'])) {
     $len = is_array($_POST['s_save']) ? count($_POST['s_save']) : 0;
+    $domain_zone = get_option($db_link, 33);
     for ($i = 0; $i < $len; $i ++) {
         $save_id = intval($_POST['s_save'][$i]);
         $len_all = is_array($_POST['n_id']) ? count($_POST['n_id']) : 0;
         for ($j = 0; $j < $len_all; $j ++) {
             if (intval($_POST['n_id'][$j]) != $save_id) { continue; }
-            $new['alias'] = trim($_POST['s_alias'][$j]);
+            $f_dnsname = trim($_POST['s_alias'][$j]);
+            if (!empty($f_dnsname)) {
+                $f_dnsname = preg_replace('/'.$domain_zone.'/','',$f_dnsname);
+                $f_dnsname = preg_replace('/\.$/','',$f_dnsname);
+                $f_dnsname = preg_replace('/\s+/','-',$f_dnsname);
+                $f_dnsname = preg_replace('/\./','-',$f_dnsname);
+                }
+            if (empty($f_dnsname) or !checkValidHostname($f_dnsname) or !checkUniqHostname($db_link,$id,$f_dnsname)) { continue; }
+            $new['alias'] = $f_dnsname;
             $new['description'] = trim($_POST['s_comment'][$j]);
             update_record($db_link, "User_auth_alias", "id='{$save_id}'", $new);
         }
@@ -40,7 +56,26 @@ if (isset($_POST['s_save'])) {
 if (isset($_POST["s_create"])) {
     $new_alias = $_POST["s_create_alias"];
     if (isset($new_alias)) {
-        $new_rec['alias'] = trim($new_alias);
+        $f_dnsname = trim($new_alias);
+        if (!empty($f_dnsname)) {
+            $domain_zone = get_option($db_link, 33);
+            $f_dnsname = preg_replace('/'.$domain_zone.'/','',$f_dnsname);
+            $f_dnsname = preg_replace('/\.$/','',$f_dnsname);
+            $f_dnsname = preg_replace('/\s+/','-',$f_dnsname);
+            $f_dnsname = preg_replace('/\./','-',$f_dnsname);
+            }
+
+        if (empty($f_dnsname) or !checkValidHostname($f_dnsname) or !checkUniqHostname($db_link,$id,$f_dnsname)) {
+            $msg_error = "DNS $f_dnsname already exists at: ".searchHostname($db_link,$id,$f_dnsname)." Discard changes!";
+            $_SESSION[$page_url]['msg'] = $msg_error;
+            LOG_ERROR($db_link, $msg_error);
+            header("Location: " . $_SERVER["REQUEST_URI"]);
+            exit;
+        }
+
+        if (empty($f_dnsname)) { $f_dnsname = ''; }
+
+        $new_rec['alias'] = $f_dnsname;
         $new_rec['auth_id'] = $id;
         LOG_INFO($db_link, "Create new alias $new_alias");
         insert_record($db_link, "User_auth_alias", $new_rec);
@@ -54,6 +89,14 @@ require_once ($_SERVER['DOCUMENT_ROOT']."/inc/header.php");
 
 ?>
 <div id="cont">
+
+<?php
+    if (!empty($_SESSION[$page_url]['msg'])) {
+        print '<div id="msg">' . $_SESSION[$page_url]['msg'] . '</div>';
+        unset($_SESSION[$page_url]['msg']);
+    }
+?>
+
 <br>
 <form name="def" action="edit_alias.php?id=<?php echo $id; ?>" method="post">
 <b><?php print WEB_user_alias_for."&nbsp"; print_url($auth_info['ip'],"/admin/users/editauth.php?id=$id"); ?></b> <br>

+ 34 - 4
html/admin/users/editauth.php

@@ -50,16 +50,29 @@ if (isset($_POST["editauth"]) and !$old_auth_info['deleted']) {
         $new['ip_int'] = $ip_aton;
         $new['mac'] = mac_dotted($_POST["f_mac"]);
         $new['comments'] = $_POST["f_comments"];
-        //        $new['firmware'] = $_POST["f_firmware"];
         $new['WikiName'] = $_POST["f_wiki"];
         $f_dnsname = trim($_POST["f_dns_name"]);
-        //        if (!empty($f_dnsname) and checkValidHostname($f_dnsname) and checkUniqHostname($db_link,$id,$f_dnsname)) { $new['dns_name'] = $f_dnsname; }
-        if (!empty($f_dnsname) and checkValidHostname($f_dnsname)) {
+        if (!empty($f_dnsname)) {
+            $domain_zone = get_option($db_link, 33);
+            $f_dnsname = preg_replace('/'.$domain_zone.'/','',$f_dnsname);
+            $f_dnsname = preg_replace('/\.$/','',$f_dnsname);
+            $f_dnsname = preg_replace('/\s+/','-',$f_dnsname);
+            $f_dnsname = preg_replace('/\./','-',$f_dnsname);
+            }
+
+        if (!empty($f_dnsname) and checkValidHostname($f_dnsname) and checkUniqHostname($db_link,$id,$f_dnsname)) {
             $new['dns_name'] = $f_dnsname;
+        } else {
+            $msg_error = "DNS $f_dnsname already exists at: ".searchHostname($db_link,$id,$f_dnsname)." Discard changes!";
+            $_SESSION[$page_url]['msg'] = $msg_error;
+            LOG_ERROR($db_link, $msg_error);
+            header("Location: " . $_SERVER["REQUEST_URI"]);
+            exit;
         }
         if (empty($f_dnsname)) {
             $new['dns_name'] = '';
         }
+
         $new['save_traf'] = $_POST["f_save_traf"] * 1;
         $new['dhcp_acl'] = trim($_POST["f_acl"]);
         if (get_const('default_user_ou_id') == $parent_ou_id or get_const('default_hotspot_ou_id') == $parent_ou_id) {
@@ -155,6 +168,19 @@ if (isset($_POST["recovery"]) and $old_auth_info['deleted']) {
         }
         $new['deleted'] = 0;
 
+        $f_dnsname = trim($_POST["f_dns_name"]);
+        if (!empty($f_dnsname)) {
+            $domain_zone = get_option($db_link, 33);
+            $f_dnsname = preg_replace('/'.$domain_zone.'/','',$f_dnsname);
+            $f_dnsname = preg_replace('/\.$/','',$f_dnsname);
+            $f_dnsname = preg_replace('/\s+/','-',$f_dnsname);
+            $f_dnsname = preg_replace('/\./','-',$f_dnsname);
+            }
+
+        if (!empty($f_dnsname) and checkValidHostname($f_dnsname) and checkUniqHostname($db_link,$id,$f_dnsname)) {
+            $new['dns_name'] = $f_dnsname;
+            } else { $new['dns_name']=''; }
+
         $parent_id = $old_auth_info['user_id'];
 
         $old_parent = get_record_sql($db_link, "SELECT * FROM User_list WHERE id=".$parent_id);
@@ -229,13 +255,17 @@ if ($auth_info['last_found'] == '0000-00-00 00:00:00') {
         unset($_SESSION[$page_url]['msg']);
     }
     print "<b>" . WEB_user_title . "&nbsp<a href=/admin/users/edituser.php?id=" . $auth_info['user_id'] . ">" . $parent_name . "</a> </b>";
+
+    $alias_link = '';
+    if (!empty($auth_info['dns_name'])) { $alias_link="/admin/users/edit_alias.php?id=".$id; }
+
     ?>
     <form name="def" action="editauth.php?id=<?php echo $id; ?>" method="post">
         <input type="hidden" name="id" value=<?php echo $id; ?>>
         <table class="data">
             <tr>
                 <td width=200><?php print WEB_cell_dns_name . " &nbsp | &nbsp ";
-                                print_url("Альясы", "/admin/users/edit_alias.php?id=$id"); ?></td>
+                                print_url(WEB_cell_aliases, $alias_link); ?></td>
                 <td width=200><?php print WEB_cell_comment; ?></td>
                 <td width=70><?php print WEB_cell_enabled; ?></td>
                 <td><?php print WEB_cell_traf; ?></td>

+ 41 - 4
html/inc/common.php

@@ -177,12 +177,49 @@ function checkValidHostname($dnsname)
     return $result;
 }
 
-function checkUniqHostname($db, $id, $hostname)
+function searchHostname($db, $id, $hostname) 
 {
-    $count = get_count_records($db, 'User_auth', 'deleted=0 and id !="' . $id . '" and dns_name ="' . mysqli_real_escape_string($db, $hostname) . '"');
-    if ($count > 0) {
-        return FALSE;
+    $result = '';
+    $domain_zone = get_option($db, 33);
+
+    $a_search_filter = 'SELECT * FROM User_auth WHERE deleted=0 and id !="' . $id . '" and (dns_name ="' . mysqli_real_escape_string($db, $hostname) . '" or dns_name ="' . mysqli_real_escape_string($db, $hostname.'.'.$domain_zone) . '")';
+#    LOG_DEBUG($db, "A search-filter: ".$a_search_filter);
+    $a_records = get_records_sql($db, $a_search_filter);
+    foreach ($a_records as $a_rec) {
+        $result.='auth_id:'.$a_rec['id'].' ip: '.$a_rec['ip'].'; ';
     }
+    if (!empty($result)) { $result = 'A-record: '.$result; }
+
+    $result_cname = '';
+    $cname_search_filter = 'SELECT * FROM User_auth_alias WHERE auth_id !="' . $id . '" and (alias ="' . mysqli_real_escape_string($db, $hostname) . '" or alias ="' . mysqli_real_escape_string($db, $hostname.'.'.$domain_zone) . '")';
+#    LOG_DEBUG($db, "CNAME search-filter: ".$cname_search_filter);
+    $a_records = get_records_sql($db, $cname_search_filter);
+    foreach ($a_records as $a_rec) {
+        $result_cname.='auth_id:'.$a_rec['auth_id'].';';
+    }
+    if (!empty($result_cname)) { $result_cname = 'CNAME-record: '. $result_cname; }
+
+    $result = trim($result.' '.$result_cname);
+    return $result;
+}
+
+function checkUniqHostname($db, $id, $hostname)
+{
+    $domain_zone = get_option($db, 33);
+
+    $check_A_filter = 'deleted=0 and id !="' . $id . '" and (dns_name ="' . mysqli_real_escape_string($db, $hostname) . '" or dns_name ="' . mysqli_real_escape_string($db, $hostname.'.'.$domain_zone) . '")';
+#    LOG_DEBUG($db, "CNAME filter: ".$check_A_filter);
+
+    $count = get_count_records($db, 'User_auth', $check_A_filter);
+    if ($count > 0) { return FALSE; }
+
+    $check_CNAME_filter = 'auth_id !="' . $id . '" and (alias ="' . mysqli_real_escape_string($db, $hostname) . '" or alias ="' . mysqli_real_escape_string($db, $hostname.'.'.$domain_zone) . '")';
+
+#    LOG_DEBUG($db, "CNAME filter: ".$check_CNAME_filter);
+
+    $count = get_count_records($db, 'User_auth_alias', $check_CNAME_filter);
+    if ($count > 0) { return FALSE; }
+
     return TRUE;
 }
 

+ 1 - 0
html/inc/languages/english.php

@@ -190,6 +190,7 @@ define("WEB_cell_shaper","Shaper");
 define("WEB_cell_connection","Connected");
 define("WEB_cell_last_found","Last activity");
 define("WEB_cell_dns_name","Dns Name");
+define("WEB_cell_aliases","Aliases");
 define("WEB_cell_host_model","Device Model");
 define("WEB_cell_nagios","Monitoring");
 define("WEB_cell_nagios_handler","Event response");

+ 1 - 0
html/inc/languages/russian.php

@@ -190,6 +190,7 @@ define("WEB_cell_shaper","Шейпер");
 define("WEB_cell_connection","Подключен");
 define("WEB_cell_last_found","Последняя активность");
 define("WEB_cell_dns_name","Имя в dns");
+define("WEB_cell_aliases","Альясы");
 define("WEB_cell_host_model","Модель устройства");
 define("WEB_cell_nagios","Мониторинг");
 define("WEB_cell_nagios_handler","Реакция на событие");

+ 19 - 1
scripts/eyelib/mysql.pm

@@ -403,7 +403,7 @@ 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);
+my $auth_record = get_record_sql($db,"SELECT dns_name FROM User_auth WHERE deleted=0 AND id=".$id);
 if ($auth_record and $auth_record->{'dns_name'}) { return $auth_record->{'dns_name'}; }
 return;
 }
@@ -839,8 +839,19 @@ if ($dns_cmd->{name_type}=~/^a$/i) {
         next;
         }
 
+    #get aliases
+    my @aliases = get_records_sql($hdb,"SELECT * FROM User_auth_alias WHERE auth_id=".$auth_id);
+
     #remove A & PTR
     if ($dns_cmd->{type} eq 'del') {
+        #remove aliases
+        if (@aliases and scalar @aliases) {
+                foreach my $alias (@aliases) {
+                    delete_dns_cname($fqdn,$alias->{alias},$ad_zone,$ad_dns,$hdb) if ($alias->{alias});
+                    delete_dns_hostname($fqdn,$alias->{alias},$ad_zone,$ad_dns,$hdb) if ($alias->{alias});
+                }
+            }
+        #remove main record
         delete_dns_hostname($fqdn,$fqdn_ip,$ad_zone,$ad_dns,$hdb);
         delete_dns_ptr($fqdn,$fqdn_ip,$ad_zone,$ad_dns,$hdb);
         }
@@ -861,8 +872,15 @@ if ($dns_cmd->{name_type}=~/^a$/i) {
             db_log_debug($hdb,"Static record for $fqdn [$static_ok] correct.");
             next;
             }
+        #create record
         create_dns_hostname($fqdn,$fqdn_ip,$ad_zone,$ad_dns,$hdb);
         create_dns_ptr($fqdn,$fqdn_ip,$ad_zone,$ad_dns,$hdb);
+        #create aliases
+        if (@aliases and scalar @aliases) {
+                foreach my $alias (@aliases) {
+                    create_dns_cname($fqdn,$alias->{alias},$ad_zone,$ad_dns,$hdb) if ($alias->{alias});
+                }
+            }
         }
     }
 };

+ 2 - 0
updates/2-4-14/user_auth.sql

@@ -1,2 +1,4 @@
 ALTER TABLE `User_auth` CHANGE `dhcp_changed` `dhcp_changed` INT(11) NOT NULL DEFAULT '0';
 ALTER TABLE `User_auth` CHANGE `dns_name` `dns_name` VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL;
+DELETE FROM `User_auth_alias` WHERE `auth_id` in (SELECT `id` FROM `User_auth` WHERE `deleted`=1);
+DELETE FROM `User_auth_alias` WHERE `auth_id` in (SELECT `id` FROM `User_auth` WHERE `dns_name`='' or `dns_name` IS NULL);