summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Cady <d@jerkface.net>2016-04-09 14:08:38 -0400
committerAndrew Cady <d@jerkface.net>2016-04-09 14:08:38 -0400
commit9bf06242513945fbadd6fcd20b41efd0f1b073c2 (patch)
treece514d5829e4d8323c32608ae31092d3d27d84be
parentf246697d0b7ee5b0fd4e6145ef39531e75d21af5 (diff)
stub parsing of yaml config file
-rw-r--r--acme-certify.cabal3
-rw-r--r--acme-certify.hs48
2 files changed, 37 insertions, 14 deletions
diff --git a/acme-certify.cabal b/acme-certify.cabal
index 2cd61e9..22dcd20 100644
--- a/acme-certify.cabal
+++ b/acme-certify.cabal
@@ -28,7 +28,8 @@ executable acme
28 build-depends: base, base-prelude, acme-certify, 28 build-depends: base, base-prelude, acme-certify,
29 cryptonite, aeson, bytestring, base64-bytestring, SHA, 29 cryptonite, aeson, bytestring, base64-bytestring, SHA,
30 text, HsOpenSSL, optparse-applicative, time, 30 text, HsOpenSSL, optparse-applicative, time,
31 email-validate, network-uri, directory, yaml-config 31 email-validate, network-uri, directory, yaml-config,
32 yaml, unordered-containers, lens, lens-aeson
32 default-language: Haskell2010 33 default-language: Haskell2010
33 34
34-- test-suite acme-certify-test 35-- test-suite acme-certify-test
diff --git a/acme-certify.hs b/acme-certify.hs
index fc44d77..48901c9 100644
--- a/acme-certify.hs
+++ b/acme-certify.hs
@@ -13,26 +13,31 @@
13module Main where 13module Main where
14 14
15import BasePrelude 15import BasePrelude
16import Network.ACME (HttpProvisioner, Keys (..), 16import Control.Lens hiding ((&))
17 canProvision, certify, 17import Data.Aeson.Lens
18 ensureWritableDir, provisionViaFile, 18import qualified Data.HashMap.Strict as HashMap
19 readKeys, (</>)) 19import Data.Text (unpack)
20import Network.ACME.Issuer (letsEncryptX1CrossSigned) 20import Data.Yaml (Object)
21import qualified Data.Yaml.Config as Config
22import Data.Yaml.Config.Internal (Config (..))
23import Network.ACME (HttpProvisioner, Keys (..),
24 canProvision, certify,
25 ensureWritableDir, provisionViaFile,
26 readKeys, (</>))
27import Network.ACME.Issuer (letsEncryptX1CrossSigned)
21import Network.URI 28import Network.URI
22import OpenSSL 29import OpenSSL
23import OpenSSL.DH 30import OpenSSL.DH
24import OpenSSL.PEM 31import OpenSSL.PEM
25import OpenSSL.RSA 32import OpenSSL.RSA
26import OpenSSL.X509 (X509) 33import OpenSSL.X509 (X509)
27import Options.Applicative hiding (header) 34import Options.Applicative hiding (header)
28import qualified Options.Applicative as Opt 35import qualified Options.Applicative as Opt
29import System.Directory 36import System.Directory
30import System.IO 37import System.IO
31import Text.Domain.Validate hiding (validate) 38import Text.Domain.Validate hiding (validate)
32import Text.Email.Validate 39import Text.Email.Validate
33 40
34import qualified Data.Yaml.Config as Yaml
35
36stagingDirectoryUrl, liveDirectoryUrl, defaultTerms :: URI 41stagingDirectoryUrl, liveDirectoryUrl, defaultTerms :: URI
37Just liveDirectoryUrl = parseAbsoluteURI "https://acme-v01.api.letsencrypt.org/directory" 42Just liveDirectoryUrl = parseAbsoluteURI "https://acme-v01.api.letsencrypt.org/directory"
38Just stagingDirectoryUrl = parseAbsoluteURI "https://acme-staging.api.letsencrypt.org/directory" 43Just stagingDirectoryUrl = parseAbsoluteURI "https://acme-staging.api.letsencrypt.org/directory"
@@ -135,9 +140,23 @@ certifyOpts = fmap Certify $
135 , "making ACME requests" 140 , "making ACME requests"
136 ])) 141 ]))
137 142
143-- lookup' :: (Monad m, FromJSON a) => Config.Key -> Config -> m a
144
145extractObject :: Config -> Object
146extractObject (Config _ o) = o
147
138runUpdate :: UpdateOpts -> IO () 148runUpdate :: UpdateOpts -> IO ()
139runUpdate UpdateOpts{..} = do 149runUpdate UpdateOpts { .. } = do
140 error "test" 150 config <- Config.load "config.yaml"
151 hosts <- Config.subconfig "hosts" config
152 forM_ (Config.keys hosts) $ \host -> do
153 domains <- extractObject <$> (Config.subconfig host hosts >>= Config.subconfig "domains")
154 putStrLn $ unpack host ++ ": "
155 forM_ (HashMap.keys domains) $ \domain -> do
156 let subdomains = map (<..> unpack domain) $ sort $ concat $ HashMap.lookup domain domains & toListOf (_Just . _String . to (words . unpack))
157 putStrLn $ " " ++ unwords subdomains
158 putStrLn ""
159 error "Error: unimplemented"
141 160
142runCertify :: CertifyOpts -> IO (Either String ()) 161runCertify :: CertifyOpts -> IO (Either String ())
143runCertify CertifyOpts{..} = do 162runCertify CertifyOpts{..} = do
@@ -232,3 +251,6 @@ otherwiseM :: Monad m => m Bool -> m () -> m ()
232a `otherwiseM` b = a >>= flip unless b 251a `otherwiseM` b = a >>= flip unless b
233infixl 0 `otherwiseM` 252infixl 0 `otherwiseM`
234 253
254(<..>) :: String -> String -> String
255"." <..> dom = dom
256sub <..> dom = sub ++ "." ++ dom