#!/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; }