sslug-teknik team mailing list archive
-
sslug-teknik team
-
Mailing list archive
-
Message #14008
Re: Quota advarsler til brugerne
Claus Hindsgaul wrote:
>
> Hej!
>
> Vi har en velfungerende internet-, fil- og printer-server kørende på en 486
> hurtigløber :). Den betjener et 10-brugers windows-netværk.
>
> For at fordele pladsen mellem brugerne er der angivet quota (kvoter), så hver
> bruger har begrænset adgang til at bruge al pladsen. Hver bruger har lov til
> konstant at fylde 1/2 MB (soft limit) - dog op til 1 MB i en uge ad gangen.
>
> Hvordan kan man give brugerne en advarsel om, at deres quota er opbrugt?
> Som standard har de blot lige pludselig ikke skriveadgang mere. Jeg ville gerne
> sende dem en mail - eller en winpopup eller lignende, når de fylder for meget...
> Der må være nogen, der har lavet nogle smarte scripts...
Sånoed ala dette? (utestet).
/Ole
#!/usr/bin/perl
Init();
%quota_of=quota_list();
for $user (keys %quota_of) {
if($quota_of{$user} =~ /(\d+)\*/) {
#Disk quotas for user bla (uid 510):
# Filesystem blocks quota ...
# /dev/hda6 1610024* 1177 ...
# ^ quota overskredet
$kb_in_use=$1;
$quota=read_file("$home_of{$user}/quota");
$quota=~s/\D//;
$kontakt_adresse=$user;
send_warning($kontakt_adresse,$quota,$kb_in_use);
}
}
sub send_warning {
# send_warning($kvittering,$quota,$kb)
# sender email til $kvittering
# med en text ang. personer
my ($kvittering,$quota,$kb)=@_;
open(QMAIL,"|/usr/bin/qmail/qmail-inject") || die;
# open(QMAIL,">>/var/tmp/q-mail") || die;
print QMAIL <<_EOS_ ;
Return-Path: <auto-reply\@bla.dk>
From: Auto-reply <auto-reply\@bla.dk>
To: <$kvittering>
Subject: Dit disk-forbrug
Dette brev er automatisk genereret.
Du fylder $kb KB, mens din disk-quota
kun er på $quota KB.
Med venlig hilsen
Mr. Quota
_EOS_
close QMAIL;
}
sub Init {
%home_of=home_of();
use File::Slurp;
}
sub quota_list {
my $user;
my $tmpfile="/tmp/$$" . time;
my $delimiter="delim-$tmpfile";
my @quotatext;
unlink $tmpfile;
open(SH, "|bash >$tmpfile") ||die;
for $user (keys %home_of) {
print SH "quota $user\n";
print SH "echo $user$delimiter\n";
}
close SH;
local $/="$delimiter\n";
open (IN,"$tmpfile") || die;
while (<IN>) {
s/(.*)$delimiter// or die ("no delim '$_'");
$quota_of{$1}=$_;
}
close IN;
unlink $tmpfile;
return %quota_of;
}
sub home_of {
my %home_of=();
my ($user,$home);
while(($user,$home)=(getpwent)[0,7]) {
#$t++<100 or next;
$home_of{$user}=$home;
}
return %home_of;
}
References