|
@ -0,0 +1,74 @@ |
|
|
|
|
|
#!/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 |