lol2Fast4U 05.06.2009 00:15

PythonОграничиваем себя в расходе трафика

Поскольку у меня лимитный интернет (предоплачено 500 мб в месяц, а платить больше абонентской платы не хочется), я решил написать небольшую программу (не хочется скриптом называть, но по сути это скрипт. даже интерфейса нету) - демон, который висит в фоне и снимает показания счетчика. Не воды, а трафика. Когда достигнут лимит - предупреждает и отключает. Писал для себя, но решил кинуть на Pastebin и дать линк в твиттер. Тут же @hublog поправил меня - надо писать while 1, а не придумывать переменную и писать while a == a.

Что полуичлось - под катом.

UPD: Версия 2.0, теперь все делается прямо, а не через ж0пу %) Старая версия здесь.



Просто меняем интерфейс и сколько надо мегабайт. Запускаем и смело идем в интернеты.

 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
import commands, sys, time

device = 'ppp0' #network device. usually eth0 for ethernet, wlan0 for wifi, ppp0 for cdma/gsm

mb = 5 #allowed megabytes



def check(interface):

pepyaka = open('/sys/class/net/' + device + '/statistics/rx_bytes', 'r')

kb = int(pepyaka.read())/1024

pepyaka.close()

return kb



def fileupdate():

f = open('spam', 'w')

f.write(str(check(device)))

f.close()



def fileread():

f = open('spam', 'r')

val = f.read()

f.close()

return val



while 1:

fileupdate()

foo = fileread()

if int(foo) > 1024*mb:

import dbus

bus = dbus.SessionBus()

proxy = bus.get_object('org.freedesktop.Notifications', '/org/freedesktop/Notifications')

_dbus_notify = dbus.Interface(proxy, 'org.freedesktop.Notifications')

commands.getoutput('/sbin/ifconfig ' + device + ' down')

_dbus_notify.Notify('', 0, '', 'Stop!', 'Stop surfing internet. You are disconnected.',
, {'x': '0', 'y': '0'}, 5000)

sys.exit(1)

time.sleep(1)




P.S. Мой первый пост, кстати.


Тэги: python интернет трафик
+ 13 -
Похожие Поделиться

xT 05.06.2009 00:32 #
mb = 5 #allowed megabytes

Это, как я понимаю, отредактированный для публики вариант и примером является лимит в 5 мегабайт, а не твой лимит в 500мб?
lol2Fast4U 05.06.2009 11:13 #
Ты не выключаешь комп, когда идешь спать?

За первые 3 дня я потратил 160мб. 500-160=340 - осталось. 10 мб за сутки. 5 ночью, 5 днем т.к. Скайлинк разделяет траф на ночной и дневной, очень удобно.
booley 05.06.2009 11:52 #
Я не выключаю - т.к. это еще и хоум-сервер :)
xT 05.06.2009 12:00 #
С появлением анлима выключать перестал. Когда сидел на гпрс - выключал.
ussr 05.06.2009 00:39 #
угу, похоже на то. вообще надобность такого скрипта сомнительна. разве что на день себе трафик лимитировать.
partizan13 05.06.2009 00:59 #
Если трафик стоит >3р за метр, то скрипт становится очень полезным.
lol2Fast4U 05.06.2009 11:13 #
>на день себе трафик лимитировать.
Для этого он и предназначен!
krig 05.06.2009 00:40 #
Не #via anus, а #per rectum =)
А в остальном - занимательно.
Username 05.06.2009 00:53 #
мне кажется, простора для упрощения тут полно. Зачем файлы создавать? Да и правильно, как я понимаю, использовать не ppp0, а дефолтный route
lol2Fast4U 05.06.2009 11:17 #
Файл создается для того, что если слегка модифицировать скрипт...
Если связь пропадет, скрипт завершится. Когда начнется опять, и скрипт будет считать с места разрыва :)
lol2Fast4U 05.06.2009 11:48 #
Ошибся, не слегка. Там не очень понятно, как определить разрыв...
drujebober 05.06.2009 01:39 #
а может проще будет воспользоваться содержимым файликов
% cat /sys/class/net/wifi0/statistics/x_bytes
542932797
25180003

чем парсить вывод ифконфига? :)
lomereiter 05.06.2009 07:10 #
+1. Или можно удосужиться регулярки подучить:
import re
...
try:
return int(re.search(r"RX bytes:(\d+)\s+", commands.getoutput("/sbin/ifconfig " + interface)).groups()<0>)/1024
except:
return 'FAIL'
lol2Fast4U 05.06.2009 11:39 #
Да, проще. Спасибо, сейас обновлю
NucleoFag 05.06.2009 02:45 #
С 1м постом!

p.s. чую щас понасоветуют, будешь юзать высокоскоростной оптимизированный безлимитный тырнет из-за скрипта, переделанного в однострочный.. ;)
booley 05.06.2009 10:47 #
Вижу чувак написал первый пост. Где-то к половине скрипта было ощущение, что в комментах будет полно поправок. Так и вышло. ;)
lol2Fast4U 05.06.2009 11:20 #
Спасибо :)
Однострочный - это на перле который, запускает патч Бармина?
NucleoFag 05.06.2009 11:31 #
Ну, не исключено, тот вообще от проблем избавит =)
А вообще я просто писал про аццкую оптимизацию... Товарищи есть, которые мне скрипт из 50 строчек в 1 длинную переделывали на перле. Правда не очень то он и деструктивным получался, выполнял тока штатные функции
lol2Fast4U 05.06.2009 11:39 #
Да в интернетах мануалы есть по такой оптимизации, любой перл-скрипт переделать можно.
vovka 05.06.2009 07:30 #
а весь процессор не жрет? А то time.sleep(1) не заметил в бесконечном цикле.
lol2Fast4U 05.06.2009 11:18 #
У меня на Celeron 900 вообще не заметно.
exelens 05.06.2009 15:02 #
Создал блог Python и перенёс туда
cppmm 05.06.2009 15:50 #
Интересная штука. Когда сидел на GPRS, было бы актуально(правда, я бы предпочёл использовать для этого bash или perl, но это уже вопросы религии :)).
Правда, я для себя проблемы с лимитированием и экономией траффика решил тогда несколько иначе. Так сказать, админским способом - поднял кеширующий dns, для ускорения работы и экономии(на самом деле dns-запросы немало откушивают) и проксю с большим кешем, банерорезкой(тут особо стоит отметить, что в отличии от всяких adblock'ов и подобных плагинов лисы, прокся не скачивает зарезаный объект, что тоже ощутимо экономит траффик) и лимитированием с мониторингом. Вот, до чего доводит людей медленный и ограниченный инет. :)
К счастью, теперь у меня анлим, но прокся так и крутится с dns'ом.
lol2Fast4U 05.06.2009 19:30 #
Экономию трафика решает toonel.net. Но он не мешает много скачать :)
evgenyl 05.06.2009 17:17 #
А ещё можно так например сделать
iptables -A INPUT -s !192.168.0.0/16 -m quota --quota 5242880 -j ACCEPT
iptables -A INPUT -s !192.168.0.0/16 -j DROP

-s !192.168.0.0/16 - на вкус, можно заменить на -i ppp0
Username 05.06.2009 18:17 #
самое зачотное решение
lol2Fast4U 05.06.2009 19:28 #
Слишком жестоко. Не предупреждает юзера. Да и правильнее отключать ifconfig'ом, имхо.
evgenyl 06.06.2009 11:04 #
Я привел лиш ещё один способ, сделать тоже самое, твой способ ничем не хуже.
Вместе, мы демонстрируем богаство выбора, ситуаций возможно бесконечное множество и под каждую, несуществует единого правильного решения :)
lol2Fast4U 06.06.2009 17:06 #
Да, да :) Но все же без предупреждения жестоко, это либо для совсем интернет-зависимых, либо другу на 1 апреля незаметно поставить:)
evgenyl 08.06.2009 10:54 #
Я бы объеденил твой способ и мой, проверял кончилась ли квота и выдавал сообщение, иначе обычный браузер 20-30 закладок с обилием флэша сожрут ресурсы систему и какая нибуть закачка успеет накачать лишнего.

А ещё там где лежит скрипт, случайно кончится место, потому что ты тудаже качал очередной фильм и не расчитал свободное место, питон застрелится, а ты будеш думать что у тебя ещё много трафика в запасе.
Хорошо бы это поправить.
radioteh 13.06.2009 14:21 #
ещё правка:
В данном случае не сильно важно, но логичнее не так:
def check(interface):
pepyaka = open('/sys/class/net/' + device + '/statistics/rx_bytes', 'r')
а
def check(interface):
pepyaka = open('/sys/class/net/' + interface + '/statistics/rx_bytes', 'r')
lol2Fast4U 13.06.2009 22:18 #
interface - передается функции check, то есть становится device.
P.S. А еще скажи, что pepyaka - логичнее не так.
radioteh 14.06.2009 21:18 #
Во первых: написал же, в данном случае не важно. Во вторых: вдруг при модификации захочется контролировать два интерфейса и появиться device2? Функция-то независимо от переданного параметра вернёт данные по device :-) До кучи: если писать в функции device, нафига ей тогда параметр? :-)
P.S. А еще скажи, что pepyaka - логичнее не так.
- Вот
этого вообще не понял :-)
cm90 12.09.2013 19:50 #
а что означает эта строчка?
open('/sys/class/net/' + device + '/statistics/rx_bytes')
cm90 12.09.2013 19:56 #
т.е. как эту строчку переделать под Win32 ?
при условии что используется ethernet.

dront78 12.09.2013 21:08 #
Ограничиваем себя в расходе трафика

мазохизмом попахивает)
cm90 13.09.2013 19:24 #
так и есть, но надо! просто надо.
как это скриптец переделать под win32 ?
jh 14.09.2013 04:20 #
под win32 лучше использовать vbscript
uscr 14.09.2013 13:17 #
В 2013 ещё кому то не дали безлимит?
dront78 14.09.2013 20:34 #
VKontakte
Может быть так