lol2Fast4U 05.06.2009 00:15
Python — Ограничиваем себя в расходе трафика
Поскольку у меня лимитный интернет (предоплачено 500 мб в месяц, а платить больше абонентской платы не хочется), я решил написать небольшую программу (не хочется скриптом называть, но по сути это скрипт. даже интерфейса нету) - демон, который висит в фоне и снимает показания счетчика. Не воды, а трафика. Когда достигнут лимит - предупреждает и отключает. Писал для себя, но решил кинуть на Pastebin и дать линк в твиттер. Тут же @hublog поправил меня - надо писать while 1, а не придумывать переменную и писать while a == a.Что полуичлось - под катом.
UPD: Версия 2.0, теперь все делается прямо, а не через ж0пу %) Старая версия здесь.
Просто меняем интерфейс и сколько надо мегабайт. Запускаем и смело идем в интернеты.
P.S. Мой первый пост, кстати.
Ты не выключаешь комп, когда идешь спать?
За первые 3 дня я потратил 160мб. 500-160=340 - осталось. 10 мб за сутки. 5 ночью, 5 днем т.к. Скайлинк разделяет траф на ночной и дневной, очень удобно.
За первые 3 дня я потратил 160мб. 500-160=340 - осталось. 10 мб за сутки. 5 ночью, 5 днем т.к. Скайлинк разделяет траф на ночной и дневной, очень удобно.
С появлением анлима выключать перестал. Когда сидел на гпрс - выключал.
угу, похоже на то. вообще надобность такого скрипта сомнительна. разве что на день себе трафик лимитировать.
Если трафик стоит >3р за метр, то скрипт становится очень полезным.
>на день себе трафик лимитировать.
Для этого он и предназначен!
Для этого он и предназначен!
мне кажется, простора для упрощения тут полно. Зачем файлы создавать? Да и правильно, как я понимаю, использовать не ppp0, а дефолтный route
Файл создается для того, что если слегка модифицировать скрипт...
Если связь пропадет, скрипт завершится. Когда начнется опять, и скрипт будет считать с места разрыва :)
Если связь пропадет, скрипт завершится. Когда начнется опять, и скрипт будет считать с места разрыва :)
Ошибся, не слегка. Там не очень понятно, как определить разрыв...
а может проще будет воспользоваться содержимым файликов
чем парсить вывод ифконфига? :)
% cat /sys/class/net/wifi0/statistics/x_bytes
542932797
25180003
чем парсить вывод ифконфига? :)
+1. Или можно удосужиться регулярки подучить:
import re
...
try:
return int(re.search(r"RX bytes:(\d+)\s+", commands.getoutput("/sbin/ifconfig " + interface)).groups()<0>)/1024
except:
return 'FAIL'
С 1м постом!
p.s. чую щас понасоветуют, будешь юзать высокоскоростной оптимизированный безлимитный тырнет из-за скрипта, переделанного в однострочный.. ;)
p.s. чую щас понасоветуют, будешь юзать высокоскоростной оптимизированный безлимитный тырнет из-за скрипта, переделанного в однострочный.. ;)
Вижу чувак написал первый пост. Где-то к половине скрипта было ощущение, что в комментах будет полно поправок. Так и вышло. ;)
Спасибо :)
Однострочный - это на перле который, запускает патч Бармина?
Однострочный - это на перле который, запускает патч Бармина?
Ну, не исключено, тот вообще от проблем избавит =)
А вообще я просто писал про аццкую оптимизацию... Товарищи есть, которые мне скрипт из 50 строчек в 1 длинную переделывали на перле. Правда не очень то он и деструктивным получался, выполнял тока штатные функции
А вообще я просто писал про аццкую оптимизацию... Товарищи есть, которые мне скрипт из 50 строчек в 1 длинную переделывали на перле. Правда не очень то он и деструктивным получался, выполнял тока штатные функции
Да в интернетах мануалы есть по такой оптимизации, любой перл-скрипт переделать можно.
а весь процессор не жрет? А то time.sleep(1) не заметил в бесконечном цикле.
Интересная штука. Когда сидел на GPRS, было бы актуально(правда, я бы предпочёл использовать для этого bash или perl, но это уже вопросы религии :)).
Правда, я для себя проблемы с лимитированием и экономией траффика решил тогда несколько иначе. Так сказать, админским способом - поднял кеширующий dns, для ускорения работы и экономии(на самом деле dns-запросы немало откушивают) и проксю с большим кешем, банерорезкой(тут особо стоит отметить, что в отличии от всяких adblock'ов и подобных плагинов лисы, прокся не скачивает зарезаный объект, что тоже ощутимо экономит траффик) и лимитированием с мониторингом. Вот, до чего доводит людей медленный и ограниченный инет. :)
К счастью, теперь у меня анлим, но прокся так и крутится с dns'ом.
Правда, я для себя проблемы с лимитированием и экономией траффика решил тогда несколько иначе. Так сказать, админским способом - поднял кеширующий dns, для ускорения работы и экономии(на самом деле dns-запросы немало откушивают) и проксю с большим кешем, банерорезкой(тут особо стоит отметить, что в отличии от всяких adblock'ов и подобных плагинов лисы, прокся не скачивает зарезаный объект, что тоже ощутимо экономит траффик) и лимитированием с мониторингом. Вот, до чего доводит людей медленный и ограниченный инет. :)
К счастью, теперь у меня анлим, но прокся так и крутится с dns'ом.
Экономию трафика решает toonel.net. Но он не мешает много скачать :)
А ещё можно так например сделать
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
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
Слишком жестоко. Не предупреждает юзера. Да и правильнее отключать ifconfig'ом, имхо.
Я привел лиш ещё один способ, сделать тоже самое, твой способ ничем не хуже.
Вместе, мы демонстрируем богаство выбора, ситуаций возможно бесконечное множество и под каждую, несуществует единого правильного решения :)
Вместе, мы демонстрируем богаство выбора, ситуаций возможно бесконечное множество и под каждую, несуществует единого правильного решения :)
Да, да :) Но все же без предупреждения жестоко, это либо для совсем интернет-зависимых, либо другу на 1 апреля незаметно поставить:)
Я бы объеденил твой способ и мой, проверял кончилась ли квота и выдавал сообщение, иначе обычный браузер 20-30 закладок с обилием флэша сожрут ресурсы систему и какая нибуть закачка успеет накачать лишнего.
А ещё там где лежит скрипт, случайно кончится место, потому что ты тудаже качал очередной фильм и не расчитал свободное место, питон застрелится, а ты будеш думать что у тебя ещё много трафика в запасе.
Хорошо бы это поправить.
А ещё там где лежит скрипт, случайно кончится место, потому что ты тудаже качал очередной фильм и не расчитал свободное место, питон застрелится, а ты будеш думать что у тебя ещё много трафика в запасе.
Хорошо бы это поправить.
ещё правка:
В данном случае не сильно важно, но логичнее не так:
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')
В данном случае не сильно важно, но логичнее не так:
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')
interface - передается функции check, то есть становится device.
P.S. А еще скажи, что pepyaka - логичнее не так.
P.S. А еще скажи, что pepyaka - логичнее не так.
Во первых: написал же, в данном случае не важно. Во вторых: вдруг при модификации захочется контролировать два интерфейса и появиться device2? Функция-то независимо от переданного параметра вернёт данные по device :-) До кучи: если писать в функции device, нафига ей тогда параметр? :-)
этого вообще не понял :-)
P.S. А еще скажи, что pepyaka - логичнее не так.
- Вотэтого вообще не понял :-)
а что означает эта строчка?
open('/sys/class/net/' + device + '/statistics/rx_bytes')
open('/sys/class/net/' + device + '/statistics/rx_bytes')
т.е. как эту строчку переделать под Win32 ?
при условии что используется ethernet.
при условии что используется ethernet.
так и есть, но надо! просто надо.
как это скриптец переделать под win32 ?
как это скриптец переделать под win32 ?
Это, как я понимаю, отредактированный для публики вариант и примером является лимит в 5 мегабайт, а не твой лимит в 500мб?