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";
}
|