package LBDB; use DNS; require Exporter; @ISA = (Exporter); #@EXPORT = qw( # add_static add_dynamic #); $debug = 1; $default_ttl = 3600; # one hour sub open_log { local($file)=@_; &close_log if ($log_logging); open(LOGFILE,">>$file") || die "can't open $file: $!"; $log_logging = 1; select(LOGFILE); $| =1; } sub write_log { local($message)=@_; local($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); local($date)=sprintf("%02d/%02d %02d:%02d",$mon+1,$mday,$hour,$min); print LOGFILE "$date $$ lbnamed $message\n" if ($log_logging); } sub close_log { close(LOGFILE) if ($log_logging); $log_logging=0; } sub check_static { my($qname,$qtype,$qclass,$dm) = @_; my(@answers,$info,$answers,$classes,@classes,$types); if ($qclass == C_ANY || $qtype == T_ANY) { if ($qclass == C_ANY) { $classes = $static_domain{$qname}; if (defined $classes) { foreach $_ (values %$classes) { push(@classes, $_); } } } else { push(@classes, $static_domain{$qname}->{$qclass}); } foreach $types (@classes) { if ($types) { foreach $_ (values %$types) { push(@answers, $_); } } else { return 0; } } } else { push(@answers, $static_domain{$qname}->{$qclass}->{$qtype}); } foreach $info (@answers) { if (defined $info) { $dm->{'answer'} .= $info->{"answer"}; $answers = ($dm->{'ancount'} += $info->{"ancount"}); } } return $answers != 0; } sub add_static { my($domain,$type,$value,$ancount,$class,$ttl) = @_; $ancount = 1 unless $ancount; $class = C_IN unless $class; $ttl = $default_ttl unless $ttl; $static_domain{$domain} -> {$class} -> {$type} = { "answer" => dns_answer(QPTR,$type,$class,$ttl,$value), "ancount" => $ancount }; } sub add_dynamic { my($domain, $handler) = @_; $dynamic_domain{$domain} = $handler; } sub check_dynamic { my($qname,$qtype,$qclass,$dnsmsg) = @_; my(@atoms,$dfunc,$residual); @atoms = split(/\./,".$qname"); $dfunc = ''; $residual = ''; while (@atoms) { if ($residual) { $residual .= "." . shift @atoms; } else { $residual = shift @atoms; } $domain = join(".",@atoms); last if $dfunc = $dynamic_domain{$domain}; } if ($dfunc) { return &$dfunc($domain,$residual,$qtype,$qclass,$dnsmsg); } else { return 0; } } 1;