some work on the network manager

This commit is contained in:
Rene Kievits
2022-12-14 00:04:45 +01:00
parent 44836685ec
commit 4f3fb75687
10 changed files with 258 additions and 451 deletions

View File

@@ -19,7 +19,7 @@ return function(s)
elseif widget == "Clock" then
table.insert(widget_table, require("src.widgets.clock")())
elseif widget == "Cpu Frequency" then
table.insert(widget_table, require("src.widgets.cpu_info")("freq", User_config.cpu_frequency))
table.insert(widget_table, require("src.widgets.cpu_info")("freq"))
elseif widget == "Cpu Temperature" then
table.insert(widget_table, require("src.widgets.cpu_info")("temp"))
elseif widget == "Cpu Usage" then
@@ -35,7 +35,7 @@ return function(s)
elseif widget == "Tiling Layout" then
table.insert(widget_table, require("src.widgets.layout_list")())
elseif widget == "Network" then
table.insert(widget_table, require("src.widgets.network")())
table.insert(widget_table, require("src.widgets.network") { screen = s })
elseif widget == "Power Button" then
table.insert(widget_table, require("src.widgets.power")())
elseif widget == "Ram Usage" then

View File

@@ -55,7 +55,6 @@ return function(s, w)
bg = Theme_config.right_bar.bg,
visible = true,
screen = s,
maximum_width = dpi(650),
placement = function(c) awful.placement.top_right(c, { margins = dpi(10) }) end
}

View File

@@ -19,7 +19,7 @@ awful.screen.connect_for_each_screen(function(s)
require("src.modules.notification-center.init")(s)
require("src.modules.window_switcher.init")(s)
require("src.modules.application_launcher.init") { screen = s }
require("src.modules.network_controller.init") { screen = s }
--require("src.modules.network_controller.init") { screen = s }
end)
do

View File

@@ -102,7 +102,7 @@ function access_point:create_profile(ap, password, auto_connect)
}
end
function access_point:disconnect_ap()
function access_point:disconnect()
self.NetworkManager:DeactivateConnection(self.NetworkManagerDevice.ActiveConnection)
end
@@ -137,16 +137,16 @@ function access_point:connect(ap, password, auto_connect)
end
end
function access_point:toggle_access_point(ap, password, auto_connect)
function access_point:toggle_connection(ap, password, auto_connect)
if self:is_ap_active(ap) then
self:disconnect_ap()
self:disconnect()
else
self:connect_ap(ap, password, auto_connect)
self:connect(ap, password, auto_connect)
end
end
function access_point:is_ap_active(ap)
return ap.path == self.NetworkManagerDeviceWireless.ActiveAccessPoint
return ap.object_path == self.NetworkManagerDeviceWireless.ActiveAccessPoint
end
function access_point.new(args)
@@ -154,14 +154,6 @@ function access_point.new(args)
if not args.NetworkManagerAccessPoint then return end
local bg, fg, icon_color = Theme_config.network_manager.access_point.bg, Theme_config.network_manager.access_point.fg,
Theme_config.network_manager.access_point.icon_color
--[[ if get_active_access_point() == args.NetworkManagerAccessPoint.access_point_path then
bg, fg, icon_color = Theme_config.network_manager.access_point.fg, Theme_config.network_manager.access_point.bg,
Theme_config.network_manager.access_point.icon_color2
end ]]
local ssid_text = awidget.inputbox {
text = NM.utils_ssid_to_utf8(args.NetworkManagerAccessPoint.Ssid) or
args.NetworkManagerAccessPoint.hw_address or "Unknown",
@@ -177,7 +169,7 @@ function access_point.new(args)
{
image = gcolor.recolor_image(
icondir .. "wifi-strength-" .. math.floor(args.NetworkManagerAccessPoint.Strength / 25) + 1 .. ".svg",
icon_color),
Theme_config.network_manager.access_point.icon_color),
id = "icon",
resize = true,
valign = "center",
@@ -245,8 +237,8 @@ function access_point.new(args)
margins = dpi(5),
widget = wibox.container.margin
},
bg = bg,
fg = fg,
bg = Theme_config.network_manager.access_point.bg,
fg = Theme_config.network_manager.access_point.fg,
border_color = Theme_config.network_manager.access_point.border_color,
border_width = Theme_config.network_manager.access_point.border_width,
id = "background",
@@ -262,6 +254,47 @@ function access_point.new(args)
ret.NetworkManagerDevice = args.NetworkManagerDevice
ret.NetworkManager = args.NetworkManager
ret.NetworkManagerAccessPointProperties = dbus_proxy.Proxy:new {
bus = dbus_proxy.Bus.SYSTEM,
name = "org.freedesktop.NetworkManager",
interface = "org.freedesktop.DBus.Properties",
path = ret.NetworkManagerAccessPoint.object_path,
}
-- Update the access point strength
ret.NetworkManagerAccessPointProperties:connect_signal(function(_, properties, data)
if data.Strength then
awesome.emit_signal("NM::AccessPointStrength", data.Strength)
if ret.is_ap_active(ret.NetworkManagerAccessPoint.object_path) then
ret:get_children_by_id("icon")[1].image = gcolor.recolor_image(
icondir .. "wifi-strength-" .. math.floor(data.Strength / 25) + 1 .. ".svg",
Theme_config.network_manager.access_point.icon_color2)
else
ret:get_children_by_id("icon")[1].image = gcolor.recolor_image(
icondir .. "wifi-strength-" .. math.floor(data.Strength / 25) + 1 .. ".svg",
Theme_config.network_manager.access_point.icon_color)
end
end
end, "PropertiesChanged")
if ret:is_ap_active(ret.NetworkManagerAccessPoint) then
ret.bg = Theme_config.network_manager.access_point.fg
ret.fg = Theme_config.network_manager.access_point.bg
ret:get_children_by_id("icon")[1].image = gcolor.recolor_image(
icondir .. "wifi-strength-" .. math.floor(ret.NetworkManagerAccessPoint.Strength / 25) + 1 .. ".svg",
Theme_config.network_manager.access_point.icon_color2)
ret:get_children_by_id("con")[1].image = gcolor.recolor_image(
icondir .. "link.svg", Theme_config.network_manager.access_point.icon_color2)
else
ret.bg = Theme_config.network_manager.access_point.bg
ret.fg = Theme_config.network_manager.access_point.fg
ret:get_children_by_id("icon")[1].image = gcolor.recolor_image(
icondir .. "wifi-strength-" .. math.floor(ret.NetworkManagerAccessPoint.Strength / 25) + 1 .. ".svg",
Theme_config.network_manager.access_point.icon_color)
ret:get_children_by_id("con")[1].image = gcolor.recolor_image(
icondir .. "link.svg", Theme_config.network_manager.access_point.icon_color)
end
ret.ap_form = ap_form {
screen = args.screen,
NetworkManagerAccessPoint = args.NetworkManagerAccessPoint,
@@ -305,27 +338,9 @@ function access_point.new(args)
icondir .. "link.svg",
Theme_config.network_manager.access_point.icon_color),
callback = function()
ret:toggle_access_point()
ret:toggle_connection(ret.NetworkManagerAccessPoint)
end,
id = "connected"
},
{ -- Rename a device
name = "Rename",
icon = gcolor.recolor_image(icondir .. "edit.svg", Theme_config.network_manager.icon_color),
callback = function()
ssid_text:focus()
ssid_text:connect_signal("submit", function(text)
text = text:get_text()
ssid_text.markup = ret:rename(text)
end)
end
},
{ -- Remove a device
name = "Remove",
icon = gcolor.recolor_image(icondir .. "delete.svg", Theme_config.network_manager.icon_color),
callback = function()
end
}
}
}
@@ -333,8 +348,11 @@ function access_point.new(args)
ret:buttons(gtable.join(
abutton({}, 1, nil,
function()
--TODO:Check if there are any connection details, else open the popup
ret.ap_form:popup_toggle()
if ret:is_ap_active(ret.NetworkManagerAccessPoint) then
ret:disconnect()
else
ret.ap_form:popup_toggle()
end
end
),
abutton({}, 3, nil,
@@ -344,9 +362,6 @@ function access_point.new(args)
)
))
ret:get_children_by_id("con")[1].image = gcolor.recolor_image(
icondir .. "link.svg", icon_color)
Hover_signal(ret)
return ret

View File

@@ -3,25 +3,28 @@
------------------------------------
-- Awesome Libs
local awful = require("awful")
local abutton = require("awful.button")
local base = require("wibox.widget.base")
local dbus_proxy = require("src.lib.lua-dbus_proxy.src.dbus_proxy")
local dpi = require("beautiful").xresources.apply_dpi
local gtable = require("gears").table
local gtimer = require("gears").timer
local gshape = require("gears").shape
local gcolor = require("gears").color
local gears = require("gears")
local gcolor = require("gears.color")
local gfilesystem = require("gears.filesystem")
local gshape = require("gears.shape")
local gtable = require("gears.table")
local gtimer = require("gears.timer")
local lgi = require("lgi")
local NM = lgi.NM
local naughty = require("naughty")
local wibox = require("wibox")
local NM = require("lgi").NM
local base = require("wibox.widget.base")
-- Third party libs
local rubato = require("src.lib.rubato")
-- Local libs
local access_point = require("src.modules.network_controller.access_point")
local dnd_widget = require("awful.widget.toggle_widget")
local icondir = gears.filesystem.get_configuration_dir() .. "src/assets/icons/network/"
local icondir = gfilesystem.get_configuration_dir() .. "src/assets/icons/network/"
local network = { mt = {} }
@@ -57,10 +60,17 @@ network.DeviceState = {
FAILED = 120
}
function network:get_wifi_proxy()
---Get the wifi and or ethernet proxy and connect to their PropertiesChanged signal
-- The signals will return the following
-- wifi: { "Bitrate", "Strength" }
-- ethernet: { "Carrier", "Speed" }
function network:get_active_device()
--Get all devices
local devices = self._private.NetworkManager:GetDevices()
if (not devices) or (#devices == 0) then return end
-- Loop trough every found device
for _, path in ipairs(devices) do
--Create a new proxy for every device
local NetworkManagerDevice = dbus_proxy.Proxy:new {
bus = dbus_proxy.Bus.SYSTEM,
name = "org.freedesktop.NetworkManager",
@@ -68,67 +78,108 @@ function network:get_wifi_proxy()
path = path
}
if NetworkManagerDevice.DeviceType == network.DeviceType.WIFI then
--Check if the device is either a wifi or ethernet device, and if its activated
-- if its activated then its currently in use
if (NetworkManagerDevice.DeviceType == network.DeviceType.WIFI) and
(NetworkManagerDevice.State == network.DeviceState.ACTIVATED) then
-- Set the wifi device as the main device
self._private.NetworkManagerDevice = NetworkManagerDevice
--New wifi proxy to check the bitrate
self._private.NetworkManagerDeviceWireless = dbus_proxy.Proxy:new {
bus = dbus_proxy.Bus.SYSTEM,
name = "org.freedesktop.NetworkManager",
interface = "org.freedesktop.NetworkManager.Device.Wireless",
path = path
}
-- Watch PropertiesChanged and update the bitrate
local NetworkManagerDeviceWirelessProperties = dbus_proxy.Proxy:new {
bus = dbus_proxy.Bus.SYSTEM,
name = "org.freedesktop.NetworkManager",
interface = "org.freedesktop.DBus.Properties",
path = self._private.NetworkManagerDeviceWireless.object_path
}
self._private.NetworkManagerDevice:connect_signal(function(proxy, new_state, old_state, reason)
NetworkManagerDeviceWirelessProperties:connect_signal(function(_, properties, data)
if data.Bitrate then
self:emit_signal("NM::Bitrate", data.Bitrate)
end
end, "PropertiesChanged")
-- Watch the StateChanged signal, update and notify when a new AP is connected
self._private.NetworkManagerDevice:connect_signal(function(proxy, new_state)
local NetworkManagerAccessPoint = dbus_proxy.Proxy:new {
bus = dbus_proxy.Bus.SYSTEM,
name = "org.freedesktop.NetworkManager",
interface = "org.freedesktop.NetworkManager.AccessPoint",
path = self._private.wifi_proxy.ActiveAccessPoint
path = self._private.NetworkManagerDeviceWireless.ActiveAccessPoint
}
self:emit_signal(tostring(NetworkManagerAccessPoint.HwAddress) .. "::state", new_state, old_state)
if new_state == network.DeviceState.ACTIVATED then
local ssid = NM.utils_ssid_to_utf8(NetworkManagerAccessPoint.Ssid)
self:emit_signal("NM::AccessPointConnected", ssid, NetworkManagerAccessPoint.Strength)
print("AP Connected: ", ssid, NetworkManagerAccessPoint.Strength)
end
end, "StateChanged")
elseif (NetworkManagerDevice.DeviceType == network.DeviceType.ETHERNET) and
(NetworkManagerDevice.State == network.DeviceState.ACTIVATED) then
-- Create a new ethernet device and set it as the active device
self._private.NetworkManagerDevice = NetworkManagerDevice
self._private.NetworkManagerDeviceWired = dbus_proxy.Proxy:new {
bus = dbus_proxy.Bus.SYSTEM,
name = "org.freedesktop.NetworkManager",
interface = "org.freedesktop.NetworkManager.Device.Wired",
path = path
}
local NetworkManagerDeviceWiredProperties = dbus_proxy.Proxy:new {
bus = dbus_proxy.Bus.SYSTEM,
name = "org.freedesktop.NetworkManager",
interface = "org.freedesktop.DBus.Properties",
path = self._private.NetworkManagerDeviceWired.object_path
}
-- Watch the PropertiesChanged signal and update the speed and carrier
NetworkManagerDeviceWiredProperties:connect_signal(function(_, properties, data)
if data.Speed then
print(data.Speed)
self:emit_signal("NM::Speed", data.Speed)
elseif data.Carrier then
print(data.Carrier)
self:emit_signal("NM::Carrier", data.Carrier)
end
end, "PropertiesChanged")
-- Connect to the StateChanged signal and notify when the wired connection is ready
self._private.NetworkManagerDevice:connect_signal(function(proxy, new_state)
if new_state == network.DeviceState.ACTIVATED then
self:emit_signal("NM::EthernetActive")
print("Ethernet active")
end
end, "StateChanged")
end
end
end
function network.device_state_to_string(state)
local device_state_to_string = {
[0] = "Unknown",
[10] = "Unmanaged",
[20] = "Unavailable",
[30] = "Disconnected",
[40] = "Prepare",
[50] = "Config",
[60] = "Need Auth",
[70] = "IP Config",
[80] = "IP Check",
[90] = "Secondaries",
[100] = "Activated",
[110] = "Deactivated",
[120] = "Failed"
}
return device_state_to_string[state]
end
---Scan for access points and create a widget for each one.
function network:scan_access_points()
if not self._private.NetworkManagerDeviceWireless then return end
local ap_list = self:get_children_by_id("wifi_ap_list")[1]
ap_list:reset()
self._private.NetworkManagerDeviceWireless:RequestScanAsync(function(proxy, context, success, failure)
local ap_table = {}
self._private.NetworkManagerDeviceWireless:RequestScanAsync(function(_, _, _, failure)
if failure then
naughty.notification {
app_icon = icondir .. "ethernet.svg",
app_name = "Network Manager",
title = "Error: Scan failed!",
message = "Failed to scan for access points.\n" .. failure,
icon = gcolor.recolor_image(icondir .. "ethernet.svg", Theme_config.network.icon_color),
timeout = 5,
}
return
end
-- Get every access point even those who hide their ssid
for _, ap in ipairs(self._private.NetworkManagerDeviceWireless:GetAllAccessPoints()) do
-- Create a new proxy for every ap
local NetworkManagerAccessPoint = dbus_proxy.Proxy:new {
bus = dbus_proxy.Bus.SYSTEM,
@@ -138,34 +189,42 @@ function network:scan_access_points()
}
-- We are only interested in those with a ssid
if NetworkManagerAccessPoint.Ssid then
ap_list:add(access_point {
NetworkManagerAccessPoint = NetworkManagerAccessPoint,
NetworkManagerDevice = self._private.NetworkManagerDevice,
NetworkManagerSettings = self._private.NetworkManagerSettings,
NetworkManager = self._private.NetworkManager,
NetworkManagerDeviceWireless = self._private.NetworkManagerDeviceWireless
})
if NM.utils_ssid_to_utf8(NetworkManagerAccessPoint.Ssid) and NetworkManagerAccessPoint.Strength then
if (ap_table[NetworkManagerAccessPoint.Ssid] == nil) or
NetworkManagerAccessPoint.Strength > ap_table[NetworkManagerAccessPoint.Ssid].Strength then
ap_table[NetworkManagerAccessPoint.Ssid] = NetworkManagerAccessPoint
end
end
end
table.sort(ap_list, function(a, b)
return a.NetworkManagerAccessPoint.Strength > b.NetworkManagerAccessPoint.Strength
--sort ap_table first by strength
local sorted_ap_table = {}
for _, NetworkManagerAccessPoint in pairs(ap_table) do
table.insert(sorted_ap_table, NetworkManagerAccessPoint)
end
--sort the table by strength but have the active_ap at the top
table.sort(sorted_ap_table, function(a, b)
if a.object_path == self._private.NetworkManagerDeviceWireless.ActiveAccessPoint then
return true
else
return a.Strength > b.Strength
end
end)
for _, NetworkManagerAccessPoint in ipairs(sorted_ap_table) do
ap_list:add(access_point {
NetworkManagerAccessPoint = NetworkManagerAccessPoint,
NetworkManagerDevice = self._private.NetworkManagerDevice,
NetworkManagerSettings = self._private.NetworkManagerSettings,
NetworkManager = self._private.NetworkManager,
NetworkManagerDeviceWireless = self._private.NetworkManagerDeviceWireless
})
end
end, { call_id = "my-id" }, {})
end
function network:is_ap_active(ap)
return ap.path == self._private.NetworkManagerDeviceWireless.ActiveAccessPoint
end
---Toggles networking on or off
function network:toggle_wifi()
local enable = not self._private.NetworkManager.WirelessEnabled
if enable then
self._private.NetworkManager.Enable(true)
end
self._private.NetworkManager:Set("org.freedesktop.NetworkManager", "WirelessEnabled", lgi.GLib.Variant("b", enable))
self._private.NetworkManager.WirelessEnabled = { signature = "b", value = enable }
end
@@ -336,11 +395,16 @@ function network.new(args)
}
ret._private.NetworkManagerProperties:connect_signal(function(_, properties, data)
if data.WirelessEnables ~= nil and ret._private.WirelessEnabled ~= data.WirelessEnabled then
if data.WirelessEnabled ~= nil and ret._private.WirelessEnabled ~= data.WirelessEnabled then
ret._private.WirelessEnabled = data.WirelessEnabled
if ret._private.WirelessEnabled then
dnd:set_enabled()
else
dnd:set_disabled()
end
ret:emit_signal("NetworkManager::status", ret._private.WirelessEnabled)
print(ret._private.WirelessEnabled)
if data.WirelessEnabled then
gtimer {
@@ -356,21 +420,15 @@ function network.new(args)
end
end, "PropertiesChanged")
ret:get_wifi_proxy()
ret:get_active_device()
ret:scan_access_points()
--[[ gtimer.delayed_call(function()
local active_access_point = ret._private.NetworkManagerDeviceWireless.ActiveAccessPoint
if ret._private.NetworkManager.State == network.DeviceState.ACTIVATED and active_access_point ~= "/" then
local active_access_point_proxy = dbus_proxy.Proxy:new {
bus = dbus_proxy.Bus.SYSTEM,
name = "org.freedesktop.NetworkManager",
interface = "org.freedesktop.NetworkManager.AccessPoint",
path = active_access_point,
}
end
end) ]]
if ret._private.NetworkManager.WirelessEnabled then
dnd:set_enabled()
else
dnd:set_disabled()
end
--#endregion
@@ -389,7 +447,7 @@ function network.new(args)
}
wifi_margin:buttons(gtable.join(
awful.button({}, 1, nil,
abutton({}, 1, nil,
function()
if wifi_list.forced_height == 0 then
if not ret:get_children_by_id("wifi_ap_list")[1].children then
@@ -420,7 +478,7 @@ function network.new(args)
local refresh_button = ret:get_children_by_id("refresh")[1]
refresh_button:buttons(gtable.join(
awful.button({}, 1, nil,
abutton({}, 1, nil,
function()
ret:scan_access_points()
end