module Text.IPv6Addr.Manip
(
module Text.IPv6Addr.Internal
, sixteenBitsArbToken
, 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
import Text.IPv6Addr.Internal
import Text.IPv6Addr.Types
sixteenBitsArbToken :: String -> IO (Maybe IPv6AddrToken)
sixteenBitsArbToken m = do
cs <- mapM getHex m
return $ sixteenBits $ T.pack cs
where getHex c =
case c of
'_' -> hexRand
otherwise -> return c
where hexRand = do
r <- randomRIO(0,15)
return $ intToDigit r
ipv6AddrRand :: IO (Maybe IPv6Addr)
ipv6AddrRand = do
l <- replicateM 8 (sixteenBitsArbToken "____")
return $ ipv6TokensToText $ intersperse Colon $ catMaybes l
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 = do
n <- getNetworkInterfaces
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