#!/usr/bin/env ruby $levels = [] %w( 01-hub2 02-hub3 03-switch3 ).each do |file| require "./#{file}" end $level = $levels.shift def help puts <<~EOF Commands: f {iface}: forward the frame to iface h: this help n: next frame d: show the level description a: show the click frames and actions q: quit EOF end $instructions = [] def forward(iface) if !$level.interfaces.include?(iface) puts "#{iface} is not an interface in this device" return end $instructions << $frame.to(iface) end def clickactions puts "Frame #{$click}:" puts " Interfaces:" puts " #{$level.interfaces.join(", ")}" puts " Frame:" puts " #{$frame.description} from Interface #{$frame.iface}" puts " Actions:" $instructions.each_with_index do |instr, idx| puts " #{idx + 1}: Forward frame to interface #{instr.iface}" end end $click = 1 def click right = 0 wrong = 0 targetframes = $level.target($frame) $instructions.each do |frame| if targetframes.include?(frame) right += 1 targetframes.delete(frame) else wrong += 1 end end wrong += targetframes.count puts "#{right} out of #{right+wrong} correct" $instructions = [] $level.click $click += 1 if $click > $level.clicks $click = 1 $level = $levels.shift if $level.nil? puts "Demo all done" exit 0 end puts puts $level.description puts end $frame = $level.generate clickactions end def handle(cmd) case cmd.split[0] when ?f arg = cmd.split[1] if arg.nil? puts "f {iface}" else forward(arg) end when ?d puts $level.description when ?a clickactions when ?n click when ?q exit 0 when nil else help end end puts $level.description puts $frame = $level.generate clickactions loop do print ">: " handle(gets.strip) end