BlackBoard » Computerecke » Betriebssysteme » Linux Neues Perl-script - speedcontrol.pl » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Neues Perl-script - speedcontrol.pl
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Black Star Black Star ist männlich
Der Pate [Admin]


images/avatars/avatar-2158.jpg

Dabei seit: 11.12.2001
Beiträge: 2.282
Herkunft: /dev/stderr

Neues Perl-script - speedcontrol.pl       Zum Anfang der Seite springen

ich hab nen neues praktisches perl-script gecodetgroßes Grinsen

speedcontrol.pl checkt im minutentakt die netzwerlast, und wenn sie einen gewissen wert unterschreitet, oder lange zeit niedrig ist, wir ein alarm ausgelöst.

superpraktisch, wenn man den esel laufen hat, und mitkriegen will, wenn der mal wieder nicht richtig läuft.

das modul Time::HiRes muss über CPAN installiert werden. (bedeutet, man muss online sein)

# perl -MCPAN -e shell
cpan> install Time::HiRes
cpan> quit

und hier ist der code:
code:
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:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
#!/usr/bin/perl -W
#
#  speedcontrol - controls downstream - x min inactivity ==> alert 
#
#  2002 by black star
#
#  structure of /proc/net/dev:
#  #0: jadajada
#  #1: jadajada
#  #2: name:bytes_in xxx xxx xxx xxx xxx xxx xxx bytes_out xxx xxx xxx xxx xxx xxx xxx
#  #  ...... up to 5 ifaces
#
#  the interesting numbers are at position 2 (recive) and 10 (transmit)
#

$debug=0;

$iface = "ppp0"; # iface to check
    
use Time::HiRes;
$time = 60; # time between tests
$timestab = 1; # test-time    
$count_warn = 5; # counts speed=0 -> warning
$warn_command = "mpg123 -q /winstuff/sounds/003_TNsFir00.mp3; mpg123 -q /winstuff/sounds/002_tadErr03.mp3"; 

$low_speed = 5; # speed < $low_speed
$low_count = 30; # counts low_speed
$low_warn_command = "mpg123 -q /winstuff/sounds/003_TNsFir00.mp3; mpg123 -q /winstuff/sounds/004_ttapss03.mp3"; 

#--------------------------------------get_curr_speed
sub get_curr_speed {
    my $return = "test - ";
    
    my @up1; my @down1; my @up2; my @down2;
    $starttime = [Time::HiRes::gettimeofday];
    open(DEV, "$dev"); @dev = <DEV>;
    foreach $line (@dev) { # get load of all ifaces
        if ( $line =~ /$iface/ ) {
            if ( $debug > 1 ) { print "$line\n"; }
            $line =~ s/( )+/ /g;
            @temp = split(/[: ]/, $line);
            foreach $temp (@temp) { $temp =~ s/ //g; }            
            $up1 = $temp[10];
            $down1 = $temp[2];
            if ( $debug > 1 ) { print "1 - "; foreach $temp (@temp) { print "$temp|" } print "\n- $up1 - $down1 -\n"; }    
        }
    }    
    close(DEV);
    #----wait dt
    sleep($timestab);
    $stoptime  = [Time::HiRes::gettimeofday];
    open(DEV, "$dev"); @dev = <DEV>;
    foreach $line (@dev) { # get load of all ifaces
        if ( $line =~ /$iface/ ) {
            if ( $debug > 1 ) { print "$line\n"; }
            $line =~ s/( )+/ /g;
            @temp = split(/[: ]/, $line);
            foreach $temp (@temp) { $temp =~ s/ //g; }
            $up2 = $temp[10];
            $down2 = $temp[2];
            if ( $debug > 1 ) { print "2 - "; foreach $temp (@temp) { print "$temp|" } print "\n- $up2 - $down2 -\n"; }    
        }
    }
    close(DEV);
    if ( $debug > 1 ) { print "\n"; }
    
    # calculate d/dt
    $elapsed = Time::HiRes::tv_interval($starttime, $stoptime);
        
    if ( $debug > 1  ) { print "| $up2 | $up1 | $down2 | $down1 |\n"; }
    
    $load_up_bytes = ($up2 - $up1) / $elapsed;  $load_up_kbytes = $load_up_bytes / 1024;
    $load_down_b = ($down2 - $down1) / $elapsed; $load_down_kb = $load_down_b / 1024;
    # delete fuckin point numbers
    $load_up_bytes =~ s/\.[0-9]+//; $load_up_kbytes =~ s/\.[0-9]+//;
    $load_down_b =~ s/\.[0-9]+//; $load_down_kb =~ s/\.[0-9]+//;
    #if ( $debug > 1  ) { print "$iface\tup = $load_up_bytes bps\tdown = $load_down_b bps\t ||\t up = $load_up_kbytes kbps\t down = $load_down_kb kbps\n";}
    
    
    $return = $load_up_bytes."|".$load_down_b."|".$load_up_kbytes."|".$load_down_kb;    
    return $return;    
}
#--------------------------print_speed
sub print_speed {
    my $return;    
    $format = $_[0];
    $speed = $_[1];
    @speed = split(/\|/, $speed);
    if ( $format =~ /kb/ ) { $return = "".$speed[2]."/".$speed[3]."[kbytes] up/down"; }    
        else { $return = $speed[0]."/".$speed[1]."[bytes] up/down"; }    
    return $return;
}


#################MAIN#########################

print "\nSpeecontrol - 2002 by Black Star\n\n";
print "listen to network....";

# load interfaces
$dev = "/proc/net/dev";
open(DEV, "$dev");
if ( -e DEV ) { print " found process..."; } else { print "network is down"; last; }
@dev = <DEV>;

# look for ifaces
foreach $line (@dev) {
    if ( $line =~ /:/ ) {
        @temp = split(/:/, $line);
        $temp[0] =~ s/ //g;  #delete spaces
        push(@ifaces, $temp[0]);
    }        
}
if (@ifaces) { print " found interfaces:"; } else { print " none or bad interfaces"; last; }
foreach $iface (@ifaces) { print " $iface"; }
close(DEV);

print "\n\nsearching for dialup interface";
$ok = 0;
foreach $iface (@ifaces) {
    print ".";
    if ( $iface =~ /$iface/ ) { $ok++; }
}
if ( $ok == 0 ) { print "not found!\n\n"; last; } else { print "found [$iface]\n"; }


# starting
print "\nstarting speedcontrol - current speed is ".&print_speed("b",&get_curr_speed())." - timestab is $timestab - wait is $time sec\n";

$warn = 0;
$low = 0;
$count = 0;

while ( 1 ) {
    sleep($time);
    $count++;
    print "seq $count\tcurrent speed is ".&print_speed("kb",&get_curr_speed());
    $down = &get_curr_speed();
    @down = split(/\|/, $down);
    $down = $down[3];
    #warn
    if ( $down == 0 ) {
        $warn++;
        print " --- warning! - current downspeed is 0kbps! - seq$warn";            
    } else {
        $warn = 0;
    }
    if ( $debug > 0 ) { print " $count_warn | $warn |\n"; }
    if ( $warn == $count_warn ) { $warn = 0; system("$warn_command"); print " - warning send"; }
    #low
    if ( ($down < $low_speed) && ($down != 0) ) {
        $low++;
        print " --- warning! - current downspeed is under ".$low_speed."kbps! - seq$low";            
    } elsif ( $down > 0 ) {
        $low = 0;
    }
    if ( $debug > 0 ) { print " $low_count | $low |\n"; }
    if ( $low == $low_count ) { $low= 0; system("$low_warn_command"); print " - low-speed-warning send"; }
    
    print "\n";
}


das ding hat vielleicht noch ein paar macken, aber ich werde die schon noch ausmerzen. bisher liefs einwandfrei

cu - black star8)

EDIT: seit 13:20 ist das ding jetzt auch gefixed. die erste version hatte einen mittelschweren fehler.

wer die korrekte version haben will, soll sich melden

__________________
vescere bracis meis

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Black Star: 21.09.2002 17:25.

13.09.2002 12:34 Black Star ist offline E-Mail an Black Star senden Homepage von Black Star Beiträge von Black Star suchen
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
BlackBoard » Computerecke » Betriebssysteme » Linux Neues Perl-script - speedcontrol.pl

Forensoftware: Burning Board 2.3.6, entwickelt von WoltLab GmbH