summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--acme-certify.cabal2
-rw-r--r--acme-certify.hs26
-rw-r--r--stack.yaml1
3 files changed, 25 insertions, 4 deletions
diff --git a/acme-certify.cabal b/acme-certify.cabal
index 22dcd20..5c89233 100644
--- a/acme-certify.cabal
+++ b/acme-certify.cabal
@@ -29,7 +29,7 @@ executable acme
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 yaml, unordered-containers, lens, lens-aeson, process, posix-escape
33 default-language: Haskell2010 33 default-language: Haskell2010
34 34
35-- test-suite acme-certify-test 35-- test-suite acme-certify-test
diff --git a/acme-certify.hs b/acme-certify.hs
index 579622f..1e9655c 100644
--- a/acme-certify.hs
+++ b/acme-certify.hs
@@ -37,6 +37,8 @@ import Options.Applicative hiding (header)
37import qualified Options.Applicative as Opt 37import qualified Options.Applicative as Opt
38import System.Directory 38import System.Directory
39import System.IO 39import System.IO
40import System.Posix.Escape
41import System.Process
40import Text.Domain.Validate hiding (validate) 42import Text.Domain.Validate hiding (validate)
41import Text.Email.Validate 43import Text.Email.Validate
42 44
@@ -171,15 +173,21 @@ runUpdate UpdateOpts { .. } = do
171 173
172 174
173 certSpecs :: [CertSpec] <- forM certReqDomains $ \(host, domains) -> do 175 certSpecs :: [CertSpec] <- forM certReqDomains $ \(host, domains) -> do
174 provisioners <- mapM (chooseProvisioner host) domains 176 provisioners <- mapM (chooseProvisioner host) domains
175 return $ certSpec globalCertificateDir keys (host, provisioners) 177 return $ certSpec globalCertificateDir keys (host, provisioners)
176 178
177 mapM_ print certSpecs 179 mapM_ print certSpecs
180
181 h <- remoteTemp "localhost" "/tmp/whatevs 'bro'" "this content\ncontains stuff'"
182 threadDelay $ 1000*1000*10
183 removeTemp h
184
178 error "Error: unimplemented" 185 error "Error: unimplemented"
179 186
180 where 187 where
181 chooseProvisioner :: String -> String -> IO (DomainName, HttpProvisioner) 188 chooseProvisioner :: String -> String -> IO (DomainName, HttpProvisioner)
182 chooseProvisioner host domain = do -- TODO: implement 189 chooseProvisioner host domain -- TODO: implement
190 = do
183 let errmsg = "whatever" 191 let errmsg = "whatever"
184 dir <- ensureWritableDir "/var/www/html/.well-known/acme-challenge/" errmsg 192 dir <- ensureWritableDir "/var/www/html/.well-known/acme-challenge/" errmsg
185 return (domainName' domain, provisionViaFile dir) 193 return (domainName' domain, provisionViaFile dir)
@@ -197,6 +205,18 @@ runUpdate UpdateOpts { .. } = do
197 map (<..> unpack domain) $ sort -- relying on the fact that '.' sorts first 205 map (<..> unpack domain) $ sort -- relying on the fact that '.' sorts first
198 $ concat $ HashMap.lookup domain subs & toListOf (_Just . _String . to (words . unpack)) 206 $ concat $ HashMap.lookup domain subs & toListOf (_Just . _String . to (words . unpack))
199 207
208data TempRemover = TempRemover { removeTemp :: IO () }
209remoteTemp :: String -> FilePath -> String -> IO TempRemover
210remoteTemp host fileName content = do
211 (inp,out,err,_pid) <- ssh $ unlines
212 [ "printf '%s' " ++ escape content ++ " > " ++ escape fileName
213 , "trap " ++ (escape . unwords) ["rm -f", escape fileName] ++ " EXIT"
214 , "read line"
215 ]
216 return $ TempRemover $ mapM_ hClose [inp, out, err]
217 where
218 ssh cmd = runInteractiveProcess "ssh" (host : words "-- sh -c" ++ [escape cmd]) Nothing Nothing
219
200runCertify :: CertifyOpts -> IO (Either String ()) 220runCertify :: CertifyOpts -> IO (Either String ())
201runCertify CertifyOpts{..} = do 221runCertify CertifyOpts{..} = do
202 let terms = fromMaybe defaultTerms (join $ parseAbsoluteURI <$> optTerms) 222 let terms = fromMaybe defaultTerms (join $ parseAbsoluteURI <$> optTerms)
diff --git a/stack.yaml b/stack.yaml
index 5f45d6a..e4f9de2 100644
--- a/stack.yaml
+++ b/stack.yaml
@@ -19,6 +19,7 @@ packages:
19extra-deps: 19extra-deps:
20- yaml-config-0.3.0 20- yaml-config-0.3.0
21- failure-0.2.0.3 21- failure-0.2.0.3
22- posix-escape-0.1
22 23
23# Override default flag values for local packages and extra-deps 24# Override default flag values for local packages and extra-deps
24flags: 25flags: