Subversion Repositories HomeAutomation

Rev

Rev 1601 | Rev 1619 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed

Rev 1601 Rev 1609
1
/*
1
/*
2
 *
2
 *
3
 *  Copyright (C) 2010  Mattias Runge
3
 *  Copyright (C) 2010  Mattias Runge
4
 *
4
 *
5
 *  This program is free software; you can redistribute it and/or modify
5
 *  This program is free software; you can redistribute it and/or modify
6
 *  it under the terms of the GNU General Public License as published by
6
 *  it under the terms of the GNU General Public License as published by
7
 *  the Free Software Foundation; either version 2 of the License, or
7
 *  the Free Software Foundation; either version 2 of the License, or
8
 *  (at your option) any later version.
8
 *  (at your option) any later version.
9
 *
9
 *
10
 *  This program is distributed in the hope that it will be useful,
10
 *  This program is distributed in the hope that it will be useful,
11
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 *  GNU General Public License for more details.
13
 *  GNU General Public License for more details.
14
 *
14
 *
15
 *  You should have received a copy of the GNU General Public License along
15
 *  You should have received a copy of the GNU General Public License along
16
 *  with this program; if not, write to the Free Software Foundation, Inc.,
16
 *  with this program; if not, write to the Free Software Foundation, Inc.,
17
 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17
 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18
 *
18
 *
19
 */
19
 */
20
 
20
 
21
#include "Manager.h"
21
#include "Manager.h"
22
 
22
 
23
#include <iostream>
23
#include <iostream>
24
#include <fstream>
24
#include <fstream>
25
 
25
 
26
#include <boost/filesystem.hpp>
26
#include <boost/filesystem.hpp>
27
 
27
 
28
namespace atom {
28
namespace atom {
29
namespace config {
29
namespace config {
30
 
30
 
31
Manager::Pointer Manager::instance_;
31
Manager::Pointer Manager::instance_;
32
 
32
 
33
Manager::Manager() : command_line_("Command line options"), configuration_file_("Configuration file options")
33
Manager::Manager() : command_line_("Command line options"), configuration_file_("Configuration file options")
34
{
34
{
35
    std::string default_config_file = "/etc/atom.conf";
35
    std::string default_config_file = "/etc/atom.conf";
36
   
36
   
37
    if (!boost::filesystem::exists(default_config_file))
37
    if (!boost::filesystem::exists(default_config_file))
38
    {
38
    {
39
        default_config_file = "atom.conf";
39
        default_config_file = "atom.conf";
40
    }
40
    }
41
 
41
 
42
    this->configuration_file_.add_options()
42
    this->configuration_file_.add_options()
43
    ("MonitorPort", boost::program_options::value<int>()->default_value(1201), "TCP port to open for monitor output")
43
    ("MonitorPort", boost::program_options::value<int>()->default_value(1201), "TCP port to open for monitor output")
44
    ("CommandPort", boost::program_options::value<int>()->default_value(1202), "TCP port to open for command input")
44
    ("CommandPort", boost::program_options::value<int>()->default_value(1202), "TCP port to open for command input")
45
    ("LogFile",     boost::program_options::value<std::string>(),              "File to log output to")
45
    ("LogFile",     boost::program_options::value<std::string>(),              "File to log output to")
46
    ("LogLevel",    boost::program_options::value<int>()->default_value(4),    "Level of logging")
46
    ("LogLevel",    boost::program_options::value<int>()->default_value(4),    "Level of logging")
47
    ("ScriptPath",  boost::program_options::value<std::string>(),              "Path to where the scripts are")
47
    ("ScriptPath",  boost::program_options::value<std::string>(),              "Path to where the scripts are")
48
    ("ProtocolFile",boost::program_options::value<std::string>(),              "File to read the protocol form")
48
    ("ProtocolFile",boost::program_options::value<std::string>(),              "File to read the protocol form")
49
    ("CanNet",      boost::program_options::value<type::StringList>(),         "Information on where to locate the CAN networks");
49
    ("CanNet",      boost::program_options::value<type::StringList>(),         "Information on where to locate the CAN networks")
-
 
50
    ("Legacy",                                                                 "Start legacy VM environment");
50
 
51
 
51
    this->command_line_.add_options()
52
    this->command_line_.add_options()
52
    ("version,v", "print version string")
53
    ("version,v", "print version string")
53
    ("help,h",    "produce help message")
54
    ("help,h",    "produce help message")
54
    ("daemon,d",  "start in daemon mode")
55
    ("daemon,d",  "start in daemon mode")
55
    ("file,f",    boost::program_options::value<std::string>()->default_value(default_config_file), "configuration file");
56
    ("file,f",    boost::program_options::value<std::string>()->default_value(default_config_file), "configuration file");
56
   
57
   
57
    this->command_line_.add(this->configuration_file_);
58
    this->command_line_.add(this->configuration_file_);
58
}
59
}
59
 
60
 
60
Manager::~Manager()
61
Manager::~Manager()
61
{
62
{
62
}
63
}
63
 
64
 
64
Manager::Pointer Manager::Instance()
65
Manager::Pointer Manager::Instance()
65
{
66
{
66
    return Manager::instance_;
67
    return Manager::instance_;
67
}
68
}
68
 
69
 
69
void Manager::Create()
70
void Manager::Create()
70
{
71
{
71
    Manager::instance_ = Manager::Pointer(new Manager());
72
    Manager::instance_ = Manager::Pointer(new Manager());
72
}
73
}
73
 
74
 
74
void Manager::Delete()
75
void Manager::Delete()
75
{
76
{
76
    Manager::instance_.reset();
77
    Manager::instance_.reset();
77
}
78
}
78
 
79
 
79
bool Manager::Set(int argument_count, char** argument_vector)
80
bool Manager::Set(int argument_count, char** argument_vector)
80
{
81
{
81
    try
82
    try
82
    {
83
    {
83
        boost::program_options::store(boost::program_options::command_line_parser(argument_count, argument_vector).options(this->command_line_).run(), this->variable_map_);
84
        boost::program_options::store(boost::program_options::command_line_parser(argument_count, argument_vector).options(this->command_line_).run(), this->variable_map_);
84
    }
85
    }
85
    catch (boost::program_options::unknown_option e)
86
    catch (boost::program_options::unknown_option e)
86
    {
87
    {
87
        std::cerr << e.what() << std::endl;
88
        std::cerr << e.what() << std::endl;
88
        std::cout << this->command_line_ << std::endl;
89
        std::cout << this->command_line_ << std::endl;
89
        return false;
90
        return false;
90
    }
91
    }
91
    catch (boost::program_options::invalid_syntax e)
92
    catch (boost::program_options::invalid_syntax e)
92
    {
93
    {
93
        std::cerr << e.what() << std::endl;
94
        std::cerr << e.what() << std::endl;
94
        std::cout << this->command_line_ << std::endl;
95
        std::cout << this->command_line_ << std::endl;
95
        return false;
96
        return false;
96
    }
97
    }
97
   
98
   
98
    std::ifstream ifs(this->GetAsString("file").c_str());
99
    std::ifstream ifs(this->GetAsString("file").c_str());
99
       
100
       
100
    if (!ifs.is_open())
101
    if (!ifs.is_open())
101
    {
102
    {
102
        std::cerr << "Error: Could not find " << this->GetAsString("file") << std::endl;
103
        std::cerr << "Error: Could not find " << this->GetAsString("file") << std::endl;
103
        return false;
104
        return false;
104
    }
105
    }
105
   
106
   
106
    try
107
    try
107
    {
108
    {
108
        boost::program_options::store(boost::program_options::parse_config_file(ifs, this->configuration_file_), this->variable_map_);
109
        boost::program_options::store(boost::program_options::parse_config_file(ifs, this->configuration_file_), this->variable_map_);
109
    }
110
    }
110
    catch (boost::program_options::unknown_option e)
111
    catch (boost::program_options::unknown_option e)
111
    {
112
    {
112
        ifs.close();
113
        ifs.close();
113
        std::cerr << e.what() << " found in " << this->GetAsString("file") << std::endl;
114
        std::cerr << e.what() << " found in " << this->GetAsString("file") << std::endl;
114
        std::cout << this->configuration_file_ << std::endl;
115
        std::cout << this->configuration_file_ << std::endl;
115
        return false;
116
        return false;
116
    }
117
    }
117
    catch (boost::program_options::invalid_syntax e)
118
    catch (boost::program_options::invalid_syntax e)
118
    {
119
    {
119
        std::cerr << e.what() << " found in " << this->GetAsString("file") << std::endl;
120
        std::cerr << e.what() << " found in " << this->GetAsString("file") << std::endl;
120
        std::cout << this->command_line_ << std::endl;
121
        std::cout << this->command_line_ << std::endl;
121
        return false;
122
        return false;
122
    }
123
    }
123
       
124
       
124
    ifs.close();
125
    ifs.close();
125
   
126
   
126
    if (this->Exist("help"))
127
    if (this->Exist("help"))
127
    {
128
    {
128
        std::cout << this->command_line_ << std::endl;
129
        std::cout << this->command_line_ << std::endl;
129
        return false;
130
        return false;
130
    }
131
    }
131
   
132
   
132
    return true;
133
    return true;
133
}
134
}
134
 
135
 
135
bool Manager::Exist(std::string name)
136
bool Manager::Exist(std::string name)
136
{
137
{
137
    return this->variable_map_.count(name) != 0;
138
    return this->variable_map_.count(name) != 0;
138
}
139
}
139
 
140
 
140
int Manager::GetAsInt(std::string name)
141
int Manager::GetAsInt(std::string name)
141
{
142
{
142
    return this->variable_map_[name].as<int>();
143
    return this->variable_map_[name].as<int>();
143
}
144
}
144
 
145
 
145
std::string Manager::GetAsString(std::string name)
146
std::string Manager::GetAsString(std::string name)
146
{
147
{
147
    return this->variable_map_[name].as<std::string>();
148
    return this->variable_map_[name].as<std::string>();
148
}
149
}
149
 
150
 
150
type::StringList Manager::GetAsStringVector(std::string name)
151
type::StringList Manager::GetAsStringVector(std::string name)
151
{
152
{
152
    return this->variable_map_[name].as<type::StringList>();
153
    return this->variable_map_[name].as<type::StringList>();
153
}
154
}
154
 
155
 
155
 
156
 
156
}; // namespace config
157
}; // namespace config
157
}; // namespace atom
158
}; // namespace atom