X-Git-Url: http://www.average.org/gitweb/?p=pdns-pipe-nmc.git;a=blobdiff_plain;f=pdns-pipe-nmc.hs;h=f2669a23489ef7eae103838bf29ed2dd45c8ce80;hp=d9ced8f3318629029611f1f5aff08e998dfebb73;hb=b499364fc244111c99b003775c88fcb35633f26b;hpb=f0b5926d1268770bbcbcb8af7036238ae066d400 diff --git a/pdns-pipe-nmc.hs b/pdns-pipe-nmc.hs index d9ced8f..f2669a2 100644 --- a/pdns-pipe-nmc.hs +++ b/pdns-pipe-nmc.hs @@ -2,11 +2,17 @@ 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 qualified Data.ByteString.Char8 as C (pack, unpack) -import qualified Data.ByteString.Lazy.Char8 as L (pack, unpack) -import Data.ByteString.Lazy as BS 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 Data.List.Split import Data.Aeson (encode, decode, Value(..)) import Network.HTTP.Types @@ -18,12 +24,13 @@ import Config import PowerDns import NmcRpc import NmcDom +import NmcTransform confFile = "/etc/namecoin.conf" -- HTTP/JsonRpc interface -qReq :: Config -> ByteString -> ByteString -> Request m +qReq :: Config -> String -> String -> Request m qReq cf q id = applyBasicAuth (C.pack (rpcuser cf)) (C.pack (rpcpassword cf)) $ def { host = (C.pack (rpchost cf)) , port = (rpcport cf) @@ -35,8 +42,8 @@ qReq cf q id = applyBasicAuth (C.pack (rpcuser cf)) (C.pack (rpcpassword cf)) , requestBody = RequestBodyLBS $ encode $ JsonRpcRequest JsonRpcV1 "name_show" - [q] - (String "pdns-nmc") + [L.pack q] + (String (T.pack id)) , checkStatus = \_ _ _ -> Nothing } @@ -51,27 +58,21 @@ qRsp rsp = -- NMC interface -queryOp :: Manager -> Config -> String -> String - -> IO (Either String ByteString) -queryOp mgr cfg qid key = do - rsp <- runResourceT $ - httpLbs (qReq cfg (L.pack key) (L.pack qid)) mgr - return $ qRsp rsp - queryNmc :: Manager -> Config -> String -> String -> IO (Either String NmcDom) -queryNmc mgr cfg fqdn qid = do +queryNmc mgr cfg qid fqdn = case reverse (splitOn "." fqdn) of - "bit":dn:xs -> do - dom <- mergeImport (queryOp mgr cfg qid) $ - emptyNmcDom { domImport = Just ("d/" ++ dn)} - return $ Right $ descendNmcDom xs dom - _ -> - return $ Left "Only \".bit\" domain is supported" + "bit":dn:xs -> descendNmcDom queryOp xs $ seedNmcDom dn + _ -> 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 -main = do +mainNmc = do cfg <- readConfig confFile @@ -101,14 +102,37 @@ main = do Right preq -> do case preq of PdnsRequestQ qname qtype id _ _ _ -> - queryNmc mgr cfg qname id >>= putStr . (pdnsOut ver id qname qtype) + queryNmc mgr cfg 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 str "askid" >>= putStr . (pdnsOut 1 "askid" str RRTypeANY) + dom <- queryNmc mgr cfg "+" key + putStrLn $ ppShow dom + putStr $ pdnsOut 1 "+" key RRTypeANY dom + +-- using file backend for testing json domain data + +queryFile :: String -> IO (Either String ByteString) +queryFile key = catch (readFile key >>= return . Right) + (\e -> return (Left (show (e :: IOException)))) + +mainFile key = do + dom <- descendNmcDom queryFile [] (seedNmcDom key) + putStrLn $ ppShow dom + putStr $ pdnsOut 1 "+" key RRTypeANY dom + +-- Entry point + +main = do + args <- getArgs + case args of + [] -> mainNmc + [key] -> mainOne key + ["-f",key] -> mainFile key + _ -> error $ "usage: empty args, or \"\", or \"-f \""