Changeset 1047


Ignore:
Timestamp:
02/27/26 16:40:46 (2 hours ago)
Author:
Kris Deugau
Message:

/branches/stable

Rollup merge through r909 for core dnsadmin - excludes BIND export, changes
to auxiliary scripts (compatc-recs.pl, mergerecs.pl, etc)

Location:
branches/stable
Files:
15 edited

Legend:

Unmodified
Added
Removed
  • branches/stable

  • branches/stable/DNSDB.pm

    r1037 r1047  
    33##
    44# $Id$
    5 # Copyright 2008-2019 Kris Deugau <kdeugau@deepnet.cx>
     5# Copyright 2008-2025 Kris Deugau <kdeugau@deepnet.cx>
    66#
    77#    This program is free software: you can redistribute it and/or modify
     
    396396sub _maybeip {
    397397  my $izzit = shift;  # reference
    398   return 1 if $$izzit =~ m,^(?:[\d\./]+|[0-9a-fA-F:/]+)$,;
     398  return 1 if $$izzit =~ m,^(?:[0-9\.]+|[0-9a-fA-F:]+)(?:/[0-9]+)?$,;
    399399}
    400400
     
    514514  }
    515515} # end _updateserial()
     516
     517
     518## DNSDB::_recfilter()
     519# Utility sub to construct an SQL fragment for host/value filtering based on a filter argument
     520# Deconstructs the argument to apply Postgres CIDR operators or Postgres string-matching operators as appropriate
     521# Used by recSearchCount(), recSearch(), getRecList(), and getRecCount()
     522# Takes a hash of:
     523#   filter - string to create SQL fragment from
     524#   sql - reference to SQL string.  SQL fragment will be appended to this string
     525#   bindvars - reference to list of DBI bind variable scalars to be fed to DBI on execute
     526sub _recfilter {
     527  my %args = @_;
     528
     529  # flag for "was this an IPish filter argument?", since we want to fall through
     530  # to the second top-level if() if *any* of the ones in the first block fail
     531  my $ipfilt = 0;
     532
     533  if ($args{filter} =~ /^\s*(<|<=|=|>=|>|<>|<<|<<=|>>|>>=)\s*([\da-fA-F].+)\s*$/) {
     534    # filter argument starts with a Postgres CIDR operator, followed by something that could be a CIDR value
     535    my $filt_op = $1;
     536    my $filt_val = $2;
     537    # do we have an IP-ish value?
     538    if ($filt_val =~ m,^(?:[\d.]+|[0-9a-f]+)(?:/\d+)?$,) {
     539      # now make sure
     540      my $tmp = new NetAddr::IP $filt_val;
     541      if ($tmp) {
     542        ${$args{sql}} .= " AND inetlazy(r.val) $filt_op ?";
     543        push @{$args{bindvars}}, $filt_val;
     544        $ipfilt = 1;
     545      } # really looks like a valid IP/CIDR
     546    } # looks IPish
     547  } # has CIDR operator
     548
     549  if (!$ipfilt) {
     550    # simple text matching, with a bit of mix-n-match to account for .arpa names
     551    ${$args{sql}} .= " AND (r.host ~* ? OR r.val ~* ? OR r.host ~* ? OR r.val ~* ?)";
     552    my $tmp = join('.',reverse(split(/\./,$args{filter})));
     553    push @{$args{bindvars}}, ($args{filter},$args{filter});
     554    push @{$args{bindvars}}, ($tmp, $tmp);
     555  }
     556
     557} # _recfilter
    516558
    517559
     
    10491091
    10501092    # SRV target check - IP addresses not allowed.  Must be a more or less well-formed hostname.
     1093    # Allow a bare . to indicate "this service does not exist"
    10511094    return ('FAIL', "SRV records cannot point directly to an IP address")
    1052       if ${$args{val}} =~ /^(?:[\d.]+|[0-9a-fA-F:]+)$/;
     1095      if ${$args{val}} ne '.' && ${$args{val}} =~ /^(?:[\d.]+|[0-9a-fA-F:]+)$/;
    10531096  } else {
    10541097    # hm.  we can't do anything sane with IP values here;  part of the record data is in
     
    10641107
    10651108    # SRV target check - IP addresses not allowed.  Must be a more or less well-formed hostname.
     1109    # Allow a bare . to indicate "this service does not exist"
    10661110    return ('FAIL', "SRV records cannot point directly to an IP address")
    1067       if ${$args{host}} =~ /^(?:[\d.]+|[0-9a-fA-F:]+)$/;
     1111      if ${$args{host}} ne '.' && ${$args{host}} =~ /^(?:[\d.]+|[0-9a-fA-F:]+)$/;
    10681112
    10691113    # SRV records in reverse zones get stricter treatment.  The UI bars adding them in
     
    18671911  my $tmpl = shift;
    18681912  my $ip = shift;
    1869   my $subnet = shift;   # for %ngb and %c
     1913  my $subnet = shift;   # for %ngb, %c, and %x
    18701914  my $ipindex = shift;  # for %c
    18711915
     
    26912735  my $failmsg = '';
    26922736  my $zone = ($revrec eq 'n' ? $self->domainName($zoneid) : $self->revName($zoneid));
     2737  my $zonestatus = $self->zoneStatus($zoneid, $revrec);
    26932738
    26942739  return ('FAIL', ($revrec eq 'n' ? 'Domain' : 'Reverse zone')." ID $zoneid doesn't exist") if !$zone;
     
    27302775    }
    27312776
    2732     $msg = "Deleted ".($revrec eq 'n' ? 'domain' : 'reverse zone')." $zone";
     2777    $msg = "Deleted ".($zonestatus ? '' : 'inactive ').($revrec eq 'n' ? 'domain' : 'reverse zone')." $zone";
    27332778    $loghash{entry} = $msg;
    27342779    $self->_log(%loghash);
     
    45294574  # Filtering on host/val (mainly normal record list)
    45304575  if ($args{filter}) {
    4531     # not much use to end users, but internal callers may want more fine-grained restriction on CIDR ranges
    4532     # we'll only support the value-comparison operators;  bitwise/add/subtract don't make much sense in this context
    4533     my $ipfilt = 0;
    4534     if ($args{filter} =~ /^\s*(<|<=|=|>=|>|<>|<<|<<=|>>|>>=)\s*([\da-fA-F].+)\s*$/) {
    4535       my $filt_op = $1;
    4536       my $filt_val = $2;
    4537       # do we have an IP-ish value?
    4538       if ($filt_val =~ m,^(?:[\d.]+|[0-9a-f]+)(?:/\d+)?$,) {
    4539         # now make sure
    4540         my $tmp = new NetAddr::IP $filt_val;
    4541         if ($tmp) {
    4542           $sql .= " AND inetlazy(r.val) $filt_op ?";
    4543           push @bindvars, $filt_val;
    4544           $ipfilt = 1;
    4545         } # really looks like a valid IP/CIDR
    4546       } # looks IPish
    4547     } # has CIDR operator
    4548     if (!$ipfilt) {
    4549       # simple text matching, with a bit of mix-n-match to account for .arpa names
    4550       $sql .= " AND (r.host ~* ? OR r.val ~* ? OR r.host ~* ? OR r.val ~* ?)";
    4551       my $tmp = join('.',reverse(split(/\./,$args{filter})));
    4552       push @bindvars, ($args{filter},$args{filter});
    4553       push @bindvars, ($tmp, $tmp);
    4554     }
     4576    _recfilter(filter => $args{filter}, sql => \$sql, bindvars => \@bindvars);
    45554577  }
    45564578
     
    46264648  # Filtering on host/val (mainly normal record list)
    46274649  if ($args{filter}) {
    4628     # not much use to end users, but internal callers may want more fine-grained restriction on CIDR ranges
    4629     # we'll only support the value-comparison operators;  bitwise/add/subtract don't make much sense in this context
    4630     my $ipfilt = 0;
    4631     if ($args{filter} =~ /^\s*(<|<=|=|>=|>|<>|<<|<<=|>>|>>=)\s*([\da-fA-F].+)\s*$/) {
    4632       my $filt_op = $1;
    4633       my $filt_val = $2;
    4634       # do we have an IP-ish value?
    4635       if ($filt_val =~ m,^(?:[\d.]+|[0-9a-f]+)(?:/\d+)?$,) {
    4636         # now make sure
    4637         my $tmp = new NetAddr::IP $filt_val;
    4638         if ($tmp) {
    4639           $sql .= " AND inetlazy(r.val) $filt_op ?";
    4640           push @bindvars, $filt_val;
    4641           $ipfilt = 1;
    4642         } # really looks like a valid IP/CIDR
    4643       } # looks IPish
    4644     } # has CIDR operator
    4645     if (!$ipfilt) {
    4646       # simple text matching, with a bit of mix-n-match to account for .arpa names
    4647       $sql .= " AND (r.host ~* ? OR r.val ~* ? OR r.host ~* ? OR r.val ~* ?)";
    4648       my $tmp = join('.',reverse(split(/\./,$args{filter})));
    4649       push @bindvars, ($args{filter},$args{filter});
    4650       push @bindvars, ($tmp, $tmp);
    4651     }
     4650    _recfilter(filter => $args{filter}, sql => \$sql, bindvars => \@bindvars);
    46524651  }
    46534652
     
    47004699  return ('FAIL', "host must contain a value") if !$$host;
    47014700  return ('FAIL', "val must contain a value") if !$$val;
     4701
     4702  return ('FAIL', "expires must be 1, 't', or 'until',  or 0, 'f', or 'after'")
     4703        if ($stamp && !$expires)
     4704        || ($stamp && $expires ne '0' && $expires ne '1' && $expires ne 't' && $expires ne 'f');
    47024705
    47034706  # Spaces are evil.
     
    47964799  local $dbh->{RaiseError} = 1;
    47974800
     4801  my $retid;
    47984802  eval {
    4799     $dbh->do("INSERT INTO "._rectable($defrec, $revrec)." ($fields) VALUES ($vallen)",
    4800         undef, @vallist);
     4803    ($retid) = $dbh->selectrow_array("INSERT INTO "._rectable($defrec, $revrec)." ($fields) VALUES ($vallen) RETURNING record_id",
     4804        undef,
     4805        @vallist
     4806        ) || 'Falsey ID returned';
    48014807    $self->_updateserial(%logdata);
    48024808    $self->_log(%logdata);
     
    48164822
    48174823  $resultstr = $logdata{entry};
    4818   return ($retcode, $retmsg);
     4824  return ($retcode, $retmsg, $retid);
    48194825
    48204826} # end addRec()
     
    48534859  # just set it to an empty string;  failures will be caught later.
    48544860  $$host = '' if !$$host;
     4861
     4862  return ('FAIL', "expires must be 1, 't', or 'until',  or 0, 'f', or 'after'")
     4863        if ($stamp && !$expires)
     4864        || ($stamp && $expires ne '0' && $expires ne '1' && $expires ne 't' && $expires ne 'f');
    48554865
    48564866  # Spaces are evil.
     
    52585268JOIN rectypes t ON r.type = t.val
    52595269LEFT JOIN locations l ON r.location = l.location
    5260 WHERE r.type <> 6 AND (r.host ~* ? OR r.val ~* ?)
    5261 );
     5270WHERE r.type <> 6);
    52625271
    52635272
     
    52715280
    52725281  my $sql = "SELECT count(*)".$recsearchsqlbase;
     5282
     5283  my @bindargs;
     5284  _recfilter(filter => $args{searchfor}, sql => \$sql, bindvars => \@bindargs);
    52735285
    52745286  # Limit scope based on group
     
    52865298  }
    52875299
    5288   my $count = $dbh->selectrow_array($sql, undef, $args{searchfor}, $args{searchfor});
     5300  my $count = $dbh->selectrow_array($sql, undef, @bindargs);
    52895301  $errstr = $dbh->errstr if !$count;
    52905302  return $count;
     
    53085320    r.host, t.name AS rectype, r.val, l.description AS location, r.record_id).
    53095321    $recsearchsqlbase;
     5322
     5323  my @bindargs;
     5324  _recfilter(filter => $args{searchfor}, sql => \$sql, bindvars => \@bindargs);
    53105325
    53115326  # Limit scope based on group
     
    53455360
    53465361##fixme: should probably sent the warning somewhere else
    5347   my $ret = $dbh->selectall_arrayref($sql, { Slice => {} }, $args{searchfor}, $args{searchfor})
     5362  my $ret = $dbh->selectall_arrayref($sql, { Slice => {} }, @bindargs)
    53485363    or warn $dbh->errstr;
    53495364  return $ret;
     
    64596474        "FROM records WHERE domain_id=? AND type=6");
    64606475  $recsth = $dbh->prepare("SELECT host,type,val,distance,weight,port,ttl,record_id,location,extract(epoch from stamp),expires,stampactive ".
    6461         "FROM records WHERE domain_id=? AND NOT type=6");       # Just exclude all types relating to rDNS
     6476        "FROM records WHERE domain_id=? AND NOT type=6".        # Just exclude all types relating to rDNS
     6477        "ORDER BY masklen(inetlazy(val)) DESC, inetlazy(val)");
    64626478#       "FROM records WHERE domain_id=? AND type < 65280");     # Just exclude all types relating to rDNS
    64636479  my $domsth = $dbh->prepare("SELECT domain_id,domain,status,changed FROM domains WHERE status=1 ORDER BY domain_id");
     
    66906706    my $stamp = shift;
    66916707    my $loc = shift;
    6692     my $zone = new NetAddr::IP shift;
     6708    my $zone = shift;
     6709    # error/sanity check - if $zone is not an IP address, make sure we're just
     6710    # converting a string that looks like an IP into a NetAddr::IP, instead of
     6711    # doing a DNS lookup that is virtually guaranteed to be wrong.  still a
     6712    # little hazy where this functionality in NetAddr::IP is useful.
     6713    # instead, fall back to the octet-boundary CIDR derived from $sub.
     6714    if ($zone !~ m,^\d+\.\d+\.\d+\.\d+/\d+$,) {
     6715      $zone = $sub;
     6716      $zone =~ s,\d+/\d+$,0/24,;   ##fixme:  case of larger than /24?
     6717      # could apply another sanity check here?  as above anything much larger
     6718      # than a /16 is WAY too time-consuming to publish in one go
     6719    }
     6720    $zone = new NetAddr::IP $zone;
    66936721    my $ptronly = shift || 0;
    66946722
     
    68096837      } else {
    68106838        # call sub to convert 1-4 hex digits to 2 string-rep octal bytes
    6811         $altconv[$altgrp++] = octalize($_)
     6839        $altconv[$altgrp++] = octalize($_);
    68126840      }
    68136841    }
     
    69346962  elsif ($typemap{$type} eq 'PTR') {
    69356963    $$recflags{$val}++;
     6964
     6965    # technically a PTR template thing, but Bad Data Happens
     6966    return if $host =~ /\%blank\%/;
     6967
    69366968    if ($revrec eq 'y') {
    69376969
     
    69656997  elsif ($type == 65280) { # A+PTR
    69666998    $$recflags{$val}++;
     6999
     7000    # technically a PTR template thing, but Bad Data Happens
     7001    return if $host =~ /\%blank\%/;
     7002
    69677003    print $datafile "=$host:$val:$ttl:$stamp:$loc\n" or die $!;
    69687004  } # A+PTR
  • branches/stable/Makefile

    r1032 r1047  
    100100        @mkdir -p $(DESTDIR)${datadir}/$(PKG_LEAF)/templates
    101101        @$(INSTALL_DATA) $(TEMPLATES) $(DESTDIR)${datadir}/$(PKG_LEAF)/templates
    102         @# munge in necessary 'use lib ...' bits so scripts can find libs and config...
    103         @# datadir is correct;  no arch-specific files
    104102        @for i in $(SCRIPTS) $(MODULES); do \
    105103                $(INSTALL_SCRIPT) -D $$i $(DESTDIR)${datadir}/$(PKG_LEAF)/$$i ; \
    106                 perl -pi -e "s|use lib '.';\s+##uselib##|use lib '${datadir}/$(PKG_LEAF)/';|;" $(DESTDIR)${datadir}/$(PKG_LEAF)/$$i ; \
    107104        done
    108105        @$(INSTALL) -d $(DESTDIR)${sysconfdir}/$(CFG_LEAF)/
  • branches/stable/compact-recs.pl

    r1033 r1047  
    44##
    55# $Id$
    6 # Copyright 2013,2014,2018 Kris Deugau <kdeugau@deepnet.cx>
     6# Copyright 2013,2014,2018,2020 Kris Deugau <kdeugau@deepnet.cx>
    77#
    88#    This program is free software: you can redistribute it and/or modify
     
    2323use warnings;
    2424
    25 use lib '.';    ##uselib##
     25# push "the directory the script is in" into @INC
     26use FindBin;
     27use lib "$FindBin::RealBin/";
     28
    2629use DNSDB;
    2730
  • branches/stable/dns-rpc.cgi

    r1037 r1047  
    33##
    44# $Id$
    5 # Copyright 2012-2016 Kris Deugau <kdeugau@deepnet.cx>
     5# Copyright 2012-2016,2020-2025 Kris Deugau <kdeugau@deepnet.cx>
    66#
    77#    This program is free software: you can redistribute it and/or modify
     
    2222use warnings;
    2323
    24 # don't remove!  required for GNU/FHS-ish install from tarball
    25 use lib '.';    ##uselib##
     24# push "the directory the script is in" into @INC
     25use FindBin;
     26use lib "$FindBin::RealBin/";
     27
    2628use DNSDB;
    2729
     
    5052#sub revName {
    5153        'dnsdb.domainID'        => \&domainID,
    52 #sub revID {
     54        'dnsdb.revID'           => \&revID,
    5355        'dnsdb.addRDNS'         => \&addRDNS,
    5456#sub getZoneCount {
     
    372374}
    373375
    374 #sub revID {}
     376=head3 revID
     377
     378Retrieve the ID for a reverse zone
     379
     380=over 4
     381
     382=item revzone
     383
     384The reverse zone to find the ID for, in CIDR form.
     385
     386=back
     387
     388Returns the integer ID of the domain if found.
     389
     390=cut
     391sub revID {
     392  my %args = @_;
     393
     394  _commoncheck(\%args, 'y');
     395
     396  my $revid = $dnsdb->revID($args{revzone}, $args{location});
     397  die $dnsdb->errstr."\n" if !$revid;
     398  return $revid;
     399}
     400
    375401
    376402
     
    16151641  die "Need location\n" if !defined($args{location});
    16161642
     1643  # quick sanity-check version
     1644  die "CIDR is either poorly formed or not an IP/netblock at all\n" if !DNSDB::_maybeip(\$args{cidr});
     1645  my $cidr = new NetAddr::IP $args{cidr};
     1646  die "CIDR is not a valid IP/netblock\n" if !$cidr;
     1647
    16171648  # much like addOrUpdateRevRec()
    16181649  my $zonelist = $dnsdb->getZonesByCIDR(%args);
    1619   my $cidr = new NetAddr::IP $args{cidr};
    16201650
    16211651  if (scalar(@$zonelist) == 0) {
     
    16651695                     ($cidr->masklen != 32 ? "$cidr" : $cidr->addr) );
    16661696        my $reclist = $dnsdb->getRecList(rpc => 1, defrec => 'n', revrec => 'y', location => $args{location},
    1667           id => $zonelist->[0]->{rdns_id}, filter => $filt, sortby => 'val', sortorder => 'DESC');
     1697          id => $zonelist->[0]->{rdns_id}, filter => $filt, sortby => 'val', sortorder => 'DESC', offset => 'all');
    16681698        foreach my $rec (@$reclist) {
    16691699          my $reccidr = new NetAddr::IP $rec->{val};
  • branches/stable/dns.cgi

    r1033 r1047  
    33##
    44# $Id$
    5 # Copyright 2008-2019 Kris Deugau <kdeugau@deepnet.cx>
     5# Copyright 2008-2020 Kris Deugau <kdeugau@deepnet.cx>
    66#
    77#    This program is free software: you can redistribute it and/or modify
     
    3535#  return ! eval { eval("#" . substr(join("", @_), 0, 0)); 1 };
    3636#}
    37 #use Cwd 'abs_path';
    38 #use File::Basename;
    39 #use lib dirname( abs_path $0 );
    40 #die "argh!  tainted!" if is_tainted($0);
    41 #die "argh! \@INC got tainted!" if is_tainted(@INC);
    42 
    43 # don't remove!  required for GNU/FHS-ish install from tarball
    44 use lib '.';    ##uselib##
     37
     38# Taint-safe (ish) voodoo to push "the directory the script is in" into @INC.
     39# See https://secure.deepnet.cx/trac/dnsadmin/ticket/80 for more gory details on how we got here.
     40use File::Spec ();
     41use File::Basename ();
     42my $path;
     43BEGIN {
     44    $path = File::Basename::dirname(File::Spec->rel2abs($0));
     45    if ($path =~ /(.*)/) {
     46        $path = $1;
     47    }
     48}
     49use lib $path;
    4550
    4651use DNSDB;
     
    120125$webvar{startwith} =~ s/^(0-9|[a-z]).*/$1/ if $webvar{startwith};
    121126# not much call for chars not allowed in domain names
    122 $webvar{filter} =~ s/[^a-zA-Z0-9_.:\@%-]//g if $webvar{filter};
     127# allow <>= so searches can use the Postgres CIDR operators
     128# allow , for things like DMARC records
     129$webvar{filter} =~ s{[^a-zA-Z0-9_.,:\@%<>=/-]}{}g if $webvar{filter};
    123130## only set 'y' if box is checked, no other values legal
    124131## however, see https://secure.deepnet.cx/trac/dnsadmin/ticket/31
     
    18971904  # need to search on characters outside this set until we get into IDNs
    18981905  # note this is a little larger due to template records
    1899   $webvar{searchfor} =~ s/[^a-zA-Z0-9_.:\@%-]//g if $webvar{searchfor};
     1906  # allow <>= so searches can use the Postgres CIDR operators
     1907  # allow , for things like DMARC records
     1908  $webvar{searchfor} =~ s{[^a-zA-Z0-9_.,:\@%<>=/-]}{}g if $webvar{searchfor};
    19001909
    19011910  # save the search in the session, same as the "filter" in various other lists...
     
    23472356#  }
    23482357  $page->param(domtable => $zonelist);
    2349 } # end listdomains()
     2358} # end listzones()
    23502359
    23512360
  • branches/stable/dns.sql

    r1032 r1047  
    3131
    3232COPY misc (misc_id, key, value) FROM stdin;
    33 1       dbversion       1.4.0
     331       dbversion       1.4.2
    3434\.
    3535
     
    27027061      OPENPGPKEY      5       255     255
    27127162      CSYNC   5       255     255
     27263      ZONEMD  255     255     255
     27364      SVCB    255     255     255
     27465      HTTPS   255     255     255
    27227599      SPF     5       255     54
    273276100     UINFO   5       255     62
     
    289292255     *       5       255     255
    290293256     URI     5       255     255
    291 257     CAA     5       255     255
     294257     CAA     1       17      255
    292295258     AVC     5       255     255
     296259     DOA     255     255     255
     297260     AMTRELAY        255     255     255
    29329832768   TA      5       255     57
    29429932769   DLV     5       255     11
  • branches/stable/dnsdb.conf

    r725 r1047  
    4747
    4848# Show formal .arpa zone name instead of the natural IP or CIDR for reverse zone names and records?
    49 #showrev_arpa = 0
     49# Valid values are none, zone, record, or all
     50#showrev_arpa = zone
    5051
    5152# Let DNS server autosplit long TXT records however it pleases, or hand-generate the split points?
  • branches/stable/export.pl

    r582 r1047  
    2222use warnings;
    2323
    24 # don't remove!  required for GNU/FHS-ish install from tarball
    25 use lib '.';    ##uselib##
     24# push "the directory the script is in" into @INC
     25use FindBin;
     26use lib "$FindBin::RealBin/";
    2627
    2728use DNSDB;
  • branches/stable/mergerecs

    r1033 r1047  
    33##
    44# $Id$
    5 # Copyright 2014,2016,2018 Kris Deugau <kdeugau@deepnet.cx>
     5# Copyright 2014,2016,2018,2020 Kris Deugau <kdeugau@deepnet.cx>
    66#
    77#    This program is free software: you can redistribute it and/or modify
     
    2727use Data::Dumper;
    2828
    29 # don't remove!  required for GNU/FHS-ish install from tarball
    30 use lib '.';    ##uselib##
     29# push "the directory the script is in" into @INC
     30use FindBin;
     31use lib "$FindBin::RealBin/";
    3132
    3233use DNSDB;
  • branches/stable/notes

    r756 r1047  
    327327-> would solve the conundrum of what to do with the unsightly CNAME
    328328   records presented in the UI to indicate sub-octet zone delegation
     329see also https://www.zytrax.com/books/dns/ch8/dname.html for comments and RFC
     330refs for rDNS delegation.  note that even sub-/16 delegations can't just use
     331NS records, they need DNAME
     332
     333maybe consider a permissioned metatype to allow for delegated customer self-management of eg /29 or /28 blocks?
     334
     335
     336full subdomain NS records need to be seconded into parent zone on BIND export
     337
    329338
    330339BIND reference for views/locations/split-horizon
    331340https://kb.isc.org/article/AA-00851/0/Understanding-views-in-BIND-9-by-example.html
    332 
    333 HTML calendar widget?
    334 http://www.cssflow.com/snippets/tag/date-picker  (paid)
  • branches/stable/templates/recsearch.tmpl

    r756 r1047  
    5454<TMPL_IF rdns_id>
    5555<td><a href="<TMPL_VAR NAME=script_self>&amp;page=record&amp;parentid=<TMPL_VAR
    56  NAME=domain_id>&amp;defrec=n&amp;revrec=y&amp;recact=edit&amp;id=<TMPL_VAR
     56 NAME=rdns_id>&amp;defrec=n&amp;revrec=y&amp;recact=edit&amp;id=<TMPL_VAR
    5757 NAME=record_id>"><TMPL_VAR NAME=val></a></td>
    5858<TMPL_ELSE>
  • branches/stable/textrecs.cgi

    r756 r1047  
    33##
    44# $Id$
    5 # Copyright 2012-2014 Kris Deugau <kdeugau@deepnet.cx>
     5# Copyright 2012-2014,2020 Kris Deugau <kdeugau@deepnet.cx>
    66#
    77#    This program is free software: you can redistribute it and/or modify
     
    2828use DBI;
    2929
    30 # don't remove!  required for GNU/FHS-ish install from tarball
    31 use lib '.';    ##uselib##
     30# push "the directory the script is in" into @INC
     31use FindBin;
     32use lib "$FindBin::RealBin/";
    3233
    3334use DNSDB;
  • branches/stable/tiny-import.pl

    r1033 r1047  
    33##
    44# $Id$
    5 # Copyright 2012-2014 Kris Deugau <kdeugau@deepnet.cx>
     5# Copyright 2012-2014,2020 Kris Deugau <kdeugau@deepnet.cx>
    66#
    77#    This program is free software: you can redistribute it and/or modify
     
    2828use Time::TAI64 qw(:tai);
    2929
    30 use lib '.';    ##uselib##
     30# push "the directory the script is in" into @INC
     31use FindBin;
     32use lib "$FindBin::RealBin/";
     33
    3134use DNSDB;
    3235
  • branches/stable/vega-import.pl

    r548 r1047  
    33##
    44# $Id$
    5 # Copyright 2011-2013 Kris Deugau <kdeugau@deepnet.cx>
     5# Copyright 2011-2013,2020 Kris Deugau <kdeugau@deepnet.cx>
    66#
    77#    This program is free software: you can redistribute it and/or modify
     
    2828use DBI;
    2929use Data::Dumper;
     30
     31# push "the directory the script is in" into @INC
     32use FindBin;
     33use lib "$FindBin::RealBin/";
    3034
    3135use DNSDB;
Note: See TracChangeset for help on using the changeset viewer.