00001 #ifndef __rconfig_h__
00002 #define __rconfig_h__
00003
00004 #include <iostream>
00005 #include <fstream>
00006 #include <string>
00007 #include <vector>
00008 #include <map>
00009
00010 #include "asserts.h"
00011 #include "types.h"
00012 #include "tstamp.h"
00013
00014
00015
00016 class parser;
00017 class parse_job;
00018
00019
00020
00021
00022
00023 class archive_path_element
00024 {
00025 public:
00026 enum element_type {
00027 jobname,
00028 groupname,
00029 hostname,
00030 pathname,
00031 permutation,
00032 literal
00033 };
00034
00035 void clear(void);
00036
00037 archive_path_element();
00038 archive_path_element(const archive_path_element& a_class);
00039 archive_path_element(const element_type& a_enum);
00040 archive_path_element(const std::string& a_str);
00041
00042 void assign(const archive_path_element& a_class);
00043 void assign(const element_type& a_enum);
00044 void assign(const std::string& a_str);
00045
00046 const element_type& type(void) const;
00047 const std::string& value(void) const;
00048 const std::string str(void) const;
00049
00050 archive_path_element& operator=(const archive_path_element& a_class);
00051 archive_path_element& operator=(const element_type a_enum);
00052 archive_path_element& operator=(const std::string& a_str);
00053
00054 private:
00055 element_type m_type;
00056 std::string m_literal;
00057 };
00058
00059
00060
00061
00062
00063 class archive_path : public std::vector<archive_path_element>
00064 {
00065 public:
00066 typedef std::vector<archive_path_element> type;
00067
00068 void reset(void);
00069
00070 archive_path();
00071 archive_path(const archive_path& a_class);
00072 archive_path(const archive_path_element& a_class);
00073 archive_path(const std::string& a_class);
00074
00075 void push_back(const archive_path& a_class);
00076 void push_back(const archive_path_element& a_class);
00077 void push_back(const std::string& a_str);
00078
00079 void assign(const archive_path& a_class);
00080 void assign(const archive_path_element& a_class);
00081 void assign(const std::string& a_str);
00082
00083 const std::string str(void) const;
00084
00085 archive_path& operator=(const archive_path& a_class);
00086 archive_path& operator=(const archive_path_element& a_class);
00087 archive_path& operator=(const std::string& a_str);
00088
00089 private:
00090 };
00091
00092
00093
00094
00095 class rsync_behavior
00096 {
00097 public:
00098 enum behavior_type {
00099 quit,
00100 fail,
00101 retry,
00102 retry_without_hardlinks,
00103 ok
00104 };
00105 typedef behavior_type value_type;
00106 typedef std::map<uint16, value_type> map_type;
00107 static const uint16 default_behavior = ((uint16)-1);
00108
00109 void clear(void);
00110 void reset(void);
00111
00112 rsync_behavior();
00113 rsync_behavior(const rsync_behavior& a_class);
00114
00115 void assign(const uint16 a_code, const value_type a_action);
00116 void assign(const rsync_behavior& a_class);
00117 void assign(const std::string& a_str);
00118
00119 const value_type operator[](const uint16 a_code) const;
00120 value_type& operator[](const uint16 a_code);
00121 rsync_behavior& operator=(const rsync_behavior& a_class);
00122 rsync_behavior& operator=(const value_type a_enum);
00123 rsync_behavior& operator=(const std::string& a_str);
00124
00125 const value_type default_value(void) const;
00126 const map_type& map_value(void) const;
00127
00128 private:
00129 map_type m_map;
00130 value_type m_default;
00131 };
00132
00133 class configuration_manager;
00134
00135
00136 class job
00137 {
00138 public:
00139 enum rsync_connection_type {
00140 connection_remote,
00141 connection_local,
00142 connection_server
00143 };
00144 enum rsync_behavior_type {
00145 behavior_ok,
00146 behavior_fail,
00147 behavior_retry,
00148 behavior_retry_without_hardlinks
00149 };
00150 typedef std::vector<std::string> excludes_type;
00151 typedef std::vector<std::string> includes_type;
00152 typedef std::vector<std::string> paths_type;
00153
00154 job();
00155 job(const job& a_job);
00156
00157 void clear(void);
00158 void assign(const job& a_job);
00159
00160 job& operator=(const job& a_job);
00161
00162 std::string default_config_path;
00163 uint16 default_config_line;
00164 std::string config_path;
00165 uint16 config_line;
00166 class archive_path archive_path;
00167 excludes_type excludes;
00168 includes_type includes;
00169 std::string groupname;
00170 std::string hostname;
00171 std::string jobname;
00172 paths_type paths;
00173 class rsync_behavior rsync_behavior;
00174 rsync_connection_type rsync_connection;
00175 bool rsync_hardlink;
00176 bool rsync_multi_hardlink;
00177 uint16 rsync_multi_hardlink_max;
00178 std::string rsync_options;
00179 std::string rsync_remote_user;
00180 std::string rsync_remote_path;
00181 std::string rsync_remote_module;
00182 uint16 rsync_remote_port;
00183 uint16 rsync_retry_count;
00184 uint16 rsync_retry_delay;
00185 uint16 rsync_timeout;
00186
00187 const std::string generate_archive_path(const std::string& a_path) const;
00188 const std::string generate_source_path(const std::string& a_path) const;
00189 const std::string generate_job_id(void) const;
00190 const std::vector<std::string> generate_rsync_options_vector(void) const;
00191 const std::string common_pathname(void) const;
00192 void check(void);
00193
00194 private:
00195
00196 friend class parser;
00197 };
00198
00199
00200 class configuration_manager
00201 {
00202 public:
00203 enum action_type {
00204 action_help,
00205 action_version,
00206 action_archive,
00207 action_relink,
00208 action_check_config
00209 };
00210 enum cfgfile_type {
00211 config_file,
00212 job_file,
00213 };
00214 enum overflow_type {
00215 overflow_quit,
00216 overflow_delete_oldest,
00217 overflow_delete_until_free
00218 };
00219 enum selection_type {
00220 selection_round_robin,
00221 selection_max_free
00222 };
00223 enum logging_type {
00224 logging_manager,
00225 logging_child,
00226 logging_rsync
00227 };
00228 typedef std::pair<cfgfile_type, std::string> cfgfile_element;
00229 typedef class std::vector<cfgfile_element> cfgfiles_type;
00230 typedef std::vector<job> jobs_type;
00231 typedef std::vector<std::string> vaults_type;
00232
00233 void clear(void);
00234
00235 configuration_manager();
00236
00237 void init(int argc, char const *argv[]);
00238 void check(void) const;
00239 const bool initialized(void) const;
00240
00241 const action_type action(void) const;
00242 const bool use_default(void) const;
00243 void default_file(const std::string& a_path);
00244 const std::string& default_file(void) const;
00245 void default_logdir(const std::string& a_path);
00246 const class timestamp& timestamp(void) const;
00247 const std::string& link_catalog_dir(void) const;
00248 const std::string& log_dir(void) const;
00249 const bool delete_old_log_files(void) const;
00250 const bool delete_old_report_files(void) const;
00251 const std::string& rsync_local_path(void) const;
00252 const uint16& rsync_parallel(void) const;
00253 const uint16& io_poll_interval(void) const;
00254 const timestamp::resolution_type timestamp_resolution(void) const;
00255 const vaults_type& vaults(void) const;
00256 const overflow_type& vault_overflow_behavior(void) const;
00257 const uint16& vault_overflow_blocks(void) const;
00258 const uint16& vault_overflow_inodes(void) const;
00259 const selection_type& vault_selection_behavior(void) const;
00260 const bool vault_locking(void) const;
00261 const job& default_job(void) const;
00262 const jobs_type& jobs(void) const;
00263 const logging_type& logging_level(void) const;
00264 const logging_type& error_logging_level(void) const;
00265
00266 private:
00267 bool m_initialized;
00268 uint16 m_configs_read;
00269 std::string m_default_file;
00270 action_type m_action;
00271 bool m_default;
00272 class timestamp m_timestamp;
00273 cfgfiles_type m_cfgfiles;
00274 std::string m_link_catalog_dir;
00275 std::string m_log_dir;
00276 std::string m_rsync_local_path;
00277 uint16 m_rsync_parallel;
00278 uint16 m_io_poll_interval;
00279 std::vector<std::string> m_vaults;
00280 overflow_type m_vault_overflow_behavior;
00281 uint16 m_vault_overflow_blocks;
00282 uint16 m_vault_overflow_inodes;
00283 selection_type m_vault_selection_behavior;
00284 bool m_vault_locking;
00285 bool m_delete_old_log_files;
00286 bool m_delete_old_report_files;
00287 job m_default_job;
00288 jobs_type m_jobs;
00289 logging_type m_logging_level;
00290 logging_type m_error_logging_level;
00291
00292 friend class global_parser;
00293 friend class job_parser;
00294
00295 void read_config(const std::string& a_path);
00296 void read_job(const std::string& a_path);
00297 };
00298
00299 void parse_line(
00300 std::istream& a_in,
00301 std::string& a_keyword,
00302 std::string& a_value
00303 );
00304
00305
00306
00307
00308 class global_parser
00309 {
00310 public:
00311 global_parser(
00312 const std::string& a_path,
00313 uint16& a_line,
00314 std::istream& a_in
00315 );
00316
00317 private:
00318 const std::string* m_path;
00319 std::istream* m_in;
00320 uint16* m_line;
00321
00322 const std::string location(void);
00323 void read_config(const std::string& a_path);
00324 void read_job(const std::string& a_path, job& a_job);
00325
00326 void parse(void);
00327 void parse_default(const std::string& a_value);
00328 void parse_include(const std::string& a_value);
00329 void parse_include_job(const std::string& a_value);
00330 void parse_job(const std::string& a_value);
00331 void parse_link_catalog_dir(const std::string& a_value);
00332 void parse_log_dir(const std::string& a_value);
00333 void parse_delete_old_log_files(const std::string& a_value);
00334 void parse_delete_old_report_files(const std::string& a_value);
00335 void parse_logging_level(const std::string& a_value);
00336 void parse_error_logging_level(const std::string& a_value);
00337 void parse_rsync_local_path(const std::string& a_value);
00338 void parse_rsync_parallel(const std::string& a_value);
00339 void parse_io_poll_interval(const std::string& a_value);
00340 void parse_timestamp_resolution(const std::string& a_value);
00341 void parse_vault(const std::string& a_value);
00342 void parse_vault_overflow_behavior(const std::string& a_value);
00343 void parse_vault_overflow_blocks(const std::string& a_value);
00344 void parse_vault_overflow_inodes(const std::string& a_value);
00345 void parse_vault_selection_behavior(const std::string& a_value);
00346 void parse_vault_locking(const std::string& a_value);
00347 };
00348
00349
00350
00351
00352 class job_parser
00353 {
00354 public:
00355 job_parser(
00356 job * a_job,
00357 const std::string& a_path,
00358 uint16& a_line,
00359 std::istream& a_in,
00360 const std::string& a_block_delimiter,
00361 const bool a_default_context
00362 );
00363
00364 private:
00365 job* m_job;
00366 const std::string* m_path;
00367 std::istream* m_in;
00368 uint16* m_line;
00369 const std::string* m_delimiter;
00370 bool m_default_context;
00371
00372 const std::string location(void);
00373 void read_job(const std::string& a_path);
00374
00375 void parse(void);
00376 void parse_archive_path(const std::string& a_value);
00377 void parse_clear(const std::string& a_value);
00378 void parse_exclude_from(const std::string& a_value);
00379 void parse_include_from(const std::string& a_value);
00380 void parse_groupname(const std::string& a_value);
00381 void parse_hostname(const std::string& a_value);
00382 void parse_include(const std::string& a_value);
00383 void parse_jobname(const std::string& a_value);
00384 void parse_path(const std::string& a_value);
00385 void parse_rsync_behavior(const std::string& a_value);
00386 void parse_rsync_connection_type(const std::string& a_value);
00387 void parse_rsync_hardlink(const std::string& a_value);
00388 void parse_rsync_multi_hardlink(const std::string& a_value);
00389 void parse_rsync_multi_hardlink_max(const std::string& a_value);
00390 void parse_rsync_options(const std::string& a_value);
00391 void parse_rsync_options_context(const std::string& a_value);
00392 void parse_rsync_remote_user(const std::string& a_value);
00393 void parse_rsync_remote_path(const std::string& a_value);
00394 void parse_rsync_remote_port(const std::string& a_value);
00395 void parse_rsync_remote_module(const std::string& a_value);
00396 void parse_rsync_retry_count(const std::string& a_value);
00397 void parse_rsync_retry_delay(const std::string& a_value);
00398 void parse_rsync_timeout(const std::string& a_value);
00399 };
00400
00401 extern configuration_manager config;
00402
00403 #endif