Changeset 1051 for trunk


Ignore:
Timestamp:
03/06/26 11:33:19 (3 days ago)
Author:
Kris Deugau
Message:

/trunk

Reintegrate /branches/cname-collision
See #72

Location:
trunk
Files:
5 edited
3 copied

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/DNSDB.pm

    r1036 r1051  
    3333use Fcntl qw(:flock);
    3434use Time::TAI64 qw(:tai64);
     35use Date::Parse;
    3536
    3637use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
     
    222223                force_refresh   => 1,
    223224                lowercase       => 0,   # mangle as little as possible by default
     225                # tinker with timestamps if adding or updating a record would
     226                # cause overlapping CNAME and other in some way
     227                coerce_cname_timestamp => 'none',
    224228                # show IPs and CIDR blocks as-is for reverse zones.  valid values are
    225229                # 'none' (default, show natural IP or CIDR)
     
    283287    warn "Bad showrev_arpa setting $self->{showrev_arpa}, using default\n";
    284288    $self->{showrev_arpa} = 'none';
     289  }
     290  if (!grep /$self->{coerce_cname_timestamp}/, ('none','adjust','full')) {
     291    warn "Bad coerce_cname_timestamp setting $self->{coerce_cname_timestamp}, using default\n";
     292    $self->{coerce_cname_timestamp} = 'none';
    285293  }
    286294
     
    612620##
    613621
     622# Check for name collisions relating to CNAMEs.  Needs to be called from all other validators.
     623sub _cname_collision {
     624  my $self = shift;
     625  my $dbh = $self->{dbh};
     626
     627  my %args = @_;
     628
     629  my $hcheck = ($args{revrec} eq 'y' ? ${$args{val}} : ${$args{host}});
     630  my $hfield = ($args{revrec} eq 'y' ? 'val' : 'host');
     631
     632  # $hcheck should be normalized by the time this sub is called.  Convert to the formal .arpa name for error reporting in reverse zones.
     633  my $arpaname = '';
     634  if ($args{revrec} eq 'y') {
     635    $arpaname = NetAddr::IP->new($hcheck);
     636##fixme:  more voodoo if global and/or per-user ARPA display mode flag set this way or that
     637    $arpaname = _ZONE($arpaname, 'ZONE', 'r', '.').($arpaname->{isv6} ? '.ip6.arpa' : '.in-addr.arpa');
     638  }
     639
     640  # The record type comparison is the only difference between two passes through this chunk of code.
     641  # CNAME records require both passes, where other records only need the second one.  Downside is
     642  # that returning error messages needs to check the loop variable on top of whatever else it references.
     643  foreach my $tcompare ('<>', '=') {
     644    next if $tcompare eq '<>' && ${$args{rectype}} != 5;
     645
     646    # Merging these sets of SQL statements is far too messy and doesn't reasonably
     647    # allow for more fine-grained error/warning messages to be returned
     648
     649    # First lookup fails out collisions with records without timestamps or default records (which can not have timestamps)
     650    my $sql = "SELECT count(*) FROM "._rectable($args{defrec}, $args{revrec}).
     651        " WHERE "._recparent($args{defrec}, $args{revrec})." = ? AND type $tcompare 5 AND $hfield = ?";
     652    my @lookupargs = ($args{id}, $hcheck);
     653    $sql .= " AND stampactive = 'f'" if $args{defrec} eq 'n';
     654    if ($args{update}) {
     655      $sql .= " AND record_id <> ?";
     656      push @lookupargs, $args{update};
     657    }
     658    my @t = $dbh->selectrow_array($sql, undef, @lookupargs);
     659    if ($t[0] > 0) {
     660      if ($tcompare eq '<>') {
     661        return ('FAIL', "One or more non-CNAME records already exist for ".($args{revrec} eq 'y' ? $arpaname : $hcheck).
     662                ".  CNAME records cannot use the same name as other records.");
     663      } else {
     664        return ('FAIL', "There is already a CNAME present for ".($args{revrec} eq 'y' ? $arpaname : $hcheck).
     665                ".  Only one CNAME may be present for a given name.");
     666      }
     667    }
     668
     669    # By this point, all failure cases for default records have been checked.
     670    # Default records cannot carry timestamps, so cannot have timestamp-based collisions
     671    return ('OK','OK') if $args{defrec} ne 'n';
     672
     673    # Second lookup fails out various timestamp-exists collision cases when adding/updating with a timestamp
     674    $sql = "SELECT count(*) FROM "._rectable($args{defrec}, $args{revrec}).
     675        " WHERE "._recparent($args{defrec}, $args{revrec})." = ? AND type $tcompare 5 AND $hfield = ?".
     676        " AND stampactive = 't'";
     677    @lookupargs = ($args{id}, $hcheck);
     678    if (${$args{stamp}} && ${$args{expires}}) {
     679      $sql .= " AND expires = ?";
     680      push @lookupargs, ${$args{expires}};
     681      if ($self->{coerce_cname_timestamp} eq 'none') {
     682        # no coercion means new valid-after < existing expires or new expires > existing valid-after will fail
     683        $sql .= " AND ". (${$args{expires}} eq 'f' ? "expires = 't' AND stamp <= ?)" : "expires = 'f' AND stamp >= ?");
     684        push @lookupargs, ${$args{stamp}};
     685      }
     686    }
     687    if ($args{update}) {
     688      $sql .= " AND record_id <> ?";
     689      push @lookupargs, $args{update};
     690    }
     691    @t = $dbh->selectrow_array($sql, undef, @lookupargs);
     692    if ($t[0] > 0) {
     693      if ($tcompare eq '<>') {
     694        return ('FAIL', "One or more non-CNAME records with timestamps already exist for ".($args{revrec} eq 'y' ? $arpaname : $hcheck).
     695                ".  CNAME records must expire before or become valid after any records with the same name.");
     696      } else {
     697        return ('FAIL', "There is already a CNAME with a timestamp present for ".($args{revrec} eq 'y' ? $arpaname : $hcheck).
     698                ".  Records with a matching name must expire before or become valid after this CNAME.");
     699      }
     700    }
     701
     702    # Third check starts retrieving actual timestamps to see if we need to,
     703    # and then if we can, coerce the new/updated record's timestamp to match
     704    $sql = "SELECT extract(epoch from stamp),expires,stamp < now() FROM "._rectable($args{defrec}, $args{revrec}).
     705        " WHERE "._recparent($args{defrec}, $args{revrec})." = ? AND type $tcompare 5 AND $hfield = ?".
     706        " AND stampactive = 't'";
     707    @lookupargs = ($args{id}, $hcheck);
     708    if ($args{update}) {
     709      $sql .= " AND record_id <> ?";
     710      push @lookupargs, $args{update};
     711    }
     712    if (${$args{stamp}}) {
     713      $sql .= " ORDER BY stamp ".(${$args{expires}} eq 'f' ? 'ASC' : 'DESC' )." LIMIT 1";
     714    } else {
     715      $sql .= " ORDER BY stamp LIMIT 1";
     716    }
     717    @t = $dbh->selectrow_array($sql, undef, @lookupargs);
     718    if (@t) {
     719      # caller requested an expiry time
     720      my $reqstamp = str2time(${$args{stamp}});
     721      if (${$args{expires}} eq 'f') {
     722        if ($reqstamp > $t[0]) {
     723          # do nothing, new record goes valid after the expiring record we found
     724        } else {
     725          if ($self->{coerce_cname_timestamp} eq 'adjust') {
     726            # coerce the valid-after timestamp
     727            ${$args{stamp}} = strftime('%Y-%m-%d %H:%M:%S', localtime($t[0]));
     728            return ('WARN', $typemap{${$args{rectype}}}." ".($args{update} ? 'updated' : 'added').
     729                " with modified valid-after time;  conflicting expiring record found");
     730          } else {
     731            # New valid-after overlaps existing expiry, and not configured to adjust it
     732            my $fill = ($tcompare eq '<>' ? ' CNAME, another record' : $typemap{${$args{rectype}}}.', a CNAME');
     733            return ('FAIL', "Cannot ".($args{update} ? 'update' : 'add').$fill.
     734                " with a valid-after time already exists for this name");
     735          }
     736        } # else ($reqstamp < $t[0])
     737      } else {
     738        if ($reqstamp < $t[0]) {
     739          # do nothing, new record will expire before the one we found
     740        } else {
     741          if ($self->{coerce_cname_timestamp} eq 'adjust') {
     742            if ($t[2] == 1) {
     743              # found a valid-after, but it's in the past, so adding an expiring record to match doesn't make
     744              # sense since it's effectively expired.
     745##fixme:  should probably remove this case once we get around to stripping valid-after timestamps once exported as active
     746              return ('FAIL', "Cannot ".($args{update} ? 'update' : 'add')." ".$typemap{${$args{rectype}}}.
     747                ", an existing valid-after record is already active for this name");
     748            } else {
     749              # coerce the expiry timestamp
     750              ${$args{stamp}} = strftime('%Y-%m-%d %H:%M:%S', localtime($t[0]));
     751              return ('WARN', $typemap{${$args{rectype}}}." ".($args{update} ? 'updated' : 'added').
     752                " with modified expiry time;  conflicting valid-after record found");
     753            }
     754          } else {
     755            return ('FAIL', "Cannot ".($args{update} ? 'update' : 'add')." ".$typemap{${$args{rectype}}}.
     756                ", another record with an overlapping valid-after timestamp already exists for this name");
     757          }
     758        }
     759      } # args{expires} ne 'f'
     760    } # if @t
     761
     762  } # each $tcompare
     763
     764  return ('OK', 'OK');
     765} # _cname_collision()
     766
    614767## All of these subs take substantially the same arguments:
    615768# a hash containing at least the following keys:
     
    808961      return ('FAIL', "The bare zone name may not be a CNAME") if ${$args{host}} eq $pname || ${$args{host}} =~ /^\@/;
    809962
    810 ##enhance:  Look up the passed value to see if it exists.  Ooo, fancy.
    811963      return ('FAIL', $errstr) if ! _check_hostname_form(${$args{val}}, ${$args{rectype}}, $args{defrec}, $args{revrec});
     964
    812965    } # $zname !~ .rpz
    813966  } # revzone eq 'n'
     
    16661819
    16671820  return ('WARN', join("\n", $errstr, $warnmsg) ) if $warnmsg;
    1668  
     1821
    16691822  return ('OK','OK');
    16701823} # done ALIAS record
     
    22222375      $cfg->{lowercase}         = $1 if /^lowercase\s*=\s*([a-z01]+)/i;
    22232376      $cfg->{showrev_arpa}      = $1 if /^showrev_arpa\s*=\s*([a-z]+)/i;
     2377      $cfg->{coerce_cname_timestamp}    = $1 if /^coerce_cname_timestamp\s*=\s*([a-z]+)/i;
    22242378      $cfg->{template_skip_0}   = $1 if /^template_skip_0\s*=\s*([a-z01]+)/i;
    22252379      $cfg->{template_skip_255} = $1 if /^template_skip_255\s*=\s*([a-z01]+)/i;
     
    47614915
    47624916  my $expires = shift || '';
    4763   $expires = 1 if $expires eq 'until';  # Turn some special values into the appropriate booleans.
    4764   $expires = 0 if $expires eq 'after';
     4917  $expires = 't' if $expires eq 'until';        # Turn some special values into the appropriate booleans.
     4918  $expires = 'f' if $expires eq 'after';
     4919  $expires = 't' if $expires eq '1';
     4920  $expires = 'f' if $expires eq '0';
    47654921  my $stamp = shift;
    47664922  $stamp = '' if !$stamp;        # Timestamp should be a string at this point.
     
    47724928  return ('FAIL', "expires must be 1, 't', or 'until',  or 0, 'f', or 'after'")
    47734929        if ($stamp && !defined($expires))
    4774         || ($stamp && $expires ne '0' && $expires ne '1' && $expires ne 't' && $expires ne 'f');
     4930        || ($stamp && $expires ne 't' && $expires ne 'f');
    47754931
    47764932  # Spaces are evil.
     
    48124968        host => $host, rectype => $rectype, val => $val, addr => $addr,
    48134969        dist => \$dist, port => \$port, weight => \$weight,
     4970        stamp => \$stamp, expires => \$expires,
    48144971        fields => \$fields, vallist => \@vallist);
    48154972
    48164973  return ($retcode,$retmsg) if $retcode eq 'FAIL';
     4974
     4975  # Check for CNAME collisions.
     4976##fixme:  should trim the list of arguments, not all of these should be required for CNAME collision checking
     4977  my ($ccode,$cmsg) = _cname_collision($self, defrec => $defrec, revrec => $revrec, id => $id,
     4978        host => $host, rectype => $rectype, val => $val, addr => $addr,
     4979        dist => \$dist, port => \$port, weight => \$weight,
     4980        stamp => \$stamp, expires => \$expires,
     4981        fields => \$fields, vallist => \@vallist);
     4982
     4983  return ($ccode,$cmsg) if $ccode eq 'FAIL';
     4984
     4985  # If both the validator and CNAME collision check return warnings, glue them together
     4986  if ($ccode eq 'WARN') {
     4987    if ($retcode eq 'WARN') {
     4988      $retmsg .= "<br>\n$cmsg";
     4989    } else {
     4990      $retmsg = $cmsg;
     4991    }
     4992    $retcode = 'WARN';
     4993  }
    48174994
    48184995  # Minor cleanup of invalid DNS labels
     
    48735050  $logdata{entry} .= "', TTL $ttl";
    48745051  $logdata{entry} .= ", location ".$self->getLoc($location)->{description} if $location;
    4875   $logdata{entry} .= ($expires ? ', expires at ' : ', valid after ').$stamp if $stamp;
     5052  $logdata{entry} .= ($expires eq 't' ? ', expires at ' : ', valid after ').$stamp if $stamp;
    48765053
    48775054  # Allow transactions, and raise an exception on errors so we can catch it later.
     
    49335110
    49345111  my $expires = shift || '';
    4935   $expires = 1 if $expires eq 'until';  # Turn some special values into the appropriate booleans.
    4936   $expires = 0 if $expires eq 'after';
     5112  $expires = 't' if $expires eq 'until';        # Turn some special values into the appropriate booleans.
     5113  $expires = 'f' if $expires eq 'after';
     5114  $expires = 't' if $expires eq '1';
     5115  $expires = 'f' if $expires eq '0';
    49375116  my $stamp = shift;
    49385117  $stamp = '' if !$stamp;        # Timestamp should be a string at this point.
     
    49435122  return ('FAIL', "expires must be 1, 't', or 'until',  or 0, 'f', or 'after'")
    49445123        if ($stamp && !defined($expires))
    4945         || ($stamp && $expires ne '0' && $expires ne '1' && $expires ne 't' && $expires ne 'f');
     5124        || ($stamp && $expires ne 't' && $expires ne 'f');
    49465125
    49475126  # Spaces are evil.
     
    49895168        host => $host, rectype => $rectype, val => $val, addr => $addr,
    49905169        dist => \$dist, port => \$port, weight => \$weight,
     5170        stamp => \$stamp, expires => \$expires,
    49915171        fields => \$fields, vallist => \@vallist,
    49925172        update => $id);
    49935173
    49945174  return ($retcode,$retmsg) if $retcode eq 'FAIL';
     5175
     5176  # Check for CNAME collisions.
     5177##fixme:  should trim the list of arguments, not all of these should be required for CNAME collision checking
     5178  my ($ccode,$cmsg) = _cname_collision($self, defrec => $defrec, revrec => $revrec,
     5179        id => ($defrec eq 'y' ? $oldrec->{group_id} : ($revrec eq 'n' ? $oldrec->{domain_id} : $oldrec->{rdns_id})),
     5180        host => $host, rectype => $rectype, val => $val, addr => $addr,
     5181        dist => \$dist, port => \$port, weight => \$weight,
     5182        stamp => \$stamp, expires => \$expires,
     5183        fields => \$fields, vallist => \@vallist,
     5184        update => $id);
     5185
     5186  return ($ccode,$cmsg) if $ccode eq 'FAIL';
     5187
     5188  # If both the validator and CNAME collision check return warnings, glue them together
     5189  if ($ccode eq 'WARN') {
     5190    if ($retcode eq 'WARN') {
     5191      $retmsg .= "<br>\n$cmsg";
     5192    } else {
     5193      $retmsg = $cmsg;
     5194    }
     5195    $retcode = 'WARN';
     5196  }
    49955197
    49965198  # Minor cleanup of invalid DNS labels
     
    50915293  $logdata{entry} .= "', TTL $ttl";
    50925294  $logdata{entry} .= ", location ".$self->getLoc($location)->{description} if $location;
    5093   $logdata{entry} .= ($expires ? ', expires at ' : ', valid after ').$stamp if $stamp;
     5295  $logdata{entry} .= ($expires eq 't' ? ', expires at ' : ', valid after ').$stamp if $stamp;
    50945296
    50955297  local $dbh->{AutoCommit} = 0;
  • trunk/dnsdb.conf

    r901 r1051  
    6060#lowercase = 0
    6161
     62# Variously coerce timestamp and valid-after/expiry flags onto a new/updated record if the
     63# record as requested would cause a CNAME to overlap with another record.
     64# adjust:  Adjust the timestamp where an expiry+valid-after would overlap
     65#   - existing record expires, new record has valid-after before expiry => adjust timestamp to match existing record
     66#   - existing record is valid-after, new record has expiry after valid-after => adjust timestamp to match existing record
     67# none: (default) Do not make changes to timestamps to avoid overlap
     68#coerce_cname_timestamp = none
     69
    6270# Show formal .arpa zone name instead of the natural IP or CIDR for reverse zone names and records?
    6371# Valid values are none, zone, record, or all
  • trunk/t/DNSTest.pm

    r985 r1051  
    55##
    66# $Id$
    7 # Copyright 2025 Kris Deugau <kdeugau@deepnet.cx>
     7# Copyright 2025,2026 Kris Deugau <kdeugau@deepnet.cx>
    88#
    99#    This program is free software: you can redistribute it and/or modify
     
    4848        dbuser => 'dnstest',
    4949        dbpass => 'dnstestpwd',
     50
     51        # This exercises more branches of the CNAME collision check with more fine-grained results.
     52        coerce_cname_timestamp => 'adjust',
    5053  );
    5154  ok( defined $dnsdb );
     
    6164
    6265  my ($dcount) = $dbh->selectrow_array("SELECT count(*) FROM domains WHERE NOT domain IN ".
    63         "('example.com','example.net','example.org','expiry1.test','expiry2.test')");
     66        "('example.com','example.net','example.org','expiry1.test','expiry2.test','expiry3.test','cname-blocks1.test')");
    6467  BAIL_OUT("# DB looks like it may not be a test DB, found $dcount > 0 non-test domains!\n")
    6568        if $dcount > 0;
     
    6871  my ($rcount) = $dbh->selectrow_array(qq{SELECT count(*) FROM records WHERE NOT (
    6972        host like '%example.com' or host like '%example.net' or host like '%example.org' or
    70         host like '%expiry1.test' or host like '%expiry2.test' or inetlazy(val) << '192.168.2.0/27'
     73        host like '%expiry_.test' or host like '%cname-blocks_.test' or
     74        inetlazy(val) << '192.168.2.0/27'
    7175        )});
    7276  my $maxrecs = 0;
    73   BAIL_OUT("# DB looks like it may not be a test DB, found $rcount > $maxrecs records!\n")
     77  BAIL_OUT("# DB looks like it may not be a test DB, found $rcount > $maxrecs non-test records!\n")
    7478        if $rcount > $maxrecs;
    7579  cmp_ok( $rcount, '<=', $maxrecs, "non-test record ($rcount): looks like a test DB" );
     
    8387  my $reload = qx( psql -h $dnsdb->{dbhost} -U $dnsdb->{dbuser} $dnsdb->{dbname} 2>&1 < t/dns-unitbase.sql );
    8488  diag( $reload ) if $debug;
     89  # Set timestamps to a sliding window
     90  my $stampwindow = qx( psql -h $dnsdb->{dbhost} -U $dnsdb->{dbuser} $dnsdb->{dbname} 2>&1 < t/test-cname-timestamps.sql );
     91  diag( $stampwindow ) if $debug;
    8592  undef $ENV{PGPASSWORD};
    8693} # new()
  • trunk/t/dns-unitbase.sql

    r965 r1051  
    6576572       example.org     1               1       2025121800      D       f       ac
    6586583       example.net     1               1       2025121800      D       f       ab
    659 4       expiry1.test    1               1       1765992407      D       f       
     6594       expiry1.test    1               1       2026011400      D       t       
     6605       expiry2.test    1               1       2026011901      D       t       
     6616       expiry3.test    1               1       2026020509      D       t       
     6627       cname-blocks1.test      1               1       2026021811      D       t       
    660663\.
    661664
     
    665668--
    666669
    667 SELECT pg_catalog.setval('public.domains_domain_id_seq', 4, true);
     670SELECT pg_catalog.setval('public.domains_domain_id_seq', 7, true);
    668671
    669672
     
    76176453      0       1       1       admin   Initial User    Added record '192.168.2.17 TXT imma blocker!', TTL 2560 2025-12-23 13:06:20.492137-05   1       0
    76276555      0       1       1       admin   Initial User    Added record '192.168.2.18 CNAME 18-2.arpa.example.com', TTL 2560       2026-01-07 16:37:03.094557-05   1       0
     76656      4       1       1       admin   Initial User    Added record 'expired1.expiry1.test A 192.168.2.23', TTL 5400, expires at 2025-12-24 18:30      2026-01-07 17:55:46.022401-05   0       0
     76757      4       1       1       admin   Initial User    Added record 'expired2.expiry1.test TXT imma expire soon', TTL 5400, expires at 2026-01-10 07:00        2026-01-07 17:57:07.015962-05   0       0
     76858      4       1       1       admin   Initial User    Added record 'active-after1.expiry1.test TXT not active yet', TTL 5400, valid after 2026-01-11 11:30    2026-01-07 18:12:57.491476-05   0       0
     76959      4       1       1       admin   Initial User    Added record 'active-after2.expiry1.test TXT I'm done waiting', TTL 5400, expires at 2025-12-31 14:00   2026-01-14 18:02:13.876839-05   0       0
     77060      5       1       1       admin   Initial User    Added active domain expiry2.test        2026-01-15 12:08:59.951774-05   0       0
     77161      5       1       1       admin   Initial User    [new expiry2.test] Added SOA record [contact ns1.example.com] [master hostmaster.expiry2.test] [refresh 10800] [retry 3600] [expire 604800] [minttl 5400], TTL 86400    2026-01-15 12:08:59.951774-05   0       60
     77262      5       1       1       admin   Initial User    [new expiry2.test] Added record 'expiry2.test NS ns2.example.com', TTL 7200     2026-01-15 12:08:59.951774-05   0       60
     77363      5       1       1       admin   Initial User    [new expiry2.test] Added record 'expiry2.test NS ns1.example.com', TTL 7200     2026-01-15 12:08:59.951774-05   0       60
     77464      5       1       1       admin   Initial User    [new expiry2.test] Added record 'expiry2.test A 10.0.0.4', TTL 7200     2026-01-15 12:08:59.951774-05   0       60
     77565      5       1       1       admin   Initial User    [new expiry2.test] Added record 'expiry2.test MX [distance 10] mx1.example.com', TTL 7200       2026-01-15 12:08:59.951774-05   0       60
     77666      5       1       1       admin   Initial User    [new expiry2.test] Added record 'www.expiry2.test CNAME expiry2.test', TTL 10800        2026-01-15 12:08:59.951774-05   0       60
     77767      5       1       1       admin   Initial User    [new expiry2.test] Added record 'expiry2.test TXT "v=spf1 a mx -all"', TTL 10800        2026-01-15 12:08:59.951774-05   0       60
     77868      5       1       1       admin   Initial User    Added record 'expires-at1.expiry2.test TXT Hanging around', TTL 5400    2026-01-15 12:57:28.411931-05   0       0
     77969      5       1       1       admin   Initial User    Added record 'expires-at2.expiry2.test TXT imma expire soon', TTL 5400, expires at 2026-01-15 18:00     2026-01-15 12:58:51.09629-05    0       0
     78070      5       1       1       admin   Initial User    Added record 'expires-at3.expiry2.test TXT active after pending expiry', TTL 5400, expires at 2026-01-15 18:00  2026-01-15 13:21:31.833257-05   0       0
     78171      5       1       1       admin   Initial User    Added record 'expires-at4.expiry2.test TXT active before pending expiry', TTL 5400, expires at 2026-01-15 18:00 2026-01-15 17:59:01.61806-05    0       0
     78272      5       1       1       admin   Initial User    Added record 'expires-at5.expiry2.test TXT expired before now', TTL 5400, expires at 2026-01-15 18:00   2026-01-16 11:50:43.678446-05   0       0
     78373      5       1       1       admin   Initial User    Added record 'valid-after1.expiry2.test TXT always here', TTL 5400      2026-01-16 13:36:36.066418-05   0       0
     78474      5       1       1       admin   Initial User    Added record 'valid-after2.expiry2.test TXT valid soon', TTL 5400, expires at 2026-01-15 18:00  2026-01-16 13:38:57.274666-05   0       0
     78575      5       1       1       admin   Initial User    Added record 'valid-after3.expiry2.test TXT valid days ago', TTL 5400, expires at 2026-01-15 18:00      2026-01-16 13:45:27.179614-05   0       0
     78676      5       1       1       admin   Initial User    Added record 'valid-after4.expiry2.test TXT valid quite soon', TTL 5400, expires at 2026-01-15 18:00    2026-01-19 11:40:07.438603-05   0       0
     78777      5       1       1       admin   Initial User    Added record 'valid-after5.expiry2.test TXT expires before pending valid', TTL 5400, expires at 2026-01-15 18:00        2026-01-19 11:40:55.325144-05   0       0
     78878      6       1       1       admin   Initial User    Added active domain expiry3.test        2026-01-29 18:05:53.678277-05   0       0
     78979      6       1       1       admin   Initial User    [new expiry3.test] Added SOA record [contact ns1.example.com] [master hostmaster.expiry3.test] [refresh 10800] [retry 3600] [expire 604800] [minttl 5400], TTL 86400    2026-01-29 18:05:53.678277-05   0       78
     79080      6       1       1       admin   Initial User    [new expiry3.test] Added record 'expiry3.test NS ns2.example.com', TTL 7200     2026-01-29 18:05:53.678277-05   0       78
     79181      6       1       1       admin   Initial User    [new expiry3.test] Added record 'expiry3.test NS ns1.example.com', TTL 7200     2026-01-29 18:05:53.678277-05   0       78
     79282      6       1       1       admin   Initial User    [new expiry3.test] Added record 'expiry3.test A 10.0.0.4', TTL 7200     2026-01-29 18:05:53.678277-05   0       78
     79383      6       1       1       admin   Initial User    [new expiry3.test] Added record 'expiry3.test MX [distance 10] mx1.example.com', TTL 7200       2026-01-29 18:05:53.678277-05   0       78
     79484      6       1       1       admin   Initial User    [new expiry3.test] Added record 'www.expiry3.test CNAME expiry3.test', TTL 10800        2026-01-29 18:05:53.678277-05   0       78
     79585      6       1       1       admin   Initial User    [new expiry3.test] Added record 'expiry3.test TXT "v=spf1 a mx -all"', TTL 10800        2026-01-29 18:05:53.678277-05   0       78
     79686      6       1       1       admin   Initial User    Added record 'nostamp1a.expiry3.test TXT target - expired', TTL 5400, expires at 2026-01-29 14:00       2026-01-30 15:07:08.695134-05   0       0
     79787      6       1       1       admin   Initial User    Added record 'nostamp2a.expiry3.test TXT target - soon to expire', TTL 5400, expires at 2026-01-31 14:00        2026-01-30 15:07:34.780671-05   0       0
     79888      6       1       1       admin   Initial User    Added record 'nostamp3a.expiry3.test TXT target - valid soon', TTL 5400, valid after 2026-01-31 14:00   2026-01-30 15:07:53.379107-05   0       0
     79989      6       1       1       admin   Initial User    Added record 'nostamp4a.expiry3.test TXT target - already valid', TTL 5400, valid after 2026-01-29 14:00        2026-01-30 15:08:15.4399-05     0       0
     80090      6       1       1       admin   Initial User    Added record 'nostamp1b.expiry3.test TXT to change', TTL 5400   2026-01-30 15:29:48.433198-05   0       0
     80191      6       1       1       admin   Initial User    Added record 'nostamp2b.expiry3.test TXT to change', TTL 5400   2026-01-30 15:29:53.902318-05   0       0
     80292      6       1       1       admin   Initial User    Added record 'nostamp3b.expiry3.test TXT to change', TTL 5400   2026-01-30 15:29:57.875273-05   0       0
     80393      6       1       1       admin   Initial User    Added record 'nostamp4b.expiry3.test TXT to change', TTL 5400   2026-01-30 15:30:01.924263-05   0       0
     80494      6       1       1       admin   Initial User    Added record 'expires1a.expiry3.test TXT target - no timestamp', TTL 5400       2026-02-03 12:02:32.883354-05   0       0
     80595      6       1       1       admin   Initial User    Added record 'expires2a.expiry3.test TXT target - expired', TTL 5400, expires at 2026-01-29 14:00       2026-02-03 12:03:09.031474-05   0       0
     80696      6       1       1       admin   Initial User    Added record 'expires3a.expiry3.test TXT target - expires soon', TTL 5400, expires at 2026-01-31 14:00  2026-02-03 12:04:30.954558-05   0       0
     80797      6       1       1       admin   Initial User    Added record 'expires4a.expiry3.test TXT target - valid soon', TTL 5400, valid after 2026-01-31 14:00   2026-02-03 12:04:52.864866-05   0       0
     80898      6       1       1       admin   Initial User    Added record 'expires5a.expiry3.test TXT target - already valid', TTL 5400, valid after 2026-01-29 14:00        2026-02-03 12:05:10.629373-05   0       0
     80999      6       1       1       admin   Initial User    Added record 'expires6a.expiry3.test TXT target - valid less soon', TTL 5400, valid after 2026-01-15 18:00      2026-02-03 12:05:31.096289-05   0       0
     810100     6       1       1       admin   Initial User    Added record 'expires1b.expiry3.test TXT to change', TTL 5400   2026-02-03 12:05:33.779645-05   0       0
     811101     6       1       1       admin   Initial User    Added record 'expires2b.expiry3.test TXT to change', TTL 5400   2026-02-03 12:05:44.12329-05    0       0
     812102     6       1       1       admin   Initial User    Added record 'expires3b.expiry3.test TXT to change', TTL 5400   2026-02-03 12:05:50.968888-05   0       0
     813103     6       1       1       admin   Initial User    Added record 'expires4b.expiry3.test TXT to change', TTL 5400   2026-02-03 12:05:56.415551-05   0       0
     814104     6       1       1       admin   Initial User    Added record 'expires5b.expiry3.test TXT to change', TTL 5400   2026-02-03 12:06:01.591204-05   0       0
     815105     6       1       1       admin   Initial User    Added record 'expires6b.expiry3.test TXT to change', TTL 5400   2026-02-03 12:06:34.192183-05   0       0
     816106     6       1       1       admin   Initial User    Added record 'validafter1a.expiry3.test TXT target - no timestamp', TTL 5400    2026-02-05 17:06:17.118891-05   0       0
     817107     6       1       1       admin   Initial User    Added record 'validafter2a.expiry3.test TXT target - expires in the future', TTL 5400, expires at 2026-02-05 17:30      2026-02-05 17:07:12.29965-05    0       0
     818108     6       1       1       admin   Initial User    Added record 'validafter3a.expiry3.test TXT target - expires soon', TTL 5400, expires at 2026-02-05 17:30       2026-02-05 17:07:49.064852-05   0       0
     819109     6       1       1       admin   Initial User    Added record 'validafter4a.expiry3.test TXT target - valid less soon', TTL 5400, valid after 2026-02-05 17:30   2026-02-05 17:14:01.474778-05   0       0
     820110     6       1       1       admin   Initial User    Added record 'validafter5a.expiry3.test TXT target - valid soon', TTL 5400, valid after 2026-02-05 17:30        2026-02-05 17:14:25.354496-05   0       0
     821111     6       1       1       admin   Initial User    Added record 'validafter1b.expiry3.test TXT to change', TTL 5400        2026-02-05 17:16:49.945082-05   0       0
     822112     6       1       1       admin   Initial User    Added record 'validafter2b.expiry3.test TXT to change', TTL 5400        2026-02-05 17:16:59.246035-05   0       0
     823113     6       1       1       admin   Initial User    Added record 'validafter3b.expiry3.test TXT to change', TTL 5400        2026-02-05 17:17:04.371248-05   0       0
     824114     6       1       1       admin   Initial User    Added record 'validafter4b.expiry3.test TXT to change', TTL 5400        2026-02-05 17:17:09.60198-05    0       0
     825115     6       1       1       admin   Initial User    Added record 'validafter5b.expiry3.test TXT to change', TTL 5400        2026-02-05 17:17:15.012334-05   0       0
     826116     7       1       1       admin   Initial User    Added active domain cname-blocks1.test  2026-02-18 18:00:14.727439-05   0       0
     827117     7       1       1       admin   Initial User    [new cname-blocks1.test] Added SOA record [contact ns1.example.com] [master hostmaster.cname-blocks1.test] [refresh 10800] [retry 3600] [expire 604800] [minttl 5400], TTL 86400        2026-02-18 18:00:14.727439-05   0       116
     828118     7       1       1       admin   Initial User    [new cname-blocks1.test] Added record 'cname-blocks1.test NS ns2.example.com', TTL 7200 2026-02-18 18:00:14.727439-05   0       116
     829119     7       1       1       admin   Initial User    [new cname-blocks1.test] Added record 'cname-blocks1.test NS ns1.example.com', TTL 7200 2026-02-18 18:00:14.727439-05   0       116
     830120     7       1       1       admin   Initial User    [new cname-blocks1.test] Added record 'cname-blocks1.test A 10.0.0.4', TTL 7200 2026-02-18 18:00:14.727439-05   0       116
     831121     7       1       1       admin   Initial User    [new cname-blocks1.test] Added record 'cname-blocks1.test MX [distance 10] mx1.example.com', TTL 7200   2026-02-18 18:00:14.727439-05   0       116
     832122     7       1       1       admin   Initial User    [new cname-blocks1.test] Added record 'www.cname-blocks1.test CNAME cname-blocks1.test', TTL 10800      2026-02-18 18:00:14.727439-05   0       116
     833123     7       1       1       admin   Initial User    [new cname-blocks1.test] Added record 'cname-blocks1.test TXT "v=spf1 a mx -all"', TTL 10800    2026-02-18 18:00:14.727439-05   0       116
     834124     7       1       1       admin   Initial User    Added record 'blocker01.cname-blocks1.test TXT I do not collide', TTL 5400      2026-02-18 18:00:35.918847-05   0       0
     835125     7       1       1       admin   Initial User    Added record 'blocker02.cname-blocks1.test CNAME target.example.com', TTL 5400  2026-02-18 18:00:54.003589-05   0       0
     836126     7       1       1       admin   Initial User    Added record 'blocker03.cname-blocks1.test CNAME target.example.com', TTL 5400, expires at 2026-02-20 20:20:00-05       2026-02-18 18:01:13.009519-05   0       0
     837127     7       1       1       admin   Initial User    Added record 'blocker04.cname-blocks1.test CNAME target.example.com', TTL 5400, valid after 2026-02-20 20:20:00-05      2026-02-18 18:01:24.142491-05   0       0
     838128     7       1       1       admin   Initial User    Added record 'blocker05.cname-blocks1.test CNAME target.example.com', TTL 5400  2026-02-18 18:02:22.263541-05   0       0
     839129     7       1       1       admin   Initial User    Added record 'blocker06.cname-blocks1.test CNAME target.example.com', TTL 5400, expires at 2026-02-20 20:20:00-05       2026-02-18 18:02:37.418389-05   0       0
     840130     7       1       1       admin   Initial User    Added record 'blocker07.cname-blocks1.test CNAME target.example.com', TTL 5400, valid after 2026-02-20 20:20:00-05      2026-02-18 18:02:47.023266-05   0       0
     841131     7       1       1       admin   Initial User    Added record 'blocker08.cname-blocks1.test CNAME target.example.com', TTL 5400, valid after 2026-02-20 20:20:00-05      2026-02-18 18:02:52.405397-05   0       0
     842132     7       1       1       admin   Initial User    Added record 'blocker09.cname-blocks1.test CNAME target.example.com', TTL 5400  2026-02-18 18:03:11.617403-05   0       0
     843133     7       1       1       admin   Initial User    Added record 'blocker10.cname-blocks1.test CNAME target.example.com', TTL 5400, expires at 2026-02-20 20:20:00-05       2026-02-18 18:03:25.888935-05   0       0
     844134     7       1       1       admin   Initial User    Added record 'blocker11.cname-blocks1.test CNAME target.example.com', TTL 5400, expires at 2026-02-20 20:20:00-05       2026-02-18 18:03:33.383937-05   0       0
     845135     7       1       1       admin   Initial User    Added record 'blocker12.cname-blocks1.test CNAME target.example.com', TTL 5400, valid after 2026-02-20 20:20:00-05      2026-02-18 18:03:41.441495-05   0       0
    763846\.
    764847
     
    768851--
    769852
    770 SELECT pg_catalog.setval('public.log_log_id_seq', 55, true);
     853SELECT pg_catalog.setval('public.log_log_id_seq', 135, true);
    771854
    772855
     
    8559380       45      imma blocker!   16      192.168.2.17    0       0       0       2560    \N      1               1969-12-31 19:00:00-05  f       f       \N
    8569390       46      18-2.arpa.example.com   5       192.168.2.18    0       0       0       2560    \N      1               1969-12-31 19:00:00-05  f       f       \N
     9404       47      expired1.expiry1.test   1       192.168.2.23    0       0       0       5400    \N      0               2025-12-24 18:30:00-05  t       t       \N
     9414       48      expired2.expiry1.test   16      imma expire soon        0       0       0       5400    \N      0               2026-01-10 07:00:00-05  t       t       \N
     9424       49      active-after1.expiry1.test      16      not active yet  0       0       0       5400    \N      0               2026-01-11 11:30:00-05  f       t       \N
     9434       50      active-after2.expiry1.test      16      I'm done waiting        0       0       0       5400    \N      0               2025-12-31 14:00:00-05  f       t       \N
     9445       51      ns1.example.com:hostmaster.expiry2.test 6       10800:3600:604800:5400  0       0       0       86400   \N      0               1969-12-31 19:00:00-05  f       f       \N
     9455       52      expiry2.test    2       ns2.example.com 0       0       0       7200    \N      0               1969-12-31 19:00:00-05  f       f       \N
     9465       53      expiry2.test    2       ns1.example.com 0       0       0       7200    \N      0               1969-12-31 19:00:00-05  f       f       \N
     9475       54      expiry2.test    1       10.0.0.4        0       0       0       7200    \N      0               1969-12-31 19:00:00-05  f       f       \N
     9485       55      expiry2.test    15      mx1.example.com 10      0       0       7200    \N      0               1969-12-31 19:00:00-05  f       f       \N
     9495       56      www.expiry2.test        5       expiry2.test    0       0       0       10800   \N      0               1969-12-31 19:00:00-05  f       f       \N
     9505       57      expiry2.test    16      "v=spf1 a mx -all"      0       0       0       10800   \N      0               1969-12-31 19:00:00-05  f       f       \N
     9515       58      expires-at1.expiry2.test        16      Hanging around  0       0       0       5400    \N      0               1969-12-31 19:00:00-05  f       f       \N
     9525       59      expires-at2.expiry2.test        16      imma expire soon        0       0       0       5400    \N      0               2026-01-15 18:00:00-05  t       t       \N
     9535       60      expires-at3.expiry2.test        16      active after pending expiry     0       0       0       5400    \N      0               2026-01-15 18:00:00-05  f       t       \N
     9545       61      expires-at4.expiry2.test        16      active before pending expiry    0       0       0       5400    \N      0               2026-01-15 18:00:00-05  f       t       \N
     9555       62      expires-at5.expiry2.test        16      expired before now      0       0       0       5400    \N      0               2026-01-15 18:00:00-05  t       t       \N
     9565       63      valid-after1.expiry2.test       16      always here     0       0       0       5400    \N      0               1969-12-31 19:00:00-05  f       f       \N
     9575       64      valid-after2.expiry2.test       16      expires soon    0       0       0       5400    \N      0               2026-01-15 18:00:00-05  t       t       \N
     9585       65      valid-after3.expiry2.test       16      valid days ago  0       0       0       5400    \N      0               2026-01-15 18:00:00-05  f       t       \N
     9595       66      valid-after4.expiry2.test       16      valid quite soon        0       0       0       5400    \N      0               2026-01-15 18:00:00-05  f       t       \N
     9605       67      valid-after5.expiry2.test       16      expires before pending valid    0       0       0       5400    \N      0               2026-01-15 18:00:00-05  t       t       \N
     9616       68      ns1.example.com:hostmaster.expiry3.test 6       10800:3600:604800:5400  0       0       0       86400   \N      0               1969-12-31 19:00:00-05  f       f       \N
     9626       69      expiry3.test    2       ns2.example.com 0       0       0       7200    \N      0               1969-12-31 19:00:00-05  f       f       \N
     9636       70      expiry3.test    2       ns1.example.com 0       0       0       7200    \N      0               1969-12-31 19:00:00-05  f       f       \N
     9646       71      expiry3.test    1       10.0.0.4        0       0       0       7200    \N      0               1969-12-31 19:00:00-05  f       f       \N
     9656       72      expiry3.test    15      mx1.example.com 10      0       0       7200    \N      0               1969-12-31 19:00:00-05  f       f       \N
     9666       73      www.expiry3.test        5       expiry3.test    0       0       0       10800   \N      0               1969-12-31 19:00:00-05  f       f       \N
     9676       74      expiry3.test    16      "v=spf1 a mx -all"      0       0       0       10800   \N      0               1969-12-31 19:00:00-05  f       f       \N
     9686       75      nostamp1a.expiry3.test  16      target - expired        0       0       0       5400    \N      0               2026-01-29 14:00:00-05  t       t       \N
     9696       76      nostamp2a.expiry3.test  16      target - soon to expire 0       0       0       5400    \N      0               2026-01-31 14:00:00-05  t       t       \N
     9706       77      nostamp3a.expiry3.test  16      target - valid soon     0       0       0       5400    \N      0               2026-01-31 14:00:00-05  f       t       \N
     9716       78      nostamp4a.expiry3.test  16      target - already valid  0       0       0       5400    \N      0               2026-01-29 14:00:00-05  f       t       \N
     9726       79      nostamp1b.expiry3.test  16      to change       0       0       0       5400    \N      0               1969-12-31 19:00:00-05  f       f       \N
     9736       80      nostamp2b.expiry3.test  16      to change       0       0       0       5400    \N      0               1969-12-31 19:00:00-05  f       f       \N
     9746       81      nostamp3b.expiry3.test  16      to change       0       0       0       5400    \N      0               1969-12-31 19:00:00-05  f       f       \N
     9756       82      nostamp4b.expiry3.test  16      to change       0       0       0       5400    \N      0               1969-12-31 19:00:00-05  f       f       \N
     9766       83      expires1a.expiry3.test  16      target - no timestamp   0       0       0       5400    \N      0               1969-12-31 19:00:00-05  f       f       \N
     9776       84      expires2a.expiry3.test  16      target - expired        0       0       0       5400    \N      0               2026-01-29 14:00:00-05  t       t       \N
     9786       85      expires3a.expiry3.test  16      target - expires soon   0       0       0       5400    \N      0               2026-01-31 14:00:00-05  t       t       \N
     9796       86      expires4a.expiry3.test  16      target - valid soon     0       0       0       5400    \N      0               2026-01-31 14:00:00-05  f       t       \N
     9806       87      expires5a.expiry3.test  16      target - already valid  0       0       0       5400    \N      0               2026-01-29 14:00:00-05  f       t       \N
     9816       88      expires6a.expiry3.test  16      target - valid less soon        0       0       0       5400    \N      0               2026-01-29 14:00:00-05  f       t       \N
     9826       89      expires1b.expiry3.test  16      to change       0       0       0       5400    \N      0               1969-12-31 19:00:00-05  f       f       \N
     9836       90      expires2b.expiry3.test  16      to change       0       0       0       5400    \N      0               1969-12-31 19:00:00-05  f       f       \N
     9846       91      expires3b.expiry3.test  16      to change       0       0       0       5400    \N      0               1969-12-31 19:00:00-05  f       f       \N
     9856       92      expires4b.expiry3.test  16      to change       0       0       0       5400    \N      0               1969-12-31 19:00:00-05  f       f       \N
     9866       93      expires5b.expiry3.test  16      to change       0       0       0       5400    \N      0               1969-12-31 19:00:00-05  f       f       \N
     9876       94      expires6b.expiry3.test  16      to change       0       0       0       5400    \N      0               1969-12-31 19:00:00-05  f       f       \N
     9886       95      validafter1a.expiry3.test       16      target - no timestamp   0       0       0       5400    \N      0               1969-12-31 19:00:00-05  f       f       \N
     9896       96      validafter2a.expiry3.test       16      target - expires in the future  0       0       0       5400    \N      0               2026-02-05 17:30:00-05  t       t       \N
     9906       97      validafter3a.expiry3.test       16      target - expires soon   0       0       0       5400    \N      0               2026-02-05 17:30:00-05  t       t       \N
     9916       98      validafter4a.expiry3.test       16      target - valid less soon        0       0       0       5400    \N      0               2026-02-05 17:30:00-05  f       t       \N
     9926       99      validafter5a.expiry3.test       16      target - valid soon     0       0       0       5400    \N      0               2026-02-05 17:30:00-05  f       t       \N
     9936       100     validafter1b.expiry3.test       16      to change       0       0       0       5400    \N      0               1969-12-31 19:00:00-05  f       f       \N
     9946       101     validafter2b.expiry3.test       16      to change       0       0       0       5400    \N      0               1969-12-31 19:00:00-05  f       f       \N
     9956       102     validafter3b.expiry3.test       16      to change       0       0       0       5400    \N      0               1969-12-31 19:00:00-05  f       f       \N
     9966       103     validafter4b.expiry3.test       16      to change       0       0       0       5400    \N      0               1969-12-31 19:00:00-05  f       f       \N
     9976       104     validafter5b.expiry3.test       16      to change       0       0       0       5400    \N      0               1969-12-31 19:00:00-05  f       f       \N
     9987       105     ns1.example.com:hostmaster.cname-blocks1.test   6       10800:3600:604800:5400  0       0       0       86400   \N      0               1969-12-31 19:00:00-05  f       f       \N
     9997       106     cname-blocks1.test      2       ns2.example.com 0       0       0       7200    \N      0               1969-12-31 19:00:00-05  f       f       \N
     10007       107     cname-blocks1.test      2       ns1.example.com 0       0       0       7200    \N      0               1969-12-31 19:00:00-05  f       f       \N
     10017       108     cname-blocks1.test      1       10.0.0.4        0       0       0       7200    \N      0               1969-12-31 19:00:00-05  f       f       \N
     10027       109     cname-blocks1.test      15      mx1.example.com 10      0       0       7200    \N      0               1969-12-31 19:00:00-05  f       f       \N
     10037       110     www.cname-blocks1.test  5       cname-blocks1.test      0       0       0       10800   \N      0               1969-12-31 19:00:00-05  f       f       \N
     10047       111     cname-blocks1.test      16      "v=spf1 a mx -all"      0       0       0       10800   \N      0               1969-12-31 19:00:00-05  f       f       \N
     10057       112     blocker01.cname-blocks1.test    16      I do not collide        0       0       0       5400    \N      0               1969-12-31 19:00:00-05  f       f       \N
     10067       113     blocker02.cname-blocks1.test    5       target.example.com      0       0       0       5400    \N      0               1969-12-31 19:00:00-05  f       f       \N
     10077       114     blocker03.cname-blocks1.test    5       target.example.com      0       0       0       5400    \N      0               2026-02-20 20:20:00-05  t       t       \N
     10087       115     blocker04.cname-blocks1.test    5       target.example.com      0       0       0       5400    \N      0               2026-02-20 20:20:00-05  f       t       \N
     10097       116     blocker05.cname-blocks1.test    5       target.example.com      0       0       0       5400    \N      0               1969-12-31 19:00:00-05  f       f       \N
     10107       117     blocker06.cname-blocks1.test    5       target.example.com      0       0       0       5400    \N      0               2026-02-20 20:20:00-05  t       t       \N
     10117       118     blocker07.cname-blocks1.test    5       target.example.com      0       0       0       5400    \N      0               2026-02-20 20:20:00-05  f       t       \N
     10127       119     blocker08.cname-blocks1.test    5       target.example.com      0       0       0       5400    \N      0               2026-02-20 20:20:00-05  f       t       \N
     10137       120     blocker09.cname-blocks1.test    5       target.example.com      0       0       0       5400    \N      0               1969-12-31 19:00:00-05  f       f       \N
     10147       121     blocker10.cname-blocks1.test    5       target.example.com      0       0       0       5400    \N      0               2026-02-20 20:20:00-05  t       t       \N
     10157       122     blocker11.cname-blocks1.test    5       target.example.com      0       0       0       5400    \N      0               2026-02-20 20:20:00-05  t       t       \N
     10167       123     blocker12.cname-blocks1.test    5       target.example.com      0       0       0       5400    \N      0               2026-02-20 20:20:00-05  f       t       \N
    8571017\.
    8581018
     
    8621022--
    8631023
    864 SELECT pg_catalog.setval('public.records_record_id_seq', 46, true);
     1024SELECT pg_catalog.setval('public.records_record_id_seq', 123, true);
    8651025
    8661026
Note: See TracChangeset for help on using the changeset viewer.