| 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 Handles, 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