start and end scripts run automatically
[zcc.git] / ztargets / irspy_yaml.rb
blobc22f2dc3b3485b7d844a4cb08fcf2dcafd3b1a00
1 # (C) Jason Ronallo\r
2 #July 2007\r
3 \r
4 require 'rubygems'\r
5 require "rexml/document"\r
6 require "rexml/xpath"\r
7 $KCODE = 'u'\r
8 require 'jcode'\r
9 \r
11 puts "this will take a while..."\r
12 contents = open(ARGV[0], 'r') { |f| f.read }\r
13 puts "finished reading in file..."\r
14 contents.gsub!("\n", '')\r
15 #puts contents\r
16 puts "splitting the file up!"\r
17 records = contents.split('<?xml version="1.0" encoding="UTF-8"?>')\r
19 match = 0\r
20 good_matches = 0\r
21 really_good_matches = 0\r
22 ok_matches = 0\r
23 all_lines = []\r
24 oks = []\r
25 nums = []\r
26 records.each do |record|\r
27   next if record == ""\r
28   puts "---------------------------"\r
29   puts "rexml is reading in the contents of a record..."\r
30   rec = REXML::Document.new record\r
31     puts rec.elements["explain/recordInfo"]\r
32     #STDIN.gets\r
33      #puts rec.elements["databaseInfo/title"].text\r
34       if rec.elements["explain/databaseInfo/title"]\r
35         puts "Looking in #{rec.elements["explain/databaseInfo/title"].text} ..."\r
36       else\r
37         puts "Untitled... "\r
38       end\r
39       if rec.elements["explain/recordInfo/recordSyntax[@name='usmarc']"] || rec.elements["explain/recordInfo/recordSyntax[@name='USmarc']"]\r
40         \r
41         #get record syntaxes supported\r
42         syntaxes = []\r
43         rec.elements.each("explain/recordInfo/recordSyntax") do |syn|\r
44           syntaxes << syn.attributes["name"]\r
45         end\r
47         \r
48         if rec.elements["explain/serverInfo[@protocol='Z39.50']"]\r
49           puts "we've got a match!"\r
50           match += 1\r
51           \r
52           #how reliable is the target?\r
53           a = []\r
54           rec.elements.each("explain/irspy:status/irspy:probe") do | elem |\r
55             a << elem.attributes["ok"]\r
56           end\r
57           total = 0\r
58           a.each do |b|\r
59             total += b.to_i\r
60           end\r
61           puts total\r
62           puts a.length\r
63           ok = 0.0\r
64           unless a.length == 0\r
65             ok =  100.0 * (total.to_f / a.length.to_f)\r
66             if ok < 50\r
67               puts "not a reliable site!"\r
68               #STDIN.gets\r
69               next\r
70             end\r
71             puts ok.floor\r
72             oks << ok.floor\r
73           end            \r
74           \r
75           \r
76           #create the yaml\r
77             line =  "- [ " + rec.elements["explain/serverInfo/host"].text + ",  "  \r
78             line << rec.elements["explain/serverInfo/port"].text + ",  "\r
79             line << rec.elements["explain/serverInfo/database"].text    \r
80             if ok > 90\r
81               num = 100 - ok.floor + 10 + rand(90)\r
82               line << ", #{num}] #"\r
83               nums << num\r
84             else\r
85               line << ", #{ok.floor + 100}] #"\r
86             end\r
87                       \r
88             line << rec.elements["explain/databaseInfo/title"].text if rec.elements["explain/databaseInfo/title"] && rec.elements["explain/databaseInfo/title"].text\r
89             line << "  " + ok.floor.to_s + '%' if ok\r
90             line << " | " + syntaxes.join(", ")\r
91             puts line\r
92             #STDIN.gets\r
93             all_lines << line << "\n"\r
94         end\r
95       end\r
96 end\r
97   puts all_lines\r
98   puts "matches: #{match}"\r
99   \r
101   File.open("irspy-#{Time.now.strftime("%Y%m%d%H%M%S")}\.yaml", "w") do |f|\r
102     f.write all_lines\r
103   end\r
104   oks.sort!\r
105   puts oks.join(", ")\r
106   puts "------------------------"\r
107   nums.sort!\r
108   puts nums.join(" + ")\r
109   \r
110  # puts "really reliable 98%+: #{really_good_matches}"\r
111   #puts "reliable 95%+:        #{good_matches}"\r
112   #puts "still good 90%+       #{ok_matches}"\r