initial commit
[old-and-random.git] / dns / dns.pl
1 #!/usr/bin/perl
2
3 use warnings;
4 use Net::DNS;
5 use Net::DNS::Nameserver;
6
7 sub reply_handler {
8   my ($qname, $qclass, $qtype, $peerhost,$query,$conn) = @_;
9   my ($rcode, @ans, @auth, @add);
10
11   print "Received query from $peerhost to ". $conn->{sockhost}. "\n";
12 #  $query->print;
13
14 #  if ($qtype eq "A" && $qname eq "foo.example.com" ) {
15 #    my ($ttl, $rdata) = (30, "10.1.2.3");
16 #    my $rr = new Net::DNS::RR("$qname $ttl $qclass $qtype $rdata");
17 #    push @ans, $rr;
18 #    $rcode = "NOERROR";
19 #  }elsif( $qname eq "foo.example.com" ) {
20 #    $rcode = "NOERROR";
21 #  }else
22
23   if($qtype eq "A") {
24     my $res = Net::DNS::Resolver->new;
25     my $answer = $res->search("$qname");
26     my $random_number = rand(100);
27     my ($ttl, $rdata);
28     my $ip;
29     foreach $record ($answer->answer) {
30       $ip=$record->address;
31     }
32
33     if ($random_number > 50) {
34       ($ttl, $rdata) = (30, "205.196.209.62");
35     } else {
36       ($ttl, $rdata) = (30, "$ip");
37     }
38     print "$random_number - ".$ip."\n";
39
40     #my ($ttl, $rdata) = (30, "10.1.2.3");
41     my $rr = new Net::DNS::RR("$qname $ttl $qclass $qtype $rdata");
42     push @ans, $rr;
43     $rcode = "NOERROR";
44   }else{
45         $rcode = "NXDOMAIN";
46   }
47
48   # mark the answer as authoritive (by setting the 'aa' flag
49     return ($rcode, \@ans, \@auth, \@add, { aa => 1 });
50 }
51
52 my $ns = new Net::DNS::Nameserver(
53   LocalPort    => 53,
54   ReplyHandler => \&reply_handler,
55   Verbose            => 0
56 ) || die "couldn't create nameserver object\n";
57
58 $ns->main_loop;