1 |
#!/usr/bin/perl -w |
2 |
|
3 |
use strict; |
4 |
use Template; |
5 |
use Net::LDAP; |
6 |
use File::Slurp; |
7 |
use YAML qw/LoadFile/; |
8 |
use LWP::UserAgent; |
9 |
|
10 |
my $config_file = '/etc/mgapeople.conf'; |
11 |
my $config = LoadFile($ENV{MGAPEOPLE_CONF} ? $ENV{MGAPEOPLE_CONF} : $config_file); |
12 |
|
13 |
my %maintdb; |
14 |
my %groups; |
15 |
my %users; |
16 |
|
17 |
sub process_template { |
18 |
my ($template, $src, $vars, $dest) = @_; |
19 |
for my $extension (@{$config->{output_format}}) { |
20 |
next unless -f "$config->{tmpl_dir}/$src.$extension"; |
21 |
$template->process("$src.$extension", $vars, "$dest.$extension"); |
22 |
} |
23 |
} |
24 |
|
25 |
sub loadmaintdb { |
26 |
return unless $config->{maintdburl}; |
27 |
my $ua = LWP::UserAgent->new; |
28 |
my $r = $ua->get($config->{maintdburl}); |
29 |
return unless $r->is_success; |
30 |
for my $line (split /^/, $r->decoded_content) { |
31 |
my ($pkg, $user) = split ' ', $line; |
32 |
push @{$maintdb{$user}}, $pkg; |
33 |
} |
34 |
} |
35 |
|
36 |
sub loaduser { |
37 |
my ($ldap, $user) = @_; |
38 |
my $m = $ldap->search( |
39 |
base => $user, |
40 |
scope => 'base', |
41 |
filter => '(objectClass=inetOrgPerson)', |
42 |
); |
43 |
die $m->error if $m->is_error; |
44 |
my $res = $m->as_struct; |
45 |
if (exists $res->{$user}) { |
46 |
$res->{$user}->{groups} = []; |
47 |
$users{$user} = $res->{$user}; |
48 |
} |
49 |
} |
50 |
|
51 |
sub loadgroups { |
52 |
my ($ldap) = @_; |
53 |
my $m = $ldap->search( |
54 |
base => $config->{groupbase}, |
55 |
filter => '(objectClass=groupOfNames)', |
56 |
); |
57 |
die $m->error if $m->is_error; |
58 |
my $res = $m->as_struct; |
59 |
for my $groupname (keys %$res) { |
60 |
$groups{$groupname} = $res->{$groupname}; |
61 |
for my $user (@{$groups{$groupname}->{member}}) { |
62 |
loaduser($ldap, $user) unless exists $users{$user}; |
63 |
if (exists $users{$user}) { |
64 |
push @{$users{$user}->{groups}}, $groupname; |
65 |
} |
66 |
} |
67 |
$res->{$groupname}->{member} = |
68 |
[ grep { exists $users{$_} } @{$groups{$groupname}->{member}} ]; |
69 |
} |
70 |
} |
71 |
|
72 |
sub output_users { |
73 |
my $template = Template->new({ |
74 |
INCLUDE_PATH => $config->{tmpl_dir}, |
75 |
OUTPUT_PATH => "$config->{output_dir}/u", |
76 |
}); |
77 |
for my $user (keys %users) { |
78 |
my $vars = { |
79 |
config => $config, |
80 |
user => $user, |
81 |
users => \%users, |
82 |
groups => \%groups, |
83 |
maintdb => \%maintdb, |
84 |
}; |
85 |
my $uid = $users{$user}->{uid}->[0]; |
86 |
process_template($template, 'user', $vars, $uid); |
87 |
} |
88 |
|
89 |
my $vars = { |
90 |
config => $config, |
91 |
users => \%users, |
92 |
groups => \%groups, |
93 |
maintdb => \%maintdb, |
94 |
}; |
95 |
process_template($template, 'userindex', $vars, 'index'); |
96 |
} |
97 |
|
98 |
sub output_groups { |
99 |
my $template = Template->new({ |
100 |
INCLUDE_PATH => $config->{tmpl_dir}, |
101 |
OUTPUT_PATH => "$config->{output_dir}/g", |
102 |
}); |
103 |
for my $group (keys %groups) { |
104 |
my $vars = { |
105 |
config => $config, |
106 |
group => $group, |
107 |
users => \%users, |
108 |
groups => \%groups, |
109 |
maintdb => \%maintdb, |
110 |
}; |
111 |
my $cn = $groups{$group}->{cn}->[0]; |
112 |
process_template($template, 'group', $vars, $cn); |
113 |
} |
114 |
|
115 |
my $vars = { |
116 |
config => $config, |
117 |
users => \%users, |
118 |
groups => \%groups, |
119 |
maintdb => \%maintdb, |
120 |
}; |
121 |
process_template($template, 'groupindex', $vars, 'index'); |
122 |
} |
123 |
|
124 |
sub output_index { |
125 |
my $template = Template->new({ |
126 |
INCLUDE_PATH => $config->{tmpl_dir}, |
127 |
OUTPUT_PATH => "$config->{output_dir}", |
128 |
}); |
129 |
my $vars = { |
130 |
config => $config, |
131 |
users => \%users, |
132 |
groups => \%groups, |
133 |
maintdb => \%maintdb, |
134 |
}; |
135 |
process_template($template, 'index', $vars, 'index'); |
136 |
} |
137 |
|
138 |
my $bindpw = read_file($config->{bindpwfile}); |
139 |
chomp $bindpw; |
140 |
my $ldap = Net::LDAP->new($config->{ldapserver}) or die "$@"; |
141 |
my $m; |
142 |
$m = $ldap->start_tls(verify => 'none'); |
143 |
die $m->error if $m->is_error; |
144 |
$m = $ldap->bind($config->{binddn}, password => $bindpw); |
145 |
die $m->error if $m->is_error; |
146 |
loadmaintdb; |
147 |
loadgroups($ldap); |
148 |
output_users(); |
149 |
output_groups(); |
150 |
output_index(); |