@@ -1,65 +1,17 @@
2import Prelude hiding (catch)
2import Prelude hiding (catch)
3import System.Environment (getArgs, getEnv)
3import System.Environment (getArgs, getEnv)
4−import System.IO (IOMode(ReadWriteMode), hClose)
5import System.FilePath ((</>))
4import System.FilePath ((</>))
6import System.Posix.Types (Fd)
5import System.Posix.Types (Fd)
7−import Data.IORef (IORef, writeIORef, readIORef, newIORef)
8−import qualified Data.ByteString.Lazy.Char8 as BSLC (pack, putStrLn)
6+import qualified Data.ByteString.Lazy.Char8 as BSLC (putStrLn)
9−import Control.Exception (SomeException, catch)
12−import qualified Crypto.Random.AESCtr as RNG (makeSystem)
13−import Network.Azure.ServiceManagement
9+import Network.Azure.ServiceManagement
10+ ( SubscriptionId(SubscriptionId)
14− ( fileReadCertificate
12+ , fileReadCertificate
15 , fileReadPrivateKey
13 , fileReadPrivateKey
22− , SockAddr(SockAddrInet)
29−import Network.BSD (getHostByName, hostAddresses)
37− , onCertificateRequest
45− , defaultParamsClient
47− , clientWantSessionResume
48− , Version(TLS10, TLS11, TLS12)
49− , SessionManager(sessionEstablish, sessionResume, sessionInvalidate)
58−import Network.TLS.Extra
59− ( certificateVerifyChain
62−import Data.Certificate.X509 (X509)
65import Network.SSH.Client.LibSSH2
17import Network.SSH.Client.LibSSH2
@@ -116,68 +68,8 @@ ssh login host port actions = do
116--------------------------------------------------------------------------------
68--------------------------------------------------------------------------------
118tryConnectToAzure :: String -> String -> String -> IO ()
70tryConnectToAzure :: String -> String -> String -> IO ()
119−tryConnectToAzure subscriptionId pathToCert pathToKey = do
71+tryConnectToAzure sid pathToCert pathToKey = do
120 cert <- fileReadCertificate pathToCert
72 cert <- fileReadCertificate pathToCert
121 key <- fileReadPrivateKey pathToKey
73 key <- fileReadPrivateKey pathToKey
122− sessionState <- newIORef undefined
123− let hostname = "management.core.windows.net"
125− runTLS (getDefaultParams sessionState [(cert, Just key)]) hostname port $ \ctx -> do
127− sendData ctx $ BSLC.pack $ concat
128− [ "GET /" ++ subscriptionId ++ "/services/hostedservices HTTP/1.1\r\n"
74+ outp <- azureRequest (SubscriptionId sid) cert key "/services/hostedservices"
129− , "host: " ++ hostname ++ "\r\n"
130− , "content-type: application/xml\r\n"
131− , "x-ms-version: 2010-10-28\r\n"
136− BSLC.putStrLn d
75+ BSLC.putStrLn outp
138−runTLS :: Params -> HostName -> PortNumber -> (Context -> IO a) -> IO ()
139−runTLS params hostname portNumber f = do
140− rng <- RNG.makeSystem
141− he <- getHostByName hostname
142− sock <- socket AF_INET Stream defaultProtocol
143− let sockaddr = SockAddrInet portNumber (head $ hostAddresses he)
144− catch (connect sock sockaddr)
145− (\(e :: SomeException) -> sClose sock >> error ("cannot open socket " ++ show sockaddr ++ " " ++ show e))
146− dsth <- socketToHandle sock ReadWriteMode
147− ctx <- contextNewOnHandle dsth params rng
151−getDefaultParams :: IORef (SessionID, SessionData)
152− -> [(X509, Maybe PrivateKey)]
154−getDefaultParams sessionState certs =
155− updateClientParams setCParams $ setSessionManager (SessionRef sessionState) $ defaultParamsClient
156− { pConnectVersion = TLS10
157− , pAllowedVersions = [TLS10,TLS11,TLS12]
158− , pCiphers = ciphersuite_all
159− , pCertificates = certs
160− , pLogging = logging
161− , onCertificatesRecv = crecv
164− setCParams cparams = cparams { clientWantSessionResume = Nothing
165− , onCertificateRequest = creq
167− logging = defaultLogging
168− { loggingPacketSent = putStrLn . ("debug: >> " ++)
169− , loggingPacketRecv = putStrLn . ("debug: << " ++)
171− crecv = certificateVerifyChain
172− creq _ = return certs
174−data SessionRef = SessionRef (IORef (SessionID, SessionData))
176−instance SessionManager SessionRef where
177− sessionEstablish (SessionRef ref) sid sdata =
178− writeIORef ref (sid,sdata)
179− sessionResume (SessionRef ref) sid = do
180− (s, d) <- readIORef ref
181− if s == sid then return (Just d) else return Nothing
182− sessionInvalidate _ _ =