@@ -4,95 +4,26 @@
44
55module Network.Docker where
66
7−import Control.Applicative ((<$>), (<*>))
7+import Control.Applicative ((<$>), (<*>))
8+import Control.Lens
89import Control.Monad.Free
9−import Data.Aeson (FromJSON, ToJSON, Value, decode,
10− eitherDecode, toJSON)
11−import Data.Aeson.Lens (key, _String)
12−import qualified Data.ByteString.Lazy as L
10+import Data.Aeson (FromJSON, ToJSON, Value, decode,
11+ eitherDecode, toJSON)
12+import Data.Aeson.Lens (key, _String)
13+import qualified Data.ByteString.Lazy as L
1314import Data.Char
14−import qualified Data.Text as T
15−import Network.HTTP.Client.OpenSSL
15+import qualified Data.Text as T
1616import Network.Wreq
17−import OpenSSL (withOpenSSL)
18−import OpenSSL.Session (SSLContext, context)
19−import qualified OpenSSL.Session as SSL
2017import Pipes
2118import Pipes
22−import qualified Pipes.ByteString as PB
23−import qualified Pipes.HTTP as PH
24−import Text.Printf (printf)
19+import qualified Pipes.ByteString as PB
20+import qualified Pipes.HTTP as PH
21+import Text.Printf (printf)
2522
2623import Network.Docker.Internal
2724import Network.Docker.Options
2825import Network.Docker.Types
2926
30−emptyPost = "" :: String
31−
32−defaultClientOpts :: DockerClientOpts
33−defaultClientOpts = DockerClientOpts
34− { apiVersion = "v1.12"
35− , baseUrl = "http://127.0.0.1:3128/"
36− , ssl = NoSSL
37− }
38−run :: HttpRequestM r -> IO (Response L.ByteString)
39−run (Free (Get url)) = get url
40−run (Free (GetSSL sslOpts url)) = getSSL sslOpts url
41−run (Free (Post url body)) = post url body
42−run (Free (PostSSL sslOpts url body)) = postSSL sslOpts url body
43−
44−constructUrl :: URL -> ApiVersion -> String -> URL
45−constructUrl url apiVersion endpoint = printf "%s%s%s" url apiVersion endpoint
46−
47−-- decodeResponse :: Response L.ByteString -> a
48−decodeResponse r = decode (r ^. responseBody)
49−
50−getElemFromResponse k r = (^? responseBody . key k . _String) r
51−
52−getResponseStatusCode r = (^. responseStatus) r
53−
54−
55−setupSSLCtx :: SSLOptions -> IO SSLContext
56−setupSSLCtx (SSLOptions key cert) = do
57− ctx <- SSL.context
58− SSL.contextSetPrivateKeyFile ctx key
59− SSL.contextSetCertificateFile ctx cert
60− SSL.contextAddOption ctx SSL.SSL_OP_NO_SSLv3
61− SSL.contextAddOption ctx SSL.SSL_OP_NO_SSLv2
62− return ctx
63−
64−
65−mkOpts c = defaults & manager .~ Left (opensslManagerSettings c)
66−
67−getSSL
68− :: SSLOptions
69− -> String
70− -> IO (Response L.ByteString)
71−getSSL sopts url = withOpenSSL $ getWith (mkOpts $ setupSSLCtx sopts) url
72−
73−postSSL
74− :: ToJSON a
75− => SSLOptions
76− -> String
77− -> a
78− -> IO (Response L.ByteString)
79−postSSL sopts url = withOpenSSL . postWith (mkOpts $ setupSSLCtx sopts) url . toJSON
80−
81−_dockerGetQuery :: DockerClientOpts -> Endpoint -> HttpRequestM Endpoint
82−_dockerGetQuery clientOpts@DockerClientOpts{ssl = NoSSL} endpoint = Free (Get (fullUrl clientOpts endpoint))
83−_dockerGetQuery clientOpts@DockerClientOpts{ssl = SSL sslOpts} endpoint = Free (GetSSL sslOpts (fullUrl clientOpts endpoint))
84−
85−_dockerPostQuery :: ToJSON a => DockerClientOpts -> Endpoint -> a -> HttpRequestM Endpoint
86−_dockerPostQuery clientOpts@DockerClientOpts{ssl = NoSSL} endpoint postObject = Free (Post (fullUrl clientOpts endpoint) (toJSON postObject))
87−_dockerPostQuery clientOpts@DockerClientOpts{ssl = SSL sslOpts} endpoint postObject = Free (PostSSL sslOpts (fullUrl clientOpts endpoint) (toJSON postObject))
88−
89−_dockerEmptyPostQuery :: DockerClientOpts -> Endpoint -> HttpRequestM Endpoint
90−_dockerEmptyPostQuery clientOpts@DockerClientOpts{ssl = NoSSL} endpoint = Free (Post (fullUrl clientOpts endpoint) (toJSON emptyPost))
91−_dockerEmptyPostQuery clientOpts@DockerClientOpts{ssl = SSL sslOpts} endpoint = Free (PostSSL sslOpts (fullUrl clientOpts endpoint) (toJSON emptyPost))
92−
93−
94−_dockerEmptyDeleteQuery endpoint clientOpts = delete (fullUrl clientOpts endpoint)
95−
9627getDockerVersion :: DockerClientOpts -> IO (Maybe DockerVersion)
9728getDockerVersion clientOpts = decodeResponse <$> runDocker (getDockerVersionM clientOpts SVersionEndpoint)
9829
@@ -131,10 +62,12 @@ deleteContainerWithOpts clientOpts deleteOpts cid = (^. responseStatus) <$>
13162 runDocker (deleteContainerM clientOpts (SDeleteContainerEndpoint cid deleteOpts))
13263
13364getContainerLogsWithOpts :: DockerClientOpts -> LogOpts -> String -> IO (L.ByteString)
134−getContainerLogsWithOpts clientOpts l cid = (^. responseBody) <$> runDocker (getContainerLogsM clientOpts (SContainerLogsEndpoint cid l))
65+getContainerLogsWithOpts clientOpts l cid = (^. responseBody) <$>
66+ runDocker (getContainerLogsM clientOpts (SContainerLogsEndpoint cid l))
13567
13668getContainerLogs :: DockerClientOpts -> String -> IO (L.ByteString)
137−getContainerLogs clientOpts cid = (^. responseBody) <$> runDocker (getContainerLogsM clientOpts (SContainerLogsEndpoint cid defaultLogOpts))
69+getContainerLogs clientOpts cid = (^. responseBody) <$>
70+ runDocker (getContainerLogsM clientOpts (SContainerLogsEndpoint cid defaultLogOpts))
13871
13972getContainerLogsStream :: DockerClientOpts -> String -> IO ()
14073getContainerLogsStream clientOpts cid = do