From: ivan Date: Thu, 23 May 2002 13:00:08 +0000 (+0000) Subject: bind: allow adding slave domains too X-Git-Tag: freeside_1_4_0_pre14~67 X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=commitdiff_plain;h=4920ad2671d712afe23d731e25bc5b53955397b7 bind: allow adding slave domains too --- diff --git a/ANNOUCE.1.4.0 b/ANNOUCE.1.4.0 index a3d786508..a916076e9 100644 --- a/ANNOUCE.1.4.0 +++ b/ANNOUCE.1.4.0 @@ -105,8 +105,6 @@ be able to get everything else working... Critical Path provisioning has been updated and can now username changes and suspension/unsuspension. --- - - New export code! - Name and company searches: - now case-insensative @@ -128,3 +126,5 @@ schema diagram -- +complete bind import and export and edit of dns zone files + diff --git a/FS/FS/domain_record.pm b/FS/FS/domain_record.pm index 44e70ade1..4ed713c77 100644 --- a/FS/FS/domain_record.pm +++ b/FS/FS/domain_record.pm @@ -1,7 +1,7 @@ package FS::domain_record; use strict; -use vars qw( @ISA ); +use vars qw( @ISA $noserial_hack ); #use FS::Record qw( qsearch qsearchs ); use FS::Record qw( qsearchs dbh ); use FS::svc_domain; @@ -85,6 +85,16 @@ sub insert { local $FS::UID::AutoCommit = 0; my $dbh = dbh; + if ( $self->rectype eq '_mstr' ) { #delete all other records + foreach my $domain_record ( reverse $self->svc_domain->domain_record ) { + my $error = $domain_record->delete; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + } + } + my $error = $self->SUPER::insert; if ( $error ) { $dbh->rollback if $oldAutoCommit; @@ -265,6 +275,7 @@ sub check { =cut sub increment_serial { + return '' if $noserial_hack; my $self = shift; my $soa = qsearchs('domain_record', { @@ -283,11 +294,22 @@ sub increment_serial { $new->replace($soa); } +=item svc_domain + +Returns the domain (see L $self->svcnum } ); +} + =back =head1 VERSION -$Id: domain_record.pm,v 1.8 2002-05-22 18:44:01 ivan Exp $ +$Id: domain_record.pm,v 1.9 2002-05-23 13:00:08 ivan Exp $ =head1 BUGS diff --git a/bin/bind.import b/bin/bind.import new file mode 100755 index 000000000..5c4149501 --- /dev/null +++ b/bin/bind.import @@ -0,0 +1,191 @@ +#!/usr/bin/perl -w +# +# $Id: bind.import,v 1.1 2002-05-23 13:00:08 ivan Exp $ + +#need to manually put header in /usr/local/etc/freeside/export./named.conf.HEADER + +use strict; +use vars qw( %d_part_svc ); +use Term::Query qw(query); +#use BIND::Conf_Parser; +#use DNS::ZoneParse; + +#use Net::SCP qw(iscp); +use Net::SCP qw(scp); +use FS::UID qw(adminsuidsetup datasrc); +use FS::Record qw(qsearch); #qsearchs); +#use FS::svc_acct_sm; +use FS::svc_domain; +use FS::domain_record; +#use FS::svc_acct; +#use FS::part_svc; + +my $user = shift or die &usage; +adminsuidsetup $user; + +$FS::domain_record::noserial_hack = 1; + +use vars qw($spooldir); +$spooldir = "/usr/local/etc/freeside/export.". datasrc. "/bind"; +mkdir $spooldir unless -d $spooldir; + +%d_part_svc = + map { $_->svcpart, $_ } qsearch('part_svc',{'svcdb'=>'svc_domain'}); + +print "\n\n", + ( join "\n", map "$_: ".$d_part_svc{$_}->svc, sort keys %d_part_svc ), + "\n\n"; +use vars qw($domain_svcpart); +$^W=0; #Term::Query isn't -w-safe +$domain_svcpart = + query "Enter part number for domains: ", 'irk', [ keys %d_part_svc ]; +$^W=1; + +print "\n\n", <new; +$p->parse_file("$prefix/named.conf.import"); + +print "\nBIND import completed.\n"; + +## + +sub usage { + die "Usage:\n\n svc_domain.import user\n"; +} + +######## +BEGIN { + + package Parser; + use BIND::Conf_Parser; + use vars qw(@ISA $named_dir); + @ISA = qw(BIND::Conf_Parser); + + sub handle_option { + my($self, $option, $argument) = @_; + return unless $option eq "directory"; + $named_dir = $argument; + } + + sub handle_zone { + my($self, $name, $class, $type, $options) = @_; + return unless $class eq 'in'; + return if grep { $name eq $_ } + ( qw( . localhost 127.in-addr.arpa 0.in-addr.arpa 255.in-addr.arpa ) ); + + my $domain = new FS::svc_domain( { + svcpart => $main::domain_svcpart, + domain => $name, + action => 'N', + } ); + my $error = $domain->insert; + die $error if $error; + + if ( $type eq 'slave' ) { + + #use Data::Dumper; + #print Dumper($options); + #exit; + + foreach my $master ( @{ $options->{masters} } ) { + my $domain_record = new FS::domain_record( { + 'svcnum' => $domain->svcnum, + 'reczone' => '@', + 'recaf' => 'IN', + 'rectype' => '_mstr', + 'recdata' => $master, + } ); + my $error = $domain_record->insert; + die $error if $error; + } + + } elsif ( $type eq 'master' ) { + + my $file = $options->{file}; + + use File::Basename; + my $basefile = basename($file); + my $sourcefile = $file; + $sourcefile = "$named_dir/$sourcefile" unless $file =~ /^\//; + use Net::SCP qw(iscp scp); + scp("root\@$main::named_machine:$sourcefile", + "$main::prefix/$basefile.import"); + + use DNS::ZoneParse; + my $zone = DNS::ZoneParse->new("$main::prefix/$basefile.import"); + + my $dump = $zone->Dump; + + #use Data::Dumper; + #print "$name: ". Dumper($dump); + #exit; + + foreach my $rectype ( keys %$dump ) { + if ( $rectype =~ /^SOA$/i ) { + my $rec = $dump->{$rectype}; + my $domain_record = new FS::domain_record( { + 'svcnum' => $domain->svcnum, + 'reczone' => $rec->{origin}, + 'recaf' => 'IN', + 'rectype' => $rectype, + 'recdata' => + $rec->{primary}. ' '. $rec->{email}. ' ( '. + join(' ', map $rec->{$_}, + qw( serial refresh retry expire minimumTTL ) ). + ' )', + } ); + my $error = $domain_record->insert; + die $error if $error; + } else { + #die $dump->{$rectype}; + foreach my $rec ( @{ $dump->{$rectype} } ) { + my $domain_record = new FS::domain_record( { + 'svcnum' => $domain->svcnum, + 'reczone' => $rec->{name}, + 'recaf' => $rec->{class}, + 'rectype' => $rectype, + 'recdata' => ( $rectype =~ /^MX$/i + ? $rec->{priority}. ' '. $rec->{host} + : $rec->{host} ), + } ); + my $error = $domain_record->insert; + die $error if $error; + } + } + } + + } + + } + +} +######### + diff --git a/bin/svc_domain.import b/bin/svc_domain.import deleted file mode 100644 index 8090b1e9b..000000000 --- a/bin/svc_domain.import +++ /dev/null @@ -1,189 +0,0 @@ -#!/usr/bin/perl -w -# -# $Id: svc_domain.import,v 1.6 2002-05-20 11:02:47 ivan Exp $ - -#need to manually put header in /usr/local/etc/freeside/export./named.conf.HEADER - -use strict; -use vars qw( %d_part_svc ); -use Term::Query qw(query); -#use BIND::Conf_Parser; -#use DNS::ZoneParse; - -#use Net::SCP qw(iscp); -use Net::SCP qw(scp); -use FS::UID qw(adminsuidsetup datasrc); -use FS::Record qw(qsearch); #qsearchs); -#use FS::svc_acct_sm; -use FS::svc_domain; -use FS::domain_record; -#use FS::svc_acct; -#use FS::part_svc; - -my $user = shift or die &usage; -adminsuidsetup $user; - -use vars qw($spooldir); -$spooldir = "/usr/local/etc/freeside/export.". datasrc. "/bind"; -mkdir $spooldir unless -d $spooldir; - -%d_part_svc = - map { $_->svcpart, $_ } qsearch('part_svc',{'svcdb'=>'svc_domain'}); - -print "\n\n", - ( join "\n", map "$_: ".$d_part_svc{$_}->svc, sort keys %d_part_svc ), - "\n\n"; -use vars qw($domain_svcpart); -$^W=0; #Term::Query isn't -w-safe -$domain_svcpart = - query "Enter part number for domains: ", 'irk', [ keys %d_part_svc ]; -$^W=1; - -print "\n\n", <new; -$p->parse_file("$prefix/named.conf.import"); - -print "\nBIND import completed.\n"; - -## - -sub usage { - die "Usage:\n\n svc_domain.import user\n"; -} - -######## -BEGIN { - - package Parser; - use BIND::Conf_Parser; - use vars qw(@ISA $named_dir); - @ISA = qw(BIND::Conf_Parser); - - sub handle_option { - my($self, $option, $argument) = @_; - return unless $option eq "directory"; - $named_dir = $argument; - } - - sub handle_zone { - my($self, $name, $class, $type, $options) = @_; - return unless $class eq 'in'; - return if grep { $name eq $_ } - ( qw( . localhost 127.in-addr.arpa 0.in-addr.arpa 255.in-addr.arpa ) ); - - my $domain = new FS::svc_domain( { - svcpart => $main::domain_svcpart, - domain => $name, - action => 'N', - } ); - my $error = $domain->insert; - die $error if $error; - - if ( $type eq 'slave' ) { - - #use Data::Dumper; - #print Dumper($options); - #exit; - - foreach my $master ( @{ $options->{masters} } ) { - my $domain_record = new FS::domain_record( { - 'svcnum' => $domain->svcnum, - 'reczone' => '@', - 'recaf' => 'IN', - 'rectype' => '_mstr', - 'recdata' => $master, - } ); - my $error = $domain_record->insert; - die $error if $error; - } - - } elsif ( $type eq 'master' ) { - - my $file = $options->{file}; - - use File::Basename; - my $basefile = basename($file); - my $sourcefile = $file; - $sourcefile = "$named_dir/$sourcefile" unless $file =~ /^\//; - use Net::SCP qw(iscp scp); - scp("root\@$main::named_machine:$sourcefile", - "$main::prefix/$basefile.import"); - - use DNS::ZoneParse; - my $zone = DNS::ZoneParse->new("$main::prefix/$basefile.import"); - - my $dump = $zone->Dump; - - #use Data::Dumper; - #print "$name: ". Dumper($dump); - #exit; - - foreach my $rectype ( keys %$dump ) { - if ( $rectype =~ /^SOA$/i ) { - my $rec = $dump->{$rectype}; - my $domain_record = new FS::domain_record( { - 'svcnum' => $domain->svcnum, - 'reczone' => $rec->{origin}, - 'recaf' => 'IN', - 'rectype' => $rectype, - 'recdata' => - $rec->{primary}. ' '. $rec->{email}. ' ( '. - join(' ', map $rec->{$_}, - qw( serial refresh retry expire minimumTTL ) ). - ' )', - } ); - my $error = $domain_record->insert; - die $error if $error; - } else { - #die $dump->{$rectype}; - foreach my $rec ( @{ $dump->{$rectype} } ) { - my $domain_record = new FS::domain_record( { - 'svcnum' => $domain->svcnum, - 'reczone' => $rec->{name}, - 'recaf' => $rec->{class}, - 'rectype' => $rectype, - 'recdata' => ( $rectype =~ /^MX$/i - ? $rec->{priority}. ' '. $rec->{host} - : $rec->{host} ), - } ); - my $error = $domain_record->insert; - die $error if $error; - } - } - } - - } - - } - -} -######### - diff --git a/httemplate/edit/process/domain_record.cgi b/httemplate/edit/process/domain_record.cgi index 8fb0368f6..b8c3f62a1 100755 --- a/httemplate/edit/process/domain_record.cgi +++ b/httemplate/edit/process/domain_record.cgi @@ -22,6 +22,9 @@ if ( $error ) { # $cgi->param('error', $error); # print $cgi->redirect(popurl(2). "agent.cgi?". $cgi->query_string ); #no edit screen to send them back to +%> + +<% eidiot($error); } else { my $svcnum = $new->svcnum; diff --git a/httemplate/view/svc_domain.cgi b/httemplate/view/svc_domain.cgi index 28214f04e..b70ac8f90 100755 --- a/httemplate/view/svc_domain.cgi +++ b/httemplate/view/svc_domain.cgi @@ -30,7 +30,9 @@ if ($svc_domain->catchall) { my $domain = $svc_domain->domain; -print header('Domain View', menubar( +%> + +<%= header('Domain View', menubar( ( ( $pkgnum || $custnum ) ? ( "View this package (#$pkgnum)" => "${p}view/cust_pkg.cgi?$pkgnum", "View this customer (#$custnum)" => "${p}view/cust_main.cgi?$custnum", @@ -39,43 +41,66 @@ print header('Domain View', menubar( "${p}misc/cancel-unaudited.cgi?$svcnum" ) ), "Main menu" => $p, -)), - "Service #$svcnum", - "
Service: ", $part_svc->svc, "", - "
Domain name: $domain.", - qq!
Catch all email (change):!, - $email ? "$email." : "(none)", - qq!

View whois information.!, - '

', - '', - ntable("",2), - 'ZoneTypeData', -; +)) %> +Service #<%= $svcnum %> +
Service: <%= $part_svc->svc %> +
Domain name: <%= $domain %> +
Catch all email (change): +<%= $email ? "$email" : "(none)" %> +

View whois information. +

+ -foreach my $domain_record ( $svc_domain->domain_record ) { - print ''. $domain_record->reczone. ''. - ''. $domain_record->recaf. ' '. $domain_record->rectype. ''. - ''. $domain_record->recdata; - print qq! (delete)! - unless $domain_record->rectype eq 'SOA'; - print ''; -} -print '
'. - qq!
!. - qq!!. - ' '. - 'IN '. - ''. - ' '. - '

'. joblisting({'svcnum'=>$svcnum}, 1). - ''; +<% my @records; if ( @records = $svc_domain->domain_record ) { %> + <%= ntable("",2) %> + ZoneTypeData -%> + <% foreach my $domain_record ( @records ) { + my $type = $domain_record->rectype eq '_mstr' + ? "(slave)" + : $domain_record->recaf. ' '. $domain_record->rectype; + %> + + <%= $domain_record->reczone %> + <%= $type %> + <%= $domain_record->recdata %> + + <% unless ( $domain_record->rectype eq 'SOA' ) { %> + (delete) + <% } %> + + <% } %> + +<% } %> + +
+ + + + IN + + +


or

+
+ + +<% if ( @records ) { %> Delete all records and <% } %> +Slave from nameserver IP + + + + + +
+

<%= joblisting({'svcnum'=>$svcnum}, 1) %> +