1
0

print-dns-zones.pl 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. #!/usr/bin/perl
  2. #
  3. # Copyright (C) Roman Dmitriev, rnd@rajven.ru
  4. #
  5. use utf8;
  6. use warnings;
  7. use Encode;
  8. use open qw(:std :encoding(UTF-8));
  9. no warnings 'utf8';
  10. use FindBin '$Bin';
  11. use lib "/opt/Eye/scripts";
  12. use strict;
  13. use DBI;
  14. use Time::Local;
  15. use Net::Patricia;
  16. use Data::Dumper;
  17. use eyelib::config;
  18. use eyelib::main;
  19. use eyelib::logconfig;
  20. use eyelib::database;
  21. use eyelib::common;
  22. setpriority(0,0,19);
  23. my $named_root='';
  24. my $named_db_fullpath=$named_root.'/etc/bind/masters';
  25. my $named_db_path='/etc/bind/masters';
  26. my $DNS1=$config_ref{dns_server};
  27. my $DNS1_IP=$config_ref{dns_server};
  28. my $dns_server_record = get_record_sql($dbh,"SELECT id,ip,dns_name FROM user_auth WHERE deleted=0 AND ip=?",$DNS1_IP);
  29. if ($dns_server_record and $dns_server_record->{dns_name}) {
  30. my $ns1=$dns_server_record->{dns_name};
  31. $ns1 =~s/\.$//g;
  32. $ns1 =~s/_/-/g;
  33. # $dns_name =~s/[\.]/-/g;
  34. $ns1 =~s/ /-/g;
  35. $ns1 =~s/-$//g;
  36. $ns1 = trim($ns1);
  37. if ($ns1 and $ns1 !~ /\.\Q$domain_name\E$/i) { $ns1 = $ns1 .".".$domain_name; }
  38. $DNS1 = $ns1;
  39. }
  40. #exit if ($config_ref{dns_server_type!='bind');
  41. my $named_conf=$named_root.'/etc/bind/named.dynamic';
  42. my %zones;
  43. my $sSQL = "
  44. SELECT id, ou_id, ip, dns_name, dhcp_hostname, dns_ptr_only
  45. FROM user_auth
  46. WHERE deleted = 0
  47. AND ip IS NOT NULL
  48. AND (
  49. (dns_name IS NOT NULL AND dns_name != '' AND dns_name NOT LIKE '%.')
  50. OR
  51. (dhcp_hostname IS NOT NULL AND dhcp_hostname != '')
  52. )
  53. ORDER BY ip_int
  54. ";
  55. my @authlist_ref = get_records_sql($dbh,$sSQL);
  56. foreach my $row (@authlist_ref) {
  57. next if (!$row);
  58. next if (is_default_ou($dbh,$row->{ou_id}));
  59. my $dns_name = trim($row->{dns_name});
  60. if ($dns_name) {
  61. # $dns_name =~s/$domain_name//i;
  62. $dns_name =~s/\.$//g;
  63. $dns_name =~s/_/-/g;
  64. # $dns_name =~s/[\.]/-/g;
  65. $dns_name =~s/ /-/g;
  66. $dns_name =~s/-$//g;
  67. $dns_name = trim($dns_name);
  68. if ($dns_name and $dns_name !~ /\.\Q$domain_name\E$/i) { $dns_name = $dns_name .".".$domain_name; }
  69. } else { $dns_name=''; }
  70. next if (!$dns_name);
  71. my $ip=trim($row->{ip});
  72. next if (!$ip);
  73. next if (!$office_networks->match_string($ip));
  74. my $default_name=$dns_name;
  75. $zones{$domain_name}{A}{$default_name}=$ip;
  76. my @dns_aliases = get_records_sql( $dbh, "SELECT * FROM user_auth_alias WHERE auth_id = ? AND alias IS NOT NULL AND alias != '' AND alias NOT LIKE '%.' ORDER BY alias", $row->{id});
  77. foreach my $alias (@dns_aliases) {
  78. my $dns_alias = trim($alias->{alias});
  79. # $dns_alias =~s/$domain_name//i;
  80. $dns_alias =~s/_/-/g;
  81. $dns_alias =~s/[\.]/-/g;
  82. $dns_alias =~s/ /-/g;
  83. $dns_alias =~s/-$//g;
  84. $dns_alias = trim($dns_alias);
  85. if ($dns_alias and $dns_alias !~ /\.\Q$domain_name\E$/i) { $dns_alias = $dns_alias .".".$domain_name; }
  86. $zones{$domain_name}{CNAME}{$dns_alias}=$default_name if ($dns_alias);
  87. }
  88. if ($ip=~/([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\.([0-9]{1,3})/) {
  89. my $zone_name=$1;
  90. my $ip_in_zone=$2;
  91. $zones{$zone_name}{PTR}{$ip_in_zone}=$default_name;
  92. }
  93. }
  94. $dbh->disconnect;
  95. my ($min, $hour, $mday, $mon, $year) = (localtime())[1,2,3,4,5];
  96. $mon += 1;
  97. $year += 1900;
  98. my $yy = $year - 2000;
  99. open(F2,">$named_conf.new") or die "Unamed to open config $named_conf.new!";
  100. flock(F2,2);
  101. foreach my $ZONE (keys %zones) {
  102. my $ZONE_DB=$named_db_fullpath."/db.".$ZONE.".new";
  103. my $reverse=0;
  104. my $zone_name=$ZONE;
  105. if ($ZONE!~/$domain_name/) {
  106. $reverse=1;
  107. if ($ZONE=~/([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})/) {
  108. $zone_name=$3.".".$2.".".$1.".in-addr.arpa";
  109. } else {
  110. print "Unknown zone name: $ZONE!!!\n";
  111. next;
  112. }
  113. }
  114. print F2 "zone $zone_name \{\n";
  115. print F2 "type master;\n";
  116. print F2 "file \"$named_db_path"."/db.".$ZONE."\";\n";
  117. print F2 "allow-update { key rndc-key; };\n";
  118. #print F2 "allow-transfer { second; };\n";
  119. print F2 "\};\n";
  120. print F2 "\n";
  121. open(F1,">$ZONE_DB") or die "Unable to open config file $ZONE_DB!" ;
  122. flock(F1,2);
  123. print F1 "\$ORIGIN .\n";
  124. print F1 "\$TTL 3600\t; 1 hour\n";
  125. print F1 $zone_name."\t\tIN SOA\t\t".$DNS1." root.".$DNS1.". (\n";
  126. printf F1 "\t\t\t\t%04d%02d%02d%02d ; serial\n",$year,$mon,$mday,$hour;
  127. print F1 "\t\t\t\t900\t; refresh (15 minutes)\n";
  128. print F1 "\t\t\t\t600\t; retry (10 minutes)\n";
  129. print F1 "\t\t\t\t86400\t; expire (1 day)\n";
  130. print F1 "\t\t\t\t3600\t; minimum (1 hour)\n";
  131. print F1 "\t\t\t\t)\n";
  132. print F1 "\t\t\t\tNS\t $DNS1\n";
  133. print F1 ";\n";
  134. #A-record for domain
  135. if ($DNS1) {
  136. print F1 ";A-record for domain\n";
  137. print F1 "\t\t\t\tA\t $DNS1_IP\n";
  138. }
  139. print F1 "\$TTL 3600\t; 1 hour\n";
  140. print F1 "; host list\n";
  141. if ($reverse) {
  142. print F1 "\$ORIGIN $zone_name.\n";
  143. foreach my $record (sort keys %{$zones{$ZONE}->{PTR}}) {
  144. print F1 "$record\t\t\tIN\tPTR\t$zones{$ZONE}->{PTR}->{$record}.\n";
  145. }
  146. } else {
  147. #print F1 "\$ORIGIN $zone_name.\n";
  148. foreach my $record (sort keys %{$zones{$ZONE}->{A}}) {
  149. print F1 "$record\t\t\t\tA\t$zones{$ZONE}->{A}->{$record}\n";
  150. };
  151. foreach my $record (sort keys %{$zones{$ZONE}->{CNAME}}) {
  152. print F1 "$record\t\t\t\tCNAME\t$zones{$ZONE}->{CNAME}->{$record}.\n";
  153. };
  154. }
  155. }
  156. close(F1);
  157. close(F2);
  158. exit;