module Text.IPv6Addr.Manip
(
module Text.IPv6Addr.Internal
, sixteenBitsArbToken
, partialRandAddr
, macAddrToIPv6AddrTokens
, getTokIPv6AddrOf
, getTokMacAddrOf
) where
import Control.Monad (replicateM)
import Data.Char (intToDigit,isHexDigit)
import Data.List (intersperse)
import Data.Maybe (catMaybes,fromJust)
import qualified Data.Text as T
import System.Random (randomRIO)
import Network.Info
import Text.IPv6Addr.Internal
import Text.IPv6Addr.Types
sixteenBitsArbToken :: String -> IO (Maybe IPv6AddrToken)
sixteenBitsArbToken m =
mapM getHex m >>= \cs -> return $ sixteenBits $ T.pack cs
where getHex c =
case c of
'_' -> hexRand
otherwise -> return c
where hexRand = randomRIO(0,15) >>= \r -> return $ intToDigit r
partialRandAddr :: Int -> IO [IPv6AddrToken]
partialRandAddr n =
if n < 9 then do l <- replicateM n $ sixteenBitsArbToken "____"
return $ intersperse Colon $ catMaybes l
else return []
macAddrToIPv6AddrTokens :: T.Text -> [IPv6AddrToken]
macAddrToIPv6AddrTokens mac =
if T.length mac == 17
then do
let p = snd $ trans (T.split (==':') mac,[])
if length p == 3
then intersperse Colon $ map (fromJust . maybeIPv6AddrToken) p
else []
else []
where
trans ([],l) = ([],l)
trans (l1,l2) = do
let s = splitAt 2 l1
trans (snd s,l2 ++ [T.concat $ fst s])
networkInterfacesMacAddrList :: IO [(String,MAC)]
networkInterfacesMacAddrList =
getNetworkInterfaces >>= \n -> return $ map networkInterfacesMac n
where networkInterfacesMac (NetworkInterface n _ _ m) = (n,m)
getTokIPv6AddrOf :: String -> IO (Maybe [IPv6AddrToken])
getTokIPv6AddrOf s = do
l <- networkInterfacesIPv6AddrList
case lookup s l of
Just a -> return $ maybeTokIPv6Addr $ T.pack $ show a
Nothing -> return Nothing
getTokMacAddrOf :: String -> IO (Maybe [IPv6AddrToken])
getTokMacAddrOf s = do
l <- networkInterfacesMacAddrList
case lookup s l of
Just a -> return $ Just $ macAddrToIPv6AddrTokens $ T.pack $ show a
Nothing -> return Nothing