Safe Haskell | None |
---|
Implementation of the Ganeti Unix Domain Socket JSON server interface.
- withTimeout :: Int -> String -> IO a -> IO a
- data RecvResult
- = RecvConnClosed
- | RecvError String
- | RecvOk String
- eOM :: Word8
- bEOM :: ByteString
- data MsgKeys
- strOfKey :: MsgKeys -> String
- data ServerConfig = ServerConfig {}
- data ConnectConfig = ConnectConfig {}
- data Client = Client {
- rsocket :: Handle
- wsocket :: Handle
- rbuf :: IORef ByteString
- clientConfig :: ConnectConfig
- data Server = Server {
- sSocket :: Socket
- sPath :: FilePath
- serverConfig :: ConnectConfig
- openClientSocket :: Int -> FilePath -> IO Handle
- closeClientSocket :: Handle -> IO ()
- openServerSocket :: FilePath -> IO Socket
- closeServerSocket :: Socket -> FilePath -> IO ()
- acceptSocket :: Socket -> IO Handle
- connectClient :: ConnectConfig -> Int -> FilePath -> IO Client
- connectServer :: ServerConfig -> Bool -> FilePath -> IO Server
- pipeClient :: ConnectConfig -> IO (Client, Client)
- closeServer :: MonadBase IO m => Server -> m ()
- acceptClient :: Server -> IO Client
- closeClient :: Client -> IO ()
- clientToFd :: Client -> IO (Fd, Fd)
- sendMsg :: Client -> String -> IO ()
- recvUpdate :: ConnectConfig -> Handle -> ByteString -> IO (ByteString, ByteString)
- recvMsg :: Client -> IO String
- recvMsgExt :: Client -> IO RecvResult
- buildCall :: (JSON mth, JSON args) => mth -> args -> String
- parseCall :: (JSON mth, JSON args) => String -> Result (mth, args)
- buildResponse :: Bool -> JSValue -> String
- decodeError :: JSValue -> ErrorResult JSValue
- parseResponse :: String -> ErrorResult JSValue
- logMsg :: (Show e, JSON e, MonadLog m) => Handler i m o -> i -> GenericResult e JSValue -> m ()
- prepareMsg :: JSON e => GenericResult e JSValue -> (Bool, JSValue)
- type HandlerResult m o = m (Bool, GenericResult GanetiException o)
- data Handler i m o = Handler {
- hParse :: JSValue -> JSValue -> Result i
- hInputLogShort :: i -> String
- hInputLogLong :: i -> String
- hExec :: i -> HandlerResult m o
- handleJsonMessage :: (JSON o, Monad m) => Handler i m o -> i -> HandlerResult m JSValue
- handleRawMessage :: (JSON o, MonadLog m) => Handler i m o -> String -> m (Bool, String)
- isRisky :: RecvResult -> Bool
- handleClient :: (JSON o, MonadBase IO m, MonadLog m) => Handler i m o -> Client -> m Bool
- clientLoop :: (JSON o, MonadBase IO m, MonadLog m) => Handler i m o -> Client -> m ()
- listener :: (JSON o, MonadBaseControl IO m, MonadLog m) => Handler i m o -> Server -> m ()
Utility functions
withTimeout :: Int -> String -> IO a -> IO aSource
Generic protocol functionality
data RecvResult Source
Result of receiving a message from the socket.
RecvConnClosed | Connection closed |
RecvError String | Any other error |
RecvOk String | Successfull receive |
Eq RecvResult | |
Show RecvResult |
A client encapsulation. Note that it has separate read and write handle. For sockets it is the same handle. It is required for bi-directional inter-process pipes though.
Client | |
|
A server encapsulation.
Server | |
|
Unix sockets
:: Int | connection timeout |
-> FilePath | socket path |
-> IO Handle |
Creates a Unix socket and connects it to the specified path
,
where timeout
specifies the connection timeout.
closeClientSocket :: Handle -> IO ()Source
Closes the handle. Performing the operation on a handle that has already been closed has no effect; doing so is not an error. All other operations on a closed handle will fail.
openServerSocket :: FilePath -> IO SocketSource
Creates a Unix socket and binds it to the specified path
.
closeServerSocket :: Socket -> FilePath -> IO ()Source
acceptSocket :: Socket -> IO HandleSource
Client and server
:: ConnectConfig | configuration for the client |
-> Int | connection timeout |
-> FilePath | socket path |
-> IO Client |
Connects to the master daemon and returns a Client.
connectServer :: ServerConfig -> Bool -> FilePath -> IO ServerSource
Creates and returns a server endpoint.
pipeClient :: ConnectConfig -> IO (Client, Client)Source
Creates a new bi-directional client pipe. The two returned clients talk to each other through the pipe.
closeServer :: MonadBase IO m => Server -> m ()Source
Closes a server endpoint.
acceptClient :: Server -> IO ClientSource
Accepts a client
closeClient :: Client -> IO ()Source
Closes the client socket. Performing the operation on a client that has already been closed has no effect; doing so is not an error. All other operations on a closed client will fail with an exception.
clientToFd :: Client -> IO (Fd, Fd)Source
Extracts the read (the first) and the write (the second) file descriptor
of a client. This closes the underlying Handle
s, therefore the original
client is closed and unusable after the call.
The purpose of this function is to keep the communication channel open,
while replacing a Client
with some other means.
recvUpdate :: ConnectConfig -> Handle -> ByteString -> IO (ByteString, ByteString)Source
recvMsgExt :: Client -> IO RecvResultSource
Extended wrapper over recvMsg.
:: (JSON mth, JSON args) | |
=> mth | The method |
-> args | The arguments |
-> String | The serialized form |
Serialize a request to String.
parseCall :: (JSON mth, JSON args) => String -> Result (mth, args)Source
Parse the required keys out of a call.
:: Bool | Success |
-> JSValue | The arguments |
-> String | The serialized form |
Serialize the response to String.
decodeError :: JSValue -> ErrorResult JSValueSource
parseResponse :: String -> ErrorResult JSValueSource
Check that luxi responses contain the required keys and that the call was successful.
logMsg :: (Show e, JSON e, MonadLog m) => Handler i m o -> i -> GenericResult e JSValue -> m ()Source
prepareMsg :: JSON e => GenericResult e JSValue -> (Bool, JSValue)Source
Processing client requests
type HandlerResult m o = m (Bool, GenericResult GanetiException o)Source
Handler | |
|
handleJsonMessage :: (JSON o, Monad m) => Handler i m o -> i -> HandlerResult m JSValueSource
handleRawMessage :: (JSON o, MonadLog m) => Handler i m o -> String -> m (Bool, String)Source
isRisky :: RecvResult -> BoolSource
handleClient :: (JSON o, MonadBase IO m, MonadLog m) => Handler i m o -> Client -> m BoolSource
clientLoop :: (JSON o, MonadBase IO m, MonadLog m) => Handler i m o -> Client -> m ()Source