# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#
+use warnings;
use strict;
#
# Does not yet remove quotation marks from options
# Does not yet escape + at the beginning of a dn
# Does not yet handle line wraps correctly
-# Does not yet handle multiple roles with same name (needs tiebreaker)
#
# CAVEATS:
# Sudoers entries can have multiple RunAs entries that override former ones,
-# with LDAP sudoRunAs{Group,User} applies to all commands in a sudoRole
+# with LDAP sudoRunAs{Group,User} applies to all commands in a sudoRole
my %RA;
my %UA;
my $did_defaults=0;
my $order = 0;
+my %seen_users;
# parse sudoers one line at a time
while (<>){
}
# Definition
my @users=split /\s*,\s*/,$p1;
+ my $username = $users[0];
+ if ($seen_users{$username}) {
+ $seen_users{$username} += 1;
+ $username = sprintf("%s_%s", $username, $seen_users{$username});
+ } else {
+ $seen_users{$username} = 1;
+ }
my @hosts=split /\s*,\s*/,$p2;
my @cmds= split /\s*,\s*/,$p3;
@options=();
- print "dn: cn=$users[0],$base\n";
+ print "dn: cn=$username,$base\n";
print "objectClass: top\n";
print "objectClass: sudoRole\n";
- print "cn: $users[0]\n";
+ print "cn: $username\n";
# will clobber options
print "sudoUser: $_\n" foreach expand(\%UA,@users);
print "sudoHost: $_\n" foreach expand(\%HA,@hosts);
foreach (@cmds) {
- if (s/^\(([^\)]+)\)\s*//) {
- my @runas = split(/:\s*/, $1);
- if (defined($runas[0])) {
- print "sudoRunAsUser: $_\n" foreach expand(\%RA, split(/,\s*/, $runas[0]));
- }
- if (defined($runas[1])) {
- print "sudoRunAsGroup: $_\n" foreach expand(\%RA, split(/,\s*/, $runas[1]));
- }
- }
+ if (s/^\(([^\)]+)\)\s*//) {
+ my @runas = split(/:\s*/, $1);
+ if (defined($runas[0])) {
+ print "sudoRunAsUser: $_\n" foreach expand(\%RA, split(/,\s*/, $runas[0]));
+ }
+ if (defined($runas[1])) {
+ print "sudoRunAsGroup: $_\n" foreach expand(\%RA, split(/,\s*/, $runas[1]));
+ }
+ }
}
print "sudoCommand: $_\n" foreach expand(\%CA,@cmds);
print "sudoOption: $_\n" foreach @options;
} else {
print "parse error: $_\n";
}
-
}
#
push @a,$ref->{$_} ? expand($ref,split /\s*,\s*/,$ref->{$_}):$_ foreach @_;
@a;
}
-
-