Wednesday, December 11, 2013

Giving access on SVN repository to existing Active Directory group ( NT group )

    

               I was trying to give access to our SVN repository for some existing windows NT group(Active directory group).  We are using SSPI module to authenticate users. I tried all the solutions available in the internet to give access to NT group but none didn't work. So I decided to write a perl script to update the group information in the SVN access file periodically.


Our httpd.conf file look like this

==================
              
  DAV svn
  SVNListParentPath on
  SVNParentPath "D:/Repositories"
  SVNIndexXSLT "/svnindex.xsl"

AuthName "svn repository"
AuthType SSPI
SSPIAuth On
SSPIDomain "DC=domain,DC=com"
SSPIOmitDomain on
SSPIUsernameCase lower
SSPIOfferSSPI On

AuthzSVNAccessFile "c:/Apache2.2/conf/svnaccess.txt"
require valid-user
  
==================


First enter the group names in C:\Apache2\conf\svnaccess.txt and
This is the script to update the access file

==================
 #!c:\Perl\bin\perl.exe
use POSIX qw/strftime/;
$CURRENT_FILE = "C:\\Apache2\\conf\\svnaccess.txt";
$file_name = "svnaccess";
$UPDATED_FILE = "C:\\Apache2\\conf\\svnaccess_tmp.txt";
$ARCHIVE_FOLDER = "D:\\svn_auth_files_old";
$GROUP_LIST_FILE = "C:\\Apache2\\conf\\grouplist.txt";
open $SVN_ACCESS, "<$CURRENT_FILE";
open $NEW_SVN_ACCESS, ">>$UPDATED_FILE";
unless (-d $ARCHIVE_FOLDER)
    {
        `mkdir $ARCHIVE_FOLDER`;
    }


while ( <$SVN_ACCESS> )
{
     
        $my_cur_line_main = $_;
        chomp($my_cur_line_main);

  
      
        $new_line = &check_group($my_cur_line_main);
        if ($new_line)
        {
        print $NEW_SVN_ACCESS "$new_line\n";
        }
        else
        {
        print $NEW_SVN_ACCESS "$my_cur_line_main\n";
        }
              
       
                  
      
        }
      
        close $SVN_ACCESS;
        close $NEW_SVN_ACCESS;
      
        $date_time = strftime('%d-%b-%Y__%H_%M_%S',localtime);
        `move $CURRENT_FILE $ARCHIVE_FOLDER\\$file_name\_$date_time\.txt`;
        `move $UPDATED_FILE $CURRENT_FILE`;
      
      
      
      
      
        sub check_group {
        $my_cur_line = $_[0];
        chomp ($my_cur_line);
        #print $my_cur_line;
        open $GROUP_LIST,  "<$GROUP_LIST_FILE"
  while ( <$GROUP_LIST> )
        {
      
                $group1 = $_;
                chomp $group1;
                #print $group1;
                if ($my_cur_line =~ /^$group1/)
            {
                    #print $my_cur_line;
                  
                    @group_members =`dsquery group DC=your,DC=domain,DC=com -name  $group1|dsget group -members`;
                    #print @group_members;
                    my @member_list;
                    foreach ( @group_members )
                {
                    $group_info = $_;
                    chomp($group_info);
                    @group_member = split (/=/,$group_info);
                    #print $group_member[1];
                    @member = split (/,/,$group_member[1]);
                    #print @member;
                    $member_uid = $member[0];
                    $member_uid =~ tr/A-Z/a-z/;
                    #print $member_uid;
                    push (@member_list, $member_uid);
                        #                print "$member[0]\n";
              
                    #print @member_list;
                }
                    $group_members = join (',',@member_list);
                    chop ($group_members);
                    $new_string = "$group1 = $group_members";
                    return $new_string;
                    #print  "$group1 = $group_members\n";
                              
                               
            }
                          
        }
      

}

==================


You can have a try.. All the best.

No comments:

Post a Comment