Поскольку у меня лимитный интернет (предоплачено 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
|
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. Мой первый пост, кстати.
-
mb = 5 #allowed megabytes
Это, как я понимаю, отредактированный для публики вариант и примером является лимит в 5 мегабайт, а не твой лимит в 500мб?
-
-
Ты не выключаешь комп, когда идешь спать?
За первые 3 дня я потратил 160мб. 500-160=340 - осталось. 10 мб за сутки. 5 ночью, 5 днем т.к. Скайлинк разделяет траф на ночной и дневной, очень удобно.
-
-
Я не выключаю - т.к. это еще и хоум-сервер :)
-
С появлением анлима выключать перестал. Когда сидел на гпрс - выключал.
-
угу, похоже на то. вообще надобность такого скрипта сомнительна. разве что на день себе трафик лимитировать.
-
-
Если трафик стоит >3р за метр, то скрипт становится очень полезным.
-
>на день себе трафик лимитировать.
Для этого он и предназначен!
-
Не #via anus, а #per rectum =)
А в остальном - занимательно.
-
мне кажется, простора для упрощения тут полно. Зачем файлы создавать? Да и правильно, как я понимаю, использовать не ppp0, а дефолтный route
-
-
Файл создается для того, что если слегка модифицировать скрипт...
Если связь пропадет, скрипт завершится. Когда начнется опять, и скрипт будет считать с места разрыва :)
-
-
Ошибся, не слегка. Там не очень понятно, как определить разрыв...
-
а может проще будет воспользоваться содержимым файликов
1
2
3
4
|
% cat /sys/class/net/wifi0/statistics/[t,r]x_bytes
542932797
25180003
|
чем парсить вывод ифконфига? :)
-
-
+1. Или можно удосужиться регулярки подучить:
1
2
3
4
5
6
7
8
|
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. чую щас понасоветуют, будешь юзать высокоскоростной оптимизированный безлимитный тырнет из-за скрипта, переделанного в однострочный.. ;)
-
-
Вижу чувак написал первый пост. Где-то к половине скрипта было ощущение, что в комментах будет полно поправок. Так и вышло. ;)
-
Спасибо :)
Однострочный - это на перле который, запускает патч Бармина?
-
-
Ну, не исключено, тот вообще от проблем избавит =)
А вообще я просто писал про аццкую оптимизацию... Товарищи есть, которые мне скрипт из 50 строчек в 1 длинную переделывали на перле. Правда не очень то он и деструктивным получался, выполнял тока штатные функции
-
-
Да в интернетах мануалы есть по такой оптимизации, любой перл-скрипт переделать можно.
-
а весь процессор не жрет? А то time.sleep(1) не заметил в бесконечном цикле.
-
-
У меня на Celeron 900 вообще не заметно.
-
Создал блог Python и перенёс туда
-
Интересная штука. Когда сидел на GPRS, было бы актуально(правда, я бы предпочёл использовать для этого bash или perl, но это уже вопросы религии :)).
Правда, я для себя проблемы с лимитированием и экономией траффика решил тогда несколько иначе. Так сказать, админским способом - поднял кеширующий 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
-
-
самое зачотное решение
-
Слишком жестоко. Не предупреждает юзера. Да и правильнее отключать 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')
-
-
interface - передается функции check, то есть становится device.
P.S. А еще скажи, что pepyaka - логичнее не так.
-
-
Во первых: написал же, в данном случае не важно. Во вторых: вдруг при модификации захочется контролировать два интерфейса и появиться device2? Функция-то независимо от переданного параметра вернёт данные по device :-) До кучи: если писать в функции device, нафига ей тогда параметр? :-)
P.S. А еще скажи, что pepyaka - логичнее не так.
- Вот
этого вообще не понял :-)
|
|
|
Последние посты
|
|
Последние комментарии
|
|
Изменения
|
|
Top блогов (все)
|
|
Top пользователей (все)
|
|
|