print-dns-zones.pl 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. #!/usr/bin/perl
  2. #
  3. # Copyright (C) Roman Dmitiriev, rnd@rajven.ru
  4. #
  5. use FindBin '$Bin';
  6. use lib "$Bin/";
  7. use strict;
  8. use DBI;
  9. use Time::Local;
  10. use Net::Patricia;
  11. use Data::Dumper;
  12. use Rstat::config;
  13. use Rstat::main;
  14. use Rstat::mysql;
  15. setpriority(0,0,19);
  16. my $named_root='/var/named/chroot';
  17. my $named_db_fullpath=$named_root.'/var/named/master';
  18. my $named_db_path='/var/named/master';
  19. my $ns1 = 'ns1';
  20. my $DNS1=$ns1.'.'.$domain_name;
  21. my $named_conf=$named_root.'/etc/named.dynamic';
  22. # user auth list
  23. my @authlist_ref = get_records_sql($dbh,"SELECT id,ip,dns_name FROM User_auth WHERE `ip_int`>0 AND `deleted`=0 ORDER BY ip_int");
  24. my %zones;
  25. $zones{$domain_name}{$ns1}=$dns_server;
  26. foreach my $row (@authlist_ref) {
  27. next if (!$row);
  28. my $ip=trim($row->{ip});
  29. my $dns_name=trim($row->{dns_name});
  30. next if (!$ip);
  31. next if (!$office_networks->match_string($ip));
  32. my $default_name=$ip;
  33. $default_name=~s/\./-/g;
  34. if ($dns_name) {
  35. $default_name=$dns_name;
  36. $default_name =~s/_/-/g;
  37. $default_name =~s/[.]/-/g;
  38. $default_name =~s/ /-/g;
  39. $zones{$domain_name}{$default_name}=$ip;
  40. }
  41. my @dns_names=get_records_sql($dbh,"SELECT * FROM User_auth_alias WHERE auth_id=$row->{id} ORDER BY alias");
  42. foreach my $alias (@dns_names) {
  43. my $dns = $alias->{alias};
  44. $dns =~s/_/-/g;
  45. $dns =~s/[.]/-/g;
  46. $dns =~s/ /-/g;
  47. $zones{$domain_name}{$dns}=$ip;
  48. }
  49. if ($ip=~/([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\.([0-9]{1,3})/) {
  50. my $zone_name=$1;
  51. my $ip_in_zone=$2;
  52. $zones{$zone_name}{$ip_in_zone}=$default_name;
  53. }
  54. }
  55. $dbh->disconnect;
  56. my ($min, $hour, $mday, $mon, $year) = (localtime())[1,2,3,4,5];
  57. $mon += 1;
  58. $year += 1900;
  59. my $yy = $year - 2000;
  60. open(F2,">$named_conf.new") or die "Unamed to open config $named_conf.new!";
  61. flock(F2,2);
  62. foreach my $ZONE (keys %zones) {
  63. my $ZONE_DB=$named_db_fullpath."/db.".$ZONE.".new";
  64. my $reverse=0;
  65. my $zone_name=$ZONE;
  66. if ($ZONE!~/$domain_name/) {
  67. $reverse=1;
  68. if ($ZONE=~/([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})/) {
  69. $zone_name=$3.".".$2.".".$1.".in-addr.arpa";
  70. } else {
  71. print "Unknown zone name: $ZONE!!!\n";
  72. next;
  73. }
  74. }
  75. print F2 "zone $zone_name \{\n";
  76. print F2 "type master;\n";
  77. print F2 "file \"$named_db_path"."/db.".$ZONE."\";\n";
  78. #print F2 "allow-update { key rndckey; };\n";
  79. print F2 "allow-transfer { second; };\n";
  80. print F2 "\};\n";
  81. print F2 "\n";
  82. open(F1,">$ZONE_DB") or die "Unable to open config file $ZONE_DB!" ;
  83. flock(F1,2);
  84. print F1 "\$ORIGIN .\n";
  85. print F1 "\$TTL 3600\t; 1 hour\n";
  86. print F1 "$zone_name\t\t\t\tIN SOA\t\t$DNS1. root.$DNS1. (\n";
  87. printf F1 "\t\t\t\t%04d%02d%02d%02d ; serial\n",$year,$mon,$mday,$hour;
  88. print F1 "\t\t\t\t900\t; refresh (15 minutes)\n";
  89. print F1 "\t\t\t\t600\t; retry (10 minutes)\n";
  90. print F1 "\t\t\t\t86400\t; expire (1 day)\n";
  91. print F1 "\t\t\t\t3600\t; minimum (1 hour)\n";
  92. print F1 "\t\t\t\t)\n";
  93. print F1 "\t\t\t\tNS\t $DNS1.\n";
  94. if ($dns_server) {
  95. print F1 "\t\t\t\tA\t $dns_server\n";
  96. }
  97. print F1 ";\n";
  98. print F1 "\$TTL 3600\t; 1 hour\n";
  99. print F1 "; host list\n";
  100. print F1 "\$ORIGIN $zone_name.\n";
  101. foreach my $record (sort keys %{$zones{$ZONE}}) {
  102. if ($reverse) {
  103. print F1 "$record\t\t\tIN\tPTR\t$zones{$ZONE}->{$record}.$domain_name.\n";
  104. } else {
  105. print F1 "$record\t\t\t\tA\t$zones{$ZONE}->{$record}\n";
  106. }
  107. }
  108. }
  109. close(F1);
  110. close(F2);
  111. exit;