Келег`s homepage

Обработанные мысли

Рубиновая плазма. Часть 2.

Постановка

Есть такая, очень полезная программка – vnstat. Она показывает сетевой трафик по выбранным интерфейсам. Для меня, у которого дневной лимит – 150 мб жизни, очень нужная вещь.

Устанавливаем, если ее еще у вас нет, набираем в консоли vnstat -u -i ppp0 для начальной инициализации (если будете смотреть интерфейс модема ppp0, если нужен другой, можно выбрать и другой, тот же eth0 для сетевой карты)

Теперь запускаем vnstat – получаем информацию о трафике.

Только вот одна незадача, информация есть в консоли, в текстовом виде. Каждый раз запускать консоль и набирать vnstat чтоб узнать, сколько интернета осталось?

Увольте! Самое время написать красивый плазмоид!

Что говорит vnstat?

Сначала разберемся с выводом vnstat

ppp0 since 11/05/09

rx: 3.37 GiB tx: 252.77 MiB total: 3.61 GiB

monthly

rx | tx | total | avg. rate

————————+————-+————-+—————

Nov ‘09 2.63 GiB | 197.18 MiB | 2.82 GiB | 9.12 kbit/s

Dec ‘09 756.73 MiB | 55.59 MiB | 812.32 MiB | 13.79 kbit/s

————————+————-+————-+—————

estimated 4.10 GiB | 305 MiB | 4.40 GiB |

daily

rx | tx | total | avg. rate

————————+————-+————-+—————

yesterday 124.79 MiB | 15.33 MiB | 140.12 MiB | 13.29 kbit/s

today 148.93 MiB | 6.63 MiB | 155.55 MiB | 25.21 kbit/s

————————+————-+————-+—————

estimated 253 MiB | 10 MiB | 263 MiB |

Столько много нам не нужно, нам бы сегодняшний интернет… его легко получить командой vnstat | grep today

Получим строчку “today 148.94 MiB | 6.63 MiB | 155.58 MiB | 24.97 kbit/s” которую уже легко отпарсить.

Создание нового плазмоида

Теперь можно заняться созданием плазмоида. Копируем из примера предыдущей статьи структуру папок вместе с файлами, переименовываем папку plasmatest в, например, wnetstat. Создаем новый проект geany, открываем файлы metadata.desktop и main.rb и также изменяем там название plasmatest на wnstat.

Человеко-читаемое название в metadata.desktop тоже лучше изменить на что-то более осмысленное, например

Name=Трафик Интернета

Comment=Интерфейс для vnstat

Проверяем все ли сделали правильно, запускаем проект.

Все хорошо?

Теперь можно и программировать.

Получение информации от внешней программы

Напишем на ruby метод для получения информации от vnstat

def updateStat

IO.popen(”vnstat -u”).close

pipe = IO.popen(”vnstat | grep today”)

stat = pipe.gets

pipe.close

if stat!=nil then

@stat=stat.split(’ ‘)

end

end

Теперь в переменной объекта @stat лежит распарсенная строка вывода нашего vnstat.

Осталось ее вывести на экран. Для этого напишем еще один мааленький метод, он будет говорить нам суммарный трафик за день.

def view

@stat[7]+”\n”+@stat[8]

end

Если теперь заменим наш тестовый “Hello world” на вызов этой функции, не забыв предварительно вызвать updateStat, получим при выполнении количество мегабайт!

Обновление по таймеру

Сейчас у нас всего два вызываемых системой метода, куда можно вклиниться – init и paintInterface

Соответственно, если вставить туда наш updateStat, информация о трафике будет обновляться или при старте системы, или при перерисовке виджета-плазмоида. И то, и другое – не самый лучший выход, было бы правильнее обновлять информацию по таймеру, например раз в 30 секунд. И это очень просто сделать!

Достаточно в методе init инициализировать таймер

startTimer(30000)

и написать новый метод, который будет вызываться при срабатывании таймера, обновлять информацию о статистике Интернета и перерисовывать наш плазмоид.

def timerEvent(event)

updateStat

update

end

Итог

В общем-то все. Полный текст программы будет таков

require ‘plasma_applet’

module Wnetstat

class Main < PlasmaScripting::Applet

def initialize parent

super parent

end

def init

self.has_configuration_interface = false

updateStat

startTimer(30000)

end

def updateStat

IO.popen(”vnstat -u”).close

pipe = IO.popen(”vnstat | grep today”)

stat = pipe.gets

pipe.close

if stat!=nil then

@stat=stat.split(’ ‘)

end

end

def view

@stat[7]+”\n”+@stat[8]

end

def timerEvent(event)

updateStat

update

end

def paintInterface(painter, option, rect)

painter.save

painter.pen = Qt::Color.new Qt::white

painter.draw_text rect, Qt::AlignVCenter | Qt::AlignHCenter,view

painter.restore

end

end

end

Запускаем, если все нормально – инсталлируем и кидаем в системный лоток. Теперь мегабайты от нас далеко не убегут! В следующей статье нам осталось разобраться с изменением вывода в зависимости от размера, настройкой виджета и выводом напоминаний о превышенном лимите. А пока – мягкой плазмы!


Теги: , , + Рубрика: Программирование

1 отзыв

Трекбеки и пинги

  1. Рубиновая плазма. Часть 1. | Келег`s homepage

    [...] Пока он почти совершенно бесполезен, разве что сигнализирует нам, что все работает и уже можно делать что-то посерьезнее. Но об этом – в следующей статье. [...]

Ваш отзыв