summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorelijah <elijah@riseup.net>2016-04-06 13:41:24 -0700
committerelijah <elijah@riseup.net>2016-04-06 13:41:24 -0700
commit44666c42ce836fb611dfd9c1b549e955c470814c (patch)
treed3a4521f178690c9149db7c4c1fdeee3052e6f4e
parent90e1d3ec113d2644b659fd6ed9af7d2b94393407 (diff)
leap compile zone: added zone serial number.
-rw-r--r--lib/leap_cli/commands/compile.rb43
1 files changed, 38 insertions, 5 deletions
diff --git a/lib/leap_cli/commands/compile.rb b/lib/leap_cli/commands/compile.rb
index 47b003eb..f9079279 100644
--- a/lib/leap_cli/commands/compile.rb
+++ b/lib/leap_cli/commands/compile.rb
@@ -18,7 +18,7 @@ module LeapCli
c.command :zone do |zone|
zone.action do |global_options, options, args|
compile_command(nil)
- compile_zone_file
+ compile_zone_file(global_options[:yes] || global_options[:force])
end
end
@@ -280,7 +280,7 @@ remove this directory if you don't use it.
#
# serial is any number less than 2^32 (4294967296)
#
- def compile_zone_file
+ def compile_zone_file(force=false)
# note: we use the default provider for all nodes, because we use it
# to generate hostnames that are relative to the default domain.
provider = manager.env('default').provider
@@ -290,7 +290,12 @@ remove this directory if you don't use it.
#
# header
#
- lines << ZONE_HEADER % {:domain => provider.domain, :ns => provider.domain, :contact => provider.contacts.default.first.sub('@','.')}
+ lines << ZONE_HEADER % {
+ :domain => provider.domain,
+ :ns => provider.domain,
+ :contact => provider.contacts.default.first.sub('@','.'),
+ :serial => generate_zone_serial
+ }
#
# common records
@@ -302,11 +307,22 @@ remove this directory if you don't use it.
lines << ["@", "IN A #{node.ip_address}"]
end
end
+
# NS records
if provider['dns'] && provider.dns['nameservers']
+ unless provider.dns.nameservers.is_a?(Array)
+ # TODO: remove me once we have JSON schema working
+ bail! {log :error, 'dns.nameservers must be an array' }
+ end
provider.dns.nameservers.each do |ns|
- lines << ["@", "IN NS #{ns}."]
+ lines << ["@", "IN NS #{ns}."]
end
+ elsif !force
+ log :warning, "Property dns.nameservers is not configured in provider.json." do
+ log "This will produce a zone file without any NS records."
+ log "Use --force to skip this warning."
+ end
+ return unless agree("Continue? ")
end
# environment records
@@ -341,6 +357,7 @@ remove this directory if you don't use it.
# print the lines
max_width = lines.inject(0) {|max, line| line.is_a?(Array) ? [max, line[0].length].max : max}
+ max_width = [max_width, 24].min
lines.each do |host, line|
if line.nil?
puts(host)
@@ -426,6 +443,22 @@ remove this directory if you don't use it.
'"' + str.scan(/.{1,255}/).join('" "') + '"'
end
+ #
+ # For zone serial number, we want something that will be
+ # different each time you deploy but also will be greater
+ # than any prior likely serial that was prefixed by the
+ # year, such as 2016040600.
+ #
+ # so, we use time_t of right now, modified with first
+ # digit incremented by one.
+ #
+ # this will work until Time.at(2**32 - 1_000_000_000)
+ # aka 2074-05-31 04:41:36 UTC.
+ #
+ def generate_zone_serial
+ Time.now.utc.to_i + 1_000_000_000
+ end
+
ENV_HEADER = %[
;;
;; ENVIRONMENT %s
@@ -442,7 +475,7 @@ $TTL 600
$ORIGIN %{domain}.
@ IN SOA %{ns}. %{contact}. (
- 0000 ; serial
+ %{serial} ; serial
7200 ; refresh ( 24 hours)
3600 ; retry ( 2 hours)
1209600 ; expire (1000 hours)