All pastes #45616 Raw Edit

Anonymous

public text v1 · immutable
#45616 ·published 2006-03-14 09:02 UTC
rendered paste body
#!/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;
}