#!/usr/bin/perl -w
package Domain;
$VERSION = 0.4;
use DNS::ZoneParse;
use strict;
require Carp;
## contructor ##
sub new {
my ($pkg,$path,$domain, $srcip, $dstip,$class) = @_;
my $self = {
"path" => $path, ## cache path
"domain" => $domain, ## domain name
"from" => $srcip, ## what to change
"to" => $dstip, ## what to chenge to
"class"=> $class, ## class (A,NS,MX .. )
"deny" => undef
};
bless $self,$pkg;
return $self;
}
sub set_deny_hash {
my $self = shift;
my $deny_hash = shift;
if (defined($deny_hash)) {
$self->{deny} = $deny_hash;
}
return $self->{deny};
}
## run ##
sub run {
my $self = shift;
my $zone=DNS::ZoneParse->new(_prepare_path($self)) or return 1;
my $a = $zone->a();
my $mx = $zone->mx();
my %dont_touch_mx;
my $changed=0;
foreach(@$mx) {
my $host = $_->{'host'};
$host=~s/\.$//;
$dont_touch_mx{$host} = 1;
}
foreach(@$a) {
if (($_->{'host'} eq $self->{from}) && not defined($dont_touch_mx{$_->{'name'}})) {
unless(defined($self->{deny}) && ${$self->{deny}}{$_->{'name'}}) {
$_->{'host'} = $self->{to};
$changed = 1;
}
}
}
if ($changed==1) {
$zone->new_serial(1);
open T, ">/tmp/".$self->{domain};
print T $zone->output();
close T;
my $cmdline = "mv /tmp/".$self->{domain}." "._prepare_path($self);
# my $cmdline = "mv /tmp/".$self->{domain}." /home/tdi/domeny/";
qx{$cmdline};
_log_small($self,$self->{domain}." zostala zmieniona\n");
} else {
_log_small($self,$self->{domain}." nie zostala zmieniona\n");
}
return 0;
}
## Creates /var/cache/bind/[0-9a-b]/$domain path
sub _prepare_path {
my $self = shift;
return $self->{path}.substr($self->{domain},0,1)."/".$self->{domain};
}
sub _log_small {
my $self = shift;
my $content = shift;
require Time::Local;
my $tm = localtime time;
open L, ">>domain.log";
print L "[domain $tm ] $content";
close L;
}