#! /usr/bin/env ruby require 'erb' require 'optparse' def v6rev(input) # Parse the input to separate address and netmask address, netmask = input.split('/') netmask = netmask.to_i # Calculate how many bits we actually have (128 - missing bits) remaining_bits = 128 - netmask remaining_groups = remaining_bits / 16 # Expand the partial address within the context of just the remaining bits expanded_suffix = expand_ipv6_suffix(address, remaining_groups) # Convert to hex string and get nibbles hex_string = expanded_suffix.gsub(':', '') # Split into individual nibbles and reverse for PTR format nibbles = hex_string.chars.reverse # Join with dots nibbles.join('.') end def expand_ipv6_suffix(address, total_groups) # Handle :: expansion within the context of just our suffix if address.include?('::') parts = address.split('::') left_parts = parts[0].empty? ? [] : parts[0].split(':') right_parts = parts[1].empty? ? [] : parts[1].split(':') # Calculate how many zero groups we need missing_groups = total_groups - left_parts.length - right_parts.length zero_groups = ['0000'] * missing_groups all_parts = left_parts + zero_groups + right_parts else all_parts = address.split(':') end # Pad each part to 4 digits all_parts.map { |part| part.rjust(4, '0') }.join(':') end # Hash to store our -D variables template_vars = {} # Parse command line options OptionParser.new do |opts| opts.banner = "Usage: #{$0} [options] " opts.on('-DVAR=VALUE', 'Define template variable') do |definition| var, value = definition.split('=', 2) if var && value template_vars[var] = value else puts "Invalid -D format: #{definition}" exit 1 end end opts.on('-h', '--help', 'Show this help') do puts opts exit end end.parse! # Check we have the right number of remaining args if ARGV.length != 2 puts "Usage: #{$0} [options] " puts "Use -h for help" exit 1 end input_file = ARGV[0] output_file = ARGV[1] # Read the template template = File.read(input_file) # Create a binding with our variables binding_context = binding template_vars.each do |var, value| binding_context.local_variable_set(var.to_sym, value) end # Process with ERB erb = ERB.new(template, trim_mode: '-') result = erb.result(binding_context) # Write output File.write(output_file, result)