module Text.IPv6Addr.Manip
( randIPv6AddrChunk
, randPartialIPv6Addr
, macAddrToIPv6AddrTokens
, getTokIPv6AddrOf
, getTokMacAddrOf
) where
import Control.Monad (replicateM)
import Data.Attoparsec.Text as A
import Data.Char (intToDigit)
import Data.List (intersperse)
import qualified Data.Text as T
import Network.Info
import System.Random (randomRIO)
import Text.IPv6Addr.Internal
import Text.IPv6Addr.Types
randIPv6AddrChunk :: String -> IO IPv6AddrToken
randIPv6AddrChunk m =
mapM getHex m >>= \g -> return $ SixteenBit $ T.dropWhile (=='0') $ T.pack g
where
getHex c
| c == '_' = intToDigit <$> randomRIO (0,15)
| otherwise = return c
randPartialIPv6Addr :: Int -> IO [IPv6AddrToken]
randPartialIPv6Addr n
| n > 0 && n < 9 = intersperse Colon <$> replicateM n (randIPv6AddrChunk "____")
| otherwise = return []
macAddrToIPv6AddrTokens :: T.Text -> Maybe [IPv6AddrToken]
macAddrToIPv6AddrTokens t =
case parse macAddr t of
Done a b ->
if a == T.empty
then intersperse Colon <$> b
else Nothing
_ -> Nothing
getTokIPv6AddrOf :: String -> IO (Maybe [IPv6AddrToken])
getTokIPv6AddrOf s = maybe Nothing (maybeTokIPv6Addr. T.pack . show) <$>
(lookup s <$> networkInterfacesIPv6AddrList)
getTokMacAddrOf :: String -> IO (Maybe [IPv6AddrToken])
getTokMacAddrOf s =
maybe Nothing (macAddrToIPv6AddrTokens . T.pack . show) <$>
(lookup s <$> networkInterfacesMacAddrList)
where
networkInterfacesMacAddrList = getNetworkInterfaces >>= \n -> return $ map networkInterfacesMac n
where networkInterfacesMac (NetworkInterface n _ _ m) = (n,m)