[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[dennou-ruby:000992] Re: RubyNetCDF 0.2.0
In message "[dennou-ruby:000990] Re: RubyNetCDF 0.2.0"
on Wed, 12 Dec 2001 17:27:00 +0900,
Takeshi Horinouchi <horinout@xxxxxx> writes:
> たった今の思いつきですが、各パッケージにお任せインストールコマン
> ドを同じファイル名で作って、全体を一括りのディレクトリーに入れちゃっ
> て、トップレベルのスクリプトで、各パッケージに cd して実行すると
> いうのが、いいような気がします。他に何か案はありませんか。
フレームワークは難しいのでちょっと分かりませんが、とりあえず
必ず要りそうなfetch.rbというのを書いてみました。
$ ruby fetch <url>
というふうに使います。wget や fetch の原始的なものです。
#! /usr/bin/env ruby
# $kNotwork: fetch/fetch.rb,v 1.2 2001/12/14 03:00:42 gotoken Exp $
require 'uri'
require 'net/http'
require 'net/ftp'
Net::HTTP.version_1_2
module NumRu
module Fetch
FetchError = Class.new(StandardError)
def http_fetch(uri, header, proxy, out = STDOUT)
proxyclass = Net::HTTP
proxyclass = Net::HTTP::Proxy(proxy.host, proxy.port) if proxy
while true
host = uri.host
port = uri.port
request_uri = uri.request_uri
http = proxyclass.new(host, port)
res = http.get(request_uri, header)
break if /3../ !~ res.code # /3../ for redirection
uri = uri.merge(URI::parse(res['location']))
end
out << res.body
end
module_function :http_fetch
def ftp_fetch(uri, header, proxy, out = STDOUT)
host = uri.host
port = uri.port
user = uri.user || "anonymous"
pass = uri.password
remote_file = uri.path
passive = header[:passive]
ftp = Net::FTP.new(host)
ftp.passive = passive
ftp.login(user, pass)
ftp.getbinaryfile(remote_file, "/dev/null"){|b|
out << b
}
end
module_function :ftp_fetch
def fetch(uri, header, proxy, out)
scheme = uri.scheme
case scheme
when "http"
http_fetch(uri, header, proxy, out)
when "ftp"
ftp_fetch(uri, header, proxy, out)
else
raise NumRu::Fetch::FetchError, "unsupported scheme `#{scheme}'"
end
end
module_function :fetch
end
end
if __FILE__ == $0
require 'getopts'
getopts(nil, "lang:en")
h = ENV['http_proxy']
proxy = h ? URI::parse(h) : nil
header = {"accept-language" => $OPT_lang}
ARGV.each do |url|
uri = URI::parse(url)
local_file = uri.path.scan(%r|[^/]+$|).shift
f = open(local_file, "w")
begin
NumRu::Fetch::fetch(uri, header, proxy, f)
rescue
f.close if f && !f.closed?
File::delete(local_file)
end
end
end