← Back to team overview

sslug-teknik team mailing list archive

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