xcorp::When it rains, it pours.

"The nice thing about rain," said Eeyore, "is that it always stops. Eventually."

Ruby/LDAP がいただけない

Ruby/LDAP
LDAP::Conn#bound? メソッドでどハマリ(;´Д`)
LDAP::Conn#bind メソッドで LDAP セッションを確立した後、LDAP サーバで slapd を再起動しても、LDAP::Conn#bound? が true を返しやがる。誰だよ、こんな役に立たないメソッド作った奴。graceless disconnect ならどうしようもないのは分かるけど、graceful disconnect だぜ?ちゃんと状態遷移させろよなー!!
仕方がないので、セッション取得メソッドが呼ばれるたびに、無駄な LDAP query を発行して、例外帰ってきたら再接続するとかいう激しく後ろ向きな対応をしました。
は〜萎えるわぁ…

#
#= LDAP base class
#
# Version:: $Id: ldapbase.rb 2405 2009-02-05 12:03:16Z xcorp $
#
#== SEE ALSO
#* Ruby/LDAP  http://ruby-ldap.sourceforge.net/rdoc/

require	'ldap'
require	'ldap/ldif'

class	LdapBase
	attr_accessor :dn

	def	LdapBase.connect(isReconnect = false)
		if !isReconnect then
			return if (defined?(@@conn) && @@conn)
		end
		begin
			@@conn	= LDAP::Conn.new(ldapHost, LDAP::LDAP_PORT)
			@@conn.set_option(LDAP::LDAP_OPT_PROTOCOL_VERSION, 3)
			@@conn.bind("cn=admin,dc=hoge,dc=xcorp,dc=jp", passwd)
		rescue => e
			@@conn	= nil
			raise e
		end
	end

	def	LdapBase.disconnect
		return if (!defined?(@@conn) || !@@conn)
		begin
			@@conn.unbind
			@@conn	= nil
		rescue => e
			@@conn	= nil
			raise e
		end
	end

	def	LdapBase.conn
		LdapBase.connect if (!defined?(@@conn) || !@@conn || !@@conn.bound?)
		begin
			@@conn.search("cn=admin,dc=hoge,dc=xcorp,dc=jp", LDAP::LDAP_SCOPE_ONELEVEL, '(objectClass=OpenLDAProotDSE)') { |e| }
		rescue => e
			LdapBase.connect(true)
		end
		return	@@conn
	end

# 以下略
end