Fawkes API  Fawkes Development Version
yaml.h
1 
2 /***************************************************************************
3  * yaml.h - Fawkes configuration stored in one or more YAML files
4  *
5  * Created: Wed Aug 01 15:44:33 2012
6  * Copyright 2006-2012 Tim Niemueller [www.niemueller.de]
7  *
8  ****************************************************************************/
9 
10 /* This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version. A runtime exception applies to
14  * this software (see LICENSE.GPL_WRE file mentioned below for details).
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19  * GNU Library General Public License for more details.
20  *
21  * Read the full text in the LICENSE.GPL_WRE file in the doc directory.
22  */
23 
24 #ifndef _CONFIG_YAML_H_
25 #define _CONFIG_YAML_H_
26 
27 #include <config/config.h>
28 #include <utils/system/fam.h>
29 #include <yaml-cpp/yaml.h>
30 
31 #include <memory>
32 #include <queue>
33 #include <string>
34 #include <vector>
35 
36 namespace fawkes {
37 
38 class Mutex;
39 class FamThread;
40 class YamlConfigurationNode;
41 
42 class YamlConfiguration : public Configuration, public FamListener
43 {
44 public:
46  YamlConfiguration(const char *sysconfdir, const char *userconfdir = NULL);
47  virtual ~YamlConfiguration();
48 
49  virtual void copy(Configuration *copyconf);
50 
51  virtual void load(const char *file_path);
52 
53  virtual bool exists(const char *path);
54  virtual bool is_float(const char *path);
55  virtual bool is_uint(const char *path);
56  virtual bool is_int(const char *path);
57  virtual bool is_bool(const char *path);
58  virtual bool is_string(const char *path);
59  virtual bool is_list(const char *path);
60 
61  virtual bool is_default(const char *path);
62 
63  virtual std::string get_type(const char *path);
64  virtual float get_float(const char *path);
65  virtual unsigned int get_uint(const char *path);
66  virtual int get_int(const char *path);
67  virtual bool get_bool(const char *path);
68  virtual std::string get_string(const char *path);
69  virtual std::vector<float> get_floats(const char *path);
70  virtual std::vector<unsigned int> get_uints(const char *path);
71  virtual std::vector<int> get_ints(const char *path);
72  virtual std::vector<bool> get_bools(const char *path);
73  virtual std::vector<std::string> get_strings(const char *path);
74  virtual ValueIterator * get_value(const char *path);
75  virtual std::string get_comment(const char *path);
76  virtual std::string get_default_comment(const char *path);
77 
78  virtual void set_float(const char *path, float f);
79  virtual void set_uint(const char *path, unsigned int uint);
80  virtual void set_int(const char *path, int i);
81  virtual void set_bool(const char *path, bool b);
82  virtual void set_string(const char *path, std::string &s);
83  virtual void set_string(const char *path, const char *s);
84  virtual void set_floats(const char *path, std::vector<float> &f);
85  virtual void set_uints(const char *path, std::vector<unsigned int> &uint);
86  virtual void set_ints(const char *path, std::vector<int> &i);
87  virtual void set_bools(const char *path, std::vector<bool> &b);
88  virtual void set_strings(const char *path, std::vector<std::string> &s);
89  virtual void set_strings(const char *path, std::vector<const char *> &s);
90  virtual void set_comment(const char *path, std::string &comment);
91  virtual void set_comment(const char *path, const char *comment);
92 
93  virtual void erase(const char *path);
94 
95  virtual void set_default_float(const char *path, float f);
96  virtual void set_default_uint(const char *path, unsigned int uint);
97  virtual void set_default_int(const char *path, int i);
98  virtual void set_default_bool(const char *path, bool b);
99  virtual void set_default_string(const char *path, std::string &s);
100  virtual void set_default_string(const char *path, const char *s);
101  virtual void set_default_comment(const char *path, const char *comment);
102  virtual void set_default_comment(const char *path, std::string &comment);
103 
104  virtual void erase_default(const char *path);
105 
107  ValueIterator *search(const char *path);
108 
109  void lock();
110  bool try_lock();
111  void unlock();
112 
113  virtual void try_dump();
114 
115  virtual void fam_event(const char *filename, unsigned int mask);
116 
117 public:
119  {
120  public:
122  YamlValueIterator(std::map<std::string, std::shared_ptr<YamlConfigurationNode>> &nodes);
123 
124  virtual ~YamlValueIterator()
125  {
126  }
127  virtual bool next();
128  virtual bool valid() const;
129 
130  virtual const char *path() const;
131  virtual const char *type() const;
132 
133  virtual bool is_float() const;
134  virtual bool is_uint() const;
135  virtual bool is_int() const;
136  virtual bool is_bool() const;
137  virtual bool is_string() const;
138  virtual bool is_list() const;
139  virtual size_t get_list_size() const;
140 
141  virtual float get_float() const;
142  virtual unsigned int get_uint() const;
143  virtual int get_int() const;
144  virtual bool get_bool() const;
145  virtual std::string get_string() const;
146  virtual std::vector<float> get_floats() const;
147  virtual std::vector<unsigned int> get_uints() const;
148  virtual std::vector<int> get_ints() const;
149  virtual std::vector<bool> get_bools() const;
150  virtual std::vector<std::string> get_strings() const;
151  virtual std::string get_as_string() const;
152 
153  virtual std::string get_comment() const;
154 
155  virtual bool is_default() const;
156 
157  private:
158  bool first_;
159  std::map<std::string, std::shared_ptr<YamlConfigurationNode>> nodes_;
160  std::map<std::string, std::shared_ptr<YamlConfigurationNode>>::iterator current_;
161  };
162 
163 private:
164  /// @cond INTERNALS
165  class LoadQueueEntry
166  {
167  public:
168  LoadQueueEntry(std::string fn, bool im, bool id = false)
169  : filename(fn), ignore_missing(im), is_dir(id)
170  {
171  }
172 
173  std::string filename;
174  bool ignore_missing;
175  bool is_dir;
176  };
177  /// @endcond
178 
179  std::shared_ptr<YamlConfigurationNode> query(const char *path) const;
180  void
181  read_meta_doc(YAML::Node &doc, std::queue<LoadQueueEntry> &load_queue, std::string &host_file);
182  std::shared_ptr<YamlConfigurationNode> read_config_doc(const YAML::Node &doc);
183  std::shared_ptr<YamlConfigurationNode> read_yaml_file(std::string filename,
184  bool ignore_missing,
185  std::queue<LoadQueueEntry> &load_queue,
186  std::string & host_file);
187  void read_yaml_config(std::string filename,
188  std::string & host_file,
189  std::shared_ptr<YamlConfigurationNode> &root,
190  std::shared_ptr<YamlConfigurationNode> &host_root,
191  std::list<std::string> & files,
192  std::list<std::string> & dirs);
193  void write_host_file();
194 
195  std::string config_file_;
196  std::string host_file_;
197 
198  std::shared_ptr<YamlConfigurationNode> root_;
199  std::shared_ptr<YamlConfigurationNode> host_root_;
200 
201  bool write_pending_;
202  Mutex *write_pending_mutex_;
203 
204 private:
205  Mutex *mutex;
206 
207  typedef std::map<std::string, YAML::Node *> DocMap;
208  mutable DocMap documents_;
209 
210  char *sysconfdir_;
211  char *userconfdir_;
212 
213  FamThread *fam_thread_;
214 };
215 
216 } // end namespace fawkes
217 
218 #endif
fawkes::YamlConfiguration::try_dump
virtual void try_dump()
Definition: yaml.cpp:1152
fawkes::YamlConfiguration::set_floats
virtual void set_floats(const char *path, std::vector< float > &f)
Definition: yaml.cpp:991
fawkes::YamlConfiguration::is_string
virtual bool is_string(const char *path)
Definition: yaml.cpp:896
fawkes::YamlConfiguration::exists
virtual bool exists(const char *path)
Definition: yaml.cpp:723
fawkes::YamlConfiguration::set_default_string
virtual void set_default_string(const char *path, std::string &s)
Definition: yaml.cpp:1093
fawkes::YamlConfiguration::load
virtual void load(const char *file_path)
Definition: yaml.cpp:373
fawkes::YamlConfiguration::YamlValueIterator::is_int
virtual bool is_int() const
Definition: yaml.cpp:137
fawkes::YamlConfiguration::set_int
virtual void set_int(const char *path, int i)
Definition: yaml.cpp:958
fawkes::YamlConfiguration::set_uints
virtual void set_uints(const char *path, std::vector< unsigned int > &uint)
Definition: yaml.cpp:1000
fawkes::YamlConfiguration::YamlValueIterator::is_uint
virtual bool is_uint() const
Definition: yaml.cpp:128
fawkes::YamlConfiguration::YamlValueIterator::is_list
virtual bool is_list() const
Definition: yaml.cpp:164
fawkes::YamlConfiguration::fam_event
virtual void fam_event(const char *filename, unsigned int mask)
Definition: yaml.cpp:534
fawkes::YamlConfiguration::YamlValueIterator::is_default
virtual bool is_default() const
Definition: yaml.cpp:294
fawkes::YamlConfiguration::set_default_comment
virtual void set_default_comment(const char *path, const char *comment)
Definition: yaml.cpp:1099
fawkes::YamlConfiguration::YamlValueIterator::get_ints
virtual std::vector< int > get_ints() const
Definition: yaml.cpp:261
fawkes::YamlConfiguration::YamlValueIterator::get_uints
virtual std::vector< unsigned int > get_uints() const
Definition: yaml.cpp:252
fawkes::YamlConfiguration::YamlConfiguration
YamlConfiguration()
Constructor.
Definition: yaml.cpp:308
fawkes::YamlConfiguration::YamlValueIterator::get_floats
virtual std::vector< float > get_floats() const
Definition: yaml.cpp:243
fawkes::YamlConfiguration::YamlValueIterator
Definition: yaml.h:122
fawkes::YamlConfiguration::get_value
virtual ValueIterator * get_value(const char *path)
Definition: yaml.cpp:924
fawkes::YamlConfiguration::YamlValueIterator::get_int
virtual int get_int() const
Definition: yaml.cpp:203
fawkes::YamlConfiguration::get_ints
virtual std::vector< int > get_ints(const char *path)
Definition: yaml.cpp:829
fawkes::YamlConfiguration::set_strings
virtual void set_strings(const char *path, std::vector< std::string > &s)
Definition: yaml.cpp:1027
fawkes::YamlConfiguration::YamlValueIterator::YamlValueIterator
YamlValueIterator()
Constructor.
Definition: yaml.cpp:68
fawkes::YamlConfiguration::get_uint
virtual unsigned int get_uint(const char *path)
Definition: yaml.cpp:793
fawkes::YamlConfiguration::get_type
virtual std::string get_type(const char *path)
Definition: yaml.cpp:734
fawkes::YamlConfiguration::set_float
virtual void set_float(const char *path, float f)
Definition: yaml.cpp:940
fawkes::YamlConfiguration::YamlValueIterator::next
virtual bool next()
Definition: yaml.cpp:84
fawkes::YamlConfiguration::YamlValueIterator::get_bools
virtual std::vector< bool > get_bools() const
Definition: yaml.cpp:270
fawkes::YamlConfiguration::YamlValueIterator::get_uint
virtual unsigned int get_uint() const
Definition: yaml.cpp:194
fawkes::YamlConfiguration::set_string
virtual void set_string(const char *path, std::string &s)
Definition: yaml.cpp:985
fawkes::Configuration::ValueIterator
Definition: config.h:75
fawkes::Configuration
Definition: config.h:68
fawkes::YamlConfiguration::set_comment
virtual void set_comment(const char *path, std::string &comment)
Definition: yaml.cpp:1050
fawkes::YamlConfiguration::YamlValueIterator::valid
virtual bool valid() const
Definition: yaml.cpp:95
fawkes::YamlConfiguration::set_bool
virtual void set_bool(const char *path, bool b)
Definition: yaml.cpp:967
fawkes::YamlConfiguration::get_strings
virtual std::vector< std::string > get_strings(const char *path)
Definition: yaml.cpp:841
fawkes::YamlConfiguration::is_float
virtual bool is_float(const char *path)
Definition: yaml.cpp:863
fawkes::YamlConfiguration::set_uint
virtual void set_uint(const char *path, unsigned int uint)
Definition: yaml.cpp:949
fawkes::YamlConfiguration::is_list
virtual bool is_list(const char *path)
Definition: yaml.cpp:902
fawkes::YamlConfiguration::get_uints
virtual std::vector< unsigned int > get_uints(const char *path)
Definition: yaml.cpp:823
fawkes::YamlConfiguration::unlock
void unlock()
Unlock the config.
Definition: yaml.cpp:1140
fawkes::YamlConfiguration::get_default_comment
virtual std::string get_default_comment(const char *path)
Definition: yaml.cpp:912
fawkes::YamlConfiguration::YamlValueIterator::get_list_size
virtual size_t get_list_size() const
Definition: yaml.cpp:173
fawkes::YamlConfiguration::YamlValueIterator::get_comment
virtual std::string get_comment() const
Definition: yaml.cpp:288
fawkes::YamlConfiguration::get_int
virtual int get_int(const char *path)
Definition: yaml.cpp:799
fawkes::YamlConfiguration::~YamlConfiguration
virtual ~YamlConfiguration()
Destructor.
Definition: yaml.cpp:352
fawkes
fawkes::YamlConfiguration::YamlValueIterator::is_string
virtual bool is_string() const
Definition: yaml.cpp:155
fawkes::YamlConfiguration::lock
void lock()
Lock the config.
Definition: yaml.cpp:1121
fawkes::YamlConfiguration::get_string
virtual std::string get_string(const char *path)
Definition: yaml.cpp:811
fawkes::YamlConfiguration::get_bools
virtual std::vector< bool > get_bools(const char *path)
Definition: yaml.cpp:835
fawkes::YamlConfiguration::is_int
virtual bool is_int(const char *path)
Definition: yaml.cpp:884
fawkes::YamlConfiguration::is_default
virtual bool is_default(const char *path)
Definition: yaml.cpp:918
fawkes::YamlConfiguration::YamlValueIterator::get_string
virtual std::string get_string() const
Definition: yaml.cpp:221
fawkes::YamlConfiguration::get_bool
virtual bool get_bool(const char *path)
Definition: yaml.cpp:805
fawkes::YamlConfiguration::set_default_float
virtual void set_default_float(const char *path, float f)
Definition: yaml.cpp:1063
fawkes::YamlConfiguration::set_default_int
virtual void set_default_int(const char *path, int i)
Definition: yaml.cpp:1075
fawkes::YamlConfiguration::get_floats
virtual std::vector< float > get_floats(const char *path)
Definition: yaml.cpp:817
fawkes::YamlConfiguration::YamlValueIterator::get_float
virtual float get_float() const
Definition: yaml.cpp:185
fawkes::YamlConfiguration::is_uint
virtual bool is_uint(const char *path)
Definition: yaml.cpp:869
fawkes::YamlConfiguration::search
ValueIterator * search(const char *path)
Definition: yaml.cpp:1165
fawkes::YamlConfiguration::YamlValueIterator::get_as_string
virtual std::string get_as_string() const
Definition: yaml.cpp:230
fawkes::YamlConfiguration::YamlValueIterator::get_bool
virtual bool get_bool() const
Definition: yaml.cpp:212
fawkes::YamlConfiguration::try_lock
bool try_lock()
Try to lock the config.
Definition: yaml.cpp:1131
fawkes::YamlConfiguration::YamlValueIterator::path
virtual const char * path() const
Definition: yaml.cpp:101
fawkes::YamlConfiguration::YamlValueIterator::type
virtual const char * type() const
Definition: yaml.cpp:110
fawkes::YamlConfiguration::get_comment
virtual std::string get_comment(const char *path)
Definition: yaml.cpp:745
fawkes::YamlConfiguration::set_default_uint
virtual void set_default_uint(const char *path, unsigned int uint)
Definition: yaml.cpp:1069
fawkes::YamlConfiguration::set_ints
virtual void set_ints(const char *path, std::vector< int > &i)
Definition: yaml.cpp:1009
fawkes::YamlConfiguration::erase
virtual void erase(const char *path)
Definition: yaml.cpp:1055
fawkes::YamlConfiguration::set_bools
virtual void set_bools(const char *path, std::vector< bool > &b)
Definition: yaml.cpp:1018
fawkes::YamlConfiguration::set_default_bool
virtual void set_default_bool(const char *path, bool b)
Definition: yaml.cpp:1081
fawkes::YamlConfiguration::YamlValueIterator::is_bool
virtual bool is_bool() const
Definition: yaml.cpp:146
fawkes::YamlConfiguration::YamlValueIterator::get_strings
virtual std::vector< std::string > get_strings() const
Definition: yaml.cpp:279
fawkes::YamlConfiguration::is_bool
virtual bool is_bool(const char *path)
Definition: yaml.cpp:890
fawkes::YamlConfiguration::iterator
ValueIterator * iterator()
Definition: yaml.cpp:1157
fawkes::YamlConfiguration::get_float
virtual float get_float(const char *path)
Definition: yaml.cpp:787
fawkes::YamlConfiguration::YamlValueIterator::is_float
virtual bool is_float() const
Definition: yaml.cpp:119
fawkes::YamlConfiguration::copy
virtual void copy(Configuration *copyconf)
Definition: yaml.cpp:717
fawkes::YamlConfiguration::erase_default
virtual void erase_default(const char *path)
Definition: yaml.cpp:1111