[#399938] how to read arrary with an array — "Richard D." <lists@...>

Hello. I believe this is basic question, but I'm just starting to learn

19 messages 2012/10/02

[#400050] img src while sending email ruby cgi — Ferdous ara <lists@...>

Hi

16 messages 2012/10/05

[#400351] Drop 1st and last particular character — ajay paswan <lists@...>

What is the most efficient way to drop '#' from the first place and last

15 messages 2012/10/16

[#400374] database part of a desktop application — "Sebastjan H." <lists@...>

Hi,

14 messages 2012/10/16
[#400375] Re: database part of a desktop application — Chad Perrin <code@...> 2012/10/16

On Wed, Oct 17, 2012 at 05:28:39AM +0900, Sebastjan H. wrote:

[#400377] Re: database part of a desktop application — sto.mar@... 2012/10/17

Am 16.10.2012 23:24, schrieb Chad Perrin:

[#400389] Re: database part of a desktop application — Chad Perrin <code@...> 2012/10/17

On Wed, Oct 17, 2012 at 01:39:21PM +0900, sto.mar@web.de wrote:

[#400386] Unable to send attachment, and dealing with multiple attachment — ajay paswan <lists@...>

Hi,

11 messages 2012/10/17

[#400454] Hash with Integer key issue — Wayne Simmerson <lists@...>

Hi Im new to Ruby and am getting some unexpected results from a

18 messages 2012/10/19

[#400535] Name/symbol/object type clash? What is happening here? — Todd Benson <caduceass@...>

It's nonsense code, but I'm curious as to what is going on behind the scenes...

41 messages 2012/10/23

[#400556] Calling a method foo() or an object foo.method_call_here - both — Marc Heiler <lists@...>

Hello.

13 messages 2012/10/24

[#400650] OpenSSL ECDSA public key from private — Nokan Emiro <uzleepito@...>

Hi,

11 messages 2012/10/27

[#400680] Passing folder as argument ARGV? — Joz Private <lists@...>

Is there an easy way to pass multiple files on the command line?

15 messages 2012/10/28
[#400681] Re: Passing folder as argument ARGV? — brad smith <bradleydsmith@...> 2012/10/28

How are you traversing the directory you pass in on the command line ?

[#400697] File.readable? and /proc — Jeff Moore <lists@...>

root@nail:/projects/proc_fs# uname -a

13 messages 2012/10/28

[#400714] Marshal.load weird issue — "Pierre J." <lists@...>

Hi guys

12 messages 2012/10/28

[#400781] bug?: local variable created in if modifier not available in modified expression — "Mean L." <lists@...>

irb(main):001:0> local1 if local1 = "created"

21 messages 2012/10/30
[#400807] Re: bug?: local variable created in if modifier not available in modified expression — Bartosz Dziewoński <matma.rex@...> 2012/10/31

Oh, and in case it wasn't apparent: you can just add

[#400808] Re: bug?: local variable created in if modifier not available in modified expression — Eliezer Croitoru <eliezer@...> 2012/10/31

On 10/31/2012 4:52 PM, Bartosz Dziewoナгki wrote:

[#400809] Re: bug?: local variable created in if modifier not available in modified expression — Robert Klemme <shortcutter@...> 2012/10/31

On Wed, Oct 31, 2012 at 4:28 PM, Eliezer Croitoru <eliezer@ngtech.co.il>wrote:

[#400784] REXML & HTMLentities incorrectly map to UTF-8 — "Mark S." <lists@...>

I have some XML data (UTF 8) that I'm trying to convert into another XML

13 messages 2012/10/30

Re: Trying to convert some configuration files to a different output

From: Brian Candler <lists@...>
Date: 2012-10-25 08:39:21 UTC
List: ruby-talk #400596
=begin
A note about the structure:

* a route map has a name and a list of entries
* a route map entry has a priority (in Cisco world anyway), a list
  of matches, and a list of actions

So let's make an object which holds the data for one route map entry
=end

class RouteMapEntry
  attr_accessor :priority, :conditions, :actions
  def initialize
    @priority = nil
    @conditions = []
    @actions = []
  end
end

=begin
Parsing a single route map entry is pretty simple; we can use regular
expressions to match the 'match' and 'set' lines, and convert them to
the relevant Juniper form before storing them in a RouteMapEntry.

For flexibility, we will write this parser so it assumes that the first
line (the route-map header) has already been parsed, and it returns the
first unparseable line. This allows us easily to assemble different 
parsers
if we want to parse an entire Cisco config.
=end

def parse_cisco_routemap_entry(src, priority)
  rme = RouteMapEntry.new
  rme.priority = priority
  loop do
    line = src.gets
    line.strip! if line   # remove leading/trailing whitespace
    case line
    when /^match as-path (\d+)$/
      rme.conditions << "as-path in aspath#{$1}"
    when /^match ip address prefix-list (\S+)$/
      rme.conditions << "destination in #{$1}"
    when /^set local-preference (\d+)$/
      rme.actions << "set local-preference #{$1}"
    when /^set community (.*)$/
      rme.actions << "set community (#{$1})"
    # add more here as required
    else
      # EOF or any unrecognised line terminates this routemap entry
      return [rme, line]
    end
  end
end

=begin
So now we parse a whole series of routemaps. In general a config
may have multiple named routemaps, so we build a hash of them.
=end

def parse_cisco_routemaps(src)
  routemaps = {}   # {"name" => [RouteMapEntry, RouteMapEntry, ...]}
  line = src.gets
  while line
    line.strip!  # remove leading/trailing whitespace
    case line
    when /^!/, /^\s*$/
      # skip comment or empty line
      line = src.gets
    when /^route-map (\S+) permit (\d+)$/
      name, priority = $1, $2.to_i
      rme, line = parse_cisco_routemap_entry(src, priority)
      routemaps[name] ||= []
      routemaps[name] << rme
    else
      $stderr.puts "Unrecognized line: #{line.inspect}"
      line = src.gets
    end
  end
  return routemaps
end

=begin
We need to be able to assemble a list of routemaps into Juniper form
=end

def write_juniper_routemaps(routemaps, dest=$stdout)
  routemaps.each do |name,routemap_entries|
    dest << "route-policy #{name}\n"
    dest << "  apply bogons\n"
    routemap_entries = routemap_entries.sort_by { |e| e.priority }
    cond = "if"
    routemap_entries.each do |rme|
      if rme.conditions.empty?
        dest << "  else\n"
      else
        dest << "  #{cond} #{rme.conditions.join(" and ")} then\n"
      end
      rme.actions.each do |action|
        dest << "    #{action}\n"
      end
      break if rme.conditions.empty?
      cond = "elseif"
    end
    dest << "  endif\n"
    dest << "end-policy\n"
  end
end

# Testing

src = <<EOS
route-map 6300-test-in permit 5
 match as-path 1
 set local-preference 90
 set community 65000:1 65000:3 65000:1000 65000:3000 65000:3500 
65000:3613
!
route-map 6300-test-in permit 10
 match ip address prefix-list 6300-pref-low
 set local-preference 90
 set community 65000:1 65000:3 65000:1000 65000:3000 65000:3500 
65000:3613
!
route-map 6300-test-in permit 5000
 set local-preference 200
 set community 65000:1 65000:3 65000:1000 65000:3000 65000:3500 
65000:3613
EOS

require 'stringio'
rms = parse_cisco_routemaps(StringIO.new(src))
write_juniper_routemaps(rms)

# Real main program might look like this:
#   rms = parse_cisco_routemaps($stdin)
#   write_juniper_routemaps(rms)

-- 
Posted via http://www.ruby-forum.com/.

In This Thread

Prev Next