#!/usr/local/bin/ruby -Ks # secunia の危険度画像へジャンプ require "open-uri" # これを読み込んでおくと、webpageを、ファイルを開くようにして扱うことができる。 # --------------------------------------------------------- 初期設定 Expire = 60 # キャッシュの寿命(分) n = 0 # ダウンロードするページの番号初期値 b = "error" # ブラウザの種類初期値 c = 6 # 危険度の状態初期値 Q = ENV['QUERY_STRING'] endne = /Most\s+Popular\s+Advisories/ # ページセパレータ。このキーワードにマッチした部分以降は読み込まない。 # --------------------------------------------------------- パラメータ調整 if /^i.*5/i =~ Q then n = 10; b = "ie5" # ie5 elsif /^i.*7/i =~ Q then n = 12366; b = "ie7" # ie7 elsif /^i/i =~ Q then n = 11; b = "ie6" # ie6 elsif /^f/i =~ Q then n = 12434; b = "firefox" # firefox2 elsif /^o/i =~ Q then n = 10615; b = "opera" # opera9 elsif /^s/i =~ Q then n = 5289; b = "safari" # safari2 elsif /\A(\d+)\Z/ =~ Q then n = $1 ; b = n # 任意 end # --------------------------------------------------------- 関数 def disp(n) # 結果を画像に出力して終わるメソッド img = File.open("var/#{ n }.gif","rb"){|f| f.read } # 画像ファイルを読み込む puts "Content-type: image/gif" # ヘッダを出力:mime type puts "Content-Disposition: filename=\"crit_#{ n }.gif\"" # ヘッダを出力:保存時のファイル名 puts "Content-Length: #{ img.length }" # ヘッダを出力:データ長さ puts # ヘッダと本文の間の空行を出力 print img # 画像ファイルを出力 exit end # --------------------------------------------------------- プログラムメイン disp("error") if n == 0 || !FileTest.file?("var/#{ b }.txt") # クエリー又はデータファイルが無いとエラー c = File.open("var/#{ b }.txt"){|f| f.read } rescue "" # キャッシュとして保存されていたデータを読み込む # 読み込まれたデータが正しい内容であり、キャッシュの寿命よりも時間が短い場合は、保存されていたデータを表示 disp(c) if /\A[0-5]\Z/ =~ c && Time.now.to_i - File::stat("var/#{ b }.txt").mtime.to_i < ( 60 * Expire ) c = "0" begin # ページをダウンロードして、データを解析 open("http://secunia.com/product/#{ n }/"){|f| while line = f.gets do # 1行ずつ(?)読み込む if /\bcrit_(\d).gif\b/ =~ line then # マッチする画像ファイル名があたらそこでストップ c = $1 break end break if endne =~ line # 違うデータを読み込まないよう、キーワードで読み込み終了 end } File.open("var/#{ b }.txt","w"){|f| f.print c } # ブラウザ危険度をファイルに記録 disp(c) rescue # 接続できない場合、エラーを表示 disp("error") end