asif 3.0.0 → 3.1.0
raw patch · 4 files changed
+44/−1 lines, 4 filesdep +networknew-uploaderPVP ok
version bump matches the API change (PVP)
Dependencies added: network
API changes (from Hackage documentation)
+ Arbor.File.Format.Asif.Data.Ip: ipv4ToIpv6 :: IPv4 -> IPv6
+ Arbor.File.Format.Asif.Data.Ip: ipv6ToString :: IPv6 -> String
+ Arbor.File.Format.Asif.Data.Ip: ipv6ToWord32x4 :: IPv6 -> (Word32, Word32, Word32, Word32)
+ Arbor.File.Format.Asif.Data.Ip: stringToIpv6 :: String -> Maybe IPv6
+ Arbor.File.Format.Asif.Data.Ip: word32x4ToIpv6 :: (Word32, Word32, Word32, Word32) -> IPv6
+ Arbor.File.Format.Asif.Format: Ipv6 :: Format
Files
- app/App/Commands/Dump.hs +19/−0
- asif.cabal +4/−1
- src/Arbor/File/Format/Asif/Data/Ip.hs +20/−0
- src/Arbor/File/Format/Asif/Format.hs +1/−0
app/App/Commands/Dump.hs view
@@ -23,6 +23,7 @@ import Data.Thyme.Clock.POSIX (POSIXTime) import Data.Thyme.Format (formatTime) import Data.Thyme.Time.Core+import Data.Word import HaskellWorks.Data.Bits.BitShow import Numeric (showHex) import Options.Applicative@@ -64,6 +65,14 @@ showTime :: FormatTime t => t -> String showTime = formatTime defaultTimeLocale (iso8601DateFormat (Just "%H:%M:%S %Z")) +getWord32x4 :: G.Get (Word32, Word32, Word32, Word32)+getWord32x4 = do+ a <- G.getWord32be+ b <- G.getWord32be+ c <- G.getWord32be+ d <- G.getWord32be+ return (a, b, c, d)+ runDump :: MonadResource m => DumpOptions -> m () runDump opt = do (_, hIn) <- openFileOrStd (opt ^. the @"source") IO.ReadMode@@ -107,6 +116,16 @@ let w = G.runGet G.getWord32le (LBS.take 8 (bs <> LBS.replicate 4 0)) let ipString = w & word32ToIpv4 & ipv4ToString liftIO $ IO.hPutStrLn hOut $ ipString <> replicate (16 - length ipString) ' ' <> "(" <> show w <> ")"+ Just (Known F.Ipv6) ->+ forM_ (LBS.chunkBy 16 (segment ^. the @"payload")) $ \bs -> do+ let (a, b, c, d) = G.runGet getWord32x4 (LBS.take 16 (bs <> LBS.replicate 16 0))+ if a == 0 && b == 0 && c == 0xFFFF+ then do+ let ipString = d & word32ToIpv4 & ipv4ToString+ liftIO $ IO.hPutStrLn hOut $ ipString <> replicate (64 - length ipString) ' ' <> "(" <> show d <> ")"+ else do+ let ipString = word32x4ToIpv6 (a, b, c, d) & ipv6ToString+ liftIO $ IO.hPutStrLn hOut $ ipString <> replicate (64 - length ipString) ' ' <> "(" <> show (a, b, c, d) <> ")" Just (Known F.Int64LE) -> forM_ (LBS.chunkBy 8 (segment ^. the @"payload")) $ \bs -> do let w = G.runGet G.getInt64le (LBS.take 8 (bs <> LBS.replicate 8 0))
asif.cabal view
@@ -3,7 +3,7 @@ -- see: https://github.com/sol/hpack name: asif-version: 3.0.0+version: 3.1.0 description: Please see the README on Github at <https://github.com/packetloop/asif#readme> category: Services homepage: https://github.com/packetloop/asif#readme@@ -46,6 +46,7 @@ , hw-ip , iproute , lens+ , network , old-locale , resourcet , temporary-resourcet@@ -97,6 +98,7 @@ , hw-ip , iproute , lens+ , network , old-locale , resourcet , temporary-resourcet@@ -140,6 +142,7 @@ , hw-ip , iproute , lens+ , network , old-locale , resourcet , temporary-resourcet
src/Arbor/File/Format/Asif/Data/Ip.hs view
@@ -1,8 +1,13 @@ module Arbor.File.Format.Asif.Data.Ip ( stringToIpv4+ , stringToIpv6 , ipv4ToString+ , ipv6ToString , word32ToIpv4+ , word32x4ToIpv6 , ipv4ToWord32+ , ipv6ToWord32x4+ , ipv4ToIpv6 ) where import Arbor.File.Format.Asif.Data.Read@@ -16,11 +21,26 @@ then readMaybe str else word32ToIpv4 <$> stringToAnyDigits str +stringToIpv6 :: String -> Maybe IPv6+stringToIpv6 = readMaybe+ ipv4ToString :: IPv4 -> String ipv4ToString = show +ipv6ToString :: IPv6 -> String+ipv6ToString = show+ word32ToIpv4 :: Word32 -> IPv4 word32ToIpv4 = fromHostAddress . toBE32 +word32x4ToIpv6 :: (Word32, Word32, Word32, Word32) -> IPv6+word32x4ToIpv6 = fromHostAddress6+ ipv4ToWord32 :: IPv4 -> Word32 ipv4ToWord32 = fromBE32 . toHostAddress++ipv6ToWord32x4 :: IPv6 -> (Word32, Word32, Word32, Word32)+ipv6ToWord32x4 = toHostAddress6++ipv4ToIpv6 :: IPv4 -> IPv6+ipv4ToIpv6 = ipv4ToIPv6
src/Arbor/File/Format/Asif/Format.hs view
@@ -13,6 +13,7 @@ | Int32LE | Int64LE | Ipv4+ | Ipv6 | Repeat Word Format | StringZ | Text