kvóta értesítési rendszer

Fórumok

Sziasztok!
Módosítom az előző kérdést, hogy jobban érthető legyen:

Kialakítottam egy működő linux-ldap-samba rendszert kvótával.
A rendszer küld levelet ha tárhely kezd betelni.
Tökéletesíteni szeretném, úgy, hogy ne csak email útján értesülhessenek a kvóta állapotáról hanem win és linux felhasználók belépéskor kapjanak egy felbukkanó üzenetet.

Úgy tervezem, hogy:
- vagy lefuttatja a sudo repquota /dev/sda1 -et és onnan valami sztringkezelõ bûvészkedéssel kiszámolom,hogy adott userre mi a helyzet
- vagy sudo quota -s username és abból számolja ki a sztringkezelõ
- ezután az csinálna egy fájlt amit az xmessage 'fájlname' feldobna a usernek

win esetén meg egy vbscript dobná fel

Mit gondoltok?
Esetleg van egyszerûbb módja is adott user kvóta érték közvetlen feldolgozható lekérdezésének, amit átadhatok pl.: százalékos érték alapján xmessage ablakot feldobó programnak?
Vagy az egészet már valaki kitalálta csak én nem találtam még meg?

Köszi

Hozzászólások

Sziasztok!

Elkezdtem a programomat ami a quota -s kimenetét dolgozná fel.
Ott akadtam el, hogy eléggé nehezen megy nekem a programozás.

Addig megy, hogy megtalálja az olyan szavakat amik tartalmaznak "M"-et.
Amit nem sikerült, hogy az ellenőrzés előtt szeretném az első 2 sort törölni, hogy csak a /dev-vel kezdődőt figyelje.
Úgy gondoltam, hogy nem hozok létre egy fájlt hanem elintézem az egészet memóriában.

Ezután még szeretném a talált M értékeket változókba tenni, ezt sem tudom pontosan hogy kell.
Szerintem ezután a számolást már meg tudnám csinálni, talán.....

Köszi

A quota -s kimenete:

Disk quotas for user csaba (uid 1000):
Filesystem blocks quota limit grace files quota limit grace
/dev/md2 512M 590M 700M 974 0 0

A programom:

#!/usr/bin/perl

#Ez a program a felhasznalok disk kvotait kerdezi le es dolgozza fel

use strict;
use warnings;

my $all_text;
my $string_to_find;

my $usage;
my $kvota;
my $max;

my @elemek;

$all_text=`quota -s`;

@elemek=split(/[ ]+/,$all_text);

foreach(@elemek)
{
if (/M/)
{
print "A(z) $_ szó tartalmazza az 'M' részletet\n";
}
}

print $all_text;

Ha futtatom a programot akkor jelenleg ezt adja:
A(z) 512M szó tartalmazza az 'M' részletet
A(z) 590M szó tartalmazza az 'M' részletet
A(z) 700M szó tartalmazza az 'M' részletet
Disk quotas for user csaba (uid 1000):
Filesystem blocks quota limit grace files quota limit grace
/dev/md2 512M 590M 700M 974 0 0

Eleve csak azt tedd be a tömbbe, ami kell. Pl:


open(SOURCE,"qouta -s |");
while ($var=<SOURCE>) {
   if($var =~ m/^\/dev/) {
      # valami
   }
}

Egyébként ez így nem tudom mennyire lehet működőképes, mivel nekem pl. az eszköz neve nem fér el a kiszabott helyre, ezért a hozzá tartozó kvóták új sorba vannak. Így meg ugye már nem fog működni a script.


     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
/dev/mapper/VG1-Home
                 65847M  87891M  92774M            155k       0       0

--
Discover It - Have a lot of fun!

nekem kiírja a saját lemezhasználatomat ha user futtatja:
ez nem jó?

$ quota
Disk quotas for user sysop (uid 1000): 
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
      /dev/hda3 3099708  3100708       0           47473       0       0   

$ quota -V
Quota utilities version 3.16.
Compiled with: USE_LDAP_MAIL_LOOKUP EXT2_DIRECT HOST_ACCESS ALT_FORMAT RPC RPC_SETQUOTA BSD_BEHAVIOUR
Bugs to jack@suse.cz

~~~~~~~~
De ezt az egy lépést ki nem tevé,
Az nem tett semmit, nem tud semmit is.

Az awk parancsot próbálom belekombinálni, hogy kinyerjem a változókat. Mit csinálok rosszul?

#!/usr/bin/perl

#Ez a program a felhasznalok disk kvotait kerdezi le es dolgozza fel

use strict;
use warnings;

my $usage;
my $kvota;
my $max;

($usage,$kvota,$max)=`quota | awk '{ print $2,$3,$4 }'| tail -1`;

így se jó
($usage)=`quota | awk '{ print $2 }'| tail -1`;
($kvota)=`quota | awk '{ print $3 }'| tail -1`
($max)=`quota | awk '{ print $4 }'| tail -1`

print $usage;
print $kvota;
print $max;

Nem sok értelme van a perl és az awk keverésének. Mit értesz feldolgozás alatt?

quota | awk '{printf "blocks: %d\nquota: %d\nlimit: %d\n", sqrt($2), log($3), $4**2}' | tail -1 | xmessage -file -

-----
"Guglizni csak pontosan, szépen, ahogy a csillag megy az égen, úgy érdemes.""

Feldolgozáson azt értem, hogy:
- amikor a tanulók (suli) belépnek elindul a kvota.pl ami ellenőrzi, hogy áll a saját kvótája + elindul egy időzítő
--ha kvóta ≥90% ⇒ xmessage (figyelmeztet, h kezd betelni)
--ha kvóta < 90% ⇒ ok nem jön felbukkanó
--ha kvóta =100% ⇒ xmessage (figyelmeztet, h betelt )
- az elindított időzítő újra lefuttatja ezt az egészet

Ez a tervem. Elég kezdő vagyok, lehet h másnak jobb ötlete is volna .

Jelenleg itt tartok:

#!/usr/bin/perl

#Ez a program a felhasznalok disk kvotait kerdezi le es dolgozza fel

use strict;
use warnings;
my @all_text;
my $usage;
my $kvota;
my $max;
my $valtozok;
my $line;
my @bits;
my $maradt;

$line=`quota`;

@bits = split(/\s+/, $line);

print "$bits[17] $bits[18] $bits[19]\n";

$maradt=$bits[18]-$bits[17];
print "$maradt\n";

Akkor jobb a perl. Vagy egy kicsit gányolni kell az awk-ban.
Alapként azt tenném, hogy a scriptet belépéskor, illetve cronból, például 30 percenként futtatnám, így az időzítés kérdése megoldódna. Ha van bőven szabad hely, akkor nem történik semmi. Ha kevés a hely akkor a cronból futtatott script megjelenítené az üzenetet.

Nem szép, de talán működik:
quota | tail -1 | awk '($3>=0.9*$4){ system("gxmessage ""Kezd betelni a tárhely. Maradt még """$4-$3""" MByte szabad hely.""") }'

Ez 100%-nál nem tökéletes, de így egyszerűbb. Vagy bonyolultabban:
quota | tail -1 | awk '($3>=0.9*$4)&&($3<$4){ system("gxmessage ""Kezd betelni a tárhely. Maradt még """$4-$3""" MByte szabad hely.""") } ($3==$4){system("gxmessage ""Nincs szabad hely!""")}'

Az xmessage nem szereti az utf8-at, ezért célszerűbb a gxmessage használata.

-----
"Guglizni csak pontosan, szépen, ahogy a csillag megy az égen, úgy érdemes.""

Itt az én verzióm, persze nem olyan profi, mint ironcaté :)

Még az időzítő hiányzik belőle és az, hogy saját magát meghívja adott idő eltelte után.

#!/usr/bin/perl

#Ez a program a felhasznalok disk kvotait kerdezi le es dolgozza fel

use strict;
use warnings;
use POSIX;

my @all_text;
my $usage;
my $kvota;
my $max;
my $valtozok;
my $line;
my @bits;
my $maradt;
my $szazalek;
my $treshold;

$treshold=90;

$line=`quota`;

@bits = split(/\s+/, $line);
#print "$bits[17] $bits[18] $bits[19]\n";

$usage=$bits[17];
$kvota=$bits[18];
$maradt=floor(($kvota-$usage)/1024);

$usage=floor($usage/1024);
$kvota=floor($kvota/1024);
$szazalek=floor(($usage/$kvota)*100);

print "----------- Treshold:$treshold % ------------\n";
print "Hasznal: $usage Mbyte\n";
print "Kvota: $kvota Mbyte\n";
print "Maradt: $maradt Mbyte\n";
print "szazalek: $szazalek %\n";

print "tarhely ok\n" if ($szazalek<$treshold);
print "tarhely nem ok\n" if ($szazalek>=$treshold);
print "tarhely betelt\n" if ($szazalek==99);

if ($szazalek>=$treshold)
{
`xmessage tarhely kezd betelni`;
}

if ($szazalek==99)
{
`xmessage tarhely betelt`;
}

Azért, elég ügyes.

Azt hogy lehetne megoldani, hogy:

lenne egy parancs, ami meghívje ugyan ezt a programot adott idő eltelte után függetlenül attól, hogy mikor lépett ki a program?
Vagyis, user belép...program indul..... ha baj van kap egy értesítést... ok-ra kattint és program kilép
De a kilépés előtt az újrahívás elintéződne.

Arra gondoltam, hogy a kvota.pl meghívná a kvota-restart.pl programot.
A kvota-restart meg a kvotat a megadott idő eltelte után.
De azt nem tudom, pontosan mi a módja egy másik perl progi elindításának és még azt nem tudom, hogy ha user kilép akkor ez a loop-ot megáll e attól, hogy a user kilépett?

kvota-restart.pl
#!/usr/bin/perl

#Ez a program a kvota.pl programot inditja ujra a megadott ido eltelte utan

use strict;
use warnings;
use POSIX;

sleep(500);
itt lenne a kvota.pl meghívása

A perl-t szeretem, mert nagyon rugalmas ilyen szempontból
system("perl ./kvota.pl");
vagy rekviráld! :D
require "./kvota.pl";

Ha kiforkoltatsz egy processzt egy másikból, az fog futni attól függetlenül is hogy a login processzed kimúlik. Próbáld ki:
$ ( sleep 5; play hang.wav ) &
$ logout

~~~~~~~~
De ezt az egy lépést ki nem tevé,
Az nem tett semmit, nem tud semmit is.

Ha kevés hely van, akkor az at paranccsal beállítható a következő futás időpontja.
Kilépés előtt atq-val lekérdezhető hogy van-e időzített parancs, és ha van akkor atrm-mel törölhető.

-----
"Guglizni csak pontosan, szépen, ahogy a csillag megy az égen, úgy érdemes.""

Csak egy tipp: Én az /etc/X11/Xreset.d/-be tennék be egy fájlt, a megfelelő paranccsal. Arra viszont vigyázni kell, hogy ez root-ként fut le, így szűrni kell a felhasználói névre.

Ha konzolon is bejelentkezhet a felhasználó, akkor a ~/.bash_logout-ot is szerkeszteni kell..

-----
"Guglizni csak pontosan, szépen, ahogy a csillag megy az égen, úgy érdemes.""

Amikor ilyen webtárhelyes mókáim voltak, akkor én repquota -a kimenetét toltam be egy mysql táblába és mindenki meg tudta nézni a service felületén a quota értékeit filesystemenként és ilyesmi. Mondjuk nem érdekelte a kutyát sem, ettől még lazán telefonálgattak, ha több volt a számlán, így elhalt ez a dolog. Ha úgysem nézik, akkor minek? Egy időben automata mail-t küldtem róla....akkor is telefonálgattak. Mindkét esetben a számlán is szerepelt, hogy n (k/M)byte túllépésük van...de masszívan a telefonon lógtak. Az ügyfél fura állat.

Köszi.

Csak félig, de idetartozó kérdés:
nfs serverhez kapcsolódik egy nfs auto home móddal egy másik linux, amikor az nfs kliensre jelentkezik be az illető, ott hogy lehetne a kvótázást beindítani?
A kliensre fel kell telepíteni a quota daemont?
Én csak annyit szeretnék, hogy az auto home-mal castolt usereket kvótázza.

Köszi

megoldódott, csak a quota programok kellett felrakni,