Make distinction between config dir and data dir

pull/1186/head
Stephen Shelton 4 years ago
parent 9e7254f6fa
commit 05257126fe
No known key found for this signature in database
GPG Key ID: EE4BADACCE8B631C

@ -220,7 +220,7 @@ main(int argc, char* argv[])
if (genconfigOnly)
{
llarp::ensureConfig(llarp::GetDefaultConfigDir(),
llarp::ensureConfig(llarp::GetDefaultDataDir(),
llarp::GetDefaultConfigFilename(),
overwrite,
asRouter);
@ -240,7 +240,7 @@ main(int argc, char* argv[])
}
else
{
auto basepath = llarp::GetDefaultConfigDir();
auto basepath = llarp::GetDefaultDataDir();
llarp::LogDebug("Find or create ", basepath.string());
std::error_code ec;
@ -255,7 +255,7 @@ main(int argc, char* argv[])
}
}
llarp::ensureConfig(llarp::GetDefaultConfigDir(),
llarp::ensureConfig(llarp::GetDefaultDataDir(),
llarp::GetDefaultConfigFilename(),
overwrite,
asRouter);

@ -141,12 +141,6 @@ extern "C"
bool
llarp_config_load_file(const char *fname, struct llarp_config **c, bool isRelay);
/// loads config from file by name
/// uses already allocated config
/// return false on failure
bool
llarp_config_read_file(struct llarp_config *c, const char *f, bool isRelay);
/// make a main context from configuration
/// copies config contents
struct llarp_main *

@ -73,7 +73,7 @@ namespace llarp
HandleSignal(int sig);
bool
Configure(bool isRelay);
Configure(bool isRelay, nonstd::optional<fs::path> dataDir);
bool
IsUp() const;

@ -81,7 +81,8 @@ namespace llarp
return val;
}
LoggingConfig::LogType LoggingConfig::LogTypeFromString(const std::string& str)
LoggingConfig::LogType
LoggingConfig::LogTypeFromString(const std::string& str)
{
if (str == "unknown") return LogType::Unknown;
else if (str == "file") return LogType::File;
@ -92,7 +93,7 @@ namespace llarp
}
void
RouterConfig::defineConfigOptions(Configuration& conf, bool isRelay)
RouterConfig::defineConfigOptions(Configuration& conf, const ConfigGenParameters& params)
{
conf.defineOption<int>("router", "job-queue-size", false, m_JobQueueSize,
[this](int arg) {
@ -117,7 +118,7 @@ namespace llarp
m_netId = std::move(arg);
});
int minConnections = (isRelay ? DefaultMinConnectionsForRouter
int minConnections = (params.isRelay ? DefaultMinConnectionsForRouter
: DefaultMinConnectionsForClient);
conf.defineOption<int>("router", "min-connections", false, minConnections,
[=](int arg) {
@ -127,7 +128,7 @@ namespace llarp
m_minConnectedRouters = arg;
});
int maxConnections = (isRelay ? DefaultMaxConnectionsForRouter
int maxConnections = (params.isRelay ? DefaultMaxConnectionsForRouter
: DefaultMaxConnectionsForClient);
conf.defineOption<int>("router", "max-connections", false, maxConnections,
[=](int arg) {
@ -216,9 +217,9 @@ namespace llarp
}
void
NetworkConfig::defineConfigOptions(Configuration& conf, bool isRelay)
NetworkConfig::defineConfigOptions(Configuration& conf, const ConfigGenParameters& params)
{
(void)isRelay;
(void)params;
// TODO: review default value
conf.defineOption<bool>("network", "profiling", false, m_enableProfiling,
@ -240,9 +241,9 @@ namespace llarp
}
void
NetdbConfig::defineConfigOptions(Configuration& conf, bool isRelay)
NetdbConfig::defineConfigOptions(Configuration& conf, const ConfigGenParameters& params)
{
(void)isRelay;
(void)params;
conf.defineOption<std::string>("netdb", "dir", false, m_nodedbDir,
[this](std::string arg) {
@ -251,9 +252,9 @@ namespace llarp
}
void
DnsConfig::defineConfigOptions(Configuration& conf, bool isRelay)
DnsConfig::defineConfigOptions(Configuration& conf, const ConfigGenParameters& params)
{
(void)isRelay;
(void)params;
// TODO: this was previously a multi-value option
conf.defineOption<std::string>("dns", "upstream", false, "",
@ -294,9 +295,9 @@ namespace llarp
}
void
LinksConfig::defineConfigOptions(Configuration& conf, bool isRelay)
LinksConfig::defineConfigOptions(Configuration& conf, const ConfigGenParameters& params)
{
(void)isRelay;
(void)params;
conf.addUndeclaredHandler("bind", [&](string_view, string_view name, string_view value) {
LinkInfo info = LinkInfoFromINIValues(name, value);
@ -320,9 +321,9 @@ namespace llarp
}
void
ConnectConfig::defineConfigOptions(Configuration& conf, bool isRelay)
ConnectConfig::defineConfigOptions(Configuration& conf, const ConfigGenParameters& params)
{
(void)isRelay;
(void)params;
conf.addUndeclaredHandler("connect", [this](string_view section,
@ -336,9 +337,9 @@ namespace llarp
}
void
ServicesConfig::defineConfigOptions(Configuration& conf, bool isRelay)
ServicesConfig::defineConfigOptions(Configuration& conf, const ConfigGenParameters& params)
{
(void)isRelay;
(void)params;
conf.addUndeclaredHandler("services", [this](string_view section,
string_view name,
@ -350,9 +351,9 @@ namespace llarp
}
void
SystemConfig::defineConfigOptions(Configuration& conf, bool isRelay)
SystemConfig::defineConfigOptions(Configuration& conf, const ConfigGenParameters& params)
{
(void)isRelay;
(void)params;
conf.defineOption<std::string>("system", "pidfile", false, pidfile,
[this](std::string arg) {
@ -361,9 +362,9 @@ namespace llarp
}
void
ApiConfig::defineConfigOptions(Configuration& conf, bool isRelay)
ApiConfig::defineConfigOptions(Configuration& conf, const ConfigGenParameters& params)
{
(void)isRelay;
(void)params;
conf.defineOption<bool>("api", "enabled", false, m_enableRPCServer,
[this](bool arg) {
@ -379,9 +380,9 @@ namespace llarp
}
void
LokidConfig::defineConfigOptions(Configuration& conf, bool isRelay)
LokidConfig::defineConfigOptions(Configuration& conf, const ConfigGenParameters& params)
{
(void)isRelay;
(void)params;
conf.defineOption<std::string>("lokid", "service-node-seed", false, "",
[this](std::string arg) {
@ -415,9 +416,9 @@ namespace llarp
}
void
BootstrapConfig::defineConfigOptions(Configuration& conf, bool isRelay)
BootstrapConfig::defineConfigOptions(Configuration& conf, const ConfigGenParameters& params)
{
(void)isRelay;
(void)params;
conf.addUndeclaredHandler("bootstrap", [&](string_view, string_view name, string_view value) {
if (name != "add-node")
@ -433,9 +434,9 @@ namespace llarp
}
void
LoggingConfig::defineConfigOptions(Configuration& conf, bool isRelay)
LoggingConfig::defineConfigOptions(Configuration& conf, const ConfigGenParameters& params)
{
(void)isRelay;
(void)params;
conf.defineOption<std::string>("logging", "type", false, "file",
[this](std::string arg) {
@ -462,13 +463,16 @@ namespace llarp
}
bool
Config::Load(const char *fname, bool isRelay)
Config::Load(const char *fname, bool isRelay, fs::path defaultDataDir)
{
// TODO: DRY
try
{
ConfigGenParameters params;
params.isRelay = isRelay;
params.defaultDataDir = std::move(defaultDataDir);
Configuration conf;
initializeConfig(conf, isRelay);
initializeConfig(conf, params);
ConfigParser parser;
if(!parser.LoadFile(fname))
@ -494,29 +498,29 @@ namespace llarp
}
void
Config::initializeConfig(Configuration& conf, bool isRelay)
Config::initializeConfig(Configuration& conf, const ConfigGenParameters& params)
{
// TODO: this seems like a random place to put this, should this be closer
// to main() ?
if(Lokinet_INIT())
throw std::runtime_error("Can't initializeConfig() when Lokinet_INIT() == true");
router.defineConfigOptions(conf, isRelay);
network.defineConfigOptions(conf, isRelay);
connect.defineConfigOptions(conf, isRelay);
netdb.defineConfigOptions(conf, isRelay);
dns.defineConfigOptions(conf, isRelay);
links.defineConfigOptions(conf, isRelay);
services.defineConfigOptions(conf, isRelay);
system.defineConfigOptions(conf, isRelay);
api.defineConfigOptions(conf, isRelay);
lokid.defineConfigOptions(conf, isRelay);
bootstrap.defineConfigOptions(conf, isRelay);
logging.defineConfigOptions(conf, isRelay);
router.defineConfigOptions(conf, params);
network.defineConfigOptions(conf, params);
connect.defineConfigOptions(conf, params);
netdb.defineConfigOptions(conf, params);
dns.defineConfigOptions(conf, params);
links.defineConfigOptions(conf, params);
services.defineConfigOptions(conf, params);
system.defineConfigOptions(conf, params);
api.defineConfigOptions(conf, params);
lokid.defineConfigOptions(conf, params);
bootstrap.defineConfigOptions(conf, params);
logging.defineConfigOptions(conf, params);
}
fs::path
GetDefaultConfigDir()
GetDefaultDataDir()
{
#ifdef _WIN32
const fs::path homedir = fs::path(getenv("APPDATA"));
@ -535,61 +539,63 @@ namespace llarp
fs::path
GetDefaultConfigPath()
{
return GetDefaultConfigDir() / GetDefaultConfigFilename();
return GetDefaultDataDir() / GetDefaultConfigFilename();
}
void
ensureConfig(const fs::path& dir, const fs::path& filename, bool overwrite, bool asRouter)
ensureConfig(const fs::path& defaultDataDir,
const fs::path& confFile,
bool overwrite,
bool asRouter)
{
fs::path fullPath = dir / filename;
std::error_code ec;
// fail to overwrite if not instructed to do so
if(fs::exists(fullPath, ec) && !overwrite)
throw std::invalid_argument(stringify("Config file ", fullPath, " already exists"));
if(fs::exists(confFile, ec) && !overwrite)
throw std::invalid_argument(stringify("Config file ", confFile, " already exists"));
if (ec) throw std::runtime_error(stringify("filesystem error: ", ec));
// create parent dir if it doesn't exist
if (not fs::exists(dir, ec))
if (not fs::exists(confFile.parent_path(), ec))
{
if (not fs::create_directory(dir))
throw std::runtime_error(stringify("Failed to create parent directory ", dir));
if (not fs::create_directory(confFile.parent_path()))
throw std::runtime_error(stringify("Failed to create parent directory for ", confFile));
}
if (ec) throw std::runtime_error(stringify("filesystem error: ", ec));
llarp::LogInfo("Attempting to create config file, asRouter: ", asRouter,
" path: ", fullPath);
" path: ", confFile);
llarp::Config config;
std::string confStr;
if (asRouter)
confStr = config.generateBaseRouterConfig();
confStr = config.generateBaseRouterConfig(std::move(defaultDataDir));
else
confStr = config.generateBaseClientConfig();
confStr = config.generateBaseClientConfig(std::move(defaultDataDir));
// open a filestream
auto stream = llarp::util::OpenFileStream<std::ofstream>(fullPath.c_str(), std::ios::binary);
auto stream = llarp::util::OpenFileStream<std::ofstream>(confFile.c_str(), std::ios::binary);
if (not stream.has_value() or not stream.value().is_open())
throw std::runtime_error(stringify("Failed to open file ", fullPath, " for writing"));
throw std::runtime_error(stringify("Failed to open file ", confFile, " for writing"));
llarp::LogInfo("confStr: ", confStr);
stream.value() << confStr;
stream.value().flush();
llarp::LogInfo("Generated new config ", fullPath);
llarp::LogInfo("Generated new config ", confFile);
}
std::string
Config::generateBaseClientConfig()
Config::generateBaseClientConfig(fs::path defaultDataDir)
{
llarp::Configuration def;
initializeConfig(def, false);
ConfigGenParameters params;
params.isRelay = false;
params.defaultDataDir = std::move(defaultDataDir);
// TODO: pass these in
const std::string basepath = "";
llarp::Configuration def;
initializeConfig(def, params);
// router
def.addSectionComment("router", "Configuration for routing activity.");
@ -602,16 +608,12 @@ namespace llarp
"threads. Should not exceed the number of logical CPU cores.");
def.addOptionComment("router", "contact-file", "Path to store signed RC.");
def.addConfigValue("router", "contact-file", stringify(basepath, "self.signed"));
def.addOptionComment("router", "transport-privkey", "Path to store transport private key.");
def.addConfigValue("router", "transport-privkey", stringify(basepath, "transport.private"));
def.addOptionComment("router", "identity-privkey", "Path to store identity signing key.");
def.addConfigValue("router", "identity-privkey", stringify(basepath, "identity.private"));
def.addOptionComment("router", "encryption-privkey", "Encryption key for onion routing.");
def.addConfigValue("router", "encryption-privkey", stringify(basepath, "encryption.private"));
// TODO: why did Kee want this, and/or what does it really do? Something about logs?
def.addOptionComment("router", "nickname", "Router nickname. Kee wanted it.");
@ -633,7 +635,6 @@ namespace llarp
def.addOptionComment("logging", "level", " info");
def.addOptionComment("logging", "level", " warn");
def.addOptionComment("logging", "level", " error");
def.addConfigValue("logging", "level", "info");
def.addOptionComment("logging", "type", "Log type (format). Valid options are:");
def.addOptionComment("logging", "type", " file - plaintext formatting");
@ -702,10 +703,14 @@ namespace llarp
}
std::string
Config::generateBaseRouterConfig()
Config::generateBaseRouterConfig(fs::path defaultDataDir)
{
ConfigGenParameters params;
params.isRelay = true;
params.defaultDataDir = std::move(defaultDataDir);
llarp::Configuration def;
initializeConfig(def, true);
initializeConfig(def, params);
// lokid
def.addSectionComment("lokid", "Lokid configuration (settings for talking to lokid");

@ -34,6 +34,14 @@ namespace llarp
nonstd::optional<bool>
fromEnv(const nonstd::optional<bool>& val, string_view envNameSuffix);
/// Small struct to gather all parameters needed for config generation to reduce the number of
/// parameters that need to be passed around.
struct ConfigGenParameters
{
bool isRelay = false;
fs::path defaultDataDir;
};
class RouterConfig
{
public:
@ -91,7 +99,7 @@ namespace llarp
// clang-format on
void
defineConfigOptions(Configuration& conf, bool isRelay);
defineConfigOptions(Configuration& conf, const ConfigGenParameters& params);
};
class NetworkConfig
@ -114,7 +122,7 @@ namespace llarp
// clang-format on
void
defineConfigOptions(Configuration& conf, bool isRelay);
defineConfigOptions(Configuration& conf, const ConfigGenParameters& params);
};
class NetdbConfig
@ -128,7 +136,7 @@ namespace llarp
// clang-format on
void
defineConfigOptions(Configuration& conf, bool isRelay);
defineConfigOptions(Configuration& conf, const ConfigGenParameters& params);
};
struct DnsConfig
@ -136,7 +144,7 @@ namespace llarp
std::unordered_multimap<std::string, std::string> netConfig;
void
defineConfigOptions(Configuration& conf, bool isRelay);
defineConfigOptions(Configuration& conf, const ConfigGenParameters& params);
};
class LinksConfig
@ -165,7 +173,7 @@ namespace llarp
// clang-format on
void
defineConfigOptions(Configuration& conf, bool isRelay);
defineConfigOptions(Configuration& conf, const ConfigGenParameters& params);
};
struct ConnectConfig
@ -173,14 +181,14 @@ namespace llarp
std::vector<std::string> routers;
void
defineConfigOptions(Configuration& conf, bool isRelay);
defineConfigOptions(Configuration& conf, const ConfigGenParameters& params);
};
struct ServicesConfig
{
std::vector< std::pair< std::string, std::string > > services;
void
defineConfigOptions(Configuration& conf, bool isRelay);
defineConfigOptions(Configuration& conf, const ConfigGenParameters& params);
};
struct SystemConfig
@ -188,7 +196,7 @@ namespace llarp
std::string pidfile;
void
defineConfigOptions(Configuration& conf, bool isRelay);
defineConfigOptions(Configuration& conf, const ConfigGenParameters& params);
};
class ApiConfig
@ -204,7 +212,7 @@ namespace llarp
// clang-format on
void
defineConfigOptions(Configuration& conf, bool isRelay);
defineConfigOptions(Configuration& conf, const ConfigGenParameters& params);
};
struct LokidConfig
@ -217,14 +225,14 @@ namespace llarp
std::string lokidRPCPassword;
void
defineConfigOptions(Configuration& conf, bool isRelay);
defineConfigOptions(Configuration& conf, const ConfigGenParameters& params);
};
struct BootstrapConfig
{
std::vector< std::string > routers;
void
defineConfigOptions(Configuration& conf, bool isRelay);
defineConfigOptions(Configuration& conf, const ConfigGenParameters& params);
};
struct LoggingConfig
@ -243,7 +251,7 @@ namespace llarp
std::string m_logFile;
void
defineConfigOptions(Configuration& conf, bool isRelay);
defineConfigOptions(Configuration& conf, const ConfigGenParameters& params);
};
struct Config
@ -263,21 +271,21 @@ namespace llarp
// Initialize config definition
void
initializeConfig(Configuration& conf, bool isRelay);
initializeConfig(Configuration& conf, const ConfigGenParameters& params);
// Load a config from the given file
bool
Load(const char* fname, bool isRelay);
Load(const char* fname, bool isRelay, fs::path defaultDataDir);
std::string
generateBaseClientConfig();
generateBaseClientConfig(fs::path defaultDataDir);
std::string
generateBaseRouterConfig();
generateBaseRouterConfig(fs::path defaultDataDir);
};
fs::path
GetDefaultConfigDir();
GetDefaultDataDir();
fs::path
GetDefaultConfigFilename();
@ -286,7 +294,10 @@ namespace llarp
GetDefaultConfigPath();
void
ensureConfig(const fs::path& dir, const fs::path& filename, bool overwrite, bool asRouter);
ensureConfig(const fs::path& defaultDataDir,
const fs::path& confFile,
bool overwrite,
bool asRouter);
} // namespace llarp

@ -28,12 +28,15 @@ namespace llarp
}
bool
Context::Configure(bool isRelay)
Context::Configure(bool isRelay, nonstd::optional<fs::path> dataDir)
{
// llarp::LogInfo("loading config at ", configfile);
if (configfile.size())
fs::path defaultDataDir = dataDir.has_value()
? dataDir.value()
: GetDefaultDataDir();
if(configfile.size())
{
if(!config->Load(configfile.c_str(), isRelay))
if(!config->Load(configfile.c_str(), isRelay, defaultDataDir))
{
config.release();
llarp::LogError("failed to load config file ", configfile);
@ -261,7 +264,7 @@ namespace llarp
{
config = std::make_unique<Config>();
configfile = fname;
return Configure(isRelay);
return Configure(isRelay, {});
}
#ifdef LOKINET_HIVE
@ -341,25 +344,17 @@ extern "C"
if (conf == nullptr)
return nullptr;
llarp_main *m = new llarp_main(conf);
if(m->ctx->Configure(isRelay))
if(m->ctx->Configure(isRelay, {}))
return m;
delete m;
return nullptr;
}
bool
llarp_config_read_file(struct llarp_config *conf, const char *fname, bool isRelay)
{
if (conf == nullptr)
return false;
return conf->impl.Load(fname, isRelay);
}
bool
llarp_config_load_file(const char *fname, struct llarp_config **conf, bool isRelay)
{
llarp_config *c = new llarp_config();
if(c->impl.Load(fname, isRelay))
if(c->impl.Load(fname, isRelay, {}))
{
*conf = c;
return true;
@ -502,7 +497,7 @@ extern "C"
return false;
// give new config
ptr->ctx->config.reset(new llarp::Config(conf->impl));
return ptr->ctx->Configure(isRelay);
return ptr->ctx->Configure(isRelay, {});
}
bool

Loading…
Cancel
Save