mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-05-14 20:12:29 -04:00
Lots of little changes to libretroshare. Improvements mainly focused
on configuration storage and loading: * Improved Configuration Manager (almost finished) * Mutex protections for Configuration system * added Configuration storage to p3ConnectMgr. * added Configuration storage to p3MsgService. * bugfixes in p3GeneralConfig. * Added Config Save notification where necessary. * added safe FinalConfigSave before exit(). * added RsPeerNetItem + RsPeerStunItem (serialiser) * reordered startup for correct config loading. * enabled Loading of certs in AuthXPGP. * move sockaddr_clear() to util/rsnet.h * switched p3MsgService sendMessage checking to pqiMonitor syste,. * corrected pqiarchive saving of PeerIds. * added setNetworkMode() & setVisState() to p3ConnectMgr. * added Mutex protection to p3ranking. git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@336 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
parent
2c69fd7eaf
commit
806b8285f2
36 changed files with 1712 additions and 599 deletions
|
@ -26,13 +26,15 @@
|
|||
|
||||
#include "pqi/p3cfgmgr.h"
|
||||
#include "pqi/pqibin.h"
|
||||
#include "pqi/pqiarchive.h"
|
||||
|
||||
#include "pqi/pqistreamer.h"
|
||||
|
||||
#include "serialiser/rsconfigitems.h"
|
||||
|
||||
#define CONFIG_DEBUG 1
|
||||
|
||||
p3ConfigMgr::p3ConfigMgr(std::string dir, std::string fname, std::string signame)
|
||||
:basedir(dir), metafname(fname), metasigfname(signame)
|
||||
:basedir(dir), metafname(fname), metasigfname(signame),
|
||||
mConfigSaveActive(true)
|
||||
{
|
||||
|
||||
|
||||
|
@ -42,16 +44,33 @@ void p3ConfigMgr::tick()
|
|||
{
|
||||
bool toSave = false;
|
||||
|
||||
{
|
||||
RsStackMutex stack(cfgMtx); /***** LOCK STACK MUTEX ****/
|
||||
|
||||
/* iterate through and check if any have changed */
|
||||
std::map<uint32_t, pqiConfig *>::iterator it;
|
||||
for(it = configs.begin(); it != configs.end(); it++)
|
||||
{
|
||||
if (it->second->ConfInd.Changed(0))
|
||||
if (it->second->HasConfigChanged(0))
|
||||
{
|
||||
|
||||
#ifdef CONFIG_DEBUG
|
||||
std::cerr << "p3ConfigMgr::tick() Config Changed - Element: ";
|
||||
std::cerr << it->first;
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
|
||||
toSave = true;
|
||||
}
|
||||
}
|
||||
|
||||
/* disable saving before exit */
|
||||
if (!mConfigSaveActive)
|
||||
{
|
||||
toSave = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (toSave)
|
||||
{
|
||||
saveConfiguration();
|
||||
|
@ -61,67 +80,221 @@ void p3ConfigMgr::tick()
|
|||
|
||||
void p3ConfigMgr::saveConfiguration()
|
||||
{
|
||||
/* setup metaconfig */
|
||||
RsStackMutex stack(cfgMtx); /***** LOCK STACK MUTEX ****/
|
||||
|
||||
#ifdef CONFIG_DEBUG
|
||||
std::cerr << "p3ConfigMgr::saveConfiguration()";
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
|
||||
RsConfigKeyValueSet *item = new RsConfigKeyValueSet();
|
||||
|
||||
std::map<uint32_t, pqiConfig *>::iterator it;
|
||||
for(it = configs.begin(); it != configs.end(); it++)
|
||||
{
|
||||
if (it->second->ConfInd.Changed(1))
|
||||
if (it->second->HasConfigChanged(1))
|
||||
{
|
||||
it->second->saveConfiguration(basedir);
|
||||
#ifdef CONFIG_DEBUG
|
||||
std::cerr << "p3ConfigMgr::saveConfiguration() Saving Element: ";
|
||||
std::cerr << it->first;
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
it->second->saveConfiguration();
|
||||
}
|
||||
/* save metaconfig */
|
||||
|
||||
#ifdef CONFIG_DEBUG
|
||||
std::cerr << "p3ConfigMgr::saveConfiguration() Element: ";
|
||||
std::cerr << it->first << " Hash: " << it->second->Hash();
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
RsTlvKeyValue kv;
|
||||
{
|
||||
std::ostringstream out;
|
||||
out << it->first;
|
||||
kv.key = out.str();
|
||||
}
|
||||
kv.value = it->second->Hash();
|
||||
item->tlvkvs.pairs.push_back(kv);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG
|
||||
std::cerr << "p3ConfigMgr::saveConfiguration() Complete MetaConfigItem: ";
|
||||
std::cerr << std::endl;
|
||||
item->print(std::cerr, 20);
|
||||
|
||||
#endif
|
||||
|
||||
/* Write the data to a stream */
|
||||
uint32_t bioflags = BIN_FLAGS_HASH_DATA | BIN_FLAGS_WRITEABLE;
|
||||
BinInterface *bio = new BinFileInterface(metafname.c_str(), bioflags);
|
||||
RsSerialiser *rss = new RsSerialiser();
|
||||
rss->addSerialType(new RsGeneralConfigSerialiser());
|
||||
pqistreamer stream(rss, "CONFIG", bio, 0);
|
||||
|
||||
stream.SendItem(item);
|
||||
stream.tick();
|
||||
stream.tick();
|
||||
|
||||
/* get hash */
|
||||
std::string totalhash = bio->gethash();
|
||||
|
||||
/* sign the hash of the data */
|
||||
|
||||
|
||||
/* write signature to configuration */
|
||||
|
||||
|
||||
}
|
||||
|
||||
void p3ConfigMgr::loadConfiguration()
|
||||
{
|
||||
RsStackMutex stack(cfgMtx); /***** LOCK STACK MUTEX ****/
|
||||
|
||||
#ifdef CONFIG_DEBUG
|
||||
std::cerr << "p3ConfigMgr::loadConfiguration()";
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
|
||||
/* Write the data to a stream */
|
||||
uint32_t bioflags = BIN_FLAGS_HASH_DATA | BIN_FLAGS_READABLE;
|
||||
BinInterface *bio = new BinFileInterface(metafname.c_str(), bioflags);
|
||||
RsSerialiser *rss = new RsSerialiser();
|
||||
rss->addSerialType(new RsGeneralConfigSerialiser());
|
||||
pqistreamer stream(rss, "CONFIG", bio, 0);
|
||||
|
||||
|
||||
stream.tick();
|
||||
stream.tick();
|
||||
RsItem *rsitem = stream.GetItem();
|
||||
|
||||
RsConfigKeyValueSet *item = dynamic_cast<RsConfigKeyValueSet *>(rsitem);
|
||||
if (!item)
|
||||
{
|
||||
delete rsitem;
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG
|
||||
std::cerr << "p3ConfigMgr::loadConfiguration() Loaded MetaConfigItem: ";
|
||||
std::cerr << std::endl;
|
||||
item->print(std::cerr, 20);
|
||||
|
||||
#endif
|
||||
|
||||
std::string totalhash = bio->gethash();
|
||||
|
||||
/* check it TODO */
|
||||
/* sign the hash of the data */
|
||||
/* check signature with configuration */
|
||||
|
||||
/* extract info from KeyValueSet */
|
||||
std::list<RsTlvKeyValue>::iterator it;
|
||||
for(it = item->tlvkvs.pairs.begin(); it != item->tlvkvs.pairs.end(); it++)
|
||||
{
|
||||
/* find the configuration */
|
||||
uint32_t confId = atoi(it->key.c_str());
|
||||
std::string hashin = it->value;
|
||||
|
||||
std::map<uint32_t, pqiConfig *>::iterator cit;
|
||||
cit = configs.find(confId);
|
||||
if (cit != configs.end())
|
||||
{
|
||||
#ifdef CONFIG_DEBUG
|
||||
std::cerr << "p3ConfigMgr::loadConfiguration() Element: ";
|
||||
std::cerr << confId << " Hash: " << hashin;
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
(cit->second)->loadConfiguration(hashin);
|
||||
/* force config to NOT CHANGED */
|
||||
cit->second->HasConfigChanged(0);
|
||||
cit->second->HasConfigChanged(1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#ifdef CONFIG_DEBUG
|
||||
std::cerr << "p3ConfigMgr::loadConfiguration() Done!";
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
void p3ConfigMgr::addConfiguration(uint32_t type, pqiConfig *conf)
|
||||
void p3ConfigMgr::addConfiguration(std::string file, pqiConfig *conf)
|
||||
{
|
||||
configs[type] = conf;
|
||||
RsStackMutex stack(cfgMtx); /***** LOCK STACK MUTEX ****/
|
||||
|
||||
/* construct filename */
|
||||
std::string filename = basedir;
|
||||
if (basedir != "")
|
||||
{
|
||||
filename += "/";
|
||||
}
|
||||
filename += file;
|
||||
|
||||
conf->setFilename(filename);
|
||||
configs[conf->Type()] = conf;
|
||||
}
|
||||
|
||||
|
||||
p3Config::p3Config(uint32_t t, std::string name)
|
||||
:pqiConfig(t, name)
|
||||
void p3ConfigMgr::completeConfiguration()
|
||||
{
|
||||
saveConfiguration();
|
||||
|
||||
RsStackMutex stack(cfgMtx); /***** LOCK STACK MUTEX ****/
|
||||
mConfigSaveActive = false;
|
||||
}
|
||||
|
||||
p3Config::p3Config(uint32_t t)
|
||||
:pqiConfig(t)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
bool p3Config::loadConfiguration(std::string basedir, std::string &loadHash)
|
||||
bool p3Config::loadConfiguration(std::string &loadHash)
|
||||
{
|
||||
std::list<RsItem *> load;
|
||||
std::list<RsItem *>::iterator it;
|
||||
|
||||
std::string fname = basedir;
|
||||
if (fname != "")
|
||||
fname += "/";
|
||||
fname += Filename();
|
||||
std::string fname = Filename();
|
||||
|
||||
BinFileInterface *bio = new BinFileInterface(fname.c_str(),
|
||||
BIN_FLAGS_READABLE | BIN_FLAGS_HASH_DATA);
|
||||
pqiarchive archive(setupSerialiser(), bio, BIN_FLAGS_READABLE);
|
||||
uint32_t bioflags = BIN_FLAGS_HASH_DATA | BIN_FLAGS_READABLE;
|
||||
uint32_t stream_flags = BIN_FLAGS_READABLE;
|
||||
|
||||
BinInterface *bio = new BinFileInterface(fname.c_str(), bioflags);
|
||||
pqistreamer stream(setupSerialiser(), "CONFIG", bio, stream_flags);
|
||||
RsItem *item = NULL;
|
||||
|
||||
while(NULL != (item = archive.GetItem()))
|
||||
stream.tick();
|
||||
while(NULL != (item = stream.GetItem()))
|
||||
{
|
||||
#ifdef CONFIG_DEBUG
|
||||
std::cerr << "p3Config::loadConfiguration() loaded item:";
|
||||
std::cerr << std::endl;
|
||||
item->print(std::cerr, 0);
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
load.push_back(item);
|
||||
stream.tick();
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG
|
||||
std::cerr << "p3Config::loadConfiguration() loaded " << load.size();
|
||||
std::cerr << " Elements from File: " << fname;
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
|
||||
/* check hash */
|
||||
std::string hashstr = archive.gethash();
|
||||
std::string hashstr = bio->gethash();
|
||||
|
||||
if (hashstr != loadHash)
|
||||
{
|
||||
|
||||
#ifdef CONFIG_DEBUG
|
||||
std::cerr << "p3Config::loadConfiguration() ERROR: Hash != MATCHloaded";
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
|
||||
/* bad load */
|
||||
for(it = load.begin(); it != load.end(); it++)
|
||||
{
|
||||
|
@ -137,32 +310,49 @@ bool p3Config::loadConfiguration(std::string basedir, std::string &loadHash)
|
|||
}
|
||||
|
||||
|
||||
bool p3Config::saveConfiguration(std::string basedir)
|
||||
bool p3Config::saveConfiguration()
|
||||
{
|
||||
bool toKeep;
|
||||
std::list<RsItem *> toSave = saveList(toKeep);
|
||||
|
||||
std::string fname = basedir;
|
||||
if (fname != "")
|
||||
fname += "/";
|
||||
fname += Filename();
|
||||
bool cleanup = true;
|
||||
std::list<RsItem *> toSave = saveList(cleanup);
|
||||
|
||||
BinFileInterface *bio = new BinFileInterface(fname.c_str(),
|
||||
BIN_FLAGS_WRITEABLE | BIN_FLAGS_HASH_DATA);
|
||||
std::string fname = Filename();
|
||||
|
||||
uint32_t arch_flags = BIN_FLAGS_WRITEABLE;
|
||||
if (toKeep)
|
||||
arch_flags |= BIN_FLAGS_NO_DELETE;
|
||||
#ifdef CONFIG_DEBUG
|
||||
std::cerr << "p3Config::saveConfiguration() toSave " << toSave.size();
|
||||
std::cerr << " Elements to File: " << fname;
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
|
||||
pqiarchive archive(setupSerialiser(), bio, arch_flags);
|
||||
uint32_t bioflags = BIN_FLAGS_HASH_DATA | BIN_FLAGS_WRITEABLE;
|
||||
|
||||
uint32_t stream_flags = BIN_FLAGS_WRITEABLE;
|
||||
if (!cleanup)
|
||||
stream_flags |= BIN_FLAGS_NO_DELETE;
|
||||
|
||||
BinInterface *bio = new BinFileInterface(fname.c_str(), bioflags);
|
||||
pqistreamer stream(setupSerialiser(), "CONFIG", bio, stream_flags);
|
||||
std::list<RsItem *>::iterator it;
|
||||
for(it = toSave.begin(); it != toSave.end(); it++)
|
||||
{
|
||||
archive.SendItem(*it);
|
||||
#ifdef CONFIG_DEBUG
|
||||
std::cerr << "p3Config::saveConfiguration() save item:";
|
||||
std::cerr << std::endl;
|
||||
(*it)->print(std::cerr, 0);
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
stream.SendItem(*it);
|
||||
stream.tick();
|
||||
}
|
||||
/* final tick for anymore writing */
|
||||
stream.tick();
|
||||
|
||||
/* store the hash */
|
||||
setHash(archive.gethash());
|
||||
setHash(bio->gethash());
|
||||
|
||||
saveDone(); /* callback to inherited class to unlock any Mutexes
|
||||
* protecting saveList() data
|
||||
*/
|
||||
|
||||
/* else okay */
|
||||
return true;
|
||||
|
@ -172,7 +362,7 @@ bool p3Config::saveConfiguration(std::string basedir)
|
|||
/**************************** CONFIGURATION CLASSES ********************/
|
||||
|
||||
p3GeneralConfig::p3GeneralConfig()
|
||||
:p3Config(CONFIG_TYPE_GENERAL, "gen.set")
|
||||
:p3Config(CONFIG_TYPE_GENERAL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
@ -180,6 +370,12 @@ p3GeneralConfig::p3GeneralConfig()
|
|||
// General Configuration System
|
||||
std::string p3GeneralConfig::getSetting(std::string opt)
|
||||
{
|
||||
#ifdef CONFIG_DEBUG
|
||||
std::cerr << "p3GeneralConfig::getSetting(" << opt << ")";
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
RsStackMutex stack(cfgMtx); /***** LOCK STACK MUTEX ****/
|
||||
|
||||
/* extract from config */
|
||||
std::map<std::string, std::string>::iterator it;
|
||||
if (settings.end() == (it = settings.find(opt)))
|
||||
|
@ -192,6 +388,13 @@ std::string p3GeneralConfig::getSetting(std::string opt)
|
|||
|
||||
void p3GeneralConfig::setSetting(std::string opt, std::string val)
|
||||
{
|
||||
#ifdef CONFIG_DEBUG
|
||||
std::cerr << "p3GeneralConfig::setSetting(" << opt << " = " << val << ")";
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
{
|
||||
RsStackMutex stack(cfgMtx); /***** LOCK STACK MUTEX ****/
|
||||
|
||||
/* extract from config */
|
||||
std::map<std::string, std::string>::iterator it;
|
||||
if (settings.end() != (it = settings.find(opt)))
|
||||
|
@ -203,40 +406,149 @@ void p3GeneralConfig::setSetting(std::string opt, std::string val)
|
|||
}
|
||||
}
|
||||
|
||||
ConfInd.IndicateChanged();
|
||||
settings[opt] = val;
|
||||
}
|
||||
/* outside mutex */
|
||||
IndicateConfigChanged();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/* TODO ******/
|
||||
|
||||
RsSerialiser *p3GeneralConfig::setupSerialiser()
|
||||
{
|
||||
RsSerialiser *rss = NULL;
|
||||
RsSerialiser *rss = new RsSerialiser();
|
||||
rss->addSerialType(new RsGeneralConfigSerialiser());
|
||||
return rss;
|
||||
}
|
||||
|
||||
std::list<RsItem *> p3GeneralConfig::saveList(bool &cleanup)
|
||||
{
|
||||
cleanup = false;
|
||||
RsStackMutex stack(cfgMtx); /***** LOCK STACK MUTEX ****/
|
||||
|
||||
#ifdef CONFIG_DEBUG
|
||||
std::cerr << "p3GeneralConfig::saveList() KV sets: " << settings.size();
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
|
||||
cleanup = true;
|
||||
std::list<RsItem *> savelist;
|
||||
//RsGenConfItem *item = ...
|
||||
|
||||
RsConfigKeyValueSet *item = new RsConfigKeyValueSet();
|
||||
std::map<std::string, std::string>::iterator it;
|
||||
for(it = settings.begin(); it != settings.end(); it++)
|
||||
{
|
||||
RsTlvKeyValue kv;
|
||||
kv.key = it->first;
|
||||
kv.value = it->second;
|
||||
item->tlvkvs.pairs.push_back(kv);
|
||||
|
||||
|
||||
/* make sure we don't overload it */
|
||||
if (item->tlvkvs.TlvSize() > 4000)
|
||||
{
|
||||
savelist.push_back(item);
|
||||
item = new RsConfigKeyValueSet();
|
||||
}
|
||||
}
|
||||
|
||||
if (item->tlvkvs.pairs.size() > 0)
|
||||
{
|
||||
savelist.push_back(item);
|
||||
}
|
||||
|
||||
return savelist;
|
||||
}
|
||||
|
||||
|
||||
bool p3GeneralConfig::loadList(std::list<RsItem *> load)
|
||||
{
|
||||
/* add into settings */
|
||||
#ifdef CONFIG_DEBUG
|
||||
std::cerr << "p3GeneralConfig::loadList() count: " << load.size();
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
|
||||
return false;
|
||||
RsStackMutex stack(cfgMtx); /***** LOCK STACK MUTEX ****/
|
||||
|
||||
/* add into settings */
|
||||
RsConfigKeyValueSet *item = NULL;
|
||||
std::list<RsItem *>::iterator it;
|
||||
std::list<RsTlvKeyValue>::iterator kit;
|
||||
|
||||
for(it = load.begin(); it != load.end();)
|
||||
{
|
||||
item = dynamic_cast<RsConfigKeyValueSet *>(*it);
|
||||
if (item)
|
||||
{
|
||||
for(kit = item->tlvkvs.pairs.begin();
|
||||
kit != item->tlvkvs.pairs.end(); kit++)
|
||||
{
|
||||
settings[kit->key] = kit->value;
|
||||
}
|
||||
}
|
||||
|
||||
/* cleanup */
|
||||
delete (*it);
|
||||
it = load.erase(it);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**** MUTEX NOTE:
|
||||
* have protected all, but think that
|
||||
* only the Indication and hash really need it
|
||||
*/
|
||||
|
||||
pqiConfig::pqiConfig(uint32_t t)
|
||||
:ConfInd(2), type(t)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
pqiConfig::~pqiConfig()
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
uint32_t pqiConfig::Type()
|
||||
{
|
||||
RsStackMutex stack(cfgMtx); /***** LOCK STACK MUTEX ****/
|
||||
return type;
|
||||
}
|
||||
|
||||
std::string pqiConfig::Filename()
|
||||
{
|
||||
RsStackMutex stack(cfgMtx); /***** LOCK STACK MUTEX ****/
|
||||
return filename;
|
||||
}
|
||||
|
||||
std::string pqiConfig::Hash()
|
||||
{
|
||||
RsStackMutex stack(cfgMtx); /***** LOCK STACK MUTEX ****/
|
||||
return hash;
|
||||
}
|
||||
|
||||
void pqiConfig::IndicateConfigChanged()
|
||||
{
|
||||
RsStackMutex stack(cfgMtx); /***** LOCK STACK MUTEX ****/
|
||||
ConfInd.IndicateChanged();
|
||||
}
|
||||
|
||||
bool pqiConfig::HasConfigChanged(uint16_t idx)
|
||||
{
|
||||
RsStackMutex stack(cfgMtx); /***** LOCK STACK MUTEX ****/
|
||||
return ConfInd.Changed(idx);
|
||||
}
|
||||
|
||||
void pqiConfig::setFilename(std::string name)
|
||||
{
|
||||
RsStackMutex stack(cfgMtx); /***** LOCK STACK MUTEX ****/
|
||||
filename = name;
|
||||
}
|
||||
|
||||
void pqiConfig::setHash(std::string h)
|
||||
{
|
||||
RsStackMutex stack(cfgMtx); /***** LOCK STACK MUTEX ****/
|
||||
hash = h;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue