awesome - netwidget

Разработка скриптов на lua. Создание виджетов, диалогов и т.д.
Аватара пользователя
olgmen
Сообщения: 155
Зарегистрирован: 30 ноя 2012, 11:00
Темы: 32
Откуда: Санкт-Петербург
Статус: Не в сети

awesome - netwidget

Сообщение olgmen » 17 ноя 2014, 07:30

Решил переделать дефолтный виджет - netwidget от visious. Выкинул 6 строк, отвечающих за определение работающей сети, и заменил её одной, затем добавил вывод иконок, ну и уровень сигнала wifi.

Вот что вводится в трей

Нет связи
Изображение

Ethernet
Изображение

WIFI
Изображение

usb-modem
Изображение

[spoiler]

Код: Выделить всё

netwidget = wibox.widget.textbox()
wifiwidget = wibox.widget.textbox()
net_icon = wibox.widget.imagebox()
vicious.cache(vicious.widgets.net)
eth_timer = timer({timeout=2})
eth_timer:connect_signal("timeout",
function()
	local spacer = " "
-- определяем какая сеть работает
	local eth = awful.util.pread("awk 'NR==2 {printf ($1)}' /proc/net/route")
-- определяем уровень сигнала wifi
	local wifi = awful.util.pread("awk 'NR==3 {printf \"%.1f%%\\n\",($3/70)*100}' /proc/net/wireless")
-- если связи нет, вводим сообщение
	if eth == "" then net_icon:set_image("/home/olgmen/.config/awesome/icons/no-icon.png")
		wifiwidget:set_text("НЕТ СВЯЗИ")
	else
-- если связь есть, вводим соответствующее сообщение
		if eth == "wls33" then
			wifiwidget:set_text(spacer .. wifi)
		else
			wifiwidget:set_text("")
		end
-- сеть ethernet - вписать свои данне
		if eth == "enp3s0" then net_icon:set_image(usrhome.."/.config/awesome/icons/network-ethernet-icon.png") end
-- сеть wifi - вписать свои данные
		if eth == "wls33" then net_icon:set_image(usrhome.."/.config/awesome/icons/wifi-on.png") end
-- usb-modem - вписать свои данные
		if eth == "ppp0" then eth = "wwp0s29f7u2i1"
			net_icon:set_image("/home/olgmen/.config/awesome/icons/network_wireless.png")
		end
		vicious.register(netwidget, vicious.widgets.net,
		'<span color="#CC9393">↓${'..eth..' down_kb}</span>' .. ' <span color="#7F9F7F">↑${'..eth..' up_kb}</span>', 1)
	end
end
)
[/spoiler]
Кто ищет, тот всегда найдет

Arch Linux
Conky - 1.9

Аватара пользователя
lumberjack
Модератор
Сообщения: 1009
Зарегистрирован: 30 сен 2012, 04:04
Темы: 152
Откуда: Сургут
Статус: Не в сети

Re: awesome - netwidget

Сообщение lumberjack » 17 ноя 2014, 19:27

olgmen, классно ))

Аватара пользователя
olgmen
Сообщения: 155
Зарегистрирован: 30 ноя 2012, 11:00
Темы: 32
Откуда: Санкт-Петербург
Статус: Не в сети

Re: awesome - netwidget

Сообщение olgmen » 18 ноя 2014, 11:21

Исправление и дополнение

Добавил вывод трафика за месяц для usb-modem. Теперь это выглядит так

Изображение

[spoiler]

Код: Выделить всё

-- ========================================== Network
local string = { find = string.find }
local math = {find = math.ceil }
vntable = {}
netwidget = wibox.widget.textbox()
wifiwidget = wibox.widget.textbox()
net_icon = wibox.widget.imagebox()
vicious.cache(vicious.widgets.net)
eth_timer = timer({timeout=2})
eth_timer:connect_signal("timeout",
function()
-- забираем данные о трафике usb-modem
	local vntable = {}
	local f = io.popen("vnstat -i ppp0 --dumpdb")
			for line in f:lines() do
				table.insert(vntable,line)
			end
	f:close()
	s,f,totalrx = string.find(vntable[7],"^.*;(.*)")
	s,f,totaltx = string.find(vntable[8],"^.*;(.*)")
	totalx = tonumber(totalrx) + tonumber(totaltx)

	local spacer = " "
-- определяем какая сеть работает
	local eth = awful.util.pread("awk 'NR==2 {printf ($1)}' /proc/net/route")
	local wifi = awful.util.pread("awk 'NR==3 {printf \"%.1f%%\\n\",($3/70)*100}' /proc/net/wireless")
--	local vnstat = awful.util.pread("awk 'NR==3 {printf ($1)' /var/lib/vnstat")
	if eth == "" then net_icon:set_image("/home/olgmen/.config/awesome/icons/no-icon.png")
		wifiwidget:set_text("НЕТ СВЯЗИ")
	else
		if eth == "wls33" then
			wifiwidget:set_text(spacer .. wifi)
		else
			wifiwidget:set_text("")
		end
		if eth == "enp3s0" then net_icon:set_image(usrhome.."/.config/awesome/icons/network-ethernet-icon.png") end
		if eth == "wls33" then net_icon:set_image(usrhome.."/.config/awesome/icons/wifi-on.png") end
		if eth == "ppp0" then
			net_icon:set_image("/home/olgmen/.config/awesome/icons/network_wireless.png")
			wifiwidget:set_text(spacer .. totalx .. " MiB")
		end
		vicious.register(netwidget, vicious.widgets.net,
		'<span color="#CC9393">↓${'..eth..' down_kb}</span>' .. ' <span color="#7F9F7F">↑${'..eth..' up_kb}</span>', 1)
	end
end
)
 eth_timer:start()
[/spoiler]

Для вывода данных о трафике необходимо установить vnstat
Кто ищет, тот всегда найдет

Arch Linux
Conky - 1.9

Аватара пользователя
olgmen
Сообщения: 155
Зарегистрирован: 30 ноя 2012, 11:00
Темы: 32
Откуда: Санкт-Петербург
Статус: Не в сети

Re: awesome - netwidget

Сообщение olgmen » 21 ноя 2014, 14:57

Решил доканать виджет, теперь данные о трафике и объём, для usb-modem, берем прямо из vnstat

Изображение

Переделанный виджет

[spoiler]

Код: Выделить всё

netwidget = wibox.widget.textbox()
wifiwidget = wibox.widget.textbox()
net_icon = wibox.widget.imagebox()
vicious.cache(vicious.widgets.net)
eth_timer = timer({timeout=2})
eth_timer:connect_signal("timeout",
function()

	local spacer = " "
-- определяем какая сеть работает
	local eth = awful.util.pread("awk 'NR==2 {printf ($1)}' /proc/net/route")
	local wifi = awful.util.pread("awk 'NR==3 {printf \"%.1f%%\\n\",($3/70)*100}' /proc/net/wireless")
	if eth ~= "" then
		if eth == "wls33" then
			wifiwidget:set_text(spacer .. wifi)
		else
			wifiwidget:set_text("")
		end
		if eth == "enp3s0" then net_icon:set_image(usrhome.."/.config/awesome/icons/network-ethernet-icon.png") end
		if eth == "wls33" then net_icon:set_image(usrhome.."/.config/awesome/icons/wifi-on.png") end
		if eth == "ppp0" then
			os.execute("vnstat -i ppp0 -m > /tmp/ppp")
			total_m = awful.util.pread("awk 'NR==6 {printf ($9)}' /tmp/ppp")
			total_b = awful.util.pread("awk 'NR==6 {printf ($10)}' /tmp/ppp")
			net_icon:set_image("/home/olgmen/.config/awesome/icons/network_wireless.png")
			wifiwidget:set_text(spacer .. total_m .. spacer .. total_b)
			os.execute("rm /tmp/ppp")

		end
		vicious.register(netwidget, vicious.widgets.net,
	'<span color="#CC9393">↓${'..eth..' down_kb}</span>' .. ' <span color="#7F9F7F">↑${'..eth..' up_kb}</span>', 1)
	else
		 net_icon:set_image("/home/olgmen/.config/awesome/icons/no-icon.png")
		wifiwidget:set_text("НЕТ СВЯЗИ")
	end
end
)
 eth_timer:start()
[/spoiler]
Кто ищет, тот всегда найдет

Arch Linux
Conky - 1.9

Faiver
Сообщения: 9
Зарегистрирован: 23 июн 2014, 07:08
Темы: 0
Статус: Не в сети

Re: awesome - netwidget

Сообщение Faiver » 01 дек 2014, 16:54

Отличное решение. И как раз в тему, недавно тоже задумывался над вопросом нового виджета сети.
P.S. Утащил себе. Спасибо!

Faiver
Сообщения: 9
Зарегистрирован: 23 июн 2014, 07:08
Темы: 0
Статус: Не в сети

Re: awesome - netwidget

Сообщение Faiver » 09 дек 2014, 14:38

Код сыроват. У меня при использовании этого кода, постепенно возрастает нагрузка на процессор (x-window-manager) начиная с 2-3% постепенно начинает съедать до 100%.
Ошибка в том, что каждые 3 секунды (время таймера) создается новый объект netwidget'а. Я решил следующим образом: в таймере проверяю изменился ли тип сети (через сравнение старого и нового значений), и если изменилась, то вызываю функцию update_netwidget()
function update_netwidget()
vicious.unregister(netwidget)
vicious.register...... -- регистрируем
last_eth=eth
end
Код тестировал на 3.4.15 (на десктопе есть 3.5, но туда пока еще проверить руки не дошли)

Также у меня не работает код awk 'NR==3 {printf \"%.1f%%\\n\",($3/70)*100}' /proc/net/wireless
Выводит ошибку:
awk: cmd. line:1: NR==3 {printf \"%.1f%%\\n\",($3/70)*100}
awk: cmd. line:1: ^ backslash not last character on line
awk: cmd. line:1: NR==3 {printf \"%.1f%%\\n\",($3/70)*100}
awk: cmd. line:1: ^ syntax error
Поэтому его пока выкинул.

Аватара пользователя
olgmen
Сообщения: 155
Зарегистрирован: 30 ноя 2012, 11:00
Темы: 32
Откуда: Санкт-Петербург
Статус: Не в сети

Re: awesome - netwidget

Сообщение olgmen » 09 дек 2014, 15:47

Может код и сыроват, всё таки я не профессионал, но у меня нагрузка на проц не растет. OS ARCH awesome v3.5.5
Кто ищет, тот всегда найдет

Arch Linux
Conky - 1.9

Faiver
Сообщения: 9
Зарегистрирован: 23 июн 2014, 07:08
Темы: 0
Статус: Не в сети

Re: awesome - netwidget

Сообщение Faiver » 09 дек 2014, 16:12

Возможно в новой библиотеке vicious эту проблему и решили, чуть позже гляну diff по разным версиям. А что скажете по awk?
Можете объяснить логику, попробую подогнать под себя. Система Debian Jessie

P.S. Есть идея по статистике сети, делал для себя, но там выводится naughty уведомление, но к сожалению, оно жестко привязано к заданным изначально значениям, пока не удалось решить вопрос динамичности :cry:
[spoiler]

Код: Выделить всё

--vnstat.lua

-- этот модуль добавляет статистику из vnstat для виджета netwidget из библиотеки vicious
--
local string=string
local tostring=tostring
local os=os
local capi = { mouse =mouse,
                           screen = screen
                   }

local awful = require("awful")
local vicious= require("vicious")
local naughty = require("naughty")

module ("vnstat")

local stat={}

function getData(eth_data)

        --получаем данные из vnstat
        local today = tostring (awful.util.pread ('vnstat -i '..eth_data..' | grep "today" | awk \'{print "\t",$2 substr($3,1,1),"\t", $5substr($6,1,1),"\t",$8substr($9,1,1)}\''))
        local yesterday = tostring (awful.util.pread ('vnstat -i '..eth_data..' | grep "yesterday" | awk \'{print "\t",$2 substr($3,1,1),"\t", $5substr($6,1,1),"\t",$8substr($9,1,1)}\''))
        local week = tostring (awful.util.pread('vnstat -w -i '..eth_data..' | grep "current week" | awk \'{print "\t",$3substr($4,1,1),"\t",$6substr($7,1,1),"\t",$9substr($10,1,1)}\' '))
        local month = tostring (awful.util.pread('vnstat -m -i '..eth_data..' | grep "`date -R | awk \'{print $3}\'` `date +"\'%y"`" | awk \'{print "\t",$3substr($4,1,1),"\t",$6substr($7,1,1),"\t",$9substr($10,1,1)}\' '))

        -- создаем переменную в которую будем помещать текст
        local lines = '<span font="DejaVu Sans Mono 10" weight="bold" color="#FFD700"> Статистика использования сети '..eth_data..'</span>\n\n'
        lines = lines.."                  Down         Up           Total\n"
    lines = lines.."Сегодня"..today 
        lines = lines.."Вчера"..yesterday
        lines = lines.."Неделя"..week
        lines = lines.."Месяц"..month

        return lines
end

function addStatToWidget(mywidget,eth_type)
        mywidget:add_signal('mouse::enter', function()
                stat={
                        naughty.notify({
                                text=getData(eth_type),
                                icon = "/home/faiver/.config/awesome/image/netstat.png",
                                timeout=0,
                                hover_timeout=0.5,
                                screen=capi.mouse.screen
                        })
                }
        end)

        mywidget:add_signal('mouse::leave', function() naughty.destroy(stat[1]) end)

end
[/spoiler]
В начале rc.lua
require("vnstat")
После создания netwidget в rc.lua прописал привязку к виджету
vnstat.addStatToWidget(netwidget,eth)

Аватара пользователя
olgmen
Сообщения: 155
Зарегистрирован: 30 ноя 2012, 11:00
Темы: 32
Откуда: Санкт-Петербург
Статус: Не в сети

Re: awesome - netwidget

Сообщение olgmen » 10 дек 2014, 16:12

Faiver! Посмотри мой скрипт для коньков http://dumpz.org/1272769/ может что нибудь пригодится, брал где то в сети и подгонял под себя
Кто ищет, тот всегда найдет

Arch Linux
Conky - 1.9

Faiver
Сообщения: 9
Зарегистрирован: 23 июн 2014, 07:08
Темы: 0
Статус: Не в сети

Re: awesome - netwidget

Сообщение Faiver » 18 дек 2014, 18:44

Сорри, я вставлял просто awk в терминал, при этом не учел, символы экранировки. Если запускать в awesome, то все нормально работает.
P.S. Доработал модуль для netwidget, теперь при наведении показывает статистику для текущей сети из vnstat

[spoiler]-- этот модуль добавляет статистику из vnstat для виджета netwidget из библиотеки vicious
--
local string=string
local tostring=tostring
local os=os
local capi = { mouse =mouse,
screen = screen
}

local awful = require("awful")
local vicious= require("vicious")
local naughty = require("naughty")

module ("vnstat")

local stat={}

function getData(eth_data)

--получаем данные из vnstat
local today = tostring (awful.util.pread ('vnstat -i '..eth_data..' | grep "today" | awk \'{print "\t",$2 substr($3,1,1),"\t", $5substr($6,1,1),"\t",$8substr($9,1,1)}\''))
local yesterday = tostring (awful.util.pread ('vnstat -i '..eth_data..' | grep "yesterday" | awk \'{print "\t",$2 substr($3,1,1),"\t", $5substr($6,1,1),"\t",$8substr($9,1,1)}\''))
local week = tostring (awful.util.pread('vnstat -w -i '..eth_data..' | grep "current week" | awk \'{print "\t",$3substr($4,1,1),"\t",$6substr($7,1,1),"\t",$9substr($10,1,1)}\' '))
local month = tostring (awful.util.pread('vnstat -m -i '..eth_data..' | grep "`date | awk \'{print $2}\'` `date +"\'%y"`" | awk \'{print "\t",$3substr($4,1,1),"\t",$6substr($7,1,1),"\t",$9substr($10,1,1)}\' '))

-- создаем переменную в которую будем помещать текст
local lines = '<span font="DejaVu Sans Mono 10" weight="bold" color="#FFD700"> Статистика использования сети '..eth_data..'</span>\n\n'
lines = lines.." Down Up Total\n"
lines = lines.."Сегодня"..today
lines = lines.."Вчера"..yesterday
lines = lines.."Неделя"..week
lines = lines.."Месяц"..month

return lines

end

function addStatToWidget(mywidget,my_eth_type)
mywidget:add_signal('mouse::enter', function()
local eth_type= awful.util.pread("awk 'NR==2 {printf ($1)}' /proc/net/route")
stat={
naughty.notify({
text=getData(eth_type),
icon = "/home/faiver/.config/awesome/image/netstat.png",
timeout=0,
hover_timeout=0.5,
screen=capi.mouse.screen
})
}
end)

mywidget:add_signal('mouse::leave', function() naughty.destroy(stat[1]) end)

end

function removeStatToWidget(mywidget)
mywidget:remove_signal('mouse::enter', function() stat={} end)
end[/spoiler]

Предлагаю довести до ума, и залить на awesome wiki

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей