pocket-dns-0.1.0: Network/DNS/Pocket/Zookeeper.hs
{-# LANGUAGE TemplateHaskell, QuasiQuotes #-}
{-# LANGUAGE TypeFamilies, EmptyDataDecls, GADTs #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE RecordWildCards, OverloadedStrings #-}
{-# LANGUAGE FlexibleContexts #-}
module Network.DNS.Pocket.Zookeeper (
DnsBackend
) where
import Data.IP
import Network.DNS hiding (lookup)
import Network.Socket hiding (recvFrom)
import Database.Persist
import Database.Persist.TH
import Database.Persist.Zookeeper
import qualified Data.Yaml as Y
import Network.DNS.Pocket.Type
let zookeeperSettings = defaultZookeeperSettings
in share [mkPersist zookeeperSettings] [persistLowerCase|
DnsRecord
name Domain
addr [IP]
DnsRecordU name
deriving Show
deriving Eq
|]
instance DnsBackend ZookeeperConf where
type Conn ZookeeperConf = Connection
load file = do
mconf <- Y.decodeFile file
case mconf of
Just val -> do
return $ Y.parseMonad Database.Persist.loadConfig val
Nothing -> return Nothing
setup p = do
withSocketsDo $ do
conn <- createPoolConfig p
return $ Just conn
getRecord p domain conn = do
mRecord <- runPool p (getBy (DnsRecordU domain)) conn
case mRecord of
Just (Entity _key val') -> do
let val = dnsRecordAddr val'
return val
Nothing ->
return []
setRecord p domain ips conn = do
a <- runPool p (insertUnique (DnsRecord domain ips)) conn
case a of
Just _ -> return True
Nothing -> return False
listRecord p conn = do
a <- runPool p (selectList [] []) conn
return $ map (\(Entity _key val) -> (dnsRecordName val,dnsRecordAddr val)) a
deleteRecord p q conn = do
runPool p (deleteBy (DnsRecordU q)) conn