From 58128df7640ca470b38fc9be6388dc2dbb0053be Mon Sep 17 00:00:00 2001 From: Martin Date: Tue, 15 Apr 2014 20:10:44 +0200 Subject: [PATCH] Better settings exchange --- DBSettingsReader.cpp | 5 +- DBSettingsReader.h | 2 + FileSettingsReader.cpp | 13 ++++++ FileSettingsReader.h | 2 + Interface/SettingsReader.h | 3 ++ MemorySettingsReader.cpp | 10 ++++ MemorySettingsReader.h | 2 + urbackupclient/ClientService.cpp | 72 ++++++++++++++++++++++++----- urbackupcommon/os_functions_lin.cpp | 1 - urbackupcommon/settingslist.cpp | 4 -- urbackupserver/server_get.cpp | 24 +++++++++- 11 files changed, 120 insertions(+), 18 deletions(-) diff --git a/DBSettingsReader.cpp b/DBSettingsReader.cpp index db0ac0aa..0671500f 100644 --- a/DBSettingsReader.cpp +++ b/DBSettingsReader.cpp @@ -86,4 +86,7 @@ bool CDBSettingsReader::getValue(std::wstring key, std::wstring *value) return false; } - +std::vector CDBSettingsReader::getKeys() +{ + return std::vector(); +} diff --git a/DBSettingsReader.h b/DBSettingsReader.h index 4dd84b19..d71c066d 100644 --- a/DBSettingsReader.h +++ b/DBSettingsReader.h @@ -10,6 +10,8 @@ public: bool getValue(std::string key, std::string *value); bool getValue(std::wstring key, std::wstring *value); + std::vector getKeys(); + private: std::string table; diff --git a/FileSettingsReader.cpp b/FileSettingsReader.cpp index 6e64f1a7..8a861279 100644 --- a/FileSettingsReader.cpp +++ b/FileSettingsReader.cpp @@ -142,4 +142,17 @@ void CFileSettingsReader::cleanup() void CFileSettingsReader::setup() { settings_mutex=Server->createMutex(); +} + +std::vector CFileSettingsReader::getKeys() +{ + IScopedLock lock(cached_settings->smutex); + + std::vector ret; + for(std::map::iterator i=cached_settings->mSettingsMap.begin(); + i!=cached_settings->mSettingsMap.end();++i) + { + ret.push_back(i->first); + } + return ret; } \ No newline at end of file diff --git a/FileSettingsReader.h b/FileSettingsReader.h index 27202441..3c1de280 100644 --- a/FileSettingsReader.h +++ b/FileSettingsReader.h @@ -30,6 +30,8 @@ public: static void cleanup(); static void setup(); + virtual std::vector CFileSettingsReader::getKeys(); + private: static std::map *settings; diff --git a/Interface/SettingsReader.h b/Interface/SettingsReader.h index 579679ee..96d28fd6 100644 --- a/Interface/SettingsReader.h +++ b/Interface/SettingsReader.h @@ -2,6 +2,7 @@ #define INTERFACE_SETTINGSREADER_H #include +#include #include "Object.h" class ISettingsReader : public IObject @@ -19,6 +20,8 @@ public: virtual std::wstring getValue(std::wstring key)=0; virtual int getValue(std::wstring key, int def)=0; virtual float getValue(std::wstring key, float def)=0; + + virtual std::vector getKeys() = 0; }; #endif //INTERFACE_SETTINGSREADER_H \ No newline at end of file diff --git a/MemorySettingsReader.cpp b/MemorySettingsReader.cpp index 1b1fc0f8..3e102ec1 100644 --- a/MemorySettingsReader.cpp +++ b/MemorySettingsReader.cpp @@ -71,3 +71,13 @@ bool CMemorySettingsReader::getValue(std::wstring key, std::wstring *value) return false; } + +std::vector CMemorySettingsReader::getKeys() +{ + std::vector ret; + for(std::map::iterator i=mSettingsMap.begin();i!=mSettingsMap.end();++i) + { + ret.push_back(i->first); + } + return ret; +} diff --git a/MemorySettingsReader.h b/MemorySettingsReader.h index f155554f..de86b3c4 100644 --- a/MemorySettingsReader.h +++ b/MemorySettingsReader.h @@ -10,6 +10,8 @@ public: virtual bool getValue(std::string key, std::string *value); virtual bool getValue(std::wstring key, std::wstring *value); + virtual std::vector getKeys(); + private: std::map mSettingsMap; }; \ No newline at end of file diff --git a/urbackupclient/ClientService.cpp b/urbackupclient/ClientService.cpp index cf64878f..179809d3 100644 --- a/urbackupclient/ClientService.cpp +++ b/urbackupclient/ClientService.cpp @@ -1116,6 +1116,7 @@ void ClientConnector::updateSettings(const std::string &pData) std::vector settings_names=getSettingsList(); settings_names.push_back(L"client_set_settings"); + settings_names.push_back(L"client_set_settings_time"); std::wstring new_settings_str=L""; bool mod=false; std::string tmp_str; @@ -1247,20 +1248,69 @@ void ClientConnector::replaceSettings(const std::string &pData) data.addVoidPtr(NULL); IndexThread::getMsgPipe()->Write(data.getDataPtr(), data.getDataSize()); } - - Server->destroy(new_settings); - IFile *sf=Server->openFile("urbackup/data/settings.cfg", MODE_WRITE); - if(sf==NULL) + + ISettingsReader* old_settings=Server->createFileSettingsReader("urbackup/data/settings.cfg"); + + std::vector new_keys = new_settings->getKeys(); + bool modified_settings=true; + if(old_settings!=NULL) { - Server->Log("Error opening settings file!", LL_ERROR); - return; + modified_settings=false; + std::vector old_keys = old_settings->getKeys(); + + for(size_t i=0;igetValue(old_keys[i], &old_val) && + (!new_settings->getValue(old_keys[i], &new_val) || + old_val!=new_val ) ) + { + modified_settings=true; + break; + } + } + + if(!modified_settings) + { + for(size_t i=0;igetValue(new_keys[i], &old_val)) + { + modified_settings=true; + break; + } + } + } + + Server->destroy(old_settings); } - sf->Write(pData); - if(pData.find("\r\nclient_set_settings=true")==std::string::npos) - { - sf->Write("\r\nclient_set_settings=true"); + + if(modified_settings) + { + std::string new_data; + + for(size_t i=0;igetValue(new_keys[i], &val)) + { + new_data+=Server->ConvertToUTF8(new_keys[i])+"="+Server->ConvertToUTF8(val)+"\n"; + } + } + + new_data+="client_set_settings=true\n"; + new_data+="client_set_settings_time="+nconvert(Server->getTimeSeconds())+"\n"; + + writestring(new_data, "urbackup/data/settings.cfg"); } - Server->destroy(sf); + + Server->destroy(new_settings); } void ClientConnector::saveLogdata(const std::string &created, const std::string &pData) diff --git a/urbackupcommon/os_functions_lin.cpp b/urbackupcommon/os_functions_lin.cpp index 2bfdd420..92a140a3 100644 --- a/urbackupcommon/os_functions_lin.cpp +++ b/urbackupcommon/os_functions_lin.cpp @@ -179,7 +179,6 @@ bool isDirectory(const std::wstring &path) int rc=stat64(Server->ConvertToUTF8(path).c_str(), &f_info); if(rc!=0) { - Server->Log(L"No permission to access \""+path+L"\" (isdir)", LL_DEBUG); return false; } diff --git a/urbackupcommon/settingslist.cpp b/urbackupcommon/settingslist.cpp index 51e4e829..951824dc 100644 --- a/urbackupcommon/settingslist.cpp +++ b/urbackupcommon/settingslist.cpp @@ -64,10 +64,6 @@ std::vector getSettingsList(void) std::vector getOnlyServerClientSettingsList(void) { std::vector ret; - ret.push_back(L"backup_window_incr_file"); - ret.push_back(L"backup_window_full_file"); - ret.push_back(L"backup_window_incr_image"); - ret.push_back(L"backup_window_full_image"); ret.push_back(L"silent_update"); ret.push_back(L"client_quota"); ret.push_back(L"local_full_file_transfer_mode"); diff --git a/urbackupserver/server_get.cpp b/urbackupserver/server_get.cpp index 53769e52..760cafaa 100644 --- a/urbackupserver/server_get.cpp +++ b/urbackupserver/server_get.cpp @@ -1552,7 +1552,7 @@ bool BackupServerGet::doFullBackup(bool with_hashes, bool &disk_error, bool &log return false; } - IFile *tmp=getTemporaryFileRetry();; + IFile *tmp=getTemporaryFileRetry(); if(tmp==NULL) { ServerLogger::Log(clientid, L"Error creating temporary file in ::doFullBackup", LL_ERROR); @@ -3479,6 +3479,10 @@ void BackupServerGet::sendSettings(void) if(!key.empty()) { + if(!allow_overwrite) + { + s_settings+=Server->ConvertToUTF8(key)+"="+Server->ConvertToUTF8(value)+"\n"; + } key+=L"_def"; s_settings+=Server->ConvertToUTF8(key)+"="+Server->ConvertToUTF8(value)+"\n"; } @@ -3543,6 +3547,24 @@ bool BackupServerGet::getClientSettings(bool& doesnt_exist) bool b=updateClientSetting(L"client_set_settings", L"true"); if(b) mod=true; + + std::wstring settings_update_time; + if(sr->getValue(L"client_set_settings_time", &settings_update_time)) + { + b=updateClientSetting(L"client_set_settings_time", settings_update_time); + if(b) + { + mod=true; + } + else + { + Server->destroy(sr); + std::string tmp_fn=tmp->getFilename(); + Server->destroy(tmp); + Server->deleteFile(tmp_fn); + return true; + } + } } }