-
Notifications
You must be signed in to change notification settings - Fork 0
/
Settings.cpp
129 lines (103 loc) · 3.35 KB
/
Settings.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/**
* This is free and unencumbered software released into the public domain.
**/
#include "Settings.h"
#include "Miner.h"
#include <boost/program_options.hpp>
#include <map>
#include <fstream>
#include <cassert>
#include <iostream>
using namespace std;
namespace BoostProgOpt = boost::program_options;
static BoostProgOpt::variables_map _varMap;
#define OPT_HELP "help"
#define OPT_DEBUG "debug"
#define OPT_CONFIG "config"
#define OPT_TYPE "type"
#define OPT_BLOCKS "blocks"
#define OPT_RPCHOST "rpchost"
#define OPT_RPCPORT "rpcport"
#define OPT_RPCPASSWORD "rpcpassword"
#define OPT_RPCUSER "rpcuser"
void Settings::init( int argc, char** argv )
{
BoostProgOpt::options_description generalOptions( "General Options" );
generalOptions.add_options()
(OPT_HELP",h", "Print this help.")
(OPT_DEBUG",d", "Show debug output.")
(OPT_CONFIG",c", BoostProgOpt::value<string>()->default_value(defaultConfigFile()), "Bitcoin Core configuration file to load.")
(OPT_TYPE",t", BoostProgOpt::value<string>()->default_value("cpu"), typeHelpText().c_str())
(OPT_BLOCKS",n", BoostProgOpt::value<int>()->default_value(0), "Number of blocks to mine (0 = unlimited).")
;
BoostProgOpt::options_description coreOptions( "Bitcoin Core Options" );
coreOptions.add_options()
(OPT_RPCHOST, BoostProgOpt::value<string>()->default_value("http://localhost"))
(OPT_RPCPORT, BoostProgOpt::value<int>()->default_value(18332))
(OPT_RPCPASSWORD, BoostProgOpt::value<string>())
(OPT_RPCUSER, BoostProgOpt::value<string>())
;
BoostProgOpt::options_description allOptions;
allOptions.add(generalOptions).add(coreOptions);
// Read all recognized options from command line
BoostProgOpt::store( BoostProgOpt::parse_command_line(argc,argv,allOptions), _varMap );
BoostProgOpt::notify( _varMap );
if( _varMap.count(OPT_HELP) )
{
cout << allOptions;
exit( 0 );
}
// Read settings from configuration file, ignoring unknown settings
const auto& configFile = _varMap[OPT_CONFIG].as<string>();
BoostProgOpt::store( BoostProgOpt::parse_config_file<char>(configFile.c_str(),coreOptions,true), _varMap );
BoostProgOpt::notify( _varMap );
}
std::string Settings::RpcHost()
{
return _varMap[OPT_RPCHOST].as<string>();
}
int Settings::RpcPort()
{
return _varMap[OPT_RPCPORT].as<int>();
}
std::string Settings::RpcUser()
{
return _varMap[OPT_RPCUSER].as<string>();
}
std::string Settings::RpcPassword()
{
return _varMap[OPT_RPCPASSWORD].as<string>();
}
std::string Settings::defaultConfigFile()
{
std::string home = getenv( "HOME" );
return home + "/.bitcoin/bitcoin.conf";
}
std::string Settings::typeHelpText()
{
auto types = Miner::types();
if( types.size() < 1 )
{
throw std::runtime_error( "No kernel implementations are registered" );
}
std::string helpText( "Hashing kernel implementation type. Possible values are" );
for( auto& typeName : types )
{
helpText.append( " \"" ).append( typeName ).append( "\"," );
}
helpText.pop_back();
helpText.append( "." );
return helpText;
}
const std::string& Settings::minerType()
{
return _varMap[OPT_TYPE].as<std::string>();
}
bool Settings::debug()
{
return _varMap.count( OPT_DEBUG );
}
int Settings::numBlocks()
{
return _varMap[OPT_BLOCKS].as<int>();
}