Confixx 3: Skript für User bei Traffic- / Speicherplatz Ã?berschreitung

Plesk, Confixx, Froxlor, SysCP, SeCoTo, IspCP, etc.
Post Reply
markuscgn
Posts: 11
Joined: 2006-02-25 09:20

Confixx 3: Skript für User bei Traffic- / Speicherplatz Ã?berschreitung

Post by markuscgn »

Hallo,

wollte mal allgemein in der Runde fragen ob zufällig jemand weis, wie mann ein kleines Skript erstellen könnte welches für die angelegten Accounts unter Confixx PRO v. 3.0.x / v. 3.1.x folgende Funktionen übernimmt.

Benachrichtigung an User-Mailadresse versenden ( 1x pro 24h) wenn...
- Speicherplatz überschreitung vorliegt
- Trafficüberschreitung vorliegt


Vielleicht hat jemand von Euch sowas realisiert? :wink:


cu Markus
Anonymous

Re: Confixx 3: Skript für User bei Traffic- / Speicherplatz Ã?berschreitung

Post by Anonymous »

du kanst diese utility im crontab ergänzen...
(`locking` von Kunden ist zehr einfach =)

Code: Select all

#!/usr/bin/perl

use DBI;
use Mail::Mailer;
use Getopt::Long;
## need to scope all vars from confixx_main.conf 
## for using use strict...
## use strict;

# allow processing of options with out '-' or '--' prefix
Getopt::Long::Configure('require_order', 'prefix_pattern=--|-||', 'ignore_case');

my @opts = (
        'debug',
        'lock',         ## lock user if he is over =)

        'traffik-delta=i',      ## deltas are (max - cur) allowed
        'disk-delta=i',         ## (measured by kB)
);

my %args = ();
unless (&GetOptions(%args, @opts)) {
    print STDERR "Incorrect usage...n";
    exit 1;
}

my ($sql, $dbh, $sth, @row);

my $space_delta = $args{'disk-delta'} || 0;
my $traffik_delta = $args{'traffik-delta'} || 0;
my $lock = $args{'lock'} || 0;
my $debug = $args{'debug'} || 0;

my ($currentMonth, $currentYear) = (localtime)[4,5];
$currentMonth = $currentMonth + 1;
$currentYear = $currentYear + 1900;
msg("Current month is '$currentMonth'nCurrent year is '$currentYear'");

# connect to Confixx DB
&loadConfFile; 
$dbh = DBI->connect($db_address, $dbUser, $dbPw) 
  or die( "Can't connect to ConfixxDbn error is '$DBI::errstr'n"); 

## get list of users with storage space over (skip space unlimited users)

$sql = "SELECT kunde AS user, emailadresse AS email, (kbhomedir+kbdb+kbpop) AS storagespace, maxkb AS maxspace FROM kunden WHERE maxkb != '-1' AND (kbhomedir+kbdb+kbpop) > (maxkb - '".$space_delta."')";
$sth = $dbh->prepare($sql);
$sth->execute or die("can't select kunden : $DBI::errstr");

if( !$sth->rows ) {
    msg( "MSG: NO kunden with traffik over allowed");
} else {
    msg("MSG: have kunden with storage space over");
    while (@row = $sth->fetchrow_array) {
        msg("MSG: processed user is '$row[0]' - $row[1] - $row[2] - $row[3]");
        sendSpaceNotification( $row[1], $row[2], $row[3]);
        if ($lock) {
            lockUser($row[0]);
        }
    }
}

## get list of users with traffik in current month over (skip traffik unlimited users)

$sql = "SELECT kunden.kunde AS user, kunden.emailadresse AS email, (transfer.ftp + transfer.web + transfer.email + transfer.pop) AS monthtraffik, kunden.maxtransfer AS maxtraffik FROM kunden, transfer WHERE transfer.monat = '$currentMonth' AND transfer.jahr = '$currentYear' AND kunden.maxtransfer != '-1' AND (transfer.ftp + transfer.web + transfer.email + transfer.pop) > (kunden.maxtransfer - '".$traffik_delta."')";
$sth = $dbh->prepare($sql);
$sth->execute or die("can't select kunden : $DBI::errstr");
if( !$sth->rows ) {
    msg("MSG: NO kunden with traffik over allowed");
} else {
    msg("MSG: have kunden with traffik over");
    while (@row = $sth->fetchrow_array) {
        msg("MSG: processed user is '$row[0]' - $row[1] - $row[2] - $row[3]");
        sendTraffikNotification($row[1], $row[2], $row[3]);
        if ($lock) {
            lockUser($row[0]);
        }
    }
}

exit 0;

#
## Subroutines
#

sub sendSpaceNotification {
    my ($email, $space, $maxspace) = @_;
    msg("MSG: send space notification to '$email' - '$space' - '$maxspace'");
    my $text = "Hello!n
Your used storage space is more then allowed.n
Used storage space is '$space' kbn
Max storage space is '$maxspace' kbn
Allowed delta is '".$space_delta."' kbn
";
    sendNotification($text, $email);
}

sub sendTraffikNotification {
    my ($email, $traffik, $maxtraffik) = @_;
    msg("MSG: send traffik notification to '$email' - '$traffik' - '$maxtraffik'");
    my $text = "Hello!n
Your used traffik is more then allowed.n
Used traffik is '$traffik' kbn
Max traffik is '$maxtraffik' kbn
Allowed delta is '".$traffik_delta."' kbn
";
    sendNotification($text, $email);
}

sub sendNotification {

    my ($body, $to_address) = @_;
    msg("MSG: send notification with '$body' - '$to_address'");
    my $from_address = "root@localhost";
    my $subject = "You is over =)";
    my $mailer = Mail::Mailer->new("sendmail");
    $mailer->open({ From    => $from_address,
                To      => $to_address,
                Subject => $subject,
      }) or die "Can't open: $!n";
    print $mailer $body;
    $mailer->close( ) or die('Cant close');
}

sub lockUser {
    my ($user) = @_;
    msg("lock user '$user'");
    $dbh->do("UPDATE kunden SET gesperrt = '1' WHERE kunde = '$user'");
}

sub msg {
    my ($text) = @_;
    print STDOUT $text."n" if $debug;
}

sub loadConfFile{ 
  my ($file, $base); 
  if(-T "/root/confixx/confixx_main.conf"){ 
    $file = "/root/confixx/confixx_main.conf"; 
  } 
  else{ 
   $0 = $^X unless ($^X =~ m%(^|[/\])(perl)|(perl.exe)$%i); 
   ($base) = $0 =~ m%^(.*)[/\]%; 
   $base ||= "."; 
   $file = "$base/confixx_main.conf"; 
   unless(-T $file){ 
     die("Couldn't find confixx_main.conf"); 
   } 
 } 
 do $file; 
}
Last edited by Anonymous on 2006-03-02 03:56, edited 2 times in total.
Anonymous

Re: Confixx 3: Skript für User bei Traffic- / Speicherplatz Ã?berschreitung

Post by Anonymous »

hmm.
meine Antwort ist zweimal...
Last edited by Anonymous on 2006-02-28 04:37, edited 1 time in total.
markuscgn
Posts: 11
Joined: 2006-02-25 09:20

Re: Confixx 3: Skript für User bei Traffic- / Speicherplatz Ã?berschreitung

Post by markuscgn »

slex wrote:du kanst diese utility im crontab ergänzen...
Verstehe ich es richtig, den gesamten Code den du jetzt gepostet hast 1:1 in den standart crontab vom System eintragen ?
adjustman
Posts: 1132
Joined: 2003-03-26 23:29
Location: SA

Re: Confixx 3: Skript für User bei Traffic- / Speicherplatz Ã?berschreitung

Post by adjustman »

MarkusCGN wrote:Verstehe ich es richtig, den gesamten Code den du jetzt gepostet hast 1:1 in den standart crontab vom System eintragen ?
natürlich nicht. Ist ein Perl-Script. DAS wird durch cron aufgerufen
markuscgn
Posts: 11
Joined: 2006-02-25 09:20

Re: Confixx 3: Skript für User bei Traffic- / Speicherplatz Ã?berschreitung

Post by markuscgn »

Hi,

OH mann , sorry sollte anschenend mal meine Augen richtig aufmachen :wink:

Klar schon verstanden :-)

@slex
Du hast geschrieben das da ein BUG drin ist ?


cu Markus
Anonymous

Re: Confixx 3: Skript für User bei Traffic- / Speicherplatz Ã?berschreitung

Post by Anonymous »

Aktionen:
- erschaffen File aus diese Code
- chmod 700 auf diese File
- ergänzen diese utility im crontab z.B.:

`echo "* 8 * * * /Path/to/Utility --login=<MYSQLLOGIN_TO_CONFIXX_DB> --password=<MYSQLPASS_TO_CONFIXX_DB> --db=<NAME_VON_CONFIXX_DB> "`

das wurde deine Kunden kontrollieren =)

Auch kannst du fur präventiv Versendung Optionen:
--traffik-delta
--disk-delta
setzen.

ich kann nicht bugs im Code finden.
Aber ich wurde fur bugs danken.

P.S.: nein, es gibt bug im Forum - meine Antwort ist zweimal...
antondollmaier
Posts: 485
Joined: 2004-03-30 10:06

Re: Confixx 3: Skript für User bei Traffic- / Speicherplatz Ã?berschreitung

Post by antondollmaier »

Alternativ könnte man noch von SW-Soft die Perl-Routine zum Finden und Ausführen der confixx_main.conf aus der mailtraffiksmtp.pl klauen ;)

Das Skript muss dafür zwar mit Root-Rechten ausgeführt werden, jedoch stehen dann die MySQL-Daten weder im Skript selbst, noch im Crontab ...
markuscgn
Posts: 11
Joined: 2006-02-25 09:20

Re: Confixx 3: Skript für User bei Traffic- / Speicherplatz Ã?berschreitung

Post by markuscgn »

Hallo ,

also habe folgendes jetzt gemacht.

QuellCODE (obiges) als Datei "statusmail.pl" abgespeichert und auf dem System unter /root/statusmail.pl gespeichert sowie mit 777 gechmodet.

In der Crontab steht nun

Code: Select all

* 8 * * * /root/statusmail.pl --login=<MYSQLLOGIN_TO_CONFIXX_DB> --password=<MYSQLPASS_TO_CONFIXX_DB> --db=<NAME_VON_CONFIXX_DB>
Beim manuell direkter Ausführung erscheint folgende Meldung

Ausgabe des Befehls /root/statusmail.pl --login= --password= --db= ..

/bin/sh: -c: line 0: syntax error near unexpected token `newline'
/bin/sh: -c: line 0: `/root/statusmail.pl --login=<MYSQLLOGIN_TO_CONFIXX_DB> --password=<MYSQLPASS_TO_CONFIXX_DB> --db=<NAME_VON_CONFIXX_DB>'
Liegt vielleicht doch ein BUG vor oder hab ich da was falsch gemacht ?
Anonymous

Re: Confixx 3: Skript für User bei Traffic- / Speicherplatz Ã?berschreitung

Post by Anonymous »

du mussst

<MYSQLLOGIN_TO_CONFIXX_DB>
<MYSQLPASS_TO_CONFIXX_DB>
<NAME_VON_CONFIXX_DB>

auf deine Werten ersetzen.

z.B.:

statusmail.pl --login=root --password=123123 --db=confixx
markuscgn
Posts: 11
Joined: 2006-02-25 09:20

Re: Confixx 3: Skript für User bei Traffic- / Speicherplatz Ã?berschreitung

Post by markuscgn »

Achso......

hatte die Werte in dem Skript

my $db = $args{'db'} || 'xxxxxxxxx';
my $login = $args{'login'} || 'xxxxxxxx';
my $password = $args{'password'} || 'xxxxxxxxx';

selbst schon reingesetzt.
Dann werd ichs direkt mal neu austesten und machen.
markuscgn
Posts: 11
Joined: 2006-02-25 09:20

Re: Confixx 3: Skript für User bei Traffic- / Speicherplatz Ã?berschreitung

Post by markuscgn »

Hmmmm,

habe jetzt noch die entsprechenden Anpassungen vorgenommen doch anscheinend kann er die DB con der Confixx nicht finden :-(
DBI connect('confixx:localhost;mysql_socket=/var/lib/mysql/mysql.sock','root',...) failed: Access denied for user: 'root@localhost' (Using password: YES) at /root/statusmail.pl line 49
Can't connect to Confixx DB
Also entweder stehe ich hier auf die Leitung oder ich überseh hier irgendwas.

Denn in dn Zeilen 47 bis 52 wird auf folgendem verwiesen.

Code: Select all

# connect to Confixx DB
my $dbAddress = 'DBI:mysql:'.$db.':localhost;mysql_socket=/var/lib/mysql/mysql.sock';
unless ($dbh = DBI->connect($dbAddress, $login, $password)) {
        print STDERR "Can't connect to Confixx DBn";
        exit 2;
}
Anonymous

Re: Confixx 3: Skript für User bei Traffic- / Speicherplatz Ã?berschreitung

Post by Anonymous »

ich uberschreibe Connection zu DB in utility - erzetzen Code in deine 'statusmail.pl'.

WENN FUNKTIONIERT UTILITY SCHON, DANN MACHEN NICHTS =)

jetzt du muss starten utility:

statusmail.pl --login=<MYSQLLOGIN_TO_CONFIXX_DB>
--password=<MYSQLPASS_TO_CONFIXX_DB> --db=<NAME_VON_CONFIXX_DB> --host=<HOST_VON_MYSQL> --port=<PORT_VON_MYSQL>


wenn utility kann nicht DB finden,
hier Output von Command:

mysql -u<MYSQLLOGIN_TO_CONFIXX_DB>
-p<MYSQLPASS_TO_CONFIXX_DB> -D<NAME_VON_CONFIXX_DB> -h<HOST_VON_MYSQL> -p<PORT_VON_MYSQL>

schreiben, bitte.
flo
Posts: 2223
Joined: 2002-07-28 13:02
Location: Berlin

Re: Confixx 3: Skript für User bei Traffic- / Speicherplatz Ã?berschreitung

Post by flo »

slex wrote:statusmail.pl --login=<MYSQLLOGIN_TO_CONFIXX_DB>
--password=<MYSQLPASS_TO_CONFIXX_DB> --db=<NAME_VON_CONFIXX_DB> --host=<HOST_VON_MYSQL> --port=<PORT_VON_MYSQL>
Confixx hat eine Konfigurationsdatei - wenn Ihr dieses Includet, steht Euer Passwort nicht im Klartext im halben System rum und Ihr habt alles wunderprächtig verfügbar.

flo.
markuscgn
Posts: 11
Joined: 2006-02-25 09:20

Re: Confixx 3: Skript für User bei Traffic- / Speicherplatz Ã?berschreitung

Post by markuscgn »

Hmmmmm - bekomm immer nur ERROR Meldungen. Egal was ich versuch und/oder modifizieren aber es will anschienend nicht.

Vielleicht liegt bes auch and er Confixx Version, SQL Version oder so ?! :?

Gibt es denn keine Andere und einfachere Lösung um dieses zu realisieren so das mann die Kunden 1x pro Tag an dessen Limit Ã?brschreitung mit einer E-Mail automatisch erinnern kann ?

Geht ja hauptsächlich nur um => Traffic + Speicherplatz

cu Markus
PS: wäre für eine Lösung dankbar
antondollmaier
Posts: 485
Joined: 2004-03-30 10:06

Re: Confixx 3: Skript für User bei Traffic- / Speicherplatz Ã?berschreitung

Post by antondollmaier »

Code: Select all

&loadConfFile;
use DBI;
$dbh = DBI->connect($db_address, $dbUser, $dbPw)
  or die( &ltext('db_connect', '#2001', "$DBI::errstr") );


sub loadConfFile{
  my ($file, $base);
  if(-T "/root/confixx/confixx_main.conf"){
    $file = "/root/confixx/confixx_main.conf";
  }
  else{
   $0 = $^X unless ($^X =~ m%(^|[/\])(perl)|(perl.exe)$%i);
   ($base) = $0 =~ m%^(.*)[/\]%;
   $base ||= ".";
   $file = "$base/confixx_main.conf";
   unless(-T $file){
     die("Couldn't find confixx_main.conf");
   }
 }
 do $file;
}
mit diesen paar Zeilen wird die Confixx-Config geladen sowie eine MySQL-Verbindung erstellt ... somit müssen die Verbindungsdaten nicht mehr im Crontab stehen ...


@flo: danke, dass du meinen Beitrag bestätigt hast ;)
Anonymous

Re: Confixx 3: Skript für User bei Traffic- / Speicherplatz Ã?berschreitung

Post by Anonymous »

@antondollmaier:
hmmm. mit loadConfFile() benutzen 'use strict' schwierig...
Aber ich einverstande - das ist Losung...
danke fur improvements ...

@MarkusCGN:

copieren neu Code in deine Utility,
copieren Utility to /root/confixxx (oder wo ist deine confixx_main.conf).
jetzt kannst du diese utility onhe Optionen!
flo
Posts: 2223
Joined: 2002-07-28 13:02
Location: Berlin

Re: Confixx 3: Skript für User bei Traffic- / Speicherplatz Ã?berschreitung

Post by flo »

antondollmaier wrote:@flo: danke, dass du meinen Beitrag bestätigt hast ;)
Ich hab den Beitrag nur überflogen und das was Du da geschrieben hast, setzt anscheinend auch wieder Abstraktion voraus ...

Wir reden - zugegeben in anderen Threads - über Systemsicherheit und hier werden Scripte programmiert, bei denen das Passwort für die Systemkonfigurationsdatenbank in der Prozeßliste steht - da graust es mir schon ein bißchen.

flo.
Post Reply