Quota ic.m. MySQL?

Pagina: 1
Acties:

  • nrg
  • Registratie: April 2001
  • Laatst online: 08:00
Dag allemaal :)

Ik heb net eindelijk quota's aan de praat gekregen op m'n Debian bak, maar ik bedacht me net dat ik eigenlijk liever de quota's beheer vanuit een MySQL database i.pv. steeds met edquota.

Is dit mogelijk?
Het mooiste zou zijn als ik een tabel had met kolom username, softlimit en hardlimit die quota dan uitleest.

Ik heb op Google en GoT gezocht, maar dan kom je eigenlijk vrijwel alleen pagina's tegen die gaan over het quotas toepassen op MySQL databases.

Is er al iemand die dit aan de praat heeft gekregen?
Ik hoor het graag! :D

Alvast bedankt voor de reacties! :)

  • Wilke
  • Registratie: December 2000
  • Laatst online: 11:37
Of het mogelijk is weet ik niet (ik durf er wel een biertje op in te zetten dat het niet kan), maar zelfs al kan het, dan lijkt dit me bepaald link!

MySQL moet dan per se draaien, omdat anders een belangrijk deel van je FS-layer afwezig is. Bovendien staat MySQL zelf weer op dat FS waarvan het de quote beheert (met een beetje pech). Ik kan me niet echt goed voorstellen hoe dit zou moeten werken zonder de grootst mogelijke problemen, eigenlijk...

En zeker niet met mySQL, wat toch al geen garanties biedt over integriteit van data, atomicity van transacties, etc.

  • Guru Evi
  • Registratie: Januari 2003
  • Laatst online: 17-04 13:12
Je zou het kunnen doen (niets is onmogelijk) door om de x-aantal tijd (normaal wordt het quota programma om de x-aantal minuten gedraaid) ipv het echte quota programma met de vaste variabelen uit te voeren een perl of php script aanroepen die het quota programma met de variabelen uit de sql database neemt. Natuurlijk is dit redelijk omslachtig en veel werk maar het zou moeten lukken. (het is maar een tip, nog niet zelf uitgewerkt)

Pandora FMS - Open Source Monitoring - pandorafms.org


  • nrg
  • Registratie: April 2001
  • Laatst online: 08:00
Wilke schreef op 02 July 2003 @ 16:02:
Of het mogelijk is weet ik niet (ik durf er wel een biertje op in te zetten dat het niet kan), maar zelfs al kan het, dan lijkt dit me bepaald link!

MySQL moet dan per se draaien, omdat anders een belangrijk deel van je FS-layer afwezig is. Bovendien staat MySQL zelf weer op dat FS waarvan het de quote beheert (met een beetje pech). Ik kan me niet echt goed voorstellen hoe dit zou moeten werken zonder de grootst mogelijke problemen, eigenlijk...

En zeker niet met mySQL, wat toch al geen garanties biedt over integriteit van data, atomicity van transacties, etc.
Ik heb de quotas ingesteld op /home (aparte partitie), daar staat MySQL dus niet.

Wel snap ik wat je bedoelt.
Wat ik me dan afvraag: hoe doen grote hosting providers dit? Die stellen het per Linux user in?
Guru Evi schreef op 02 July 2003 @ 16:10:
Je zou het kunnen doen (niets is onmogelijk) door om de x-aantal tijd (normaal wordt het quota programma om de x-aantal minuten gedraaid) ipv het echte quota programma met de vaste variabelen uit te voeren een perl of php script aanroepen die het quota programma met de variabelen uit de sql database neemt. Natuurlijk is dit redelijk omslachtig en veel werk maar het zou moeten lukken. (het is maar een tip, nog niet zelf uitgewerkt)
Ik denk dat het niet eens zoveel werk is.
Kan ik niet een PHP script schrijven die de data uit de database haalt en dit dmv een commandline tool (quotatool) opgeeft aan de quotafiles?

[ Voor 32% gewijzigd door nrg op 02-07-2003 16:14 ]


  • jurri@n
  • Registratie: Maart 2000
  • Laatst online: 13:16
Wat ik zelf doe op een machine die door meerdere mensen gebruikt wordt is iedere dag een perl-scriptje laten draaien (cron) die uit MySQL de gewenste quota's ophaalt en instelt op de server...

  • nrg
  • Registratie: April 2001
  • Laatst online: 08:00
jurri@n schreef op 02 juli 2003 @ 16:13:
Wat ik zelf doe op een machine die door meerdere mensen gebruikt wordt is iedere dag een perl-scriptje laten draaien (cron) die uit MySQL de gewenste quota's ophaalt en instelt op de server...
Precies wat ik bedoel! :D
Is dat script publiekelijk beschikbaar? :P

  • Wilke
  • Registratie: December 2000
  • Laatst online: 11:37
Guru Evi schreef op 02 July 2003 @ 16:10:
Je zou het kunnen doen (niets is onmogelijk)
Idd, voor een bepaalde, vrij ruime definitie van de begrippen 'niets' en 'onmogelijk' moet het inderdaad wel lukken...sortof >:)

Maar ik begrijp nu idd beter wat topicstarter wil..je kunt natuurlijk best syncen tussen 'echte' quota en de waardes die ingesteld zijn, eens per dag ofzo.

Nou, iemand die zo'n scriptje heeft rondslingeren toevallig?

[ Voor 26% gewijzigd door Wilke op 02-07-2003 16:21 ]


  • jurri@n
  • Registratie: Maart 2000
  • Laatst online: 13:16
nrg schreef op 02 July 2003 @ 16:14:
[...]
Precies wat ik bedoel! :D
Is dat script publiekelijk beschikbaar? :P
Wat mij betreft wel, maar het is nu nog te ranzig om public te maken (schaam schaam)... toen ik het schreef wist ik nog niet hoe ik vanuit Perl naar MySQL kon connecten... dus liet ik mysql op de command-line uitvoeren en de uitvoer parsen met split().

Ik zal kijken of ik dit weekend een nieuwe kan schrijven, dan kun je uiteraard een kopie krijgen...

  • Wilke
  • Registratie: December 2000
  • Laatst online: 11:37
jurri@n schreef op 02 July 2003 @ 16:20:
Ik zal kijken of ik dit weekend een nieuwe kan schrijven, dan kun je uiteraard een kopie krijgen...
Tof, doe ons dan meteen ook een plezier en zet het ergens online en post hier de link.

Als je geen (vaste) hosting hebt kunnen we 't vast wel even op de crewspace gooien ook nog.

  • nrg
  • Registratie: April 2001
  • Laatst online: 08:00
Wilke schreef op 02 July 2003 @ 16:22:
[...]


Tof, doe ons dan meteen ook een plezier en zet het ergens online en post hier de link.

Als je geen (vaste) hosting hebt kunnen we 't vast wel even op de crewspace gooien ook nog.
Haha, ik heb iets los gemaakt :D

Moet dit persé in Perl?
PHP kan je toch niet vanaf de commandline uitvoeren?

  • jurri@n
  • Registratie: Maart 2000
  • Laatst online: 13:16
PHP kan wel commandline hoor... maar dan moet je het op een aparte manier compileren / installeren... en perl staat er meestal al standaard op....

  • jurri@n
  • Registratie: Maart 2000
  • Laatst online: 13:16
Voor de ongeduldigen: mijn oude scriptje...

Perl:
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/perl
# This script updates userquotas from database

@result=split('\n',`/usr/local/bin/mysql -u server --password=geheim -e "SELECT username,quota FROM users" server`);
for ($counter=1; $result[$counter] ne ""; $counter++) {
        @fields=split('\t',$result[$counter]);
        $hard=$fields[1]*1024;
        $soft=int($fields[1]*921.6);
        `/usr/sbin/setquota -F vfsold -u $fields[0] $soft $hard 0 0 -a`;
}


Ik geef er geen support op, aangezien je eind deze week / dit weekend een nieuwe kunt verwachten, met een nette MySQL-koppeling

[ Voor 5% gewijzigd door jurri@n op 02-07-2003 16:42 ]


  • nrg
  • Registratie: April 2001
  • Laatst online: 08:00
Tnx, ik wacht nog wel ff totdat je je nieuwe script hebt :)
In ieder geval snap ik het idee erachter nu wel, misschien schrijf ik zelf wel een scriptje (kan alleen geen perl, maar misschien is het mogelijk in bash?)

  • zeroxcool
  • Registratie: Januari 2001
  • Laatst online: 04-05 13:54
Wat het scriptje hierboven doet zou bash in principe ook kunnen. Gewoon commandline MySQL aanroepen - LOL btw :P - kan BASH ook. Maar Perl is hier gewoon de geschikte taal voor.

zeroxcool.net - curity.eu


  • Zwerver
  • Registratie: Februari 2001
  • Niet online
* Zwerver houdt zich aanbevolen voor dit script, had je er ook een php frontend bij om het aan te passen? Of zal ik die zelf maar ff in elkaar knopen *bookmarked*

Woonachtig Down Under. Ik negeer je insults niet, maar tegen de tijd dat ik ze lees zijn ze meestal niet relevant meer


  • jurri@n
  • Registratie: Maart 2000
  • Laatst online: 13:16
En hier is de nieuwe versie dan:

Perl:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/perl
# Dit script update de userquotas vanuit een MySQL-database

use DBI; # DBI is noodzakelijk om de database-connectie te maken

$mysql_server           = "";   # MySQL server-hostname
$mysql_username         = "";   # MySQL username
$mysql_password         = "";   # MySQL password
$mysql_database         = "";   # MySQL database

$mysql_user_fieldname   = "";   # MySQL veldnaam met username
$mysql_quota_fieldname  = "";   # MySQL veldnaam met quota
$mysql_table            = "";   # MySQL tabelnaam

$setquota_pgrm          = "";   # Path naar setquota-programma
$percentage             = 0.9;  # Vermenigvuldigingsfactor (<- mooi scrabblewoord!): hardquota * percentage = softquota

$dbh = DBI->connect("dbi:mysql::database=$mysql_database;host=$mysql_server",$mysql_username,$mysql_password) or die "Connectie-probleem: $DBI::errstr";
$sth = $dbh->prepare("SELECT $mysql_user_fieldname,$mysql_quota_fieldname FROM $mysql_table") or die "Prepare-probleem: $DBI::errstr";
$sth->execute() or die "Uitvoer-probleem: $DBI::errstr";
while (($username,$hardquota) = $sth->fetchrow_array) {
        $hardquota*=1024; # omrekenen naar KiloBytes
        $softquota=int($hardquota*$percentage);
        `$setquota_pgrm -F vfsold -u $username $softquota $hardquota 0 0 -a`; # opties voor setquota eventueel aanpassen
}
$dbh->disconnect();

- Voor de perl-newbies (en uiteraard ook voor de gevorderden, aar die weten die zelf vaak wel): Op de eerste regel zorgen dat het path naar perl overeenkomt met jouw systeem
- Ik ben er vanuit gegaan dat de quota's in MB's in de database staan: dat is het makkelijkste voor de meeste mensen. Het script rekent het zelf even om naar KB's.
- $percentage is de omrekenfactur van de hardquota naar softquota. Ik hanteer zelf altijd dat de softquota = 90% van hardquota. Dit levert dus 0.9 als omrekenfactor op
- In de regel waar de quotas werkelijk ingesteld worden kun je uiteraard de opties aanpassen aan jouw systeem.
- Na het opslaan het script even chmodden naar 700 (alleen leesbaar en uitvoerbaar voor root). Alleen lezen is nodig omdat je username & password in het script staan

Verder is de DBI-package nodig. Deze installeer ja als volgt:
code:
1
2
3
perl -MCPAN -e 'install DBI'
perl -MCPAN -e 'install DBI::DBD'
perl -MCPAN -e 'install DBD::mysql'

Indien het de eerste keer is dat je op deze manier Perl-modules installeert, zul je nog e.e.a. moeten opgeven (zoals de server waar de boel gedownload moet worden). Dit is vrij eenvoudig omdat Perl je hier zelf al een vragenlijstje voor voorschotelt. Bij de laatste module zou je een foutmelding kunnen krijgen, waardoor de boel niet geinstalleerd wordt. Dit is waarschijnlijk doordat het test-script wat bij deze module zit er vanuit gaat dat het zonder password als root mag spelen op de database 'test'. Het simpelste is om tijdelijk je root-password uit te zetten. Het installeren zou moeten werken, maar ik heb zelf behoorlijk lopen rommelen om het geinstalleerd te krijgen, dus het installeren is onder voorbehoud.

Ik zelf draai dit script 1x per dag vanuit de cron, maar er zijn natuurlijk tal van mogelijkheden.

Voor vragen en opmerkingen kun je uiteraard even mailen.

[ Voor 34% gewijzigd door jurri@n op 04-07-2003 10:51 ]


  • luc
  • Registratie: Maart 2000
  • Niet online

luc

Dit is een heel simpel voorbeeld van een php shellscript wat een en ander voor je kan regelen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/local/bin/php -q

<?php

$mailfs = "/hosting/mail";

        $result=mysql_query("SELECT * FROM mailusers WHERE edquota = 1") or die(mysql_error());
        while ($row = mysql_fetch_object($result)) {
                $command="/usr/sbin/setquota -u " . $row->uid . " " . $row->quota . " " . $row->quota . " 0 0 " . $mailfs;
                system("$command");
                $query=mysql_query("UPDATE mailusers set edquota=0 WHERE uid=$row->uid")or die (mysql_error());
        }



?>

  • nrg
  • Registratie: April 2001
  • Laatst online: 08:00
Hoe kan ik PHP gaan gebruiken op de prompt?
Is er een bepaalde package die ik kan apt-getten?

  • DizzyWeb
  • Registratie: Februari 2001
  • Laatst online: 05-05 14:30

DizzyWeb

Ondertiteld

Je hebt dan php4-cgi nodig, als ik het goed heb.
Je moet dan wel even ook voor de cgi versie php.ini goed zetten... Als ik had geweten dat die een andere php.ini gebruikte had het me uren aan tijd gekost :P

  • nrg
  • Registratie: April 2001
  • Laatst online: 08:00
Maar moet ik in Apache dan ook de php4 CGI module gebruiken, of kan ik m'n Apache module blijven gebruiken?

[edit]
jurri@n: Bedankt voor je script, maar ik ga 'm toch niet gebruiken.
Bij het installen van die modules krijg ik allemaal errors, en ik heb geen zin om die op te lossen voor alleen dit script (verder gebruik ik Perl toch nooit).
Toch bedankt voor de moeite en ik denk dat andere mensen er zeker wel wat aan hebben :)

Ik ga klooien met die PHP versie, alhoewel ik eigenlijk liever eerst zeker weet dat m'n PHP module niet naar de kl*te gaat door het installen van de cgi module :)

[edit2]
Heb php4-cgi aan de praat, nu had ik zelf ook scriptjes kunnen schrijven :P

[edit3]
En het werkt allemaal, bedankt :D

[ Voor 86% gewijzigd door nrg op 04-07-2003 18:08 ]


  • Snow_King
  • Registratie: April 2001
  • Laatst online: 11:47

Snow_King

Konijn is stoer!

wrom niet een cronjob: "wget http://domein.nl/quota.php"

Werkt ook

  • nrg
  • Registratie: April 2001
  • Laatst online: 08:00
Dit is netter ;)

  • Steven
  • Registratie: December 2000
  • Laatst online: 15-04 10:17
Of nog simpeler: "php4 quota.php"

  • zeroxcool
  • Registratie: Januari 2001
  • Laatst online: 04-05 13:54
Dat zeggen ze dus, je moet dan php4-cgi geïnstalled hebben!

zeroxcool.net - curity.eu


  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

tuurlijk werkt dat ook, maar dat kan iedereen dan doen, en dat lijkt me dan niet de bedoeling ;)

  • jurri@n
  • Registratie: Maart 2000
  • Laatst online: 13:16
Erkens schreef op 05 July 2003 @ 11:08:
[...]

tuurlijk werkt dat ook, maar dat kan iedereen dan doen, en dat lijkt me dan niet de bedoeling ;)
Even een .htaccess aanmaken (met je met apache werkt) dat de directory waar het script in staat alleen te bezichten is vanaf ip 127.0.0.1 :)

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

jurri@n schreef op 05 juli 2003 @ 11:14:
[...]


Even een .htaccess aanmaken (met je met apache werkt) dat de directory waar het script in staat alleen te bezichten is vanaf ip 127.0.0.1 :)
mja, dat blijft een lapmiddel vind ik.

  • Snow_King
  • Registratie: April 2001
  • Laatst online: 11:47

Snow_King

Konijn is stoer!

of in het script

PHP:
1
if($REMOTE_ADDR !== "127.0.0.1"){ die("Forbidden"); }


(zeur nu niet over register globals :P )

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Snow_King schreef op 05 July 2003 @ 11:16:
of in het script

PHP:
1
if($REMOTE_ADDR !== "127.0.0.1"){ die("Forbidden"); }


(zeur nu niet over register globals :P )
mja, iedereen die naar die bak kan ssh'en kan het dus alsnog uitvoeren ;)
passwords via de url zijn btw ook niet handig :)
kortom gewoon het script runnen als een normaal script en niet via een webbrowser (waarmee je tevens niet root bent btw)

  • nrg
  • Registratie: April 2001
  • Laatst online: 08:00
Mensen, het werkt allang met php4-cgi :P
Dat is ook nog 'es veel makkelijker dan gekloot met wget enzo :)

Heb gewoon een cronjob aangemaakt naar m'n script "/[path]/quota.php" met bovenin het script
code:
1
#!/usr/bin/php4
ofzo :)

[ Voor 40% gewijzigd door nrg op 05-07-2003 12:44 ]


  • Snow_King
  • Registratie: April 2001
  • Laatst online: 11:47

Snow_King

Konijn is stoer!

mooi, jij blij, wij blij :)

[ Voor 38% gewijzigd door Snow_King op 05-07-2003 13:44 ]

Pagina: 1