/usr/share/zonecheck/zc/dbg.rb is in zonecheck 3.0.5-3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 | # $Id: dbg.rb,v 1.30 2010/06/23 12:03:59 chabannf Exp $
# 
# CONTACT     : zonecheck@nic.fr
# AUTHOR      : Stephane D'Alu <sdalu@nic.fr>
#
# CREATED     : 2002/09/16 13:31:29
# REVISION    : $Revision: 1.30 $ 
# DATE        : $Date: 2010/06/23 12:03:59 $
#
# CONTRIBUTORS: (see also CREDITS file)
#
#
# LICENSE     : GPL v3
# COPYRIGHT   : AFNIC (c) 2003
#
# This file is part of ZoneCheck.
#
# ZoneCheck is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
# 
# ZoneCheck is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with ZoneCheck; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
module ZoneCheck
require 'thread'
##
## Debugging
##
class DBG
    #
    # Debugging types
    #
    INIT	= 0x0001	# Initialisation
    LOCALE	= 0x0002	# Localization / Internationalisation
    CONFIG	= 0x0004	# Configuration
    AUTOCONF	= 0x0008	# Autoconf
    LOADING	= 0x0010	# Loading tests
    TESTS	= 0x0020	# Tests performed
    TESTDBG	= 0x0040	# Debugging messages from tests
    CACHE_INFO	= 0x0400	# Information about cached object
    DBG		= 0x0800	# Debugger itself
    CRAZYDEBUG	= 0x1000	# Crazy Debug, don't try it...
    DNSRUBY	= 0x2000	# Dnsruby debugging messages
    NOCACHE	= 0x4000	# Disable caching
    DONT_RESCUE	= 0x8000	# Don't try to rescue exceptions
    #
    # Tag associated with some types
    #
    Tag = { 
	INIT		=> 'init',
	LOCALE		=> 'locale',
	CONFIG		=> 'config',
	AUTOCONF	=> 'autoconf',
	LOADING		=> 'loading',
	TESTS		=> 'tests',
	TESTDBG		=> 'testdbg',
	CACHE_INFO	=> 'cache',
	DBG		=> 'dbg'
    }
    #
    # Initializer
    #
    def initialize(lvl=0, output=$stderr)
	@output = output
	@lvl    = lvl
	@mutex	= Mutex::new
  @old_messages = []
	msg(DBG) { "Debugger initialized at level %0x" % @lvl }
    end
    #
    # Test if debug is enabled for that type
    #
    def enabled?(type) 
	@lvl & type != 0
    end
    alias [] enabled?
    #
    # Enable debugging for the specified type
    #
    def []=(type, enable)
	self.level = enable ? @lvl | type : @lvl & ~type
    end
    #
    # Change debugging level
    #
    def level=(lvl)
	old_crazydebug	= enabled?(CRAZYDEBUG)
	old_dnsruby	= enabled?(DNSRUBY)
	# parsing
	case lvl
	when String then @lvl = lvl =~ /^0x/ ? lvl.hex : lvl.to_i
	when Fixnum then @lvl = lvl
	else raise ArgumentError, "unable to interprete: #{lvl}"
	end
	
	# message
	msg(DBG) { "Setting level to 0x%0x" % lvl }
	# enable/disable Dnsruby
	if enabled?(DNSRUBY) ^ old_dnsruby
    Dnsruby::TheLog.level = Logger::DEBUG if enabled?(DNSRUBY)
	end
	# enable/disable CrazyDebug
	if enabled?(CRAZYDEBUG) ^ old_crazydebug
	    dbgfunc = if enabled?(CRAZYDEBUG)
			  proc { |event, file, line, id, binding, classname|
				@output.printf "%8s %s:%-2d %10s %8s\n", 
    				event, file, line, id, classname }
		      else
			  nil
		      end
	    set_trace_func(dbgfunc)
	end
	    failed_messages = @old_messages
      
      @mutex.synchronize {
        @old_messages = []
      }
      failed_messages.each {|type,msg|
        msg(type,msg) unless msg.nil?
      }
    end
    #
    # Print debugging message
    # WARN: It is adviced to use a block instead of the string 
    #       second argument, as this will provide a lazy evaluation
    #
    def msg(type, arg=nil)
	unless block_given? ^ !arg.nil?
	    raise ArgumentError, 'either string or block should be given'
	end
	arg = yield if block_given?
	
	arg = arg.to_s
  unless enabled?(type)
    @mutex.synchronize {
      @old_messages << [type,arg]
	  }
	  return 
	end
	@mutex.synchronize {
	    case arg
	    when Array
		case arg.size
		when 0
		    raise ArgumentError, 'the array argument must not be empty'
		when 1
		    @output.puts "DBG[#{Tag[type]}]: #{arg[0]}"
		else
		    tag       = "DBG[#{Tag[type]}]"
		    tagfiller = " " * tag.size
		    @output.puts "#{tag}: #{arg[0]}"
		    arg[1..-1].each { |l|
			@output.puts "#{tagfiller}| #{l}" }
		end
	    else
		@output.puts "DBG[#{Tag[type]}]: #{arg}"
	    end
	}
    end
    def self.status2str(status, ok=true)
	case status
	when FalseClass, TrueClass then status == ok ? 'passed' : 'failed'
	when NilClass,   Exception then 'exception'
	else                            'n/a'
	end
    end
end
end
 |