asif 6.0.0 → 6.0.1
raw patch · 7 files changed
+46/−36 lines, 7 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Arbor.File.Format.Asif.Data.Ip: word64ToIpList :: Int -> Word64 -> [Word32] -> [Word32]
+ Arbor.File.Format.Asif.Extract: bitmap :: ByteString -> [IpAddress]
Files
- README.md +4/−4
- app/App/Commands/DumpBitmap.hs +7/−9
- app/App/Dump.hs +5/−15
- asif.cabal +1/−1
- src/Arbor/File/Format/Asif/ByteString/Builder.hs +1/−1
- src/Arbor/File/Format/Asif/Data/Ip.hs +13/−0
- src/Arbor/File/Format/Asif/Extract.hs +15/−6
README.md view
@@ -12,10 +12,10 @@ |Segmented OSI Model | +--------------------+ - magic, where XXXX is a feed type-+---------------------+-------------+-| "seg:XXXX" [char:8] | ver: uint64 |-+---------------------+-------------++ magic, where XXXX is a feed type (0-12 chars)++----------------------++| "seg:XXXX" [char:16] |++----------------------+ c -- countries a -- asns
app/App/Commands/DumpBitmap.hs view
@@ -8,8 +8,8 @@ ) where import App.Commands.Options.Type-import App.Dump import Arbor.File.Format.Asif.Data.Ip+import Arbor.File.Format.Asif.Extract (bitmap) import Arbor.File.Format.Asif.IO import Control.Lens import Control.Monad@@ -19,10 +19,8 @@ import Data.Monoid ((<>)) import Options.Applicative -import qualified Arbor.File.Format.Asif.ByteString.Lazy as LBS-import qualified Data.Binary.Get as G-import qualified Data.ByteString.Lazy as LBS-import qualified System.IO as IO+import qualified Data.ByteString.Lazy as LBS+import qualified System.IO as IO {-# ANN module ("HLint: ignore Reduce duplication" :: String) #-} {-# ANN module ("HLint: ignore Redundant do" :: String) #-}@@ -52,7 +50,7 @@ contents <- liftIO $ LBS.hGetContents hIn - forM_ (zip [0..] (G.runGet G.getWord64le <$> LBS.chunkBy 8 contents)) $ \(idx, w64) ->- forM_ (word64ToList idx w64 []) $ \w32 -> do- let ipString = w32 & word32ToIpv4 & ipv4ToString- liftIO $ IO.hPutStrLn hOut $ ipString <> replicate (16 - length ipString) ' ' <> "(" <> show w32 <> ")"+ forM_ (bitmap contents) $ \ip ->+ let ipString = ipv4ToString ip+ w32 = ipv4ToWord32 ip+ in liftIO $ IO.hPutStrLn hOut $ ipString <> replicate (16 - length ipString) ' ' <> "(" <> show w32 <> ")"
app/App/Dump.hs view
@@ -5,10 +5,10 @@ module App.Dump ( dumpSegment- , word64ToList ) where import Arbor.File.Format.Asif.Data.Ip+import Arbor.File.Format.Asif.Extract import Arbor.File.Format.Asif.Segment import Arbor.File.Format.Asif.Whatever import Control.Lens@@ -22,9 +22,7 @@ import Data.Text (Text) import Data.Thyme.Format (formatTime) import Data.Thyme.Time.Core-import Data.Word import HaskellWorks.Data.Bits.BitShow-import HaskellWorks.Data.Bits.BitWise import Numeric (showHex) import System.IO (Handle) import System.Locale (defaultTimeLocale, iso8601DateFormat)@@ -34,7 +32,6 @@ import qualified Arbor.File.Format.Asif.Get as D import qualified Data.Binary as G import qualified Data.Binary.Get as G-import qualified Data.Bits as B import qualified Data.ByteString.Lazy as LBS import qualified Data.ByteString.Lazy.Char8 as LBSC import qualified Data.Text as T@@ -49,13 +46,6 @@ showTime :: FormatTime t => t -> String showTime = formatTime defaultTimeLocale (iso8601DateFormat (Just "%H:%M:%S %Z")) -word64ToList :: Int -> Word64 -> [Word32] -> [Word32]-word64ToList _ 0 = id-word64ToList o w = (ip:) . word64ToList o (w .&. comp b)- where p = B.countTrailingZeros w- hi = o .<. 6- ip = fromIntegral (p .|. hi)- b = 1 .<. fromIntegral p dumpSegment :: MonadResource m => Handle -> Int -> Text -> Segment LBS.ByteString -> m () dumpSegment hOut i filename segment = do@@ -163,10 +153,10 @@ liftIO $ IO.hPutStrLn hOut (bitShow (segment ^. the @"payload")) Just (Known F.Bitmap) ->- forM_ (zip [0..] (G.runGet G.getWord64le <$> LBS.chunkBy 8 (segment ^. the @"payload"))) $ \(idx, w64) ->- forM_ (word64ToList idx w64 []) $ \w32 -> do- let ipString = w32 & word32ToIpv4 & ipv4ToString- liftIO $ IO.hPutStrLn hOut $ ipString <> replicate (16 - length ipString) ' ' <> "(" <> show w32 <> ")"+ forM_ (bitmap $ segment ^. the @"payload") $ \ip ->+ let ipString = ipv4ToString ip+ w32 = ipv4ToWord32 ip+ in liftIO $ IO.hPutStrLn hOut $ ipString <> replicate (16 - length ipString) ' ' <> "(" <> show w32 <> ")" Just (Known F.Bool) -> forM_ (LBS.chunkBy 1 (segment ^. the @"payload")) $ \bs -> do
asif.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.2 name: asif-version: 6.0.0+version: 6.0.1 description: Library for creating and querying segmented feeds. Please see <https://github.com/arbor/asif#readme> synopsis: Library for creating and querying segmented feeds category: Services
src/Arbor/File/Format/Asif/ByteString/Builder.hs view
@@ -44,7 +44,7 @@ magicPrefix = "seg:" -- magic file identifier for segmented gan feeds.--- 7 characters. the 8th is meant to be filled in based on feed.+-- 16 characters. the last 12 are meant to be filled in based on feed. magicString :: String -> LC8.ByteString magicString s = if LBS.length truncatedMagic < LBS.length rawMagic then truncatedMagic
src/Arbor/File/Format/Asif/Data/Ip.hs view
@@ -13,13 +13,16 @@ , ipv4ToWord32 , ipv6ToWord32x4 , ipv4ToIpv6+ , word64ToIpList ) where import Arbor.File.Format.Asif.Data.Read import Control.Lens ((&)) import Data.Word+import HaskellWorks.Data.Bits.BitWise import Text.Read +import qualified Data.Bits as B import qualified HaskellWorks.Data.Network.Ip.Ipv4 as IP4 import qualified HaskellWorks.Data.Network.Ip.Ipv6 as IP6 @@ -77,3 +80,13 @@ ipv4ToIpv6 :: IP4.IpAddress -> IP6.IpAddress ipv4ToIpv6 = IP6.fromIpv4++-- This takes a Word64 from a Bitmap, and converts it to a list of IPs.+-- The integer argument is an index into the bitmap+word64ToIpList :: Int -> Word64 -> [Word32] -> [Word32]+word64ToIpList _ 0 = id+word64ToIpList o w = (ip:) . word64ToIpList o (w .&. comp b)+ where p = B.countTrailingZeros w+ hi = o .<. 6+ ip = fromIntegral (p .|. hi)+ b = 1 .<. fromIntegral p
src/Arbor/File/Format/Asif/Extract.hs view
@@ -12,8 +12,10 @@ , map , vectorBoxed , vectorUnboxed+ , bitmap ) where +import Arbor.File.Format.Asif.Data.Ip import Arbor.File.Format.Asif.Format.Type (Format) import Arbor.File.Format.Asif.Whatever import Control.Lens@@ -24,12 +26,14 @@ import Data.Text.Encoding.Error import Prelude hiding (map) -import qualified Data.Binary.Get as G-import qualified Data.ByteString.Lazy as LBS-import qualified Data.List as L-import qualified Data.Map.Strict as M-import qualified Data.Vector as V-import qualified Data.Vector.Unboxed as VU+import qualified Arbor.File.Format.Asif.ByteString.Lazy as LBS+import qualified Data.Binary.Get as G+import qualified Data.ByteString.Lazy as LBS+import qualified Data.List as L+import qualified Data.Map.Strict as M+import qualified Data.Vector as V+import qualified Data.Vector.Unboxed as VU+import qualified HaskellWorks.Data.Network.Ip.Ipv4 as IP4 vectorBoxed :: Get a -> LBS.ByteString -> V.Vector a vectorBoxed g = V.unfoldr step@@ -71,3 +75,8 @@ convert (Left _) = Nothing convert (Right "") = Nothing convert (Right t) = Just (tReadWhatever t)++bitmap :: LBS.ByteString -> [IP4.IpAddress]+bitmap lbs =+ zip [0..] (G.runGet G.getWord64le <$> LBS.chunkBy 8 lbs) >>= \(idx, w64) ->+ word64ToIpList idx w64 [] <&> word32ToIpv4