]> granicus.if.org Git - icinga2/blob - lib/config/configcompiler.hpp
Merge pull request #5181 from leeclemens/rpm-selinux
[icinga2] / lib / config / configcompiler.hpp
1 /******************************************************************************
2  * Icinga 2                                                                   *
3  * Copyright (C) 2012-2017 Icinga Development Team (https://www.icinga.com/)  *
4  *                                                                            *
5  * This program is free software; you can redistribute it and/or              *
6  * modify it under the terms of the GNU General Public License                *
7  * as published by the Free Software Foundation; either version 2             *
8  * of the License, or (at your option) any later version.                     *
9  *                                                                            *
10  * This program is distributed in the hope that it will be useful,            *
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *
13  * GNU General Public License for more details.                               *
14  *                                                                            *
15  * You should have received a copy of the GNU General Public License          *
16  * along with this program; if not, write to the Free Software Foundation     *
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.             *
18  ******************************************************************************/
19
20 #ifndef CONFIGCOMPILER_H
21 #define CONFIGCOMPILER_H
22
23 #include "config/i2-config.hpp"
24 #include "config/expression.hpp"
25 #include "base/debuginfo.hpp"
26 #include "base/registry.hpp"
27 #include "base/initialize.hpp"
28 #include "base/singleton.hpp"
29 #include <boost/function.hpp>
30 #include <iostream>
31 #include <stack>
32
33 typedef union YYSTYPE YYSTYPE;
34 typedef void *yyscan_t;
35
36 namespace icinga
37 {
38
39 struct CompilerDebugInfo
40 {
41         const char *Path;
42
43         int FirstLine;
44         int FirstColumn;
45
46         int LastLine;
47         int LastColumn;
48
49         operator DebugInfo(void) const
50         {
51                 DebugInfo di;
52                 di.Path = Path;
53                 di.FirstLine = FirstLine;
54                 di.FirstColumn = FirstColumn;
55                 di.LastLine = LastLine;
56                 di.LastColumn = LastColumn;
57                 return di;
58         }
59 };
60
61 struct EItemInfo
62 {
63         bool SideEffect;
64         CompilerDebugInfo DebugInfo;
65 };
66
67 enum FlowControlType
68 {
69         FlowControlReturn = 1,
70         FlowControlContinue = 2,
71         FlowControlBreak = 4
72 };
73
74 struct ZoneFragment
75 {
76         String Tag;
77         String Path;
78 };
79
80 /**
81  * The configuration compiler can be used to compile a configuration file
82  * into a number of configuration items.
83  *
84  * @ingroup config
85  */
86 class I2_CONFIG_API ConfigCompiler
87 {
88 public:
89         explicit ConfigCompiler(const String& path, std::istream *input,
90             const String& zone = String(), const String& package = String());
91         virtual ~ConfigCompiler(void);
92
93         Expression *Compile(void);
94
95         static Expression *CompileStream(const String& path, std::istream *stream,
96             const String& zone = String(), const String& package = String());
97         static Expression *CompileFile(const String& path, const String& zone = String(),
98             const String& package = String());
99         static Expression *CompileText(const String& path, const String& text,
100             const String& zone = String(), const String& package = String());
101
102         static void AddIncludeSearchDir(const String& dir);
103
104         const char *GetPath(void) const;
105
106         void SetZone(const String& zone);
107         String GetZone(void) const;
108         
109         void SetPackage(const String& package);
110         String GetPackage(void) const;
111
112         static void CollectIncludes(std::vector<Expression *>& expressions,
113             const String& file, const String& zone, const String& package);
114
115         static Expression *HandleInclude(const String& relativeBase, const String& path, bool search,
116             const String& zone, const String& package, const DebugInfo& debuginfo = DebugInfo());
117         static Expression *HandleIncludeRecursive(const String& relativeBase, const String& path,
118             const String& pattern, const String& zone, const String& package, const DebugInfo& debuginfo = DebugInfo());
119         static Expression *HandleIncludeZones(const String& relativeBase, const String& tag,
120             const String& path, const String& pattern, const String& package, const DebugInfo& debuginfo = DebugInfo());
121
122         size_t ReadInput(char *buffer, size_t max_bytes);
123         void *GetScanner(void) const;
124
125         static std::vector<ZoneFragment> GetZoneDirs(const String& zone);
126         static void RegisterZoneDir(const String& tag, const String& ppath, const String& zoneName);
127
128         static bool HasZoneConfigAuthority(const String& zoneName);
129
130 private:
131         boost::promise<boost::shared_ptr<Expression> > m_Promise;
132
133         String m_Path;
134         std::istream *m_Input;
135         String m_Zone;
136         String m_Package;
137
138         void *m_Scanner;
139
140         static std::vector<String> m_IncludeSearchDirs;
141         static boost::mutex m_ZoneDirsMutex;
142         static std::map<String, std::vector<ZoneFragment> > m_ZoneDirs;
143
144         void InitializeScanner(void);
145         void DestroyScanner(void);
146
147         static void HandleIncludeZone(const String& relativeBase, const String& tag, const String& path, const String& pattern, const String& package, std::vector<Expression *>& expressions);
148
149         static bool IsAbsolutePath(const String& path);
150
151 public:
152         bool m_Eof;
153         int m_OpenBraces;
154
155         std::ostringstream m_LexBuffer;
156         CompilerDebugInfo m_LocationBegin;
157
158         std::stack<bool> m_IgnoreNewlines;
159         std::stack<bool> m_Apply;
160         std::stack<bool> m_ObjectAssign;
161         std::stack<bool> m_SeenAssign;
162         std::stack<bool> m_SeenIgnore;
163         std::stack<Expression *> m_Assign;
164         std::stack<Expression *> m_Ignore;
165         std::stack<String> m_FKVar;
166         std::stack<String> m_FVVar;
167         std::stack<Expression *> m_FTerm;
168         std::stack<int> m_FlowControlInfo;
169 };
170
171 }
172
173 #endif /* CONFIGCOMPILER_H */