blob: 41c74d919d37079049001c47d32b85fb008fea57 [file] [log] [blame]
#!/usr/bin/perl -w
# $0 -b "ou=People,dc=borgia,dc=com" -F '(attr=value)'
# Synopsis
# applyQuotas.pl is a script solely for making the quota set within LDAP take
# affect by running the linuxquota tool edquota with the figures set in LDAP.
# This tool is capable of applying standard LDAP filters to the user-supplied
# base DN for applying multiple users' quotas at once.
# Examples:
# Apply the quotas using the linuxquota tool edquota for user stefan
# ./applySystemQuotas.pl -b "uid=stefan,ou=People,dc=borgia,dc=com"
#
# Apply the quotas using the linuxquota tool edquota for all People with description of Student
# ./applySystemQuotas.pl -b "ou=People,dc=borgia,dc=com" -F "(description=Student)"
use strict;
use Net::LDAP;
use Getopt::Long;
chomp(my $Password = `cat /etc/ldap.secret`);
my $Host = 'localhost';
my $Port = '389';
my $BindDN = 'cn=Manager,dc=borgia,dc=com';
my $SSL = 0;
my $edquota_editor = '/usr/sbin/edquota_editor';
my $edquota = '/usr/sbin/edquota';
my $b = '';
my $F = '';
GetOptions(
'b=s' => \$b,
'F=s' => \$F,
);
die "Usage: $0 -b basedn [-F '(extrafilter)']\n" unless $b;
my $ldap = connectLDAP();
my $search;
$search = $ldap->search(
base => $b,
filter => "(&(objectClass=systemQuotas)$F)",
attrs => ['uid', 'quota'],
);
$search->code && die $search->error;
my $i = 0;
my $max = $search->count;
for ( $i=0; $i<$max; $i++ ) {
my $entry = $search->entry($i);
my $editor = $ENV{'VISUAL'} if $ENV{'VISUAL'};
$ENV{'VISUAL'} = $edquota_editor;
$ENV{'QUOTA_USER'} = $entry->get_value('uid');
# Delete all existing quotas for QUOTA_USER
$ENV{'QUOTA_FILESYS'} = '*';
$ENV{'QUOTA_SBLOCKS'} = 0;
$ENV{'QUOTA_HBLOCKS'} = 0;
$ENV{'QUOTA_SFILES'} = 0;
$ENV{'QUOTA_HFILES'} = 0;
print "$ENV{'QUOTA_USER'}: $ENV{'QUOTA_FILESYS'}:$ENV{'QUOTA_SBLOCKS'},$ENV{'QUOTA_HBLOCKS'},$ENV{'QUOTA_SFILES'},$ENV{'QUOTA_HFILES'}\n";
qx(/usr/sbin/edquota -u $ENV{'QUOTA_USER'});
my @quotas = $entry->get_value('quota');
if ( $#quotas >= 0 ) {
foreach ( @quotas ) {
my @quota = split /:/;
$ENV{'QUOTA_FILESYS'} = $quota[0];
$ENV{'QUOTA_SBLOCKS'} = $quota[1];
$ENV{'QUOTA_HBLOCKS'} = $quota[2];
$ENV{'QUOTA_SFILES'} = $quota[3];
$ENV{'QUOTA_HFILES'} = $quota[4];
print "$ENV{'QUOTA_USER'}: $ENV{'QUOTA_FILESYS'}:$ENV{'QUOTA_SBLOCKS'},$ENV{'QUOTA_HBLOCKS'},$ENV{'QUOTA_SFILES'},$ENV{'QUOTA_HFILES'}\n";
qx($edquota -u $ENV{'QUOTA_USER'});
}
}
if ($editor) {
$ENV{'VISUAL'} = $editor;
}
else {
delete $ENV{'VISUAL'};
}
}
$search = $ldap->unbind;
sub connectLDAP {
# bind to a directory with dn and password
my $ldap = Net::LDAP->new(
$Host,
port => $Port,
version => 3,
# debug => 0xffff,
) or die "Can't contact LDAP server ($@)\n";
if ( $SSL ) {
$ldap->start_tls(
# verify => 'require',
# clientcert => 'mycert.pem',
# clientkey => 'mykey.pem',
# decryptkey => sub { 'secret'; },
# capath => '/usr/local/cacerts/'
);
}
$ldap->bind($BindDN, password=>$Password);
return $ldap;
}