root / src / Ganeti / WConfd / Server.hs @ 59881a0b
History | View | Annotate | Download (2.5 kB)
1 | 59881a0b | Petr Pudlak | {-# LANGUAGE TemplateHaskell #-} |
---|---|---|---|
2 | 59881a0b | Petr Pudlak | |
3 | 59881a0b | Petr Pudlak | {-| The implementation of Ganeti WConfd daemon server. |
4 | 59881a0b | Petr Pudlak | |
5 | 59881a0b | Petr Pudlak | As TemplateHaskell require that splices be defined in a separate |
6 | 59881a0b | Petr Pudlak | module, we combine all the TemplateHaskell functionality that HTools |
7 | 59881a0b | Petr Pudlak | needs in this module (except the one for unittests). |
8 | 59881a0b | Petr Pudlak | |
9 | 59881a0b | Petr Pudlak | -} |
10 | 59881a0b | Petr Pudlak | |
11 | 59881a0b | Petr Pudlak | {- |
12 | 59881a0b | Petr Pudlak | |
13 | 59881a0b | Petr Pudlak | Copyright (C) 2013 Google Inc. |
14 | 59881a0b | Petr Pudlak | |
15 | 59881a0b | Petr Pudlak | This program is free software; you can redistribute it and/or modify |
16 | 59881a0b | Petr Pudlak | it under the terms of the GNU General Public License as published by |
17 | 59881a0b | Petr Pudlak | the Free Software Foundation; either version 2 of the License, or |
18 | 59881a0b | Petr Pudlak | (at your option) any later version. |
19 | 59881a0b | Petr Pudlak | |
20 | 59881a0b | Petr Pudlak | This program is distributed in the hope that it will be useful, but |
21 | 59881a0b | Petr Pudlak | WITHOUT ANY WARRANTY; without even the implied warranty of |
22 | 59881a0b | Petr Pudlak | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
23 | 59881a0b | Petr Pudlak | General Public License for more details. |
24 | 59881a0b | Petr Pudlak | |
25 | 59881a0b | Petr Pudlak | You should have received a copy of the GNU General Public License |
26 | 59881a0b | Petr Pudlak | along with this program; if not, write to the Free Software |
27 | 59881a0b | Petr Pudlak | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
28 | 59881a0b | Petr Pudlak | 02110-1301, USA. |
29 | 59881a0b | Petr Pudlak | |
30 | 59881a0b | Petr Pudlak | -} |
31 | 59881a0b | Petr Pudlak | |
32 | 59881a0b | Petr Pudlak | module Ganeti.WConfd.Server where |
33 | 59881a0b | Petr Pudlak | |
34 | 59881a0b | Petr Pudlak | import Control.Exception |
35 | 59881a0b | Petr Pudlak | import Control.Monad |
36 | 59881a0b | Petr Pudlak | import Control.Monad.Error |
37 | 59881a0b | Petr Pudlak | |
38 | 59881a0b | Petr Pudlak | import Ganeti.BasicTypes |
39 | 59881a0b | Petr Pudlak | import Ganeti.Daemon |
40 | 59881a0b | Petr Pudlak | import qualified Ganeti.Path as Path |
41 | 59881a0b | Petr Pudlak | import Ganeti.THH.RPC |
42 | 59881a0b | Petr Pudlak | import Ganeti.UDSServer |
43 | 59881a0b | Petr Pudlak | |
44 | 59881a0b | Petr Pudlak | import Ganeti.Runtime |
45 | 59881a0b | Petr Pudlak | import Ganeti.WConfd.ConfigState |
46 | 59881a0b | Petr Pudlak | import Ganeti.WConfd.Core |
47 | 59881a0b | Petr Pudlak | import Ganeti.WConfd.Monad |
48 | 59881a0b | Petr Pudlak | |
49 | 59881a0b | Petr Pudlak | handler :: DaemonHandle -> RpcServer WConfdMonadInt |
50 | 59881a0b | Petr Pudlak | handler ch = $( mkRpcM exportedFunctions ) |
51 | 59881a0b | Petr Pudlak | |
52 | 59881a0b | Petr Pudlak | |
53 | 59881a0b | Petr Pudlak | -- | Type alias for prepMain results |
54 | 59881a0b | Petr Pudlak | type PrepResult = (Server, DaemonHandle) |
55 | 59881a0b | Petr Pudlak | |
56 | 59881a0b | Petr Pudlak | -- | Check function for luxid. |
57 | 59881a0b | Petr Pudlak | checkMain :: CheckFn () |
58 | 59881a0b | Petr Pudlak | checkMain _ = return $ Right () |
59 | 59881a0b | Petr Pudlak | |
60 | 59881a0b | Petr Pudlak | -- | Prepare function for luxid. |
61 | 59881a0b | Petr Pudlak | prepMain :: PrepFn () PrepResult |
62 | 59881a0b | Petr Pudlak | prepMain _ _ = do |
63 | 59881a0b | Petr Pudlak | socket_path <- Path.defaultWConfdSocket |
64 | 59881a0b | Petr Pudlak | cleanupSocket socket_path |
65 | 59881a0b | Petr Pudlak | s <- describeError "binding to the socket" Nothing (Just socket_path) |
66 | 59881a0b | Petr Pudlak | $ connectServer connectConfig True socket_path |
67 | 59881a0b | Petr Pudlak | -- TODO: Lock the configuration file so that running the daemon twice fails? |
68 | 59881a0b | Petr Pudlak | conf_file <- Path.clusterConfFile |
69 | 59881a0b | Petr Pudlak | |
70 | 59881a0b | Petr Pudlak | dhOpt <- runResultT $ mkDaemonHandle conf_file mkConfigState |
71 | 59881a0b | Petr Pudlak | dh <- withError (strMsg . ("Initialization of the daemon failed" ++) . show) |
72 | 59881a0b | Petr Pudlak | dhOpt |
73 | 59881a0b | Petr Pudlak | |
74 | 59881a0b | Petr Pudlak | return (s, dh) |
75 | 59881a0b | Petr Pudlak | |
76 | 59881a0b | Petr Pudlak | connectConfig :: ConnectConfig |
77 | 59881a0b | Petr Pudlak | connectConfig = ConnectConfig GanetiLuxid 60 60 |
78 | 59881a0b | Petr Pudlak | |
79 | 59881a0b | Petr Pudlak | -- | Main function. |
80 | 59881a0b | Petr Pudlak | main :: MainFn () PrepResult |
81 | 59881a0b | Petr Pudlak | main _ _ (server, dh) = |
82 | 59881a0b | Petr Pudlak | finally |
83 | 59881a0b | Petr Pudlak | (forever $ runWConfdMonadInt (listener (handler dh) server) dh) |
84 | 59881a0b | Petr Pudlak | (liftIO $ closeServer server) |
85 | 59881a0b | Petr Pudlak | |
86 | 59881a0b | Petr Pudlak | |
87 | 59881a0b | Petr Pudlak | -- | Options list and functions. |
88 | 59881a0b | Petr Pudlak | options :: [OptType] |
89 | 59881a0b | Petr Pudlak | options = |
90 | 59881a0b | Petr Pudlak | [ oNoDaemonize |
91 | 59881a0b | Petr Pudlak | , oNoUserChecks |
92 | 59881a0b | Petr Pudlak | , oDebug |
93 | 59881a0b | Petr Pudlak | , oSyslogUsage |
94 | 59881a0b | Petr Pudlak | ] |