/[soft]/mgapeople/trunk/mkpeople
ViewVC logotype

Contents of /mgapeople/trunk/mkpeople

Parent Directory Parent Directory | Revision Log Revision Log


Revision 7855 - (show annotations) (download)
Fri Apr 12 13:54:48 2013 UTC (11 years ago) by boklm
File size: 4038 byte(s)
Add support for multiple output formats
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();

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.30