]> gitweb @ CieloNegro.org - blackboard-dns.git/blob - DDNS/Client/MakeReq.hs
Code cleanup
[blackboard-dns.git] / DDNS / Client / MakeReq.hs
1 module DDNS.Client.MakeReq
2     ( makeReq
3     )
4     where
5
6 import           Control.Monad
7 import           Control.Monad.Trans
8 import           DDNS.Utils
9 import           OpenSSL.PEM
10 import           OpenSSL.RSA
11 import           OpenSSL.X509.Request
12 import           System.Console.Haskeline
13 import           System.IO
14 import           System.Posix.Files
15 import           System.Posix.Uname
16
17 makeReq :: IO ()
18 makeReq
19     = do fqdn <- runInputT defaultSettings $
20                  do defaultFqdn <- liftM uNodeName $ liftIO uname
21                     getInputLineWithDefault
22                         ("What's your FQDN? (default: " ++ defaultFqdn ++ "): ")
23                         defaultFqdn
24
25          putStrLn "Generating RSA keypair..."
26          key <- generateRSAKey 1024 3 Nothing
27
28          let pubFile = fqdn ++ ".pub"
29          withFile pubFile WriteMode $ \ h ->
30              writePublicKey key >>= hPutStr h
31          putStrLn ("Wrote " ++ pubFile)
32
33          let keyFile = fqdn ++ ".key"
34          withFile keyFile WriteMode $ \ h ->
35              writePKCS8PrivateKey key Nothing >>= hPutStr h
36          setFileMode keyFile ownerReadMode
37          putStrLn ("Wrote " ++ keyFile ++ " (with no encryption)")
38
39          req <- newX509Req
40          setVersion     req 2
41          setSubjectName req [("CN", fqdn)]
42          setPublicKey   req key
43          signX509Req    req key Nothing
44          let reqFile = fqdn ++ ".req"
45          withFile reqFile WriteMode $ \ h ->
46              writeX509Req req ReqNewFormat >>= hPutStr h
47          putStrLn ("Wrote " ++ reqFile)
48          putStrLn ("Now send " ++ reqFile ++ " to the server operator and tell him/her to sign it.")