Statistics
| Branch: | Tag: | Revision:

root / src / Ganeti / Block / Diskstats / Parser.hs @ c6bca2d1

History | View | Annotate | Download (2.2 kB)

1
{-# LANGUAGE OverloadedStrings #-}
2
{-| Diskstats proc file parser
3

    
4
This module holds the definition of the parser that extracts status
5
information about the disks of the system from the @/proc/diskstats@ file.
6

    
7
-}
8
{-
9

    
10
Copyright (C) 2013 Google Inc.
11

    
12
This program is free software; you can redistribute it and/or modify
13
it under the terms of the GNU General Public License as published by
14
the Free Software Foundation; either version 2 of the License, or
15
(at your option) any later version.
16

    
17
This program is distributed in the hope that it will be useful, but
18
WITHOUT ANY WARRANTY; without even the implied warranty of
19
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20
General Public License for more details.
21

    
22
You should have received a copy of the GNU General Public License
23
along with this program; if not, write to the Free Software
24
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
25
02110-1301, USA.
26

    
27
-}
28
module Ganeti.Block.Diskstats.Parser (diskstatsParser) where
29

    
30
import Control.Applicative ((<*>), (*>), (<*), (<$>))
31
import qualified Data.Attoparsec.Text as A
32
import qualified Data.Attoparsec.Combinator as AC
33
import Data.Attoparsec.Text (Parser)
34
import Data.Text (unpack)
35

    
36
import Ganeti.Block.Diskstats.Types
37

    
38
-- * Utility functions
39

    
40
-- | Our own space-skipping function, because A.skipSpace also skips
41
-- newline characters. It skips ZERO or more spaces, so it does not
42
-- fail if there are no spaces.
43
skipSpaces :: Parser ()
44
skipSpaces = A.skipWhile A.isHorizontalSpace
45

    
46
-- | A parser recognizing a number preceeded by spaces.
47
numberP :: Parser Int
48
numberP = skipSpaces *> A.decimal
49

    
50
-- | A parser recognizing a word preceded by spaces, and closed by a space.
51
stringP :: Parser String
52
stringP = skipSpaces *> fmap unpack (A.takeWhile $ not . A.isHorizontalSpace)
53

    
54
-- * Parser implementation
55

    
56
-- | The parser for one line of the diskstatus file.
57
oneDiskstatsParser :: Parser Diskstats
58
oneDiskstatsParser =
59
  Diskstats <$> numberP <*> numberP <*> stringP <*> numberP <*> numberP
60
    <*> numberP <*> numberP <*> numberP <*> numberP <*> numberP <*> numberP
61
    <*> numberP <*> numberP <*> numberP <* A.endOfLine
62

    
63
-- | The parser for a whole diskstatus file.
64
diskstatsParser :: Parser [Diskstats]
65
diskstatsParser = oneDiskstatsParser `AC.manyTill` A.endOfInput