137 lines
4.2 KiB
Lua
137 lines
4.2 KiB
Lua
local gobject = require('gears.object')
|
|
local gtable = require('gears.table')
|
|
local lgi = require('lgi')
|
|
local NM = require('lgi').NM
|
|
|
|
local dbus_proxy = require('src.lib.lua-dbus_proxy.src.dbus_proxy')
|
|
|
|
local settings = gobject {}
|
|
|
|
---Get a connection path by uuid
|
|
---@param uuid string
|
|
---@return string connection_path
|
|
function settings:GetConnectionByUUID(uuid)
|
|
return self.NetworkManagerSettings:GetConnectionByUuid(uuid) or ''
|
|
end
|
|
|
|
function settings:GetConnectionForSSID(ssid)
|
|
for _, con in pairs(self.ConnectionList) do
|
|
if con:GetSettings().connection.id == ssid then
|
|
return con
|
|
end
|
|
end
|
|
end
|
|
|
|
--! For some reason not working, using AddAndActivateConnection instead works and adds the connection just fine
|
|
---Tries to add a new connection to the connections and returns the path if successfull
|
|
---@param con table connection
|
|
---@return string?
|
|
function settings:AddConnection(con)
|
|
--[[ local c = dbus_proxy.Proxy:new {
|
|
bus = dbus_proxy.Bus.SYSTEM,
|
|
name = 'org.freedesktop.NetworkManager',
|
|
interface = 'org.freedesktop.NetworkManager.Settings.Connection',
|
|
path = '/org/freedesktop/NetworkManager/Settings/',
|
|
} ]]
|
|
|
|
--[[ c:Update(con)
|
|
print('No Problem')
|
|
print(c:GetSettings().connection.id) ]]
|
|
--local path = self.NetworkManagerSettings:AddConnection(con)
|
|
--print(path)
|
|
--return path
|
|
end
|
|
|
|
function settings:RemoveConnection(con)
|
|
if not con then return end
|
|
|
|
con:Delete()
|
|
end
|
|
|
|
---Returns a new and valid connection table
|
|
---@param args {passwd: string, security: string, autoconnect: boolean, ssid: string}
|
|
---@return table
|
|
function settings:NewConnectionProfile(args)
|
|
local security = {}
|
|
|
|
if args.security:match('WPA') then
|
|
security = {
|
|
['key-mgmt'] = lgi.GLib.Variant('s', 'wpa-psk'),
|
|
['auth-alg'] = lgi.GLib.Variant('s', 'open'),
|
|
['psk'] = lgi.GLib.Variant('s', args.passwd),
|
|
}
|
|
else
|
|
security = {
|
|
['key-mgmt'] = lgi.GLib.Variant('s', 'wpa-psk'),
|
|
['wep-key-type'] = lgi.GLib.Variant('s', NM.WepKeyType.PASSPHRASE),
|
|
['wep-key0'] = lgi.GLib.Variant('s', args.passwd),
|
|
}
|
|
end
|
|
|
|
return {
|
|
['connection'] = {
|
|
['uuid'] = lgi.GLib.Variant('s', string.gsub('xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx', '[xy]', function(c)
|
|
local v = (c == 'x') and math.random(0, 0xf) or math.random(8, 0xb)
|
|
return string.format('%x', v)
|
|
end)),
|
|
['id'] = lgi.GLib.Variant('s', args.ssid),
|
|
['type'] = lgi.GLib.Variant('s', '802-11-wireless'),
|
|
['autoconnect'] = lgi.GLib.Variant('b', args.autoconnect),
|
|
},
|
|
['ipv4'] = {
|
|
['method'] = lgi.GLib.Variant('s', 'auto'),
|
|
},
|
|
['ipv6'] = {
|
|
['method'] = lgi.GLib.Variant('s', 'auto'),
|
|
},
|
|
['802-11-wireless'] = {
|
|
['mode'] = lgi.GLib.Variant('s', 'infrastructure'),
|
|
},
|
|
['802-11-wireless-security'] = security,
|
|
}
|
|
end
|
|
|
|
local instance = nil
|
|
if not instance then
|
|
instance = setmetatable(settings, {
|
|
__call = function(self)
|
|
self.NetworkManagerSettings = dbus_proxy.Proxy:new {
|
|
bus = dbus_proxy.Bus.SYSTEM,
|
|
name = 'org.freedesktop.NetworkManager',
|
|
interface = 'org.freedesktop.NetworkManager.Settings',
|
|
path = '/org/freedesktop/NetworkManager/Settings',
|
|
}
|
|
|
|
self.ConnectionList = {}
|
|
for _, value in pairs(self.NetworkManagerSettings:ListConnections()) do
|
|
local c = dbus_proxy.Proxy:new {
|
|
bus = dbus_proxy.Bus.SYSTEM,
|
|
name = 'org.freedesktop.NetworkManager',
|
|
interface = 'org.freedesktop.NetworkManager.Settings.Connection',
|
|
path = value,
|
|
}
|
|
if c then self.ConnectionList[value] = c end
|
|
end
|
|
|
|
self.NetworkManagerSettings:connect_signal(function(_, con)
|
|
print('New!', con)
|
|
local c = dbus_proxy.Proxy:new {
|
|
bus = dbus_proxy.Bus.SYSTEM,
|
|
name = 'org.freedesktop.NetworkManager',
|
|
interface = 'org.freedesktop.NetworkManager.Settings.Connection',
|
|
path = con,
|
|
}
|
|
self.ConnectionList[con] = c
|
|
end, 'NewConnection')
|
|
|
|
self.NetworkManagerSettings:connect_signal(function(_, con)
|
|
print('Removed!', con)
|
|
self.ConnectionList[con] = nil
|
|
end, 'ConnectionRemoved')
|
|
|
|
return self
|
|
end,
|
|
})
|
|
end
|
|
return instance
|