#!/usr/bin/ruby1.8 -I/usr/lib/opendnssec
#
# $Id: ods-auditor.in 3150 2010-04-08 11:36:13Z jakob $
#
# Copyright (c) 2009 Nominet UK. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#

require 'kasp_auditor.rb'
require 'optparse'
require 'ostruct'

include KASPAuditor

class OptionsParser
#
    # Return a structure describing the options.
    #
    def self.parse(args)
      # The options specified on the command line will be collected in *options*.
      # We set default values here.
      path = "/etc/opendnssec"
      options = OpenStruct.new
      options.enable_timeshift = false
      options.default_conf_file = path + "/conf.xml"
      options.zone_name = nil
      options.signed_temp = nil
      options.unsigned_file = nil
      options.force_full = false
      options.force_partial = false

      opts = OptionParser.new do |opts|
        opts.banner = "Usage: ods-auditor [options]"

        opts.separator ""
        opts.separator "Specific options:"

        # conf.xml
        opts.on("-c", "--conf [PATH_TO_CONF_FILE]",
                "Path to OpenDNSSEC configuration file",
                "  (defaults to " + options.default_conf_file + ")") do |ext|
          options.conf_file = ext
        end

        # kasp.xml
        opts.on("-k", "--kasp [PATH_TO_KASP_FILE]",
                "Path to KASP policy file",
                "  (defaults to the path given in the configuration file)") do |ext|
          options.kasp_file = ext
        end

        # zone_name
        opts.on("-z", "--zone [ZONE_NAME]",
                "Single zone to audit",
                "  (defaults to audit all zones)") do |ext|
          options.zone_name = ext
        end

        # signed_temp
        opts.on("-s", "--signed [PATH_TO_SIGNED_FILE]",
                "If a single zone is specified, then this option may override",
                "  the specified signed file with another.",
                "  (defaults to the path given in the zone list)") do |ext|
          options.signed_temp = ext
        end

        # unsigned_zone
        opts.on("-u", "--unsigned [PATH_TO_UNSIGNED_FILE]",
                "If a single zone is specified, then this option may override",
                "  the specified unsigned file with another.",
                "  (defaults to the path given in the zone list)") do |ext|
          options.unsigned_zone = ext
        end

        # Force full audit
        opts.on("-f", "--full", "Force a full audit") do |ff|
           options.force_full = ff
        end

        # Force partial audit
        opts.on("-p", "--partial", "Force a partial audit") do |fp|
           options.force_partial = fp
        end


        opts.on("-v", "--version", # Override default
               "Display version information") do |x|
           print "1.1.3\n"
           exit(1)
        end



        opts.separator ""
        opts.separator "Common options:"

        # No argument, shows at tail.  This will print an options summary.
        # Try it and see!
        opts.on_tail("-h", "-?", "--help", "Show this message") do
          puts opts
          exit(1)
        end

      end

      begin
        opts.parse!(args)
      rescue OptionParser::InvalidOption => e
        print "#{e}\n"
        puts opts
        exit(1)
      end
      options
    end  # parse()
end

  options = OptionsParser.parse(ARGV)
runner = Runner.new
if (options.conf_file)
    runner.conf_file = options.conf_file
else
    runner.conf_file = options.default_conf_file
end
if (options.kasp_file)
    runner.kasp_file = options.kasp_file
end
if (options.zone_name)
  runner.zone_name = options.zone_name
end
if (options.signed_temp)
  runner.signed_temp = options.signed_temp
end
if (options.unsigned_zone)
  runner.unsigned_zone = options.unsigned_zone
end
if (options.enable_timeshift)
  runner.enable_timeshift = true
end
if (options.force_full && options.force_partial)
  print "Can't force both full and partial audits at once\n"
  exit(1)
end
if (options.force_full)
  runner.force_full
elsif (options.force_partial)
  runner.force_partial
end
runner.working_folder = "/var/opendnssec/tmp"
runner.run()
