Revision eb62691c src/Ganeti/Block/Drbd/Parser.hs
b/src/Ganeti/Block/Drbd/Parser.hs | ||
---|---|---|
31 | 31 |
import qualified Data.Attoparsec.Text as A |
32 | 32 |
import qualified Data.Attoparsec.Combinator as AC |
33 | 33 |
import Data.Attoparsec.Text (Parser) |
34 |
import Data.List |
|
34 | 35 |
import Data.Maybe |
35 | 36 |
import Data.Text (Text, unpack) |
36 | 37 |
|
... | ... | |
61 | 62 |
optional parser = (Just <$> parser) <|> pure Nothing |
62 | 63 |
|
63 | 64 |
-- | The parser for a whole DRBD status file. |
64 |
drbdStatusParser :: Parser DRBDStatus |
|
65 |
drbdStatusParser = |
|
65 |
drbdStatusParser :: [DrbdInstMinor] -> Parser DRBDStatus
|
|
66 |
drbdStatusParser instMinor =
|
|
66 | 67 |
DRBDStatus <$> versionInfoParser |
67 |
<*> deviceParser `AC.manyTill` A.endOfInput |
|
68 |
<*> deviceParser instMinor `AC.manyTill` A.endOfInput
|
|
68 | 69 |
<* A.endOfInput |
69 | 70 |
|
70 | 71 |
-- | The parser for the version information lines. |
... | ... | |
111 | 112 |
<* A.endOfLine |
112 | 113 |
|
113 | 114 |
-- | The parser for a (multi-line) string representing a device. |
114 |
deviceParser :: Parser DeviceInfo |
|
115 |
deviceParser = do |
|
115 |
deviceParser :: [DrbdInstMinor] -> Parser DeviceInfo
|
|
116 |
deviceParser instMinor = do
|
|
116 | 117 |
deviceNum <- skipSpaces *> A.decimal <* A.char ':' |
117 | 118 |
cs <- skipSpacesAndString "cs:" connStateParser |
118 | 119 |
if cs == Unconfigured |
... | ... | |
129 | 130 |
reS <- optional resyncParser |
130 | 131 |
act <- optional actLogParser |
131 | 132 |
_ <- additionalEOL |
133 |
let inst = find ((deviceNum ==) . dimMinor) instMinor |
|
134 |
iName = fmap dimInstName inst |
|
132 | 135 |
return $ DeviceInfo deviceNum cs ro ds replicProtocol io pIndicators |
133 |
syncS reS act |
|
136 |
syncS reS act iName
|
|
134 | 137 |
|
135 | 138 |
where conditionalSyncStatusParser SyncSource = Just <$> syncStatusParser |
136 | 139 |
conditionalSyncStatusParser SyncTarget = Just <$> syncStatusParser |
Also available in: Unified diff