From ca3afdb861c3938d4e59ee44ff7947520e7129a9 Mon Sep 17 00:00:00 2001 From: wakou Date: Mon, 19 Jun 2000 21:18:41 +0000 Subject: [PATCH] Tue Jun 20 06:14:43 2000 Wakou Aoyama * lib/cgi.rb: change: version syntax. old: x.yz, now: x.y.z * lib/net/telnet.rb: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@768 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 6 + lib/cgi.rb | 1077 +++++++++++++++++++++------------------------ lib/net/telnet.rb | 546 +++++++++++------------ 3 files changed, 766 insertions(+), 863 deletions(-) diff --git a/ChangeLog b/ChangeLog index df948679a7..19f0c17398 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Tue Jun 20 06:14:43 2000 Wakou Aoyama + + * lib/cgi.rb: change: version syntax. old: x.yz, now: x.y.z + + * lib/net/telnet.rb: ditto. + Mon Jun 19 10:48:28 2000 Yukihiro Matsumoto * variable.c (rb_cvar_set): forgot to add security check for class diff --git a/lib/cgi.rb b/lib/cgi.rb index de237c9fd4..4fc2ca71ea 100644 --- a/lib/cgi.rb +++ b/lib/cgi.rb @@ -1,119 +1,119 @@ =begin -$Date$ == CGI SUPPORT LIBRARY cgi.rb -Version 1.61 +Version 1.7.0 Copyright (C) 2000 Network Applied Communication Laboratory, Inc. + Copyright (C) 2000 Information-technology Promotion Agency, Japan Wakou Aoyama + == EXAMPLE === GET FORM VALUES - require "cgi" - cgi = CGI.new - values = cgi['field_name'] # <== array of 'field_name' - # if not 'field_name' included, then return []. - fields = cgi.keys # <== array of field names + require "cgi" + cgi = CGI.new + values = cgi['field_name'] # <== array of 'field_name' + # if not 'field_name' included, then return []. + fields = cgi.keys # <== array of field names - # returns true if form has 'field_name' - cgi.has_key?('field_name') - cgi.has_key?('field_name') - cgi.include?('field_name') + # returns true if form has 'field_name' + cgi.has_key?('field_name') + cgi.has_key?('field_name') + cgi.include?('field_name') === GET FORM VALUES AS HASH - require "cgi" - cgi = CGI.new - params = cgi.params + require "cgi" + cgi = CGI.new + params = cgi.params cgi.params is a hash. - cgi.params['new_field_name'] = ["value"] # add new param - cgi.params['field_name'] = ["new_value"] # change value - cgi.params.delete('field_name') # delete param - cgi.params.clear # delete all params + cgi.params['new_field_name'] = ["value"] # add new param + cgi.params['field_name'] = ["new_value"] # change value + cgi.params.delete('field_name') # delete param + cgi.params.clear # delete all params === SAVE FORM VALUES TO FILE - require "pstore" - db = PStore.new("query.db") - db.transaction do - db["params"] = cgi.params - end + require "pstore" + db = PStore.new("query.db") + db.transaction do + db["params"] = cgi.params + end === RESTORE FORM VALUES FROM FILE - require "pstore" - db = PStore.new("query.db") - db.transaction do - cgi.params = db["params"] - end + require "pstore" + db = PStore.new("query.db") + db.transaction do + cgi.params = db["params"] + end === GET MULTIPART FORM VALUES - require "cgi" - cgi = CGI.new - values = cgi['field_name'] # <== array of 'field_name' - values[0].read # <== body of values[0] - values[0].local_path # <== path to local file of values[0] - values[0].original_filename # <== original filename of values[0] - values[0].content_type # <== content_type of values[0] + require "cgi" + cgi = CGI.new + values = cgi['field_name'] # <== array of 'field_name' + values[0].read # <== body of values[0] + values[0].local_path # <== path to local file of values[0] + values[0].original_filename # <== original filename of values[0] + values[0].content_type # <== content_type of values[0] and values[0] has Tempfile class methods. - (Tempfile class object has File class methods) === GET COOKIE VALUES - require "cgi" - cgi = CGI.new - values = cgi.cookies['name'] # <== array of 'name' - # if not 'name' included, then return []. - names = cgi.cookies.keys # <== array of cookie names + require "cgi" + cgi = CGI.new + values = cgi.cookies['name'] # <== array of 'name' + # if not 'name' included, then return []. + names = cgi.cookies.keys # <== array of cookie names and cgi.cookies is a hash. === GET COOKIE OBJECTS - require "cgi" - cgi = CGI.new - for name, cookie in cgi.cookies - cookie.expires = Time.now + 30 - end - cgi.out("cookie" => cgi.cookies){"string"} + require "cgi" + cgi = CGI.new + for name, cookie in cgi.cookies + cookie.expires = Time.now + 30 + end + cgi.out("cookie" => cgi.cookies){"string"} - cgi.cookies # { "name1" => cookie1, "name2" => cookie2, ... } + cgi.cookies # { "name1" => cookie1, "name2" => cookie2, ... } - require "cgi" - cgi = CGI.new - cgi.cookies['name'].expires = Time.now + 30 - cgi.out("cookie" => cgi.cookies['name']){"string"} + require "cgi" + cgi = CGI.new + cgi.cookies['name'].expires = Time.now + 30 + cgi.out("cookie" => cgi.cookies['name']){"string"} and see MAKE COOKIE OBJECT. === GET ENVIRONMENT VALUE - require "cgi" - cgi = CGI.new - value = cgi.auth_type - # ENV["AUTH_TYPE"] + require "cgi" + cgi = CGI.new + value = cgi.auth_type + # ENV["AUTH_TYPE"] -http://www.w3.org/CGI/ +see http://www.w3.org/CGI/ AUTH_TYPE CONTENT_LENGTH CONTENT_TYPE GATEWAY_INTERFACE PATH_INFO PATH_TRANSLATED QUERY_STRING REMOTE_ADDR REMOTE_HOST REMOTE_IDENT @@ -124,17 +124,17 @@ content_length and server_port return Integer. and the others return String. and HTTP_COOKIE, HTTP_COOKIE2 - value = cgi.raw_cookie - # ENV["HTTP_COOKIE"] - value = cgi.raw_cookie2 - # ENV["HTTP_COOKIE2"] + value = cgi.raw_cookie + # ENV["HTTP_COOKIE"] + value = cgi.raw_cookie2 + # ENV["HTTP_COOKIE2"] and other HTTP_* - value = cgi.accept - # ENV["HTTP_ACCEPT"] - value = cgi.accept_charset - # ENV["HTTP_ACCEPT_CHARSET"] + value = cgi.accept + # ENV["HTTP_ACCEPT"] + value = cgi.accept_charset + # ENV["HTTP_ACCEPT_CHARSET"] HTTP_ACCEPT HTTP_ACCEPT_CHARSET HTTP_ACCEPT_ENCODING HTTP_ACCEPT_LANGUAGE HTTP_CACHE_CONTROL HTTP_FROM HTTP_HOST HTTP_NEGOTIATE HTTP_PRAGMA @@ -143,35 +143,36 @@ HTTP_REFERER HTTP_USER_AGENT === PRINT HTTP HEADER AND HTML STRING TO $DEFAULT_OUTPUT ($>) - require "cgi" - cgi = CGI.new("html3") # add HTML generation methods - cgi.out() do - cgi.html() do - cgi.head{ cgi.title{"TITLE"} } + - cgi.body() do - cgi.form() do - cgi.textarea("get_text") + - cgi.br + - cgi.submit - end + - cgi.pre() do - CGI::escapeHTML( - "params: " + cgi.params.inspect + "\n" + - "cookies: " + cgi.cookies.inspect + "\n" + - ENV.collect() do |key, value| - key + " --> " + value + "\n" - end.join("") - ) - end - end - end + require "cgi" + cgi = CGI.new("html3") # add HTML generation methods + cgi.out() do + cgi.html() do + cgi.head{ cgi.title{"TITLE"} } + + cgi.body() do + cgi.form() do + cgi.textarea("get_text") + + cgi.br + + cgi.submit + end + + cgi.pre() do + CGI::escapeHTML( + "params: " + cgi.params.inspect + "\n" + + "cookies: " + cgi.cookies.inspect + "\n" + + ENV.collect() do |key, value| + key + " --> " + value + "\n" + end.join("") + ) end + end + end + end + + # add HTML generation methods + CGI.new("html3") # html3.2 + CGI.new("html4") # html4.0 (Strict) + CGI.new("html4Tr") # html4.0 Transitional + CGI.new("html4Fr") # html4.0 Frameset - # add HTML generation methods - CGI.new("html3") # html3.2 - CGI.new("html4") # html4.0 (Strict) - CGI.new("html4Tr") # html4.0 Transitional - CGI.new("html4Fr") # html4.0 Frameset =end @@ -183,11 +184,10 @@ class CGI CR = "\015" LF = "\012" EOL = CR + LF -v = $-v -$-v = false - VERSION = "1.61" - RELEASE_DATE = "$Date$" -$-v = v + VERSION = "1.7.0" + RELEASE_DATE = "2000-06-19" + VERSION_CODE = 170 + RELEASE_CODE = 20000619 NEEDS_BINMODE = true if /WIN/ni === RUBY_PLATFORM PATH_SEPARATOR = {'UNIX'=>'/', 'WINDOWS'=>'\\', 'MACINTOSH'=>':'} @@ -236,7 +236,7 @@ $-v = v =begin === ESCAPE URL ENCODE - url_encoded_string = CGI::escape("string") + url_encoded_string = CGI::escape("string") =end def CGI::escape(string) string.gsub(/([^a-zA-Z0-9_.-])/n) do @@ -251,7 +251,7 @@ $-v = v =begin === UNESCAPE URL ENCODED - string = CGI::unescape("url encoded string") + string = CGI::unescape("url encoded string") =end def CGI::unescape(string) string.gsub(/\+/n, ' ').gsub(/%([0-9a-fA-F]{2})/n) do @@ -262,7 +262,7 @@ $-v = v =begin === ESCAPE HTML &"<> - CGI::escapeHTML("string") + CGI::escapeHTML("string") =end def CGI::escapeHTML(string) string.gsub(/&/n, '&').gsub(/\"/n, '"').gsub(/>/n, '>').gsub(/", "A", "IMG") - # "
<A HREF="url"></A>" + print CGI::escapeElement("
", "A", "IMG") + # "
<A HREF="url"></A>" - print CGI::escapeElement("
", ["A", "IMG"]) - # "
<A HREF="url"></A>" + print CGI::escapeElement("
", ["A", "IMG"]) + # "
<A HREF="url"></A>" =end def CGI::escapeElement(string, *element) string.gsub(/<\/?(?:#{element.join("|")})(?!\w)(?:.|\n)*?>/ni) do @@ -314,13 +314,13 @@ $-v = v =begin === UNESCAPE ELEMENT - print CGI::unescapeElement( - CGI::escapeHTML("
"), "A", "IMG") - # "<BR>" + print CGI::unescapeElement( + CGI::escapeHTML("
"), "A", "IMG") + # "<BR>" - print CGI::unescapeElement( - CGI::escapeHTML("
"), ["A", "IMG"]) - # "<BR>" + print CGI::unescapeElement( + CGI::escapeHTML("
"), ["A", "IMG"]) + # "<BR>" =end def CGI::unescapeElement(string, *element) string.gsub(/<\/?(?:#{element.join("|")})(?!\w)(?:.|\n)*?>/ni) do @@ -331,8 +331,8 @@ $-v = v =begin === MAKE RFC1123 DATE STRING - CGI::rfc1123_date(Time.now) - # Sut, 1 Jan 2000 00:00:00 GMT + CGI::rfc1123_date(Time.now) + # Sut, 1 Jan 2000 00:00:00 GMT =end def CGI::rfc1123_date(time) t = time.clone.gmtime @@ -344,47 +344,48 @@ $-v = v =begin === MAKE HTTP HEADER STRING - header - # Content-Type: text/html + header + # Content-Type: text/html - header("text/plain") - # Content-Type: text/plain + header("text/plain") + # Content-Type: text/plain - header({"nph" => true, - "status" => "OK", # == "200 OK" - # "status" => "200 GOOD", - "server" => ENV['SERVER_SOFTWARE'], - "connection" => "close", - "type" => "text/html", - "charset" => "iso-2022-jp", - # Content-Type: text/html; charset=iso-2022-jp - "language" => "ja", - "expires" => Time.now + 30, - "cookie" => [cookie1, cookie2], - "my_header1" => "my_value" - "my_header2" => "my_value"}) + header({"nph" => true, + "status" => "OK", # == "200 OK" + # "status" => "200 GOOD", + "server" => ENV['SERVER_SOFTWARE'], + "connection" => "close", + "type" => "text/html", + "charset" => "iso-2022-jp", + # Content-Type: text/html; charset=iso-2022-jp + "language" => "ja", + "expires" => Time.now + 30, + "cookie" => [cookie1, cookie2], + "my_header1" => "my_value" + "my_header2" => "my_value"}) header will not convert charset. status: - "OK" --> "200 OK" - "PARTIAL_CONTENT" --> "206 Partial Content" - "MULTIPLE_CHOICES" --> "300 Multiple Choices" - "MOVED" --> "301 Moved Permanently" - "REDIRECT" --> "302 Found" - "NOT_MODIFIED" --> "304 Not Modified" - "BAD_REQUEST" --> "400 Bad Request" - "AUTH_REQUIRED" --> "401 Authorization Required" - "FORBIDDEN" --> "403 Forbidden" - "NOT_FOUND" --> "404 Not Found" - "METHOD_NOT_ALLOWED" --> "405 Method Not Allowed" - "NOT_ACCEPTABLE" --> "406 Not Acceptable" - "LENGTH_REQUIRED" --> "411 Length Required" - "PRECONDITION_FAILED" --> "412 Rrecondition Failed" - "SERVER_ERROR" --> "500 Internal Server Error" - "NOT_IMPLEMENTED" --> "501 Method Not Implemented" - "BAD_GATEWAY" --> "502 Bad Gateway" - "VARIANT_ALSO_VARIES" --> "506 Variant Also Negotiates" + + "OK" --> "200 OK" + "PARTIAL_CONTENT" --> "206 Partial Content" + "MULTIPLE_CHOICES" --> "300 Multiple Choices" + "MOVED" --> "301 Moved Permanently" + "REDIRECT" --> "302 Found" + "NOT_MODIFIED" --> "304 Not Modified" + "BAD_REQUEST" --> "400 Bad Request" + "AUTH_REQUIRED" --> "401 Authorization Required" + "FORBIDDEN" --> "403 Forbidden" + "NOT_FOUND" --> "404 Not Found" + "METHOD_NOT_ALLOWED" --> "405 Method Not Allowed" + "NOT_ACCEPTABLE" --> "406 Not Acceptable" + "LENGTH_REQUIRED" --> "411 Length Required" + "PRECONDITION_FAILED" --> "412 Rrecondition Failed" + "SERVER_ERROR" --> "500 Internal Server Error" + "NOT_IMPLEMENTED" --> "501 Method Not Implemented" + "BAD_GATEWAY" --> "502 Bad Gateway" + "VARIANT_ALSO_VARIES" --> "506 Variant Also Negotiates" =end def header(options = "text/html") @@ -487,31 +488,31 @@ status: =begin === PRINT HTTP HEADER AND STRING TO $DEFAULT_OUTPUT ($>) - cgi = CGI.new - cgi.out{ "string" } - # Content-Type: text/html - # Content-Length: 6 - # - # string + cgi = CGI.new + cgi.out{ "string" } + # Content-Type: text/html + # Content-Length: 6 + # + # string - cgi.out("text/plain"){ "string" } - # Content-Type: text/plain - # Content-Length: 6 - # - # string + cgi.out("text/plain"){ "string" } + # Content-Type: text/plain + # Content-Length: 6 + # + # string - cgi.out({"nph" => true, - "status" => "OK", # == "200 OK" - "server" => ENV['SERVER_SOFTWARE'], - "connection" => "close", - "type" => "text/html", - "charset" => "iso-2022-jp", - # Content-Type: text/html; charset=iso-2022-jp - "language" => "ja", - "expires" => Time.now + (3600 * 24 * 30), - "cookie" => [cookie1, cookie2], - "my_header1" => "my_value", - "my_header2" => "my_value"}){ "string" } + cgi.out({"nph" => true, + "status" => "OK", # == "200 OK" + "server" => ENV['SERVER_SOFTWARE'], + "connection" => "close", + "type" => "text/html", + "charset" => "iso-2022-jp", + # Content-Type: text/html; charset=iso-2022-jp + "language" => "ja", + "expires" => Time.now + (3600 * 24 * 30), + "cookie" => [cookie1, cookie2], + "my_header1" => "my_value", + "my_header2" => "my_value"}){ "string" } if "HEAD" == REQUEST_METHOD then output only HTTP header. @@ -549,8 +550,8 @@ convert string charset, and set language to "ja". =begin === PRINT - cgi = CGI.new - cgi.print # default: cgi.print == $DEFAULT_OUTPUT.print + cgi = CGI.new + cgi.print # default: cgi.print == $DEFAULT_OUTPUT.print =end def print(*options) stdoutput.print(*options) @@ -559,31 +560,31 @@ convert string charset, and set language to "ja". =begin === MAKE COOKIE OBJECT - cookie1 = CGI::Cookie::new("name", "value1", "value2", ...) - cookie1 = CGI::Cookie::new({"name" => "name", "value" => "value"}) - cookie1 = CGI::Cookie::new({'name' => 'name', - 'value' => ['value1', 'value2', ...], - 'path' => 'path', # optional - 'domain' => 'domain', # optional - 'expires' => Time.now, # optional - 'secure' => true # optional - }) + cookie1 = CGI::Cookie::new("name", "value1", "value2", ...) + cookie1 = CGI::Cookie::new({"name" => "name", "value" => "value"}) + cookie1 = CGI::Cookie::new({'name' => 'name', + 'value' => ['value1', 'value2', ...], + 'path' => 'path', # optional + 'domain' => 'domain', # optional + 'expires' => Time.now, # optional + 'secure' => true # optional + }) - cgi.out({"cookie" => [cookie1, cookie2]}){ "string" } + cgi.out({"cookie" => [cookie1, cookie2]}){ "string" } - name = cookie1.name - values = cookie1.value - path = cookie1.path - domain = cookie1.domain - expires = cookie1.expires - secure = cookie1.secure + name = cookie1.name + values = cookie1.value + path = cookie1.path + domain = cookie1.domain + expires = cookie1.expires + secure = cookie1.secure - cookie1.name = 'name' - cookie1.value = ['value1', 'value2', ...] - cookie1.path = 'path' - cookie1.domain = 'domain' - cookie1.expires = Time.now + 30 - cookie1.secure = true + cookie1.name = 'name' + cookie1.value = ['value1', 'value2', ...] + cookie1.path = 'path' + cookie1.domain = 'domain' + cookie1.expires = Time.now + 30 + cookie1.secure = true =end require "delegate" class Cookie < SimpleDelegator @@ -659,8 +660,8 @@ convert string charset, and set language to "ja". =begin === PARSE RAW COOKIE STRING - cookies = CGI::Cookie::parse("raw_cookie_string") - # { "name1" => cookie1, "name2" => cookie2, ... } + cookies = CGI::Cookie::parse("raw_cookie_string") + # { "name1" => cookie1, "name2" => cookie2, ... } =end def Cookie::parse(raw_cookie) cookies = Hash.new([]) @@ -684,9 +685,9 @@ convert string charset, and set language to "ja". =begin === PARSE QUERY STRING - params = CGI::parse("query_string") - # {"name1" => ["value1", "value2", ...], - # "name2" => ["value1", "value2", ...], ... } + params = CGI::parse("query_string") + # {"name1" => ["value1", "value2", ...], + # "name2" => ["value1", "value2", ...], ... } =end def CGI::parse(query) params = Hash.new([]) @@ -918,17 +919,17 @@ convert string charset, and set language to "ja". =begin === HTML PRETTY FORMAT - print CGI::pretty("") - # - # - # - # + print CGI::pretty("") + # + # + # + # - print CGI::pretty("", "\t") - # - # - # - # + print CGI::pretty("", "\t") + # + # + # + # =end def CGI::pretty(string, shift = " ") lines = string.gsub(/(?!\A)<(?:.|\n)*?>/n, "\n\\0").gsub(/<(?:.|\n)*?>(?!\n)/n, "\\0\n") @@ -945,17 +946,17 @@ convert string charset, and set language to "ja". =begin == HTML ELEMENTS - cgi = CGI.new("html3") # add HTML generation methods - cgi.element - cgi.element{ "string" } - cgi.element({ "ATTRILUTE1" => "value1", "ATTRIBUTE2" => "value2" }) - cgi.element({ "ATTRILUTE1" => "value1", "ATTRIBUTE2" => "value2" }){ "string" } + cgi = CGI.new("html3") # add HTML generation methods + cgi.element + cgi.element{ "string" } + cgi.element({ "ATTRILUTE1" => "value1", "ATTRIBUTE2" => "value2" }) + cgi.element({ "ATTRILUTE1" => "value1", "ATTRIBUTE2" => "value2" }){ "string" } - # add HTML generation methods - CGI.new("html3") # html3.2 - CGI.new("html4") # html4.0 (Strict) - CGI.new("html4Tr") # html4.0 Transitional - CGI.new("html4Fr") # html4.0 Frameset + # add HTML generation methods + CGI.new("html3") # html3.2 + CGI.new("html4") # html4.0 (Strict) + CGI.new("html4Tr") # html4.0 Transitional + CGI.new("html4Fr") # html4.0 Frameset =end @@ -1026,8 +1027,8 @@ convert string charset, and set language to "ja". =begin === A ELEMENT - a("url") - # = a({ "HREF" => "url" }) + a("url") + # = a({ "HREF" => "url" }) =end def a(href = "") attributes = if href.kind_of?(String) @@ -1045,8 +1046,8 @@ convert string charset, and set language to "ja". =begin === BASE ELEMENT - base("url") - # = base({ "HREF" => "url" }) + base("url") + # = base({ "HREF" => "url" }) =end def base(href = "") attributes = if href.kind_of?(String) @@ -1064,8 +1065,8 @@ convert string charset, and set language to "ja". =begin === BLOCKQUOTE ELEMENT - blockquote("url"){ "string" } - # = blockquote({ "CITE" => "url" }){ "string" } + blockquote("url"){ "string" } + # = blockquote({ "CITE" => "url" }){ "string" } =end def blockquote(cite = nil) attributes = if cite.kind_of?(String) @@ -1083,8 +1084,8 @@ convert string charset, and set language to "ja". =begin === CAPTION ELEMENT - caption("align"){ "string" } - # = caption({ "ALIGN" => "align" }){ "string" } + caption("align"){ "string" } + # = caption({ "ALIGN" => "align" }){ "string" } =end def caption(align = nil) attributes = if align.kind_of?(String) @@ -1102,14 +1103,14 @@ convert string charset, and set language to "ja". =begin === CHECKBOX - checkbox("name") - # = checkbox({ "NAME" => "name" }) + checkbox("name") + # = checkbox({ "NAME" => "name" }) - checkbox("name", "value") - # = checkbox({ "NAME" => "name", "VALUE" => "value" }) + checkbox("name", "value") + # = checkbox({ "NAME" => "name", "VALUE" => "value" }) - checkbox("name", "value", true) - # = checkbox({ "NAME" => "name", "VALUE" => "value", "CHECKED" => true }) + checkbox("name", "value", true) + # = checkbox({ "NAME" => "name", "VALUE" => "value", "CHECKED" => true }) =end def checkbox(name = "", value = nil, checked = nil) attributes = if name.kind_of?(String) @@ -1125,29 +1126,29 @@ convert string charset, and set language to "ja". =begin === CHECKBOX_GROUP - checkbox_group("name", "foo", "bar", "baz") - # foo - # bar - # baz + checkbox_group("name", "foo", "bar", "baz") + # foo + # bar + # baz - checkbox_group("name", ["foo"], ["bar", true], "baz") - # foo - # bar - # baz + checkbox_group("name", ["foo"], ["bar", true], "baz") + # foo + # bar + # baz - checkbox_group("name", ["1", "Foo"], ["2", "Bar", true], "Baz") - # Foo - # Bar - # Baz + checkbox_group("name", ["1", "Foo"], ["2", "Bar", true], "Baz") + # Foo + # Bar + # Baz - checkbox_group({ "NAME" => "name", - "VALUES" => ["foo", "bar", "baz"] }) + checkbox_group({ "NAME" => "name", + "VALUES" => ["foo", "bar", "baz"] }) - checkbox_group({ "NAME" => "name", - "VALUES" => [["foo"], ["bar", true], "baz"] }) + checkbox_group({ "NAME" => "name", + "VALUES" => [["foo"], ["bar", true], "baz"] }) - checkbox_group({ "NAME" => "name", - "VALUES" => [["1", "Foo"], ["2", "Bar", true], "Baz"] }) + checkbox_group({ "NAME" => "name", + "VALUES" => [["1", "Foo"], ["2", "Bar", true], "Baz"] }) =end def checkbox_group(name = "", *values) if name.kind_of?(Hash) @@ -1172,17 +1173,17 @@ convert string charset, and set language to "ja". =begin === FILE_FIELD - file_field("name") - # + file_field("name") + # - file_field("name", 40) - # + file_field("name", 40) + # - file_field("name", 40, 100) - # + file_field("name", 40, 100) + # - file_field({ "NAME" => "name", "SIZE" => 40 }) - # + file_field({ "NAME" => "name", "SIZE" => 40 }) + # =end def file_field(name = "", size = 20, maxlength = nil) attributes = if name.kind_of?(String) @@ -1199,17 +1200,17 @@ convert string charset, and set language to "ja". =begin === FORM ELEMENT - form{ "string" } - #
string
+ form{ "string" } + #
string
- form("get"){ "string" } - #
string
+ form("get"){ "string" } + #
string
- form("get", "url"){ "string" } - #
string
+ form("get", "url"){ "string" } + #
string
- form({"METHOD" => "post", ENCTYPE => "enctype"}){ "string" } - #
string
+ form({"METHOD" => "post", ENCTYPE => "enctype"}){ "string" } + #
string
=end def form(method = "post", action = nil, enctype = "application/x-www-form-urlencoded") attributes = if method.kind_of?(String) @@ -1240,14 +1241,14 @@ convert string charset, and set language to "ja". =begin === HIDDEN FIELD - hidden("name") - # + hidden("name") + # - hidden("name", "value") - # + hidden("name", "value") + # - hidden({ "NAME" => "name", "VALUE" => "reset", "ID" => "foo" }) - # + hidden({ "NAME" => "name", "VALUE" => "reset", "ID" => "foo" }) + # =end def hidden(name = "", value = nil) attributes = if name.kind_of?(String) @@ -1263,36 +1264,36 @@ convert string charset, and set language to "ja". =begin === HTML ELEMENT - html{ "string" } - # string + html{ "string" } + # string - html({ "LANG" => "ja" }){ "string" } - # string + html({ "LANG" => "ja" }){ "string" } + # string - html({ "DOCTYPE" => false }){ "string" } - # string + html({ "DOCTYPE" => false }){ "string" } + # string - html({ "DOCTYPE" => '' }){ "string" } - # string + html({ "DOCTYPE" => '' }){ "string" } + # string - html({ "PRETTY" => " " }){ "" } - # - # - # - # - # + html({ "PRETTY" => " " }){ "" } + # + # + # + # + # - html({ "PRETTY" => "\t" }){ "" } - # - # - # - # - # + html({ "PRETTY" => "\t" }){ "" } + # + # + # + # + # - html("PRETTY"){ "" } - # = html({ "PRETTY" => " " }){ "" } + html("PRETTY"){ "" } + # = html({ "PRETTY" => " " }){ "" } - html(if $VERBOSE then "PRETTY" end){ "HTML string" } + html(if $VERBOSE then "PRETTY" end){ "HTML string" } =end def html(attributes = {}) @@ -1331,14 +1332,14 @@ convert string charset, and set language to "ja". =begin === IMAGE_BUTTON - image_button("url") - # + image_button("url") + # - image_button("url", "name", "string") - # + image_button("url", "name", "string") + # - image_button({ "SRC" => "url", "ATL" => "strng" }) - # + image_button({ "SRC" => "url", "ATL" => "strng" }) + # =end def image_button(src = "", name = nil, alt = nil) attributes = if src.kind_of?(String) @@ -1355,11 +1356,11 @@ convert string charset, and set language to "ja". =begin === IMG ELEMENT - img("src", "alt", 100, 50) - # alt + img("src", "alt", 100, 50) + # alt - img({ "SRC" => "src", "ALT" => "alt", "WIDTH" => 100, "HEIGHT" => 50 }) - # alt + img({ "SRC" => "src", "ALT" => "alt", "WIDTH" => 100, "HEIGHT" => 50 }) + # alt =end def img(src = "", alt = "", width = nil, height = nil) attributes = if src.kind_of?(String) @@ -1375,11 +1376,11 @@ convert string charset, and set language to "ja". =begin === MULTIPART FORM - multipart_form{ "string" } - #
string
+ multipart_form{ "string" } + #
string
- multipart_form("url"){ "string" } - #
string
+ multipart_form("url"){ "string" } + #
string
=end def multipart_form(action = nil, enctype = "multipart/form-data") attributes = if action == nil @@ -1406,17 +1407,17 @@ convert string charset, and set language to "ja". =begin === PASSWORD_FIELD - password_field("name") - # + password_field("name") + # - password_field("name", "value") - # + password_field("name", "value") + # - password_field("password", "value", 80, 200) - # + password_field("password", "value", 80, 200) + # - password_field({ "NAME" => "name", "VALUE" => "value" }) - # + password_field({ "NAME" => "name", "VALUE" => "value" }) + # =end def password_field(name = "", value = nil, size = 40, maxlength = nil) attributes = if name.kind_of?(String) @@ -1433,34 +1434,34 @@ convert string charset, and set language to "ja". =begin === POPUP_MENU - popup_menu("name", "foo", "bar", "baz") - # + popup_menu("name", "foo", "bar", "baz") + # - popup_menu("name", ["foo"], ["bar", true], "baz") - # + popup_menu("name", ["foo"], ["bar", true], "baz") + # - popup_menu("name", ["1", "Foo"], ["2", "Bar", true], "Baz") - # + popup_menu("name", ["1", "Foo"], ["2", "Bar", true], "Baz") + # - popup_menu({"NAME" => "name", "SIZE" => 2, "MULTIPLE" => true, - "VALUES" => [["1", "Foo"], ["2", "Bar", true], "Baz"] }) - # + popup_menu({"NAME" => "name", "SIZE" => 2, "MULTIPLE" => true, + "VALUES" => [["1", "Foo"], ["2", "Bar", true], "Baz"] }) + # =end def popup_menu(name = "", *values) @@ -1498,14 +1499,14 @@ convert string charset, and set language to "ja". =begin === RADIO_BUTTON - radio_button("name", "value") - # + radio_button("name", "value") + # - radio_button("name", "value", true) - # + radio_button("name", "value", true) + # - radio_button({ "NAME" => "name", "VALUE" => "value", "ID" => "foo" }) - # + radio_button({ "NAME" => "name", "VALUE" => "value", "ID" => "foo" }) + # =end def radio_button(name = "", value = nil, checked = nil) attributes = if name.kind_of?(String) @@ -1521,29 +1522,29 @@ convert string charset, and set language to "ja". =begin === RADIO_GROUP - radio_group("name", "foo", "bar", "baz") - # foo - # bar - # baz + radio_group("name", "foo", "bar", "baz") + # foo + # bar + # baz - radio_group("name", ["foo"], ["bar", true], "baz") - # foo - # bar - # baz + radio_group("name", ["foo"], ["bar", true], "baz") + # foo + # bar + # baz - radio_group("name", ["1", "Foo"], ["2", "Bar", true], "Baz") - # Foo - # Bar - # Baz + radio_group("name", ["1", "Foo"], ["2", "Bar", true], "Baz") + # Foo + # Bar + # Baz - radio_group({ "NAME" => "name", - "VALUES" => ["foo", "bar", "baz"] }) + radio_group({ "NAME" => "name", + "VALUES" => ["foo", "bar", "baz"] }) - radio_group({ "NAME" => "name", - "VALUES" => [["foo"], ["bar", true], "baz"] }) + radio_group({ "NAME" => "name", + "VALUES" => [["foo"], ["bar", true], "baz"] }) - radio_group({ "NAME" => "name", - "VALUES" => [["1", "Foo"], ["2", "Bar", true], "Baz"] }) + radio_group({ "NAME" => "name", + "VALUES" => [["1", "Foo"], ["2", "Bar", true], "Baz"] }) =end def radio_group(name = "", *values) if name.kind_of?(Hash) @@ -1568,14 +1569,14 @@ convert string charset, and set language to "ja". =begin === RESET BUTTON - reset - # + reset + # - reset("reset") - # + reset("reset") + # - reset({ "VALUE" => "reset", "ID" => "foo" }) - # + reset({ "VALUE" => "reset", "ID" => "foo" }) + # =end def reset(value = nil, name = nil) attributes = if (not value) or value.kind_of?(String) @@ -1590,30 +1591,30 @@ convert string charset, and set language to "ja". =begin === SCROLLING_LIST - scrolling_list({"NAME" => "name", "SIZE" => 2, "MULTIPLE" => true, - "VALUES" => [["1", "Foo"], ["2", "Bar", true], "Baz"] }) - # + scrolling_list({"NAME" => "name", "SIZE" => 2, "MULTIPLE" => true, + "VALUES" => [["1", "Foo"], ["2", "Bar", true], "Baz"] }) + # =end alias scrolling_list popup_menu =begin === SUBMIT BUTTON - submit - # + submit + # - submit("ok") - # + submit("ok") + # - submit("ok", "button1") - # + submit("ok", "button1") + # - submit({ "VALUE" => "ok", "NAME" => "button1", "ID" => "foo" }) - # + submit({ "VALUE" => "ok", "NAME" => "button1", "ID" => "foo" }) + # =end def submit(value = nil, name = nil) attributes = if (not value) or value.kind_of?(String) @@ -1628,20 +1629,20 @@ convert string charset, and set language to "ja". =begin === TEXT_FIELD - text_field("name") - # + text_field("name") + # - text_field("name", "value") - # + text_field("name", "value") + # - text_field("name", "value", 80) - # + text_field("name", "value", 80) + # - text_field("name", "value", 80, 200) - # + text_field("name", "value", 80, 200) + # - text_field({ "NAME" => "name", "VALUE" => "value" }) - # + text_field({ "NAME" => "name", "VALUE" => "value" }) + # =end def text_field(name = "", value = nil, size = 40, maxlength = nil) attributes = if name.kind_of?(String) @@ -1658,12 +1659,11 @@ convert string charset, and set language to "ja". =begin === TEXTAREA ELEMENT + textarea("name") + # = textarea({ "NAME" => "name", "COLS" => 70, "ROWS" => 10 }) - textarea("name") - # = textarea({ "NAME" => "name", "COLS" => 70, "ROWS" => 10 }) - - textarea("name", 40, 5) - # = textarea({ "NAME" => "name", "COLS" => 40, "ROWS" => 5 }) + textarea("name", 40, 5) + # = textarea({ "NAME" => "name", "COLS" => 40, "ROWS" => 5 }) =end def textarea(name = "", cols = 70, rows = 10) attributes = if name.kind_of?(String) @@ -1908,163 +1908,114 @@ end == HISTORY -=== Version 1.61 - wakou - -2000/06/13 15:49:27 - -- read_multipart(): if no content body then raise EOFError. - -=== Version 1.60 - wakou - -2000/06/03 18:16:17 - -- improve: CGI::pretty() - -=== Version 1.50 - wakou - -2000/05/30 19:04:08 - -- CGI#out() - if "HEAD" == REQUEST_METHOD then output only HTTP header. - -=== Version 1.40 - wakou - -2000/05/24 06:58:51 - -- typo: CGI::Cookie::new() -- bug fix: CGI::escape() - bad: " " --> "%2B" true: " " --> "+" - thanks to Ryunosuke Ohshima - -=== Version 1.31 - wakou - -2000/05/08 21:51:30 - -- improvement of time forming new CGI object accompanied with HTML generation methods. - -=== Version 1.30 - wakou - -2000/05/07 21:51:14 - -- require English.rb -- improvement of load time. - -=== Version 1.21 - wakou - -2000/05/02 21:44:12 - -- support for ruby 1.5.3 (2000-05-01) (Array#filter --> Array#collect!) - -=== Version 1.20 - wakou - -2000/04/03 18:31:42 - -- bug fix: CGI#image_button() can't get Hash option - thanks to Takashi Ikeda -- CGI::unescapeHTML() - simple support for "〹" -- CGI::Cookie::new() - simple support for IE -- CGI::escape() - ' ' replaced by '+' - -=== Version 1.10 - wakou - -1999/12/06 20:16:34 - -- can make many CGI objects. -- if use mod_ruby, then require ruby1.4.3 or later. - -=== Version 1.01 - wakou - -1999/11/29 21:35:58 - -- support for ruby 1.5.0 (1999-11-20) - -=== Version 1.00 - wakou - -1999/09/13 23:00:58 - -- COUTION! name change. CGI.rb --> cgi.rb - -- CGI#auth_type, CGI#content_length, CGI#content_type, ... -if not ENV included it, then return nil. - -- CGI#content_length and CGI#server_port return Integer. - -- if not CGI#params.include?('name'), then CGI#params['name'] return []. - -- if not CGI#cookies.include?('name'), then CGI#cookies['name'] return []. - -=== Version 0.41 - wakou - -1999/08/05 18:04:59 - -- typo. thanks to MJ Ray - HTTP_STATUS["NOT_INPLEMENTED"] --> HTTP_STATUS["NOT_IMPLEMENTED"] - -=== Version 0.40 - wakou - -1999/07/20 20:44:31 - -- COUTION! incompatible change. - sorry, but probably this change is last big incompatible change. - -- CGI::print --> CGI#out - - cgi = CGI.new - cgi.out{"string"} # old: CGI::print{"string"} - -- CGI::cookie --> CGI::Cookie::new - - cookie1 = CGI::Cookie::new # old: CGI::cookie - -- CGI::header --> CGI#header - -=== Version 0.30 - wakou - -1999/06/29 06:50:21 - -- COUTION! incompatible change. - query = CGI.new - cookies = query.cookies # old: query.cookie - values = query.cookies[name] # old: query.cookie[name] - -=== Version 0.24 - wakou - -1999/06/21 21:05:57 - -- CGI::Cookie::parse() return { name => CGI::Cookie object } pairs. - -=== Version 0.23 - wakou - -1999/06/20 23:29:12 - -- modified a bit to clear module separation. - -=== Version 0.22 - matz - -Mon Jun 14 17:49:32 JST 1999 - -- Cookies are now CGI::Cookie objects. -- Cookie modeled after CGI::Cookie.pm. - -=== Version 0.21 - matz - -Fri Jun 11 11:19:11 JST 1999 - -- modified a bit to clear module separation. - -=== Version 0.20 - wakou - -1999/06/03 06:48:15 - -- support for multipart form. - -=== Version 0.10 - wakou - -1999/05/24 07:05:41 - -- first release. - +* Sun Jun 18 23:31:44 JST 2000 - wakou + * version 1.7.0 + * change: version syntax. old: x.yz, now: x.y.z + +* 2000/06/13 15:49:27 - wakou + * version 1.61 + * read_multipart(): if no content body then raise EOFError. + +* 2000/06/03 18:16:17 - wakou + * version 1.60 + * improve: CGI::pretty() + +* 2000/05/30 19:04:08 - wakou + * version 1.50 + * CGI#out(): if "HEAD" == REQUEST_METHOD then output only HTTP header. + +* 2000/05/24 06:58:51 - wakou + * version 1.40 + * typo: CGI::Cookie::new() + * bug fix: CGI::escape(): bad: " " --> "%2B"; true: " " --> "+"; + thanks to Ryunosuke Ohshima + +* 2000/05/08 21:51:30 - wakou + * version 1.31 + * improvement of time forming new CGI object accompanied with HTML generation methods. + +* 2000/05/07 21:51:14 - wakou + * version 1.30 + * require English.rb + * improvement of load time. + +* 2000/05/02 21:44:12 - wakou + * version 1.21 + * support for ruby 1.5.3 (2000-05-01) (Array#filter --> Array#collect!) + +* 2000/04/03 18:31:42 - wakou + * version 1.20 + * bug fix: CGI#image_button() can't get Hash option. + thanks to Takashi Ikeda + * CGI::unescapeHTML(): simple support for "〹" + * CGI::Cookie::new(): simple support for IE + * CGI::escape(): ' ' replaced by '+' + +* 1999/12/06 20:16:34 - wakou + * version 1.10 + * can make many CGI objects. + * if use mod_ruby, then require ruby1.4.3 or later. + +* 1999/11/29 21:35:58 - wakou + * version 1.01 + * support for ruby 1.5.0 (1999-11-20) + +* 1999/09/13 23:00:58 - wakou + * version 1.00 + * COUTION! name change. CGI.rb --> cgi.rb + * CGI#auth_type, CGI#content_length, CGI#content_type, ... + if not ENV included it, then return nil. + * CGI#content_length and CGI#server_port return Integer. + * if not CGI#params.include?('name'), then CGI#params['name'] return []. + * if not CGI#cookies.include?('name'), then CGI#cookies['name'] return []. + +* 1999/08/05 18:04:59 - wakou + * version 0.41 + * typo. thanks to MJ Ray + HTTP_STATUS["NOT_INPLEMENTED"] --> HTTP_STATUS["NOT_IMPLEMENTED"] + +* 1999/07/20 20:44:31 - wakou + * version 0.40 + * COUTION! incompatible change. + sorry, but probably this change is last big incompatible change. + * CGI::print --> CGI#out + cgi = CGI.new + cgi.out{"string"} # old: CGI::print{"string"} + * CGI::cookie --> CGI::Cookie::new + cookie1 = CGI::Cookie::new # old: CGI::cookie + * CGI::header --> CGI#header + +* 1999/06/29 06:50:21 - wakou + * version 0.30 + * COUTION! incompatible change. + query = CGI.new + cookies = query.cookies # old: query.cookie + values = query.cookies[name] # old: query.cookie[name] + +* 1999/06/21 21:05:57 - wakou + * version 0.24 + * CGI::Cookie::parse() return { name => CGI::Cookie object } pairs. + +* 1999/06/20 23:29:12 - wakou + * version 0.23 + * modified a bit to clear module separation. + +* Mon Jun 14 17:49:32 JST 1999 - matz + * version 0.22 + * Cookies are now CGI::Cookie objects. + * Cookie modeled after CGI::Cookie.pm. + +* Fri Jun 11 11:19:11 JST 1999 - matz + * version 0.21 + * modified a bit to clear module separation. + +* 1999/06/03 06:48:15 - wakou + * version 0.20 + * support for multipart form. + +* 1999/05/24 07:05:41 - wakou + * version 0.10 + * first release. + +$Date$ =end diff --git a/lib/net/telnet.rb b/lib/net/telnet.rb index b1463379c3..9377d47888 100644 --- a/lib/net/telnet.rb +++ b/lib/net/telnet.rb @@ -1,31 +1,30 @@ =begin -$Date$ == SIMPLE TELNET CLIENT LIBRARY net/telnet.rb -Version 1.40 +Version 1.5.0 Wakou Aoyama === MAKE NEW TELNET OBJECT - host = Net::Telnet::new({ - "Binmode" => false, # default: false - "Host" => "localhost", # default: "localhost" - "Output_log" => "output_log", # default: nil (no output) - "Dump_log" => "dump_log", # default: nil (no output) - "Port" => 23, # default: 23 - "Prompt" => /[$%#>] \z/n, # default: /[$%#>] \z/n - "Telnetmode" => true, # default: true - "Timeout" => 10, # default: 10 - # if ignore timeout then set "Timeout" to false. - "Waittime" => 0, # default: 0 - "Proxy" => proxy # default: nil - # proxy is Net::Telnet or IO object - }) + host = Net::Telnet::new({ + "Binmode" => false, # default: false + "Host" => "localhost", # default: "localhost" + "Output_log" => "output_log", # default: nil (no output) + "Dump_log" => "dump_log", # default: nil (no output) + "Port" => 23, # default: 23 + "Prompt" => /[$%#>] \z/n, # default: /[$%#>] \z/n + "Telnetmode" => true, # default: true + "Timeout" => 10, # default: 10 + # if ignore timeout then set "Timeout" to false. + "Waittime" => 0, # default: 0 + "Proxy" => proxy # default: nil + # proxy is Net::Telnet or IO object + }) Telnet object has socket class methods. @@ -34,351 +33,132 @@ if set "Telnetmode" option to false. not telnet command interpretation. the same character as "Prompt" is included in the data, and, when the network or the host is very heavy, the value is enlarged. + === STATUS OUTPUT - host = Net::Telnet::new({"Host" => "localhost"}){|c| print c } + host = Net::Telnet::new({"Host" => "localhost"}){|c| print c } connection status output. -example +example: - Trying localhost... - Connected to localhost. + Trying localhost... + Connected to localhost. === WAIT FOR MATCH - line = host.waitfor(/match/) - line = host.waitfor({"Match" => /match/, - "String" => "string", - "Timeout" => secs}) - # if ignore timeout then set "Timeout" to false. + line = host.waitfor(/match/) + line = host.waitfor({"Match" => /match/, + "String" => "string", + "Timeout" => secs}) + # if ignore timeout then set "Timeout" to false. if set "String" option, then Match == Regexp.new(quote("string")) ==== REALTIME OUTPUT - host.waitfor(/match/){|c| print c } - host.waitfor({"Match" => /match/, - "String" => "string", - "Timeout" => secs}){|c| print c} + host.waitfor(/match/){|c| print c } + host.waitfor({"Match" => /match/, + "String" => "string", + "Timeout" => secs}){|c| print c} of cource, set sync=true or flush is necessary. === SEND STRING AND WAIT PROMPT - line = host.cmd("string") - line = host.cmd({"String" => "string", - "Prompt" => /[$%#>] \z/n, - "Timeout" => 10}) + line = host.cmd("string") + line = host.cmd({"String" => "string", + "Prompt" => /[$%#>] \z/n, + "Timeout" => 10}) ==== REALTIME OUTPUT - host.cmd("string"){|c| print c } - host.cmd({"String" => "string", - "Prompt" => /[$%#>] \z/n, - "Timeout" => 10}){|c| print c } + host.cmd("string"){|c| print c } + host.cmd({"String" => "string", + "Prompt" => /[$%#>] \z/n, + "Timeout" => 10}){|c| print c } of cource, set sync=true or flush is necessary. === SEND STRING - host.print("string") - # == host.write("string\n") + host.print("string") + # == host.write("string\n") === TOGGLE TELNET COMMAND INTERPRETATION - host.telnetmode # return the current status (true or false) - host.telnetmode = true # do telnet command interpretation (default) - host.telnetmode = false # don't telnet command interpretation + host.telnetmode # return the current status (true or false) + host.telnetmode = true # do telnet command interpretation (default) + host.telnetmode = false # don't telnet command interpretation === TOGGLE NEWLINE TRANSLATION - host.binmode # return the current status (true or false) - host.binmode = true # no translate newline - host.binmode = false # translate newline (default) + host.binmode # return the current status (true or false) + host.binmode = true # no translate newline + host.binmode = false # translate newline (default) === LOGIN - host.login("username", "password") - host.login({"Name" => "username", - "Password" => "password", - "Prompt" => /[$%#>] \z/n, - "Timeout" => 10}) + host.login("username", "password") + host.login({"Name" => "username", + "Password" => "password", + "Prompt" => /[$%#>] \z/n, + "Timeout" => 10}) -if no password prompt. +if no password prompt: - host.login("username") - host.login({"Name" => "username", - "Prompt" => /[$%#>] \z/n, - "Timeout" => 10}) + host.login("username") + host.login({"Name" => "username", + "Prompt" => /[$%#>] \z/n, + "Timeout" => 10}) ==== REALTIME OUTPUT - host.login("username", "password"){|c| print c } - host.login({"Name" => "username", - "Password" => "password", - "Prompt" => /[$%#>] \z/n, - "Timeout" => 10}){|c| print c } + host.login("username", "password"){|c| print c } + host.login({"Name" => "username", + "Password" => "password", + "Prompt" => /[$%#>] \z/n, + "Timeout" => 10}){|c| print c } of cource, set sync=true or flush is necessary. + == EXAMPLE === LOGIN AND SEND COMMAND - localhost = Net::Telnet::new({"Host" => "localhost", - "Timeout" => 10, - "Prompt" => /[$%#>] \z/n}) - localhost.login("username", "password"){|c| print c } - localhost.cmd("command"){|c| print c } - localhost.close + localhost = Net::Telnet::new({"Host" => "localhost", + "Timeout" => 10, + "Prompt" => /[$%#>] \z/n}) + localhost.login("username", "password"){|c| print c } + localhost.cmd("command"){|c| print c } + localhost.close === CHECKS A POP SERVER TO SEE IF YOU HAVE MAIL - pop = Net::Telnet::new({"Host" => "your_destination_host_here", - "Port" => 110, - "Telnetmode" => false, - "Prompt" => /^\+OK/n}) - pop.cmd("user " + "your_username_here"){|c| print c} - pop.cmd("pass " + "your_password_here"){|c| print c} - pop.cmd("list"){|c| print c} + pop = Net::Telnet::new({"Host" => "your_destination_host_here", + "Port" => 110, + "Telnetmode" => false, + "Prompt" => /^\+OK/n}) + pop.cmd("user " + "your_username_here"){|c| print c} + pop.cmd("pass " + "your_password_here"){|c| print c} + pop.cmd("list"){|c| print c} -== HISTORY - -=== Version 1.40 - -2000/05/24 06:57:38 - -- improve: binmode(), telnetmode() interface - thanks to Dave Thomas - -=== Version 1.32 - -2000/05/09 22:02:56 - -- require English.rb - -=== Version 1.31 - -2000/05/02 21:48:39 - -- Proxy option: can receive IO object - -=== Version 1.30 - -2000/04/03 18:27:02 - -- telnet.rb --> net/telnet.rb - -=== Version 1.20 - -2000/01/24 17:02:57 - -- respond to "IAC WILL x" with "IAC DONT x" -- respond to "IAC WONT x" with "IAC DONT x" -- better dumplog format - thanks to WATANABE Hirofumi - -=== Version 1.10 - -2000/01/18 17:47:31 - -- bug fix: write method -- respond to "IAC WILL BINARY" with "IAC DO BINARY" - -=== Version 1.00 - -1999/10/04 22:51:26 - -- bug fix: waitfor(preprocess) method - thanks to Shin-ichiro Hara -- add simple support for AO, DM, IP, NOP, SB, SE -- COUTION! TimeOut --> TimeoutError - -=== Version 0.50 - -1999/09/21 21:24:07 - -- add write method - -=== Version 0.40 - -1999/09/17 17:41:41 - -- bug fix: preprocess method - -=== Version 0.30 - -1999/09/14 23:09:05 - -- change prompt check order. - not IO::select([@sock], nil, nil, waittime) and prompt === line - --> prompt === line and not IO::select([@sock], nil, nil, waittime) - -=== Version 0.24 - -1999/09/13 22:28:33 - -- Telnet#login -if ommit password, then not require password prompt. - -=== Version 0.232 - -1999/08/10 05:20:21 - -- STATUS OUTPUT sample code typo. thanks to Tadayoshi Funaba - host = Telnet.new({"Hosh" => "localhost"){|c| print c } - --> host = Telnet.new({"Host" => "localhost"){|c| print c } - -=== Version 0.231 - -1999/07/16 13:39:42 - -- TRUE --> true, FALSE --> false - -=== Version 0.23 - -1999/07/15 22:32:09 - -- waitfor: if end of file reached, then return nil. - -=== Version 0.22 - -1999/06/29 09:08:51 - -- new, waitfor, cmd: {"Timeout" => false} # ignore timeout - -=== Version 0.21 - -1999/06/28 18:18:55 - -- waitfor: not rescue (EOFError) - -=== Version 0.20 - -1999/06/04 06:24:58 - -- waitfor: support for divided telnet command - -=== Version 0.181 - -1999/05/22 - -- bug fix: print method - -=== Version 0.18 - -1999/05/14 - -- respond to "IAC WON'T SGA" with "IAC DON'T SGA" -- DON'T SGA : end of line --> CR + LF -- bug fix: preprocess method - -=== Version 0.17 - -1999/04/30 - -- bug fix: $! + "\n" --> $!.to_s + "\n" - -=== Version 0.163 - -1999/04/11 - -- STDOUT.write(message) --> yield(message) if iterator? - -=== Version 0.162 - -1999/03/17 - -- add "Proxy" option -- required timeout.rb - -=== Version 0.161 - -1999/02/03 - -- select --> IO::select - -=== Version 0.16 - -1998/10/09 - -- preprocess method change for the better -- add binmode method. -- change default Binmode. TRUE --> FALSE - -=== Version 0.15 - -1998/10/04 - -- add telnetmode method. - -=== Version 0.141 - -1998/09/22 - -- change default prompt. /[$%#>] $/ --> /[$%#>] \Z/ - -=== Version 0.14 - -1998/09/01 - -- IAC WILL SGA send EOL --> CR+NULL -- IAC WILL SGA IAC DO BIN send EOL --> CR -- NONE send EOL --> LF -- add Dump_log option. - -=== Version 0.13 - -1998/08/25 - -- add print method. - -=== Version 0.122 - -1998/08/05 - -- support for HP-UX 10.20 thanks to WATANABE Tetsuya -- socket.<< --> socket.write - -=== Version 0.121 - -1998/07/15 - -- string.+= --> string.concat - -=== Version 0.12 - -1998/06/01 - -- add timeout, waittime. - -=== Version 0.11 - -1998/04/21 - -- add realtime output. - -=== Version 0.10 - -1998/04/13 - -- first release. - =end + require "socket" require "delegate" require "timeout" @@ -455,11 +235,10 @@ module Net CR = "\015" LF = "\012" EOL = CR + LF - v = $-v - $-v = false - VERSION = "1.40" - RELEASE_DATE = "$Date$" - $-v = v + VERSION = "1.5.0" + RELEASE_DATE = "2000-06-19" + VERSION_CODE = 150 + RELEASE_CODE = 20000619 def initialize(options) @options = options @@ -799,3 +578,170 @@ module Net end end + + +=begin + +== HISTORY + +* Sun Jun 18 23:31:44 JST 2000 - wakou + * version 1.5.0 + * change: version syntax. old: x.yz, now: x.y.z + +* 2000/05/24 06:57:38 - wakou + * version 1.40 + * improve: binmode(), telnetmode() interface. + thanks to Dave Thomas + +* 2000/05/09 22:02:56 - wakou + * version 1.32 + * require English.rb + +* 2000/05/02 21:48:39 - wakou + * version 1.31 + * Proxy option: can receive IO object. + +* 2000/04/03 18:27:02 - wakou + * version 1.30 + * telnet.rb --> net/telnet.rb + +* 2000/01/24 17:02:57 - wakou + * version 1.20 + * respond to "IAC WILL x" with "IAC DONT x" + * respond to "IAC WONT x" with "IAC DONT x" + * better dumplog format. + thanks to WATANABE Hirofumi + +* 2000/01/18 17:47:31 - wakou + * version 1.10 + * bug fix: write method + * respond to "IAC WILL BINARY" with "IAC DO BINARY" + +* 1999/10/04 22:51:26 - wakou + * version 1.00 + * bug fix: waitfor(preprocess) method. + thanks to Shin-ichiro Hara + * add simple support for AO, DM, IP, NOP, SB, SE + * COUTION! TimeOut --> TimeoutError + +* 1999/09/21 21:24:07 - wakou + * version 0.50 + * add write method + +* 1999/09/17 17:41:41 - wakou + * version 0.40 + * bug fix: preprocess method + +* 1999/09/14 23:09:05 - wakou + * version 0.30 + * change prompt check order. + not IO::select([@sock], nil, nil, waittime) and prompt === line + --> prompt === line and not IO::select([@sock], nil, nil, waittime) + +* 1999/09/13 22:28:33 - wakou + * version 0.24 + * Telnet#login: if ommit password, then not require password prompt. + +* 1999/08/10 05:20:21 - wakou + * version 0.232 + * STATUS OUTPUT sample code typo. + thanks to Tadayoshi Funaba + host = Telnet.new({"Hosh" => "localhost"){|c| print c } + --> host = Telnet.new({"Host" => "localhost"){|c| print c } + +* 1999/07/16 13:39:42 - wakou + * version 0.231 + * TRUE --> true, FALSE --> false + +* 1999/07/15 22:32:09 - wakou + * version 0.23 + * waitfor: if end of file reached, then return nil. + +* 1999/06/29 09:08:51 - wakou + * version 0.22 + * new, waitfor, cmd: {"Timeout" => false} # ignore timeout + +* 1999/06/28 18:18:55 - wakou + * version 0.21 + * waitfor: not rescue (EOFError) + +* 1999/06/04 06:24:58 - wakou + * version 0.20 + * waitfor: support for divided telnet command + +* 1999/05/22 - wakou + * version 0.181 + * bug fix: print method + +* 1999/05/14 - wakou + * version 0.18 + * respond to "IAC WON'T SGA" with "IAC DON'T SGA" + * DON'T SGA : end of line --> CR + LF + * bug fix: preprocess method + +* 1999/04/30 - wakou + * version 0.17 + * bug fix: $! + "\n" --> $!.to_s + "\n" + +* 1999/04/11 - wakou + * version 0.163 + * STDOUT.write(message) --> yield(message) if iterator? + +* 1999/03/17 - wakou + * version 0.162 + * add "Proxy" option + * required timeout.rb + +* 1999/02/03 - wakou + * version 0.161 + * select --> IO::select + +* 1998/10/09 - wakou + * version 0.16 + * preprocess method change for the better + * add binmode method. + * change default Binmode. TRUE --> FALSE + +* 1998/10/04 - wakou + * version 0.15 + * add telnetmode method. + +* 1998/09/22 - wakou + * version 0.141 + * change default prompt. /[$%#>] $/ --> /[$%#>] \Z/ + +* 1998/09/01 - wakou + * version 0.14 + * IAC WILL SGA send EOL --> CR+NULL + * IAC WILL SGA IAC DO BIN send EOL --> CR + * NONE send EOL --> LF + * add Dump_log option. + +* 1998/08/25 - wakou + * version 0.13 + * add print method. + +* 1998/08/05 - wakou + * version 0.122 + * support for HP-UX 10.20. + thanks to WATANABE Tetsuya + * socket.<< --> socket.write + +* 1998/07/15 - wakou + * version 0.121 + * string.+= --> string.concat + +* 1998/06/01 - wakou + * version 0.12 + * add timeout, waittime. + +* 1998/04/21 - wakou + * version 0.11 + * add realtime output. + +* 1998/04/13 - wakou + * version 0.10 + * first release. + +$Date$ +=end