commit
02eb2401ec
1 changed files with 68 additions and 0 deletions
@ -0,0 +1,68 @@ |
||||
#!/usr/local/bin/perl -w |
||||
|
||||
use strict; |
||||
use Net::LDAP; |
||||
use Sys::Hostname; |
||||
use Quota; |
||||
|
||||
my $server = 'ldap://ldap.domain.tld'; |
||||
my $base = 'dc=domain,dc=tld'; |
||||
my $dn = 'cn=quota,ou=DSA,dc=domain,dc=tld'; |
||||
my $pass = 'secret'; |
||||
|
||||
my $ldap = Net::LDAP->new($server) or die "Couldn't connect to $server: $!"; |
||||
|
||||
$ldap->start_tls( |
||||
verify => 'require', |
||||
cafile => '/etc/pki/tls/certs/ca-bundle.crt'); |
||||
|
||||
$ldap->bind( |
||||
dn => $dn, |
||||
password => $pass); |
||||
|
||||
my $res = $ldap->search( |
||||
base => "ou=People,$base", |
||||
filter => '(objectClass=systemQuotas)', |
||||
attrs => ['uid', 'quota']); |
||||
|
||||
$res->code && die "Error while looking for quota entries: " . $res->error; |
||||
|
||||
foreach my $entry ($res->entries){ |
||||
my $user = $entry->get_value('uid'); |
||||
#print "Checking quota for user $user\n"; |
||||
foreach my $quota ($entry->get_value('quota')){ |
||||
unless ($quota =~ m/^(\/.*):(\d+):(\d+):(\d+):(\d+):(\w+)$/){ |
||||
print "$quota doesn't look like a valid quota entry\n"; |
||||
next; |
||||
} |
||||
my ($dir,$blksoft,$blkhard,$inodesoft,$inodehard,$fileserver) = ($1, $2, $3, $4, $5, $6); |
||||
my $hostname = hostname; |
||||
unless ($fileserver eq $hostname or $hostname =~ /^$fileserver\..*/){ |
||||
print "$quota doesn't match $hostname, skiping\n"; |
||||
next; |
||||
} |
||||
unless (-d $dir){ |
||||
print "$dir doesn't exists, skiping this rule\n"; |
||||
} |
||||
my $uid = getpwnam($user); |
||||
my $dev = Quota::getqcarg($dir); |
||||
Quota::sync($dev); |
||||
if ($!){ |
||||
print "Quota are not enabled on $dev, skiping this rule (error is " . Quota::strerr() . "\n"; |
||||
next; |
||||
} |
||||
my ($curblk,$curblksoft,$curblkhard,undef,$curinode,$curinodesoft,$curinodehard,undef) = |
||||
Quota::query($dev, $uid); |
||||
#print "User $user is using $curblk out of its $blkhard allowed\n"; |
||||
if ($curblksoft ne $blksoft || |
||||
$curblkhard ne $blkhard || |
||||
$curinodesoft ne $inodesoft || |
||||
$curinodehard ne $inodehard){ |
||||
print "Quota for user $user on $dir needs to be updated\n"; |
||||
Quota::setqlim($dev,$uid,$blksoft,$blkhard,$inodesoft,$inodehard); |
||||
} |
||||
} |
||||
} |
||||
|
||||
$ldap->unbind; |
||||
|
Loading…
Reference in new issue