{-# LANGUAGE NamedFieldPuns #-}
module Lib
( Connection(..)
, toggleConnection
, listConnections
)
where
import System.Process
import Data.List.Split
import Data.List
import Data.Ord
data Connection = Connection { _uuid :: String, _cType :: String, _name:: String, _timestamp:: Int, _active:: Bool } deriving (Show, Eq)
listConnections :: IO [Connection]
listConnections = toConnections <$> execReadConnections
where
execReadConnections = readProcess
"nmcli"
[ "--terse"
, "--colors=no"
, "--escape=yes"
, "--fields=uuid,type,name,timestamp,active"
, "connection"
, "show"
]
[]
toConnections :: String -> [Connection]
toConnections xs = sortOn (Down . _timestamp) $ toConnection <$> lines xs
toConnection :: String -> Connection
toConnection x = Connection uuid cType name (read ts) (isActive active)
where
[uuid, cType, name, ts, active] = splitOn ":" x
isActive "yes" = True
isActive _ = False
toggleConnection :: Connection -> IO String
toggleConnection Connection { _uuid, _active } =
readProcess "nmcli" ["connection", if _active then "down" else "up", _uuid] []