forked from freebsd/bugzilla
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsync_freebsd_committers.pl
executable file
·133 lines (111 loc) · 3.49 KB
/
sync_freebsd_committers.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#!/usr/local/bin/perl -T
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
use 5.10.1;
use strict;
use warnings;
use lib qw(. lib);
use Net::LDAP;
use Bugzilla;
use Bugzilla::User;
my $quiet = 0;
my $dbh = Bugzilla->dbh;
my %ldap_users;
###
# Get current bugzilla users
###
my %bugzilla_users = %{ $dbh->selectall_hashref(
'SELECT lower(login_name) AS new_login_name, userid, realname, disabledtext ' .
'FROM profiles', 'new_login_name') };
foreach my $login_name (keys %bugzilla_users) {
# remove whitespaces
$bugzilla_users{($login_name)}{'realname'} =~ s/^\s+|\s+$//g;
}
###
# Get current LDAP users
###
my $LDAPserver = Bugzilla->params->{"LDAPserver"};
if ($LDAPserver =~ ",") {
$LDAPserver =~ s/,.*//;
}
if ($LDAPserver eq "") {
print "No LDAP server defined in bugzilla preferences.\n";
exit;
}
my $LDAPconn;
if($LDAPserver =~ /:\/\//) {
# if the "LDAPserver" parameter is in uri scheme
$LDAPconn = Net::LDAP->new($LDAPserver, version => 3);
} else {
my $LDAPport = "389"; # default LDAP port
if($LDAPserver =~ /:/) {
($LDAPserver, $LDAPport) = split(":",$LDAPserver);
}
$LDAPconn = Net::LDAP->new($LDAPserver, port => $LDAPport, version => 3);
}
if(!$LDAPconn) {
print "Connecting to LDAP server failed. Check LDAPserver setting.\n";
exit;
}
my $mesg;
if (Bugzilla->params->{"LDAPbinddn"}) {
my ($LDAPbinddn,$LDAPbindpass) = split(":",Bugzilla->params->{"LDAPbinddn"});
$mesg = $LDAPconn->bind($LDAPbinddn, password => $LDAPbindpass);
}
else {
$mesg = $LDAPconn->bind();
}
if($mesg->code) {
print "Binding to LDAP server failed: " . $mesg->error . "\nCheck LDAPbinddn setting.\n";
exit;
}
# We've got our anonymous bind; let's look up the users.
$mesg = $LDAPconn->search( base => Bugzilla->params->{"LDAPBaseDN"},
scope => "sub",
filter => '(&(' . Bugzilla->params->{"LDAPuidattribute"} . "=*)" . Bugzilla->params->{"LDAPfilter"} . '(objectClass=freebsdAccount)(gidNumber=493))',
);
if(! $mesg->count) {
print "LDAP lookup failure. Check LDAPBaseDN setting.\n";
exit;
}
my %val = %{ $mesg->as_struct };
while( my ($key, $value) = each(%val) ) {
my @login_name = @{ $value->{"uid"} };
my @realname = @{ $value->{"cn"} };
# no mail entered? go to next
if(! @login_name) {
print "$key has no valid mail address\n";
next;
}
# no cn entered? use uid instead
if(! @realname) {
print "$key has no real name\n";
next;
}
my $login = shift @login_name;
my $real = shift @realname;
utf8::decode($real);
$login .= '@FreeBSD.org';
$ldap_users{$login} = { realname => $real };
}
my %create_users;
while( my ($key, $value) = each(%ldap_users) ) {
$key = lc($key);
if(!defined $bugzilla_users{$key}){
next if ($value->{realname} =~ m/\s+user\s*$/i);
$create_users{$key} = $value;
}
}
while( my ($key, $value) = each(%create_users) ) {
$key =~ s/freebsd.org/FreeBSD.org/ig;
my $realname = $value->{'realname'};
print "New committer: $realname <$key>\n";
Bugzilla::User->create({
login_name => $key,
realname => $value->{'realname'},
cryptpassword => '*'});
}