Hardware authentication for Linux using ordinary USB Flash Drives.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

74 lines
1.4 KiB

#!/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