05.06.09 00:15 lol2Fast4U

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. Мой первый пост, кстати.



xT 05.06.09 00:32 # +3
mb = 5 #allowed megabytes

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

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

542932797

25180003

 

чем парсить вывод ифконфига? :)
lomereiter 05.06.09 07:10 # +2
+1. Или можно удосужиться регулярки подучить:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15


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.09 11:39 # +0
Да, проще. Спасибо, сейас обновлю
NucleoFag 05.06.09 02:45 # +0
С 1м постом!

p.s. чую щас понасоветуют, будешь юзать высокоскоростной оптимизированный безлимитный тырнет из-за скрипта, переделанного в однострочный.. ;)
booley 05.06.09 10:47 # +1
Вижу чувак написал первый пост. Где-то к половине скрипта было ощущение, что в комментах будет полно поправок. Так и вышло. ;)
lol2Fast4U 05.06.09 11:20 # +1
Спасибо :)
Однострочный - это на перле который, запускает патч Бармина?
NucleoFag 05.06.09 11:31 # +0
Ну, не исключено, тот вообще от проблем избавит =)
А вообще я просто писал про аццкую оптимизацию... Товарищи есть, которые мне скрипт из 50 строчек в 1 длинную переделывали на перле. Правда не очень то он и деструктивным получался, выполнял тока штатные функции
lol2Fast4U 05.06.09 11:39 # +0
Да в интернетах мануалы есть по такой оптимизации, любой перл-скрипт переделать можно.
vovka 05.06.09 07:30 # +1
а весь процессор не жрет? А то time.sleep(1) не заметил в бесконечном цикле.
lol2Fast4U 05.06.09 11:18 # +0
У меня на Celeron 900 вообще не заметно.
exelens 05.06.09 15:02 # +0
Создал блог Python и перенёс туда
cppmm 05.06.09 15:50 # +0
Интересная штука. Когда сидел на GPRS, было бы актуально(правда, я бы предпочёл использовать для этого bash или perl, но это уже вопросы религии :)).
Правда, я для себя проблемы с лимитированием и экономией траффика решил тогда несколько иначе. Так сказать, админским способом - поднял кеширующий dns, для ускорения работы и экономии(на самом деле dns-запросы немало откушивают) и проксю с большим кешем, банерорезкой(тут особо стоит отметить, что в отличии от всяких adblock'ов и подобных плагинов лисы, прокся не скачивает зарезаный объект, что тоже ощутимо экономит траффик) и лимитированием с мониторингом. Вот, до чего доводит людей медленный и ограниченный инет. :)
К счастью, теперь у меня анлим, но прокся так и крутится с dns'ом.
lol2Fast4U 05.06.09 19:30 # +0
Экономию трафика решает toonel.net. Но он не мешает много скачать :)
evgenyl 05.06.09 17:17 # +5
А ещё можно так например сделать
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.09 18:17 # +1
самое зачотное решение
lol2Fast4U 05.06.09 19:28 # +0
Слишком жестоко. Не предупреждает юзера. Да и правильнее отключать ifconfig'ом, имхо.
evgenyl 06.06.09 11:04 # +2
Я привел лиш ещё один способ, сделать тоже самое, твой способ ничем не хуже.
Вместе, мы демонстрируем богаство выбора, ситуаций возможно бесконечное множество и под каждую, несуществует единого правильного решения :)
lol2Fast4U 06.06.09 17:06 # +0
Да, да :) Но все же без предупреждения жестоко, это либо для совсем интернет-зависимых, либо другу на 1 апреля незаметно поставить:)
evgenyl 08.06.09 10:54 # +0
Я бы объеденил твой способ и мой, проверял кончилась ли квота и выдавал сообщение, иначе обычный браузер 20-30 закладок с обилием флэша сожрут ресурсы систему и какая нибуть закачка успеет накачать лишнего.

А ещё там где лежит скрипт, случайно кончится место, потому что ты тудаже качал очередной фильм и не расчитал свободное место, питон застрелится, а ты будеш думать что у тебя ещё много трафика в запасе.
Хорошо бы это поправить.
radioteh 13.06.09 14:21 # +0
ещё правка:
В данном случае не сильно важно, но логичнее не так:
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.09 22:18 # +0
interface - передается функции check, то есть становится device.
P.S. А еще скажи, что pepyaka - логичнее не так.
radioteh 14.06.09 21:18 # +0
Во первых: написал же, в данном случае не важно. Во вторых: вдруг при модификации захочется контролировать два интерфейса и появиться device2? Функция-то независимо от переданного параметра вернёт данные по device :-) До кучи: если писать в функции device, нафига ей тогда параметр? :-)
P.S. А еще скажи, что pepyaka - логичнее не так.
- Вот
этого вообще не понял :-)
Посты Комментарии
Последние посты
Посты Комментарии
Последние комментарии
Посты Комментарии
Изменения
Посты Комментарии Изменения Черновики Избранное
Черновики (все)
Посты Комментарии Изменения Черновики Избранное
Избранное (всё)
Посты Комментарии Изменения Черновики Избранное
Лучшие блоги (все 127)
Элита (все 2421 из 196 городов)
welinux.ru