[asl-commit] ActiveSambaLdap r11:

null at cozmixng.org null at cozmixng.org
Fri Aug 3 22:31:34 EDT 2007


retro	2007-08-04 11:31:29 +0900 (Sat, 04 Aug 2007)

  New Revision: 11

  Copied files:
    trunk/lib/active_samba_ldap/configuration.rb
      (from rev 10, trunk/lib/active_samba_ldap/default_config.rb)
    trunk/test/config.yml.sample
      (from rev 10, trunk/test/activesambaldap.conf.sample)
  Removed files:
    trunk/lib/active_samba_ldap/default_config.rb
    trunk/test/activesambaldap.conf.sample
  Modified files:
    trunk/bin/asl-groupadd
    trunk/bin/asl-groupdel
    trunk/bin/asl-groupmod
    trunk/bin/asl-groupshow
    trunk/bin/asl-passwd
    trunk/bin/asl-populate
    trunk/bin/asl-useradd
    trunk/bin/asl-userdel
    trunk/bin/asl-usermod
    trunk/bin/asl-usershow
    trunk/lib/active_samba_ldap.rb
    trunk/lib/active_samba_ldap/account.rb
    trunk/lib/active_samba_ldap/base.rb
    trunk/lib/active_samba_ldap/command.rb
    trunk/lib/active_samba_ldap/computer.rb
    trunk/lib/active_samba_ldap/group.rb
    trunk/lib/active_samba_ldap/idmap.rb
    trunk/lib/active_samba_ldap/populate.rb
    trunk/lib/active_samba_ldap/user.rb
    trunk/test/asl-test-utils.rb
    trunk/test/command.rb
    trunk/test/test_asl_groupadd.rb
    trunk/test/test_asl_passwd.rb
    trunk/test/test_asl_populate.rb
    trunk/test/test_asl_usershow.rb

  Log:


  Modified: trunk/lib/active_samba_ldap/user.rb (+1 -2)
===================================================================
--- trunk/lib/active_samba_ldap/user.rb	2006-11-12 22:37:38 +09:00 (rev 10)
+++ trunk/lib/active_samba_ldap/user.rb	2007-08-04 11:31:29 +09:00 (rev 11)
@@ -6,9 +6,8 @@
 
     class << self
       def ldap_mapping(options={})
-        Config.required_variables :users_prefix, :sid
         default_options = {
-          :prefix => Config.users_prefix,
+          :prefix => configuration[:users_prefix],
           :classes => ["top", "inetOrgPerson", "posixAccount",
                        "sambaSamAccount"],
         }

  Modified: trunk/bin/asl-populate (+4 -3)
===================================================================
--- trunk/bin/asl-populate	2006-11-12 22:37:38 +09:00 (rev 10)
+++ trunk/bin/asl-populate	2007-08-04 11:31:29 +09:00 (rev 11)
@@ -8,8 +8,9 @@
 require 'active_samba_ldap/command'
 
 argv, opts, options = ActiveSambaLdap::Command.parse_options do |opts, options|
-  options.start_uid = Integer(ActiveSambaLdap::Config.start_uid)
-  options.start_gid = Integer(ActiveSambaLdap::Config.start_gid)
+  default = ActiveSambaLdap::Configuration::ClassMethods::Private.new({})
+  options.start_uid = Integer(default.start_uid)
+  options.start_gid = Integer(default.start_gid)
   options.administrator = ActiveSambaLdap::User::DOMAIN_ADMIN_NAME
   admin_rid = ActiveSambaLdap::User::DOMAIN_ADMIN_RID
   admins_rid = ActiveSambaLdap::Group::DOMAIN_ADMINS_RID
@@ -55,7 +56,7 @@
   exit 1
 end
 
-ActiveSambaLdap::Base.establish_connection({}, false)
+ActiveSambaLdap::Base.establish_connection("update")
 
 entries, opts = ActiveSambaLdap::Base.populate(options.marshal_dump)
 

  Modified: trunk/test/test_asl_groupadd.rb (+1 -1)
===================================================================
--- trunk/test/test_asl_groupadd.rb	2006-11-12 22:37:38 +09:00 (rev 10)
+++ trunk/test/test_asl_groupadd.rb	2007-08-04 11:31:29 +09:00 (rev 11)
@@ -41,7 +41,7 @@
     ensure_delete_group("test-group") do |cn|
       pool_class = Class.new(ActiveSambaLdap::UnixIdPool)
       pool_class.ldap_mapping
-      pool = pool_class.new(ActiveSambaLdap::Config.samba_domain)
+      pool = pool_class.new(pool_class.configuration[:samba_domain])
       next_gid = @group_class.find_available_gid_number(pool)
       assert_asl_groupadd_successfully(cn, "#{next_gid}\n",
                                        "--print-gid-number")

  Modified: trunk/test/asl-test-utils.rb (+27 -12)
===================================================================
--- trunk/test/asl-test-utils.rb	2006-11-12 22:37:38 +09:00 (rev 10)
+++ trunk/test/asl-test-utils.rb	2007-08-04 11:31:29 +09:00 (rev 11)
@@ -12,7 +12,7 @@
 module AslTestUtils
   def self.included(base)
     base.class_eval do
-      include Config
+      include Configuration
       include Connection
       include Populate
       include TemporaryEntry
@@ -20,31 +20,45 @@
     end
   end
 
-  module Config
+  module Configuration
     def setup
       super
       @test_dir = File.expand_path(File.dirname(__FILE__))
       @top_dir = File.expand_path(File.join(@test_dir, ".."))
       @parent_dir = File.expand_path(File.join(@top_dir, ".."))
-      @config_file = File.join(@test_dir, "activesambaldap.conf")
-      ActiveSambaLdap::DefaultConfig::FILES << @config_file
+      @config_file = File.join(@test_dir, "config.yml")
+      ActiveSambaLdap::Base.configurations = read_config
     end
 
     def teardown
       super
-      ActiveSambaLdap::DefaultConfig::FILES.reject! {|x| x == @config_file}
     end
+
+    def reference_configuration
+      ActiveSambaLdap::Base.configurations["reference"]
+    end
+
+    def update_configuration
+      ActiveSambaLdap::Base.configurations["update"]
+    end
+
+    def read_config
+      unless File.exist?(@config_file)
+        raise "config file for testing doesn't exist: #{@config_file}"
+      end
+      ActiveSambaLdap::Configuration.read(@config_file)
+    end
   end
 
   module Connection
     def setup
       super
-      ActiveSambaLdap::Base.establish_connection({}, false)
+      ActiveSambaLdap::Base.establish_connection(update_configuration)
     end
 
     def teardown
       super
-      ActiveLdap::Base.clear_active_connections!
+      ActiveSambaLdap::Base.clear_active_connections!
     end
   end
 
@@ -62,7 +76,7 @@
 
     def teardown
       super
-      ActiveSambaLdap::Base.establish_connection({}, false)
+      ActiveSambaLdap::Base.establish_connection(update_configuration)
       ActiveSambaLdap::Base.delete_all(nil, :scope => :sub)
       ActiveSambaLdap::Base.load(@dumped_data)
     end
@@ -100,7 +114,7 @@
       ensure_delete_user(name, home_directory) do
         password = config[:password] || "password"
         uid_number = config[:uid_number] || "100000#{@user_index}"
-        default_user_gid = ActiveSambaLdap::Config.default_user_gid
+        default_user_gid = @user_class.configuration[:default_user_gid]
         gid_number = config[:gid_number] || default_user_gid
         _wrap_assertion do
           assert(!@user_class.exists?(name))
@@ -135,7 +149,8 @@
       ensure_delete_computer(name, home_directory) do |name, home_directory|
         password = config[:password]
         uid_number = config[:uid_number] || "100000#{@computer_index}"
-        default_computer_gid = ActiveSambaLdap::Config.default_computer_gid
+        default_computer_gid =
+          @computer_class.configuration[:default_computer_gid]
         gid_number = config[:gid_number] || default_computer_gid
         _wrap_assertion do
           assert(!@computer_class.exists?(name))
@@ -199,8 +214,8 @@
     def pool
       pool_class = Class.new(ActiveSambaLdap::UnixIdPool)
       pool_class.ldap_mapping
-      ActiveSambaLdap::Config.required_variables :samba_domain
-      pool_class.new(ActiveSambaLdap::Config.samba_domain)
+      pool_class.required_configuration_variables :samba_domain
+      pool_class.new(pool_class.configuration[:samba_domain])
     end
 
     def next_uid_number

  Modified: trunk/lib/active_samba_ldap.rb (+2 -10)
===================================================================
--- trunk/lib/active_samba_ldap.rb	2006-11-12 22:37:38 +09:00 (rev 10)
+++ trunk/lib/active_samba_ldap.rb	2007-08-04 11:31:29 +09:00 (rev 11)
@@ -11,20 +11,12 @@
 require_gem_if_need.call("active_ldap", "activeldap", ">= 0.8.0")
 
 require 'active_samba_ldap/version'
-begin
-  require "active_samba_ldap/config"
-rescue LoadError
-  require "active_samba_ldap/default_config"
-  module ActiveSambaLdap
-    class Config < DefaultConfig
-    end
-  end
-end
-
 require 'active_samba_ldap/base'
+require "active_samba_ldap/configuration"
 require 'active_samba_ldap/populate'
 
 ActiveSambaLdap::Base.class_eval do
+  include ActiveSambaLdap::Configuration
   include ActiveSambaLdap::Populate
 end
 

  Modified: trunk/bin/asl-groupdel (+1 -1)
===================================================================
--- trunk/bin/asl-groupdel	2006-11-12 22:37:38 +09:00 (rev 10)
+++ trunk/bin/asl-groupdel	2007-08-04 11:31:29 +09:00 (rev 11)
@@ -25,7 +25,7 @@
   exit 1
 end
 
-ActiveSambaLdap::Base.establish_connection({}, false)
+ActiveSambaLdap::Base.establish_connection("update")
 
 class Group < ActiveSambaLdap::Group
   ldap_mapping

  Modified: trunk/bin/asl-groupadd (+1 -1)
===================================================================
--- trunk/bin/asl-groupadd	2006-11-12 22:37:38 +09:00 (rev 10)
+++ trunk/bin/asl-groupadd	2007-08-04 11:31:29 +09:00 (rev 11)
@@ -31,7 +31,7 @@
   exit 1
 end
 
-ActiveSambaLdap::Base.establish_connection({}, true)
+ActiveSambaLdap::Base.establish_connection("update")
 
 class Group < ActiveSambaLdap::Group
   ldap_mapping

  Modified: trunk/test/command.rb (+3 -4)
===================================================================
--- trunk/test/command.rb	2006-11-12 22:37:38 +09:00 (rev 10)
+++ trunk/test/command.rb	2007-08-04 11:31:29 +09:00 (rev 11)
@@ -42,11 +42,10 @@
       pid = fork do
         $VERBOSE = verbose
         detach_io
-        out = STDERR.dup
-        STDIN.reopen(in_r)
+        $stdin.reopen(in_r)
         in_r.close
-        STDOUT.reopen(out_w)
-        STDERR.reopen(out_w)
+        $stdout.reopen(out_w)
+        $stderr.reopen(out_w)
         out_w.close
         exec(cmd, *args.collect {|arg| arg.to_s})
         exit!(-1)

  Deleted: trunk/test/activesambaldap.conf.sample (+0 -13)
===================================================================
--- trunk/test/activesambaldap.conf.sample	2006-11-12 22:37:38 +09:00 (rev 10)
+++ trunk/test/activesambaldap.conf.sample	2007-08-04 11:31:29 +09:00 (rev 11)
@@ -1,13 +0,0 @@
-# -*- ruby -*-
-
-suffix = "dc=test,dc=local,dc=net"
-
-update_host = "127.0.0.1"
-#update_use_tls = true
-update_bind_format = "cn=%s,dc=local,dc=net"
-update_user = "admin"
-update_password = "secret"
-
-sid = "S-1-5-21-915876905-2926214379-2876160357"
-user_home = "/home/%U"
-user_login_shell = "/bin/sh"

  Modified: trunk/bin/asl-userdel (+1 -1)
===================================================================
--- trunk/bin/asl-userdel	2006-11-12 22:37:38 +09:00 (rev 10)
+++ trunk/bin/asl-userdel	2007-08-04 11:31:29 +09:00 (rev 11)
@@ -33,7 +33,7 @@
   exit 1
 end
 
-ActiveSambaLdap::Base.establish_connection({}, false)
+ActiveSambaLdap::Base.establish_connection("update")
 
 class User < ActiveSambaLdap::User
   ldap_mapping

  Modified: trunk/bin/asl-groupmod (+1 -1)
===================================================================
--- trunk/bin/asl-groupmod	2006-11-12 22:37:38 +09:00 (rev 10)
+++ trunk/bin/asl-groupmod	2007-08-04 11:31:29 +09:00 (rev 11)
@@ -39,7 +39,7 @@
   exit 1
 end
 
-ActiveSambaLdap::Base.establish_connection({}, false)
+ActiveSambaLdap::Base.establish_connection("update")
 
 class Group < ActiveSambaLdap::Group
   ldap_mapping

  Deleted: trunk/lib/active_samba_ldap/default_config.rb (+0 -255)
===================================================================
--- trunk/lib/active_samba_ldap/default_config.rb	2006-11-12 22:37:38 +09:00 (rev 10)
+++ trunk/lib/active_samba_ldap/default_config.rb	2007-08-04 11:31:29 +09:00 (rev 11)
@@ -1,255 +0,0 @@
-require 'socket'
-
-module ActiveSambaLdap
-  class DefaultConfig
-    FILES = [
-             "/etc/activesambaldap/config.rb",
-             "/etc/activesambaldap/bind.rb",
-            ]
-    begin
-      FILES << File.expand_path("~/.activesambaldap.conf")
-      FILES << File.expand_path("~/.activesambaldap.bind")
-    rescue ArgumentError
-    end
-
-    cattr_writer :sid, :smb_conf, :samba_domain, :samba_netbios_name
-
-    cattr_writer :update_host, :update_port, :update_bind_format
-    cattr_writer :update_allow_anonymous
-    cattr_accessor :update_user, :update_password, :update_use_tls
-
-    cattr_writer :reference_host, :reference_port
-    cattr_writer :reference_bind_format, :reference_user, :reference_password
-    cattr_writer :reference_use_tls
-    cattr_writer :reference_allow_anonymous
-
-    cattr_accessor :suffix
-    cattr_writer :users_prefix, :groups_prefix
-    cattr_writer :computers_prefix, :idmap_prefix
-
-    cattr_accessor :scope, :hash_encrypt
-
-    cattr_writer :start_uid, :start_gid
-
-    cattr_accessor :user_login_shell, :user_home, :user_home_directory_mode
-    cattr_accessor :user_gecos
-    cattr_writer :default_user_gid, :default_computer_gid
-    cattr_writer :skeleton_directory
-    cattr_accessor :default_max_password_age
-
-    cattr_writer :user_samba_home, :user_profile, :user_home_drive, :user_script
-    cattr_accessor :mail_domain
-
-    class << self
-      def read(path)
-        if File.exist?(path)
-          anonymous_binding = Module.new.__send__(:binding)
-          eval(File.read(path), anonymous_binding, path, 0)
-          eval("local_variables", anonymous_binding).each do |name|
-            setter = "#{name}="
-            if self.respond_to?(setter)
-              self.__send__(setter, eval(name, anonymous_binding))
-            end
-          end
-        end
-      end
-
-      def [](key)
-        required_variables key
-        __send__(key)
-      end
-
-      @@initialized = false
-      def initialized?
-        @@initialized
-      end
-
-      def init
-        reinit unless initialized?
-      end
-
-      def reinit
-        FILES.each do |file|
-          read(file)
-        end
-        @@initialized = true
-      end
-
-      def required_variables(*names)
-        names.each do |name|
-          raise RequiredVariableIsNotSet.new(name) if __send__(name).nil?
-        end
-      end
-
-      def sid
-        return @@sid if @@sid
-        result = `net getlocalsid`
-        if $?.success?
-          result.chomp.gsub(/\G[^:]+:\s*/, '')
-        else
-          nil
-        end
-      end
-
-      def smb_conf
-        return @@smb_conf if @@smb_conf
-        %w(/etc/samba/smb.conf /usr/local/etc/samba/smb.conf).each do |guess|
-          return guess if File.exist?(guess)
-        end
-        nil
-      end
-
-      def samba_domain
-        return @@samba_domain if @@samba_domain
-        if smb_conf
-          File.open(smb_conf) do |f|
-            f.read.grep(/^\s*[^#;]/).each do |line|
-              if /^\s*workgroup\s*=\s*(\S+)\s*$/i =~ line
-                return $1.upcase
-              end
-            end
-          end
-        else
-          nil
-        end
-      end
-
-      def samba_netbios_name
-        return @@samba_netbios_name if @@samba_netbios_name
-        netbios_name = nil
-        if smb_conf
-          File.open(smb_conf) do |f|
-            f.read.grep(/^\s*[^#;]/).each do |line|
-              if /^\s*netbios\s*name\s*=\s*(.+)\s*$/i =~ line
-                netbios_name = $1
-                break
-              end
-            end
-          end
-        end
-        netbios_name ||= Socket.gethostname
-        netbios_name ? netbios_name.upcase : nil
-      end
-
-      def update_host
-        @@update_host || "localhost"
-      end
-
-      def update_port
-        @@update_port || 389
-      end
-
-      def update_bind_format
-        return @@update_bind_format if @@update_bind_format
-        _suffix = suffix
-        if suffix
-          "cn=%s,#{suffix}"
-        else
-          nil
-        end
-      end
-
-      def update_allow_anonymous
-        if @@update_allow_anonymous.nil?
-          false
-        else
-          @@update_allow_anonymous
-        end
-      end
-
-      def reference_host
-        @@reference_host || update_host
-      end
-
-      def reference_port
-        @@reference_port || update_port
-      end
-
-      def reference_bind_format
-        @@reference_bind_format || update_bind_format
-      end
-
-      def reference_user
-        @@reference_user || update_user
-      end
-
-      def reference_password
-        @@reference_password || update_password
-      end
-
-      def reference_use_tls
-        if @@reference_use_tls.nil?
-          update_use_tls
-        else
-          @@reference_use_tls
-        end
-      end
-
-      def reference_allow_anonymous
-        if @@reference_allow_anonymous.nil?
-          update_allow_anonymous
-        else
-          @@reference_allow_anonymous
-        end
-      end
-
-      def users_prefix
-        @@users_prefix || "ou=Users"
-      end
-
-      def groups_prefix
-        @@groups_prefix || "ou=Groups"
-      end
-
-      def computers_prefix
-        @@computers_prefix || "ou=Computers"
-      end
-
-      def idmap_prefix
-        @@idmap_prefix || "ou=Idmap"
-      end
-
-      def start_uid
-        @@start_uid || "10000"
-      end
-
-      def start_gid
-        @@start_gid || "10000"
-      end
-
-      def default_user_gid
-        return @@default_user_gid if @@default_user_gid
-        rid = ActiveSambaLdap::Group::DOMAIN_USERS_RID
-        ActiveSambaLdap::Group.rid2gid(rid)
-      end
-
-      def default_computer_gid
-        return @@default_computer_gid if @@default_computer_gid
-        rid = ActiveSambaLdap::Group::DOMAIN_COMPUTERS_RID
-        ActiveSambaLdap::Group.rid2gid(rid)
-      end
-
-      def skeleton_directory
-        @@skeleton_directory || "/etc/skel"
-      end
-
-      def user_samba_home
-        return @@user_samba_home if @@user_samba_home
-        samba_netbios_name ? "\\\\#{samba_netbios_name}\\%U" : nil
-      end
-
-      def user_profile
-        return @@user_profile if @@user_profile
-        samba_netbios_name ? "\\\\#{samba_netbios_name}\\profiles\\%U" : nil
-      end
-
-      def user_home_drive
-        @@user_home_drive || "H:"
-      end
-
-      def user_script
-        @@user_script || "logon.bat"
-      end
-    end
-  end
-end

  Modified: trunk/lib/active_samba_ldap/base.rb (+24 -37)
===================================================================
--- trunk/lib/active_samba_ldap/base.rb	2006-11-12 22:37:38 +09:00 (rev 10)
+++ trunk/lib/active_samba_ldap/base.rb	2007-08-04 11:31:29 +09:00 (rev 11)
@@ -10,6 +10,14 @@
     end
   end
 
+  class RequiredVariablesAreNotSet < RequiredVariableIsNotSet
+    attr_reader :names
+    def initialize(names)
+      @names = names
+      super("required variables '#{names.join(', ')}' are not set")
+    end
+  end
+
   class UidNumberAlreadyExists < Error
     attr_reader :number
     def initialize(number)
@@ -72,46 +80,25 @@
     end
   end
 
+  class InvalidConfigurationFormatError < Error
+    attr_reader :file, :location, :detail
+    def initialize(file, location, detail)
+      @file = file
+      @location = location
+      @detail = detail
+      super("found invalid configuration format at #{@file}:#{@location}" +
+            ": #{@detail}")
+    end
+  end
+
   class Base < ActiveLdap::Base
     class << self
-      def establish_connection(config={}, reference_only=true)
-        Config.init
-        Config.required_variables :suffix
-        default_config = {:base => Config.suffix}
-        if reference_only
-          Config.required_variables :reference_host, :reference_port
-          default_config[:host] = Config.reference_host
-          default_config[:port] = Config.reference_port
-          default_config[:bind_format] = Config.reference_bind_format
-          default_config[:user] = Config.reference_user
-          default_config[:password] = Config.reference_password
-          default_config[:method] = :tls if Config.reference_use_tls
-          default_config[:allow_anonymous] = Config.reference_allow_anonymous
-        else
-          Config.required_variables :update_host, :update_port
-          default_config[:host] = Config.update_host
-          default_config[:port] = Config.update_port
-          default_config[:bind_format] = Config.update_bind_format
-          default_config[:user] = Config.update_user
-          default_config[:password] = Config.update_password
-          default_config[:method] = :tls if Config.update_use_tls
-          default_config[:allow_anonymous] = Config.update_allow_anonymous
-        end
-        default_config.each do |key, value|
-          default_config.delete(key) if value.nil?
-        end
-        super(default_config.merge(config))
-      end
-
       def restart_nscd
-        if system("/etc/init.d/nscd status >/dev/null 2>&1")
-          system("/etc/init.d/nscd stop >/dev/null 2>&1")
-          begin
-            yield if block_given?
-          ensure
-            system("/etc/init.d/nscd start >/dev/null 2>&1")
-          end
-        end
+        nscd_working = system("/etc/init.d/nscd status >/dev/null 2>&1")
+        system("/etc/init.d/nscd stop >/dev/null 2>&1") if nscd_working
+        yield if block_given?
+      ensure
+        system("/etc/init.d/nscd start >/dev/null 2>&1") if nscd_working
       end
 
       private

  Modified: trunk/lib/active_samba_ldap/account.rb (+5 -6)
===================================================================
--- trunk/lib/active_samba_ldap/account.rb	2006-11-12 22:37:38 +09:00 (rev 10)
+++ trunk/lib/active_samba_ldap/account.rb	2007-08-04 11:31:29 +09:00 (rev 11)
@@ -85,8 +85,7 @@
       end
 
       def start_uid
-        ActiveSambaLdap::Config.required_variables :start_uid
-        Integer(ActiveSambaLdap::Config.start_uid)
+        Integer(configuration[:start_uid])
       end
 
       def start_rid
@@ -184,7 +183,7 @@
     end
 
     def change_sid(rid, allow_non_unique=false)
-      sid = "#{ActiveSambaLdap::Config.sid}-#{rid}"
+      sid = "#{self.class.configuration[:sid]}-#{rid}"
       # check_unique_sid_number(sid) unless allow_non_unique
       self.samba_sid = sid
     end
@@ -273,16 +272,16 @@
     end
 
     def substituted_value(key)
+      config = self.class.configuration
       if block_given?
-        value = ActiveSambaLdap::Config.__send__(key)
+        value = config[key.to_sym]
         if value
           substitute_template(value)
         else
           yield
         end
       else
-        ActiveSambaLdap::Config.required_variables key
-        substitute_template(ActiveSambaLdap::Config.__send__(key))
+        substitute_template(config[key.to_sym])
       end
     end
   end

  Modified: trunk/bin/asl-useradd (+8 -12)
===================================================================
--- trunk/bin/asl-useradd	2006-11-12 22:37:38 +09:00 (rev 10)
+++ trunk/bin/asl-useradd	2007-08-04 11:31:29 +09:00 (rev 11)
@@ -145,7 +145,7 @@
 
 def get_value(options, key, default_key=nil)
   value = options.__send__(key)
-  value ||= ActiveSambaLdap::Config[default_key || key]
+  value ||= ActiveSambaLdap::Base.configuration[(default_key || key).to_sym]
   value
 end
 
@@ -153,7 +153,7 @@
   value.gsub(/%U/, member.uid)
 end
 
-ActiveSambaLdap::Base.establish_connection({}, true)
+ActiveSambaLdap::Base.establish_connection("update")
 
 
 class Computer < ActiveSambaLdap::Computer
@@ -207,7 +207,7 @@
   ldap_mapping
 end
 def make_pool
-  UnixIdPool.find(ActiveSambaLdap::Config[:samba_domain])
+  UnixIdPool.find(UnixIdPool.configuration[:samba_domain])
 end
 pool = nil
 
@@ -248,11 +248,9 @@
     end
   else
     if options.computer_account
-      ActiveSambaLdap::Config.required_variables :default_computer_gid
-      gid_number = ActiveSambaLdap::Config.default_computer_gid
+      gid_number = member_class.configuration[:default_computer_gid]
     else
-      ActiveSambaLdap::Config.required_variables :default_user_gid
-      gid_number = ActiveSambaLdap::Config.default_user_gid
+      gid_number = member_class.configuration[:default_user_gid]
     end
   end
 end
@@ -271,8 +269,7 @@
   if options.computer_account
     home_directory = "/nonexistent"
   else
-    ActiveSambaLdap::Config.required_variables :user_home
-    home_directory = ActiveSambaLdap::Config.user_home
+    home_directory = member_class.configuration[:user_home]
   end
 end
 home_directory = substitute_member(home_directory, member)
@@ -284,8 +281,7 @@
 if options.computer_account
   login_shell ||= "/bin/false"
 else
-  ActiveSambaLdap::Config.required_variables :user_login_shell
-  login_shell ||= ActiveSambaLdap::Config.user_login_shell
+  login_shell ||= member_class.configuration[:user_login_shell]
 end
 member.login_shell = login_shell
 
@@ -307,7 +303,7 @@
 if options.computer_account
   gecos ||= "Computer"
 else
-  gecos ||= ActiveSambaLdap::Config.user_gecos
+  gecos ||= member_class.configuration[:user_gecos]
 end
 
 if gecos

  Modified: trunk/lib/active_samba_ldap/populate.rb (+70 -62)
===================================================================
--- trunk/lib/active_samba_ldap/populate.rb	2006-11-12 22:37:38 +09:00 (rev 10)
+++ trunk/lib/active_samba_ldap/populate.rb	2007-08-04 11:31:29 +09:00 (rev 11)
@@ -6,32 +6,39 @@
 
     module ClassMethods
       def populate(options={})
-        options = options.dup
-        Private.init_classes(options)
-        Private.init_options(options)
+        Private.new(self, options).populate
+      end
 
-        entries = []
-        entries.concat(Private.ensure_base(options))
-        entries.concat(Private.ensure_group_base(options))
-        entries.concat(Private.ensure_user_base(options))
-        entries.concat(Private.ensure_computer_base(options))
-        entries.concat(Private.ensure_idmap_base(options))
-        entries.concat(Private.make_groups(options))
-        entries.concat(Private.make_users(options))
-        entries.concat(Private.make_pool(options))
+      class Private
+        def initialize(base, options)
+          @base = base
+          @options = options.dup
+        end
 
-        [entries, options]
-      end
+        def populate
+          init_classes
+          init_options
 
-      module Private
-        module_function
-        def init_classes(options)
-          options[:user_class] = user_class = Class.new(User)
-          options[:group_class] = group_class = Class.new(Group)
-          options[:computer_class] = computer_class = Class.new(Computer)
-          options[:idmap_class] = idmap_class = Class.new(Idmap)
-          options[:unix_id_pool_class] = id_pool_class = Class.new(UnixIdPool)
+          entries = []
+          entries.concat(ensure_base)
+          entries.concat(ensure_group_base)
+          entries.concat(ensure_user_base)
+          entries.concat(ensure_computer_base)
+          entries.concat(ensure_idmap_base)
+          entries.concat(make_groups)
+          entries.concat(make_users)
+          entries.concat(make_pool)
 
+          [entries, @options]
+        end
+
+        def init_classes
+          @options[:user_class] = user_class = Class.new(User)
+          @options[:group_class] = group_class = Class.new(Group)
+          @options[:computer_class] = computer_class = Class.new(Computer)
+          @options[:idmap_class] = idmap_class = Class.new(Idmap)
+          @options[:unix_id_pool_class] = id_pool_class = Class.new(UnixIdPool)
+
           user_class.ldap_mapping
           group_class.ldap_mapping
           computer_class.ldap_mapping
@@ -49,18 +56,19 @@
           group_class.set_associated_class(:primary_computers, computer_class)
         end
 
-        def init_options(options)
-          options[:start_uid] ||= Integer(Config.start_uid)
-          options[:start_gid] ||= Integer(Config.start_gid)
-          options[:administrator] ||= User::DOMAIN_ADMIN_NAME
-          options[:administrator_uid] ||= User.rid2uid(User::DOMAIN_ADMIN_RID)
-          options[:administrator_gid] ||=
+        def init_options
+          config = @base.configuration
+          @options[:start_uid] ||= Integer(config[:start_uid])
+          @options[:start_gid] ||= Integer(config[:start_gid])
+          @options[:administrator] ||= User::DOMAIN_ADMIN_NAME
+          @options[:administrator_uid] ||= User.rid2uid(User::DOMAIN_ADMIN_RID)
+          @options[:administrator_gid] ||=
             Group.rid2gid(Group::DOMAIN_ADMINS_RID)
-          options[:guest] ||= User::DOMAIN_GUEST_NAME
-          options[:guest_uid] ||= User.rid2uid(User::DOMAIN_GUEST_RID)
-          options[:guest_gid] ||= Group.rid2gid(Group::DOMAIN_GUESTS_RID)
-          options[:default_user_gid] ||= Config.default_user_gid
-          options[:default_computer_gid] ||= Config.default_computer_gid
+          @options[:guest] ||= User::DOMAIN_GUEST_NAME
+          @options[:guest_uid] ||= User.rid2uid(User::DOMAIN_GUEST_RID)
+          @options[:guest_gid] ||= Group.rid2gid(Group::DOMAIN_GUESTS_RID)
+          @options[:default_user_gid] ||= config[:default_user_gid]
+          @options[:default_computer_gid] ||= config[:default_computer_gid]
         end
 
         def ensure_container_base(dn, target_name, klass, ignore_base=false)
@@ -87,9 +95,8 @@
           entries
         end
 
-        def ensure_base(options)
-          Config.required_variables :suffix
-          ensure_container_base(Config.suffix, "dc", Dc, true) do |dc|
+        def ensure_base
+          ensure_container_base(@base.base, "dc", Dc, true) do |dc|
             dc.o = dc.dc
           end
         end
@@ -98,20 +105,20 @@
           ensure_container_base(dn, "ou", Ou)
         end
 
-        def ensure_user_base(options)
-          ensure_ou_base(options[:user_class].prefix)
+        def ensure_user_base
+          ensure_ou_base(@options[:user_class].prefix)
         end
 
-        def ensure_group_base(options)
-          ensure_ou_base(options[:group_class].prefix)
+        def ensure_group_base
+          ensure_ou_base(@options[:group_class].prefix)
         end
 
-        def ensure_computer_base(options)
-          ensure_ou_base(options[:computer_class].prefix)
+        def ensure_computer_base
+          ensure_ou_base(@options[:computer_class].prefix)
         end
 
-        def ensure_idmap_base(options)
-          ensure_ou_base(options[:idmap_class].prefix)
+        def ensure_idmap_base
+          ensure_ou_base(@options[:idmap_class].prefix)
         end
 
         def make_user(user_class, name, uid, group)
@@ -127,14 +134,14 @@
           [user, group]
         end
 
-        def make_users(options)
-          user_class = options[:user_class]
-          group_class = options[:group_class]
+        def make_users
+          user_class = @options[:user_class]
+          group_class = @options[:group_class]
           entries = []
           [
-           [options[:administrator], options[:administrator_uid],
-            options[:administrator_gid]],
-           [options[:guest], options[:guest_uid], options[:guest_gid]],
+           [@options[:administrator], @options[:administrator_uid],
+            @options[:administrator_gid]],
+           [@options[:guest], @options[:guest_uid], @options[:guest_gid]],
           ].each do |name, uid, gid|
             user, group = make_user(user_class, name, uid,
                                     group_class.find_by_gid_number(gid))
@@ -169,16 +176,17 @@
           group
         end
 
-        def make_groups(options)
-          group_class = options[:group_class]
+        def make_groups
+          group_class = @options[:group_class]
           entries = []
           [
-           ["Domain Admins", options[:administrator_gid],
+           ["Domain Admins", @options[:administrator_gid],
             "Netbios Domain Administrators"],
-           ["Domain Users", options[:default_user_gid], "Netbios Domain Users"],
-           ["Domain Guests", options[:guest_gid],
+           ["Domain Users", @options[:default_user_gid],
+            "Netbios Domain Users"],
+           ["Domain Guests", @options[:guest_gid],
             "Netbios Domain Guest Users"],
-           ["Domain Computers", options[:default_computer_gid],
+           ["Domain Computers", @options[:default_computer_gid],
             "Netbios Domain Computers"],
            ["Administrators", nil, nil, "builtin", Group::LOCAL_ADMINS_RID],
            ["Users", nil, nil, "builtin", Group::LOCAL_USERS_RID],
@@ -201,12 +209,12 @@
           entries
         end
 
-        def make_pool(options)
-          Config.required_variables :samba_domain, :sid
-          pool = options[:unix_id_pool_class].new(Config.samba_domain)
-          pool.samba_sid = Config.sid
-          pool.uid_number = options[:start_uid]
-          pool.gid_number = options[:start_gid]
+        def make_pool
+          config = @base.configuration
+          pool = @options[:unix_id_pool_class].new(config[:samba_domain])
+          pool.samba_sid = config[:sid]
+          pool.uid_number = @options[:start_uid]
+          pool.gid_number = @options[:start_gid]
           pool.save!
           [pool]
         end

  Modified: trunk/lib/active_samba_ldap/idmap.rb (+1 -2)
===================================================================
--- trunk/lib/active_samba_ldap/idmap.rb	2006-11-12 22:37:38 +09:00 (rev 10)
+++ trunk/lib/active_samba_ldap/idmap.rb	2007-08-04 11:31:29 +09:00 (rev 11)
@@ -2,10 +2,9 @@
   class Idmap < Base
     class << self
       def ldap_mapping(options={})
-        Config.required_variables :idmap_prefix
         default_options = {
           :dn_attribute => "sambaSID",
-          :prefix => Config.idmap_prefix,
+          :prefix => configuration[:idmap_prefix],
           :classes => ["top", "sambaIdmapEntry"],
         }
         options = default_options.merge(options)

  Modified: trunk/lib/active_samba_ldap/computer.rb (+1 -2)
===================================================================
--- trunk/lib/active_samba_ldap/computer.rb	2006-11-12 22:37:38 +09:00 (rev 10)
+++ trunk/lib/active_samba_ldap/computer.rb	2007-08-04 11:31:29 +09:00 (rev 11)
@@ -5,9 +5,8 @@
     include Account
     class << self
       def ldap_mapping(options={})
-        Config.required_variables :computers_prefix
         default_options = {
-          :prefix => Config.computers_prefix,
+          :prefix => configuration[:computers_prefix],
           :classes => ["top", "inetOrgPerson", "posixAccount",
                        "sambaSamAccount"],
         }

  Modified: trunk/bin/asl-usermod (+5 -5)
===================================================================
--- trunk/bin/asl-usermod	2006-11-12 22:37:38 +09:00 (rev 10)
+++ trunk/bin/asl-usermod	2007-08-04 11:31:29 +09:00 (rev 11)
@@ -133,7 +133,7 @@
   exit 1
 end
 
-ActiveSambaLdap::Base.establish_connection({}, false)
+ActiveSambaLdap::Base.establish_connection("update")
 
 class User < ActiveSambaLdap::User
   ldap_mapping
@@ -153,11 +153,11 @@
   password = ActiveSambaLdap::Command.read_password("Enter your password: ")
 
   auth_class = Class.new(ActiveSambaLdap::Base)
+  config = ActiveSambaLdap::Base.configurations["reference"]
   begin
-    auth_class.establish_connection({:bind_format => user.dn,
-                                      :password => password,
-                                      :allow_anonymous => false},
-                                    true)
+    auth_class.establish_connection(config.merge(:bind_dn => user.dn,
+                                                 :password => password,
+                                                 :allow_anonymous => false))
   rescue ActiveLdap::AuthenticationError
     puts "password isn't match"
     exit 1

  Modified: trunk/lib/active_samba_ldap/command.rb (+32 -1)
===================================================================
--- trunk/lib/active_samba_ldap/command.rb	2006-11-12 22:37:38 +09:00 (rev 10)
+++ trunk/lib/active_samba_ldap/command.rb	2007-08-04 11:31:29 +09:00 (rev 11)
@@ -7,6 +7,7 @@
     def parse_options(argv=nil)
       argv ||= ARGV.dup
       options = OpenStruct.new
+      configuration_files = default_configuration_files
       opts = OptionParser.new do |opts|
         yield(opts, options)
 
@@ -14,7 +15,7 @@
         opts.separator "Common options:"
 
         opts.on_tail("--config=CONFIG", "Specify configuration file") do |file|
-          DefaultConfig::FILES << file
+          configuration_files << file
         end
 
         opts.on_tail("-h", "--help", "Show this message") do
@@ -28,6 +29,9 @@
         end
       end
       opts.parse!(argv)
+
+      read_configuration_files(configuration_files)
+
       [argv, opts, options]
     end
 
@@ -39,5 +43,32 @@
       system "/bin/stty echo" if input.tty?
       output.puts
     end
+
+    def default_configuration_files
+      files = [
+        "/etc/activesambaldap/config.rb",
+        "/etc/activesambaldap/bind.rb",
+      ]
+      begin
+        configuration_files_for_user = [
+          File.expand_path("~/.activesambaldap.conf"),
+          File.expand_path("~/.activesambaldap.bind")
+        ]
+        files.concat(configuration_files_for_user)
+      rescue ArgumentError
+      end
+      files
+    end
+
+    def read_configuration_files(files)
+      return if files.empty?
+      Base.configurations = files.inject({}) do |result, file|
+        if File.exist?(file)
+          result.merge(Configuration.read(file))
+        else
+          result
+        end
+      end
+    end
   end
 end

  Modified: trunk/bin/asl-groupshow (+1 -1)
===================================================================
--- trunk/bin/asl-groupshow	2006-11-12 22:37:38 +09:00 (rev 10)
+++ trunk/bin/asl-groupshow	2007-08-04 11:31:29 +09:00 (rev 11)
@@ -15,7 +15,7 @@
   exit 1
 end
 
-ActiveSambaLdap::Base.establish_connection({}, true)
+ActiveSambaLdap::Base.establish_connection("reference")
 
 class Group < ActiveSambaLdap::Group
   ldap_mapping

  Modified: trunk/lib/active_samba_ldap/group.rb (+5 -6)
===================================================================
--- trunk/lib/active_samba_ldap/group.rb	2006-11-12 22:37:38 +09:00 (rev 10)
+++ trunk/lib/active_samba_ldap/group.rb	2007-08-04 11:31:29 +09:00 (rev 11)
@@ -49,10 +49,9 @@
 
     class << self
       def ldap_mapping(options={})
-        Config.required_variables :groups_prefix
         default_options = {
           :dn_attribute => "cn",
-          :prefix => Config.groups_prefix,
+          :prefix => configuration[:groups_prefix],
           :classes => ["posixGroup", "sambaGroupMapping"],
 
           :members_wrap => "memberUid",
@@ -121,8 +120,7 @@
       end
 
       def start_gid
-        ActiveSambaLdap::Config.required_variables :start_gid
-        Integer(ActiveSambaLdap::Config.start_gid)
+        Integer(configuration[:start_gid])
       end
 
       def start_rid
@@ -175,7 +173,8 @@
         pool = nil
         unless gid_number
           pool_class = options[:pool_class] || Class.new(UnixIdPool)
-          samba_domain = options[:samba_domain] || Config[:samba_domain]
+          samba_domain = options[:samba_domain]
+          samba_domain ||= pool_class.configuration[:samba_domain]
           pool = pool_class.find(samba_domain)
           gid_number = find_available_gid_number(pool)
         end
@@ -213,7 +212,7 @@
     end
 
     def change_sid(rid, allow_non_unique=false)
-      sid = "#{ActiveSambaLdap::Config.sid}-#{rid}"
+      sid = "#{self.class.configuration[:sid]}-#{rid}"
       # check_unique_sid_number(sid) unless allow_non_unique
       self.samba_sid = sid
     end

  Modified: trunk/test/test_asl_populate.rb (+6 -5)
===================================================================
--- trunk/test/test_asl_populate.rb	2006-11-12 22:37:38 +09:00 (rev 10)
+++ trunk/test/test_asl_populate.rb	2007-08-04 11:31:29 +09:00 (rev 11)
@@ -21,11 +21,12 @@
 
     results = ActiveSambaLdap::Base.search
 
-    users_prefix = ActiveSambaLdap::Config.users_prefix
-    groups_prefix = ActiveSambaLdap::Config.groups_prefix
-    computers_prefix = ActiveSambaLdap::Config.computers_prefix
-    idmap_prefix = ActiveSambaLdap::Config.idmap_prefix
-    domain = ActiveSambaLdap::Config.samba_domain
+    config = ActiveSambaLdap::Base.configuration
+    users_prefix = config[:users_prefix]
+    groups_prefix = config[:groups_prefix]
+    computers_prefix = config[:computers_prefix]
+    idmap_prefix = config[:idmap_prefix]
+    domain = config[:samba_domain]
     assert_equal([
                   nil,
                   users_prefix,

  Modified: trunk/bin/asl-usershow (+1 -1)
===================================================================
--- trunk/bin/asl-usershow	2006-11-12 22:37:38 +09:00 (rev 10)
+++ trunk/bin/asl-usershow	2007-08-04 11:31:29 +09:00 (rev 11)
@@ -15,7 +15,7 @@
   exit 1
 end
 
-ActiveSambaLdap::Base.establish_connection({}, true)
+ActiveSambaLdap::Base.establish_connection("reference")
 
 class User < ActiveSambaLdap::User
   ldap_mapping

  Modified: trunk/test/test_asl_passwd.rb (+4 -4)
===================================================================
--- trunk/test/test_asl_passwd.rb	2006-11-12 22:37:38 +09:00 (rev 10)
+++ trunk/test/test_asl_passwd.rb	2007-08-04 11:31:29 +09:00 (rev 11)
@@ -19,14 +19,14 @@
 
       assert_samba_password(user, password)
 
-      assert_change_password_successfully(user.uid,
-                                          password, new_password)
+      assert_change_password_successfully(user.uid, password, new_password)
 
       user.reload
       assert_samba_password(user, new_password)
 
-      assert_change_password_with_wrong_current_password(user.uid,
-                                                         password)
+      assert_change_password_with_wrong_current_password(user.uid, password)
+      user.reload
+      assert_samba_password(user, new_password)
 
       assert_change_password_successfully(user.uid,
                                           new_password, password)

  Copied: trunk/lib/active_samba_ldap/configuration.rb (+251 -0)
===================================================================
--- trunk/lib/active_samba_ldap/default_config.rb	2006-11-12 22:37:38 +09:00 (rev 10)
+++ trunk/lib/active_samba_ldap/configuration.rb	2007-08-04 11:31:29 +09:00 (rev 11)
@@ -0,0 +1,251 @@
+require 'socket'
+
+module ActiveSambaLdap
+  module Configuration
+    def self.included(base)
+      base.extend(ClassMethods)
+    end
+
+    class << self
+      def read(file)
+        require 'yaml'
+        require 'erb'
+        erb = ERB.new(File.read(file))
+        erb.filename = file
+        result = nil
+        begin
+          begin
+            result = YAML.load(erb.result)
+            unless result
+              raise InvalidConfigurationFormatError.new(file, "0",
+                                                        "empty source")
+            end
+          rescue ArgumentError
+            if /syntax error on line (\d+), col (\d+): `(.*)'/ =~ $!.message
+              raise InvalidConfigurationFormatError.new(file, "#{$1}:#{$2}", $3)
+            else
+              raise
+            end
+          end
+        rescue InvalidConfigurationFormatError
+          raise
+        rescue Exception
+          file, location = $@.first.split(/:/, 2)
+          detail = "#{$!.class}: #{$!.message}"
+          raise InvalidConfigurationFormatError.new(file, location, detail)
+        end
+        result
+      end
+    end
+
+    module ClassMethods
+      class ValidHash < Hash
+        def [](name)
+          if Private.required_variables.include?(name) and !has_key?(name)
+            raise RequiredVariableIsNotSet.new(name)
+          end
+          super(name)
+        end
+      end
+
+      def merge_configuration(config)
+        config = config.symbolize_keys
+        config = (configurations["common"] || {}).symbolize_keys.merge(config)
+        ValidHash.new.merge(super(Private.new(config).merge))
+      end
+
+      def required_configuration_variables(*names)
+        config = configuration
+        if config.nil?
+          missing_variables = names
+        else
+          missing_variables = names.find_all do |name|
+            config[name.to_sym].nil?
+          end
+        end
+        unless missing_variables.empty?
+          raise RequiredVariablesAreNotSet.new(missing_variables)
+        end
+      end
+
+      class Private
+        VARIABLES = %w(base host port scope bind_dn
+                       password method allow_anonymous
+
+                       sid smb_conf samba_domain samba_netbios_name
+                       hash_encrypt
+
+                       users_prefix groups_prefix computers_prefix
+                       idmap_prefix
+
+                       start_uid start_gid
+
+                       user_login_shell user_home user_home_directory_mode
+                       user_gecos user_samba_home user_profile
+                       user_home_drive user_script mail_domain
+
+                       skeleton_directory
+
+                       default_user_gid default_computer_gid
+                       default_max_password_age)
+
+        class << self
+          def required_variables
+            @required_variables ||= compute_required_variables
+          end
+
+          def compute_required_variables
+            not_required_variables = %w(base ldap_scope)
+            (VARIABLES - public_methods - not_required_variables).collect do |x|
+              x.to_sym
+            end
+          end
+        end
+
+        def initialize(target)
+          @target = target.symbolize_keys
+        end
+
+        def merge
+          result = @target.dup
+          VARIABLES.each do |variable|
+            result[variable.to_sym] ||= send(variable) if respond_to?(variable)
+          end
+          result
+        end
+
+        def [](name)
+          @target[name.to_sym] || (respond_to?(name) ? send(name) : nil)
+        end
+
+        def sid
+          result = `net getlocalsid`
+          if $?.success?
+            result.chomp.gsub(/\G[^:]+:\s*/, '')
+          else
+            nil
+          end
+        end
+
+        def smb_conf
+          %w(/etc/samba/smb.conf /usr/local/etc/samba/smb.conf).each do |guess|
+            return guess if File.exist?(guess)
+          end
+          nil
+        end
+
+        def samba_domain
+          _smb_conf = self["smb_conf"]
+          if _smb_conf
+            File.open(_smb_conf) do |f|
+              f.read.grep(/^\s*[^#;]/).each do |line|
+                if /^\s*workgroup\s*=\s*(\S+)\s*$/i =~ line
+                  return $1.upcase
+                end
+              end
+            end
+          else
+            nil
+          end
+        end
+
+        def samba_netbios_name
+          netbios_name = nil
+          _smb_conf = self["smb_conf"]
+          if _smb_conf
+            File.open(_smb_conf) do |f|
+              f.read.grep(/^\s*[^#;]/).each do |line|
+                if /^\s*netbios\s*name\s*=\s*(.+)\s*$/i =~ line
+                  netbios_name = $1
+                  break
+                end
+              end
+            end
+          end
+          netbios_name ||= Socket.gethostname
+          netbios_name ? netbios_name.upcase : nil
+        end
+
+        def host
+          "localhost"
+        end
+
+        def port
+          389
+        end
+
+        def allow_anonymous
+          false
+        end
+
+        def method
+          :plain
+        end
+
+        def users_prefix
+          "ou=Users"
+        end
+
+        def groups_prefix
+          "ou=Groups"
+        end
+
+        def computers_prefix
+          "ou=Computers"
+        end
+
+        def idmap_prefix
+          "ou=Idmap"
+        end
+
+        def start_uid
+          "10000"
+        end
+
+        def start_gid
+          "10000"
+        end
+
+        def default_user_gid
+          rid = ActiveSambaLdap::Group::DOMAIN_USERS_RID
+          ActiveSambaLdap::Group.rid2gid(rid)
+        end
+
+        def default_computer_gid
+          rid = ActiveSambaLdap::Group::DOMAIN_COMPUTERS_RID
+          ActiveSambaLdap::Group.rid2gid(rid)
+        end
+
+        def skeleton_directory
+          "/etc/skel"
+        end
+
+        def user_samba_home
+          netbios_name = self["samba_netbios_name"]
+          netbios_name ? "\\\\#{netbios_name}\\%U" : nil
+        end
+
+        def user_profile
+          netbios_name = self["samba_netbios_name"]
+          netbios_name ? "\\\\#{netbios_name}\\profiles\\%U" : nil
+        end
+
+        def user_home_drive
+          "H:"
+        end
+
+        def user_script
+          "logon.bat"
+        end
+
+        def user_gecos
+          nil
+        end
+
+        def bind_dn
+          nil
+        end
+      end
+    end
+  end
+end

  Modified: trunk/bin/asl-passwd (+6 -5)
===================================================================
--- trunk/bin/asl-passwd	2006-11-12 22:37:38 +09:00 (rev 10)
+++ trunk/bin/asl-passwd	2007-08-04 11:31:29 +09:00 (rev 11)
@@ -38,7 +38,7 @@
   exit
 end
 
-ActiveSambaLdap::Base.establish_connection({}, false)
+ActiveSambaLdap::Base.establish_connection("update")
 
 class User < ActiveSambaLdap::User
   ldap_mapping
@@ -55,11 +55,11 @@
   old_password = ActiveSambaLdap::Command.read_password(prompt)
 
   auth_class = Class.new(ActiveSambaLdap::Base)
+  config = ActiveSambaLdap::Base.configurations["reference"].symbolize_keys
   begin
-    auth_class.establish_connection({:bind_format => user.dn,
-                                      :password => old_password,
-                                      :allow_anonymous => false},
-                                    true)
+    auth_class.establish_connection(config.merge(:bind_dn => user.dn,
+                                                 :password => old_password,
+                                                 :allow_anonymous => false))
   rescue ActiveLdap::AuthenticationError
     puts "password isn't match"
     exit 1
@@ -67,6 +67,7 @@
     auth_class.remove_connection
   end
 end
+
 password = ActiveSambaLdap::Command.read_password("New password: ")
 password2 = ActiveSambaLdap::Command.read_password("Retype new password: ")
 

  Modified: trunk/test/test_asl_usershow.rb (+7 -1)
===================================================================
--- trunk/test/test_asl_usershow.rb	2006-11-12 22:37:38 +09:00 (rev 10)
+++ trunk/test/test_asl_usershow.rb	2007-08-04 11:31:29 +09:00 (rev 11)
@@ -10,7 +10,13 @@
 
   def test_exist_user
     make_dummy_user do |user, password|
-      assert_equal([true, user.to_ldif], run_command(user.uid))
+      user.class.establish_connection("reference")
+      begin
+        user = user.class.find(user.uid)
+        assert_equal([true, user.to_ldif], run_command(user.uid))
+      ensure
+        user.class.establish_connection("update")
+      end
     end
   end
 

  Copied: trunk/test/config.yml.sample (+17 -0)
===================================================================
--- trunk/test/activesambaldap.conf.sample	2006-11-12 22:37:38 +09:00 (rev 10)
+++ trunk/test/config.yml.sample	2007-08-04 11:31:29 +09:00 (rev 11)
@@ -0,0 +1,17 @@
+common:
+  sid: S-1-5-21-915876905-2926214379-2876160357
+  user_home: /home/%U
+  user_login_shell: /bin/sh
+
+update:
+  base: dc=test,dc=local,dc=net
+  host: 127.0.0.1
+#  method: :tls
+  bind_dn: cn=admin,dc=local,dc=net
+  password: secret
+
+reference:
+  base: dc=test,dc=local,dc=net
+  host: 127.0.0.1
+#  method: :tls
+  allow_anonymous: true



More information about the asl-commit mailing list