|
#!/usr/bin/env ruby
|
|
#
|
|
# hal_device_tree.rb
|
|
#
|
|
# Print a tree from the output of hal-device
|
|
# Useful to analyse bug reports
|
|
#
|
|
|
|
require 'getopts'
|
|
require 'open-uri'
|
|
|
|
def parse_file(path)
|
|
io = path
|
|
io = open(io) if io.class != IO
|
|
|
|
list = Array.new
|
|
current = nil
|
|
io.each_line do |line|
|
|
if line =~ /^\d/
|
|
list << current unless current.nil?
|
|
current = Hash.new
|
|
next
|
|
end
|
|
|
|
line.gsub!(/\(.*\)/, '')
|
|
line.gsub!("'", '')
|
|
k,v = line.split('=')
|
|
next if k.strip.empty?
|
|
current[k.strip] = v.strip
|
|
end
|
|
|
|
list
|
|
end
|
|
|
|
def print_node(node, pad = 0)
|
|
print '|'
|
|
pad.times { print "----" }
|
|
print '-- '
|
|
|
|
print "#{node['info.category']} " if node['info.category']
|
|
print "#{node['info.product']} " if node['info.product']
|
|
print " -> #{node['info.udi']}" if $OPT_u
|
|
puts
|
|
end
|
|
|
|
def collect_children(list, root)
|
|
root['childs'] = Array.new
|
|
children = list.select { |e| e['info.parent'] == root['info.udi'] }
|
|
children.each do |child|
|
|
root['childs'] << child
|
|
collect_children(list, child)
|
|
end
|
|
end
|
|
|
|
def print_children(root, pad = 1)
|
|
root['childs'].each do |child|
|
|
print_node(child, pad)
|
|
if not child['childs'].empty?
|
|
print_children(child, pad + 1)
|
|
end
|
|
end
|
|
end
|
|
|
|
raise ArgumentError if getopts('uf:').nil?
|
|
|
|
list = parse_file($OPT_f || STDIN)
|
|
roots = list.select { |e| e['info.parent'].match(/computer/) unless e['info.parent'].nil? }
|
|
|
|
roots.each do |root|
|
|
collect_children(list, root)
|
|
print_node(root)
|
|
print_children(root)
|
|
puts '|'
|
|
end
|