Safe Haskell | None |
---|
Ganeti.UDSServer
Contents
Description
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.
Constructors
RecvConnClosed | Connection closed |
RecvError String | Any other error |
RecvOk String | Successfull receive |
Instances
Eq RecvResult | |
Show RecvResult |
data ServerConfig Source
Constructors
ServerConfig | |
Fields |
data ConnectConfig Source
Constructors
ConnectConfig | |
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.
Constructors
Client | |
Fields
|
A server encapsulation.
Constructors
Server | |
Fields
|
Unix sockets
Arguments
:: 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
Arguments
:: 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.
Arguments
:: (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.
Arguments
:: 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
Constructors
Handler | |
Fields
|
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