Regard to "[ruby-list:7447] Re: call for scripts"
  by 石塚圭樹 
    at Tue, 14 Apr 1998 13:28:28 +0900

有馬@FITECです。

>あと, これから投稿されようと思っている方はお早めにお願いします. 非クラ
>ス版は基本的に今週末までとさせていただきます. クラス使用版は今月いっぱ
>いぐらいが〆切になると思います.

ruby の勉強のために、pop user のパスワードを変更する poppassd に
アクセスするスクリプトを書いてみました。
ひとつめは、例外処理とイテレータを使ってみたものです。
ふたつめは、ほぼ同じ内容をクラスにしてみたものです。
ruby 1.1b9(98/02/27) [i386-cygwin32] で試しました。

-----------------------------------------------------------------------
#!/usr/local/bin/ruby
#
# ex.1) ruby passwd1.rb 
# ex.2) ruby passwd1.rb hostname
# ex.3) ruby passwd1.rb hostname servicename
#

require "socket"

enter_username = "Enter User Name      :"
enter_old      = "Enter Old Password   :"
enter_new      = "Enter New Password   :"
reenter_new    = "Reenter New Password :"
wrong_password = "New Password is wrong."
success        = "Password is changed."

host    = if ARGV.length >= 1; ARGV.shift; else "mail"; end
service = if ARGV.length >= 1; ARGV.shift; else 106; end
print "Trying ", host,":", service, " ... ", "\n"
STDOUT.flush

s = TCPsocket.open(host, service)
begin
	print enter_username
	username = gets
	print enter_old
	oldpass = gets
	print enter_new
	newpass = gets
	raise(wrong_password) if newpass == oldpass
	print reenter_new
	raise(wrong_password) if newpass != gets

	u = "user " + username
	p = "pass " + oldpass
	n = "newpass " + newpass
	[u, p, n, ""].each do |t|
		s.write(t)
		st = s.readline
		break if not st =~ /.*200.*/
	end

	print success, "\n"
rescue
	print $!, "\n"
ensure
	s.close
	print "bye."
end
-----------------------------------------------------------------------
#!/usr/local/bin/ruby
#
# ex.1) ruby passwd2.rb 
# ex.2) ruby passwd2.rb hostname
# ex.3) ruby passwd2.rb hostname servicename

require "socket"

Enter_username = "Enter User Name      :"
Enter_old      = "Enter Old Password   :"
Enter_new      = "Enter New Password   :"
ReEnter_new    = "Reenter New Password :"
Wrong          = "New Password is wrong."
Success        = "Password is changed."
Fail           = "Could not change."

class TPoppassd
	def initialize(host="mail", port=106)
		@host = host
		@port = port
	end
	def change(user, pass, newpass)
		u = "user " + user
		p = "pass " + pass
		n = "newpass " + newpass
		s = TCPsocket.open(@host, @port)
		begin
			j = s.readline
			[u, p, n].each do |i|
				s.write(i)
				j = s.readline
				raise("Fail:"+j) if not j =~ /.*200.*/
			end
			t = true
		rescue
			print $!
			t = false
		ensure
			s.write("\n")
			s.close
			return t
		end
	end
	def query
		begin
			print Enter_username
			user = gets
			print Enter_old
			pass = gets
			print Enter_new
			newpass = gets
			raise(Wrong) if newpass == pass
			print ReEnter_new
			raise(Wrong) if newpass != gets
			return user, pass, newpass
		rescue
			print $!
			return nil
		end
	end
end

Poppassd = TPoppassd.new
user, pass, newpass = Poppassd.query
print Success if Poppassd.change(user, pass, newpass)
-----------------------------------------------------------------------

--
 有馬 康弘 <fit0298 / fitec.co.jp>