summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--app/BahnhofDNS.hs30
1 files changed, 30 insertions, 0 deletions
diff --git a/app/BahnhofDNS.hs b/app/BahnhofDNS.hs
index 2111aa0..1b06dc1 100644
--- a/app/BahnhofDNS.hs
+++ b/app/BahnhofDNS.hs
@@ -8,6 +8,29 @@ import Network.DNS
import Network.Socket
import Util
+mkByteString :: String -> ByteString
+mkByteString = TSE.encodeUtf8 . Data.Text.pack
+
+ourName :: ByteString
+ourName = mkByteString "ns.fynngodau.de."
+
+servedName :: ByteString
+servedName = mkByteString "bahnhof.fynngodau.de."
+
+soa :: ResourceRecord
+soa = ResourceRecord servedName SOA classIN 86400 $ RD_SOA
+ ourName -- mname
+ (mkByteString "ns@fynngodau.de") -- rname
+ 2025122800 -- serial
+ 86400 -- refresh
+ 7200 -- retry
+ 3600000 -- expire
+ 3600 -- minttl
+
+ns :: ResourceRecord
+ns = ResourceRecord servedName NS classIN 86400 $ RD_NS ourName
+
+
main :: IO ()
main = do -- general structure like sample code at https://book.realworldhaskell.org/read/sockets-and-syslog.html (for UDP server)
staticData <- readData
@@ -20,11 +43,18 @@ main = do -- general structure like sample code at https://book.realworldhaskell
procMessages staticData sckt = do
(m,ad) <- receiveFrom sckt -- Network.DNS
+-- putStrLn $ show (question m)
sendTo sckt (response m) ad
procMessages staticData sckt
where
response m = encode $ case (question m) of
(Question qh TXT) : _ -> queryAnswer (uid m) qh
+ (Question qh SOA) : _
+ | qh == servedName -> makeResponse (uid m) (Question servedName SOA) [soa]
+ | otherwise -> m
+ (Question qh NS ) : _
+ | qh == servedName -> makeResponse (uid m) (Question servedName NS ) [ns ]
+ | otherwise -> m
_ -> m -- ping back question without answering it
-- no other way to generate empty responses without providing a question in this library?