module Main where
-import System.IO
+import Prelude hiding (readFile)
+import System.Environment
+import System.IO hiding (readFile)
+import System.IO.Error
+import Control.Exception
+import Text.Show.Pretty hiding (String)
import Control.Monad
-import Data.ByteString.Lazy hiding (reverse, putStr, putStrLn)
+import Data.ByteString.Lazy hiding (reverse, putStr, putStrLn, head)
import qualified Data.ByteString.Char8 as C (pack)
import qualified Data.ByteString.Lazy.Char8 as L (pack)
import qualified Data.Text as T (pack)
import PowerDns
import NmcRpc
import NmcDom
+import NmcTransform
confFile = "/etc/namecoin.conf"
-- NMC interface
-queryNmc :: Manager -> Config -> String -> String
- -> IO (Either String NmcDom)
-queryNmc mgr cfg qid fqdn =
+queryOpNmc cfg mgr qid key =
+ runResourceT (httpLbs (qReq cfg key qid) mgr) >>= return . qRsp
+
+queryOpFile key = catch (readFile key >>= return . Right)
+ (\e -> return (Left (show (e :: IOException))))
+
+queryDom queryOp fqdn =
case reverse (splitOn "." fqdn) of
- "bit":dn:xs -> do
- dom <- mergeImport queryOp $
- emptyNmcDom { domImport = Just ("d/" ++ dn)}
- case dom of
- Left err -> return $ Left err
- Right dom' -> return $ Right $ descendNmcDom xs dom'
- _ ->
- return $ Left "Only \".bit\" domain is supported"
- where
- queryOp key = do
- rsp <- runResourceT $ httpLbs (qReq cfg key qid) mgr
- -- print $ qRsp rsp
- return $ qRsp rsp
-
--- Main entry
+ "bit":dn:xs -> descendNmcDom queryOp xs $ seedNmcDom dn
+ _ -> return $ Left "Only \".bit\" domain is supported"
-main = do
+-- Main entries
+
+mainPdnsNmc = do
cfg <- readConfig confFile
Right preq -> do
case preq of
PdnsRequestQ qname qtype id _ _ _ ->
- queryNmc mgr cfg id qname >>= putStr . (pdnsOut ver id qname qtype)
+ queryDom (queryOpNmc cfg mgr id) qname >>= putStr . (pdnsOut ver id qname qtype)
PdnsRequestAXFR xfrreq ->
putStr $ pdnsReport ("No support for AXFR " ++ xfrreq)
PdnsRequestPing -> putStrLn "END"
--- for testing
+-- query by key from Namecoin
-ask str = do
+mainOne key = do
cfg <- readConfig confFile
mgr <- newManager def
- queryNmc mgr cfg "askid" str >>= putStr . (pdnsOut 1 "askid" str RRTypeANY)
+ dom <- queryDom (queryOpNmc cfg mgr "_") key
+ putStrLn $ ppShow dom
+ putStr $ pdnsOut 1 "_" key RRTypeANY dom
+
+-- using file backend for testing json domain data
+
+mainFile key = do
+ dom <- queryDom queryOpFile key
+ putStrLn $ ppShow dom
+ putStr $ pdnsOut 1 "+" key RRTypeANY dom
+
+-- Entry point
+
+main = do
+ args <- getArgs
+ case args of
+ [] -> mainPdnsNmc
+ [key] -> mainOne key
+ ["-f",key] -> mainFile key
+ _ -> error $ "usage: empty args, or \"[-f] <fqdn>\""