Skip to content

Instantly share code, notes, and snippets.

@luisbebop
Created November 13, 2009 18:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save luisbebop/234052 to your computer and use it in GitHub Desktop.
Save luisbebop/234052 to your computer and use it in GitHub Desktop.
Use this script to parse Walk Server 2 log files
# http://rubular.com/regexes/11722
# sudo gem install dm-core
# sudo gem install dm-validations
# sudo gem install do_sqlite3
# parse walk server (www.planobe.com.br) log files and write to a database called walk_server.sqlite3 on current directory/db
# Using:
# ruby wsparser.rb walk_server2/LOGS/
require 'rubygems'
require 'dm-core'
require 'dm-validations'
require 'csv'
class Terminal
include DataMapper::Resource
property :id, Serial
property :terminal_number, String
property :walk_version, String
property :serial_number, String
property :last_connected, DateTime
validates_is_unique :serial_number
end
def process_line(line)
first_frame_protocol_walk = /\A(.*?) ::\sfd \d{1,} :: Terminal (.*?) : >[-a-z0-9]*,[-a-z0-9]{14,14}(.{4}?).*<sn>(.*?)<\/sn>/i
if line =~ first_frame_protocol_walk
add_terminal(line.scan(first_frame_protocol_walk)[0])
end
end
def add_terminal(params)
last_connected, terminal_number, walk_version, serial_number = params
@terminal = Terminal.first(:serial_number => serial_number)
if @terminal
@terminal.last_connected = last_connected
@terminal.terminal_number = terminal_number
@terminal.walk_version = walk_version
@terminal.save
else
Terminal.new( :last_connected => last_connected,
:terminal_number => terminal_number,
:walk_version => walk_version,
:serial_number=> serial_number).save
puts "Adding terminal #{serial_number} ..."
end
end
def init_datamapper
FileUtils.mkdir_p "#{Dir.pwd}/db"
DataMapper.setup(:default, "sqlite3://#{Dir.pwd}/db/walk_server.sqlite3")
DataMapper.auto_upgrade!
end
def read_directory(path)
num_files = Dir.glob("#{path}/*.log").size
task("Starting processing of #{num_files} log files") do
Dir.glob("#{path}/*.log").each_with_index do |file,i|
task("Reading log file (#{i+1}/#{num_files}): #{file}") do
File.readlines(file).each { |line| process_line(line) }
"Finished reading log file #{file}"
end
end
"Finished processing of #{num_files} log files"
end
end
def task(msg, &block)
puts "---> #{msg}..."
start = Time.now
result = block.call || 'done'
finish = Time.now
time = sprintf("%0.1f", finish - start)
puts "===> #{result} (#{time}s)"
result
end
def generate_csv()
task("Generating CSV file: walk_server.csv") do
CSV.open('walk_server.csv', 'w', ';') do |writer|
writer << ["Numero", "Versao WALK", "Numero Serial", "Data Ultima Conexao"]
Terminal.all.each do |t|
writer << [t.terminal_number,t.walk_version,t.serial_number,t.last_connected]
end
end
"CSV file generated: walk_server.csv"
end
end
init_datamapper
read_directory(ARGV[0])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment