1 /*******************************************************************************
2 
3     Support for unix socket command handling.
4 
5     Copyright:
6         Copyright (c) 2018 dunnhumby Germany GmbH.
7         All rights reserved.
8 
9     License:
10         Boost Software License Version 1.0. See LICENSE_BOOST.txt for details.
11         Alternatively, this file may be distributed under the terms of the Tango
12         3-Clause BSD License (see LICENSE_BSD.txt for details).
13 
14 *******************************************************************************/
15 
16 module ocean.application.components.UnixSocketCommands;
17 
18 /// ditto
19 public class UnixSocketCommands
20 {
21     import ocean.meta.types.Qualifiers;
22     import ocean.core.Enforce;
23     import ocean.io.select.EpollSelectDispatcher;
24     import ocean.text.convert.Integer;
25     import ocean.text.util.StringC;
26     import ocean.util.config.ConfigParser;
27     import ocean.net.server.unix.CommandRegistry;
28     import ocean.net.server.unix.UnixListener;
29 
30     /// Path to create the unix socket.
31     private istring path;
32 
33     /// Mode to apply to the unix socket after binding
34     private int mode = -1;
35 
36     /// Command registry to handle the commands from the client
37     public CommandsRegistry commands;
38 
39     /// Handler delegate
40     public alias CommandsRegistry.Handler Handler;
41 
42     /// Interactive handler delegate
43     public alias CommandsRegistry.InteractiveHandler InteractiveHandler;
44 
45     /// RawSocketHandler delegate
46     public alias CommandsRegistry.RawSocketHandler RawSocketHandler;
47 
48     /// Unix listener with dynamic command handling.
49     private UnixSocketListener!(CommandsRegistry) unix_listener;
50 
51     /***************************************************************************
52 
53         Constructor
54 
55     ***************************************************************************/
56 
57     public this ( )
58     {
59         this.commands = new CommandsRegistry;
60     }
61 
62     /***************************************************************************
63 
64         Initializes the socket listener and registers it with the provided epoll
65         selector.
66 
67         Params:
68             epoll = Epoll instance.
69 
70     ***************************************************************************/
71 
72     public void startEventHandling ( EpollSelectDispatcher epoll )
73     {
74         if (this.path.length)
75         {
76             this.unix_listener = new UnixSocketListener!(CommandsRegistry)
77                 (this.path, epoll, this.commands, this.mode);
78             epoll.register(this.unix_listener);
79         }
80     }
81 
82     /***************************************************************************
83 
84         Setup the unix socket listener if the config for the socket path exists.
85 
86         Params:
87             config = configuration instance
88 
89     ***************************************************************************/
90 
91     public void parseConfig ( ConfigParser config )
92     {
93         this.path = config.get("UNIX_SOCKET", "path", "");
94 
95         istring modestr = config.get("UNIX_SOCKET", "mode", "");
96         if (modestr.length)
97         {
98             enforce(toInteger(modestr, this.mode, 8),
99                     "Invalid mode for UnixSocket");
100         }
101     }
102 
103     /***************************************************************************
104 
105         Shut down the unix listener.
106 
107     ***************************************************************************/
108 
109     public void shutdown ( )
110     {
111         if (this.unix_listener !is null)
112             this.unix_listener.shutdown();
113     }
114 }