/*************************************************************************
* UrBackup - Client/Server backup system
* Copyright (C) 2011-2016 Martin Raiber
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
**************************************************************************/
#include "../stringtools.h"
#include "../urbackupcommon/settingslist.h"
#include "../urbackupcommon/os_functions.h"
#include
#include
#include
#ifndef CLIENT_ONLY
#include "server_settings.h"
#include "../Interface/Server.h"
#include "server.h"
IMutex *ServerSettings::g_mutex=NULL;
std::map ServerSettings::g_settings_cache;
//#define CLEAR_SETTINGS_CACHE
void ServerSettings::init_mutex(void)
{
if(g_mutex==NULL)
g_mutex=Server->createMutex();
}
void ServerSettings::destroy_mutex(void)
{
if(g_mutex!=NULL)
{
Server->destroy(g_mutex);
}
}
void ServerSettings::clear_cache()
{
IScopedLock lock(g_mutex);
for(std::map::iterator it=g_settings_cache.begin();
it!=g_settings_cache.end();)
{
if(it->second->refcount==0)
{
std::map::iterator it_curr = it;
++it;
delete it_curr->second;
g_settings_cache.erase(it_curr);
}
else
{
Server->Log("Refcount for settings for clientid \""+convert(it->second->clientid)+"\" is not 0. Not deleting.", LL_WARNING);
++it;
}
}
}
ServerSettings::ServerSettings(IDatabase *db, int pClientid)
: local_settings(NULL), clientid(pClientid), db(db)
{
IScopedLock lock(g_mutex);
std::map::iterator iter=g_settings_cache.find(clientid);
if(iter!=g_settings_cache.end())
{
++iter->second->refcount;
local_settings = iter->second;
}
else
{
lock.relock(NULL);
std::auto_ptr settings_client, settings_default, setting_global;
createSettingsReaders(settings_default, settings_client, setting_global);
local_settings = new SSettings();
local_settings->refcount = 1;
readSettingsDefault(settings_default.get(),
setting_global.get()!=NULL ? setting_global.get() : settings_default.get());
if (settings_client.get() != NULL)
{
readSettingsClient(settings_client.get());
}
lock.relock(g_mutex);
iter = g_settings_cache.find(clientid);
if (iter != g_settings_cache.end())
{
delete local_settings;
++iter->second->refcount;
local_settings = iter->second;
}
else
{
g_settings_cache.insert(std::make_pair(clientid, local_settings));
}
}
}
void ServerSettings::createSettingsReaders(std::auto_ptr& settings_default,
std::auto_ptr& settings_client, std::auto_ptr& settings_global)
{
int settings_default_id = 0;
if(clientid>0)
{
settings_client.reset(Server->createDBMemSettingsReader(db, "settings", "SELECT key,value FROM settings_db.settings WHERE clientid=" + convert(clientid)));
settings_default_id = settings_client->getValue("group_id", 0)*-1;
}
else
{
settings_default_id = clientid;
}
settings_default.reset(Server->createDBMemSettingsReader(db, "settings", "SELECT key,value FROM settings_db.settings WHERE clientid="+convert(settings_default_id)));
if (settings_default_id < 0)
{
settings_global.reset(Server->createDBMemSettingsReader(db, "settings", "SELECT key,value FROM settings_db.settings WHERE clientid=0"));
}
}
ServerSettings::~ServerSettings(void)
{
{
IScopedLock lock(g_mutex);
assert(local_settings->refcount > 0);
--local_settings->refcount;
if (local_settings->refcount == 0)
{
#ifdef CLEAR_SETTINGS_CACHE
if (!local_settings->needs_update)
{
std::map::iterator iter = g_settings_cache.find(clientid);
assert(iter != g_settings_cache.end());
delete iter->second;
g_settings_cache.erase(iter);
}
#endif
if (local_settings->needs_update)
{
std::map::iterator iter = g_settings_cache.find(clientid);
assert(iter != g_settings_cache.end());
if (local_settings == iter->second)
{
g_settings_cache.erase(iter);
}
delete local_settings;
}
}
}
}
void ServerSettings::updateAll(void)
{
IScopedLock lock(g_mutex);
for(std::map::iterator it=g_settings_cache.begin();
it!=g_settings_cache.end();)
{
if(it->second->refcount==0)
{
std::map::iterator it_curr = it;
++it;
delete it_curr->second;
g_settings_cache.erase(it_curr);
}
else
{
it->second->needs_update=true;
++it;
}
}
}
void ServerSettings::updateClient(int clientid)
{
IScopedLock lock(g_mutex);
std::map::iterator it = g_settings_cache.find(clientid);
if(it!=g_settings_cache.end())
{
if (it->second->refcount == 0)
{
delete it->second;
g_settings_cache.erase(it);
}
else
{
it->second->needs_update = true;
}
}
}
void ServerSettings::update(bool force_update)
{
while(local_settings->needs_update || force_update)
{
force_update = false;
IScopedLock lock(g_mutex);
local_settings->needs_update = true;
assert(local_settings->refcount > 0);
--local_settings->refcount;
if (local_settings->refcount == 0)
{
std::map::iterator iter = g_settings_cache.find(clientid);
if (iter != g_settings_cache.end()
&& iter->second == local_settings)
{
delete iter->second;
g_settings_cache.erase(iter);
}
else
{
if (iter != g_settings_cache.end()
&& iter->second != local_settings)
{
delete local_settings;
++iter->second->refcount;
local_settings = iter->second;
continue;
}
else
{
delete local_settings;
}
}
}
std::map::iterator iter = g_settings_cache.find(clientid);
if (iter != g_settings_cache.end()
&& iter->second != local_settings)
{
++iter->second->refcount;
local_settings = iter->second;
continue;
}
SSettings* old_local_settings = local_settings;
lock.relock(NULL);
local_settings = new SSettings();
local_settings->refcount = 1;
std::auto_ptr settings_client, settings_default, settings_global;
createSettingsReaders(settings_default, settings_client, settings_global);
readSettingsDefault(settings_default.get(),
settings_global.get() != NULL ? settings_global.get() : settings_default.get());
if (settings_client.get() != NULL)
{
readSettingsClient(settings_client.get());
}
lock.relock(g_mutex);
iter = g_settings_cache.find(clientid);
if (iter==g_settings_cache.end()
|| iter->second == old_local_settings)
{
g_settings_cache[clientid] = local_settings;
}
else
{
delete local_settings;
++iter->second->refcount;
local_settings = iter->second;
}
}
}
void ServerSettings::updateInternal(bool* was_updated)
{
if(local_settings->needs_update)
{
if(was_updated!=NULL)
*was_updated=true;
update(false);
}
else
{
if(was_updated!=NULL)
*was_updated=false;
}
}
SSettings *ServerSettings::getSettings(bool *was_updated)
{
updateInternal(was_updated);
return local_settings;
}
void ServerSettings::readSettingsDefault(ISettingsReader* settings_default,
ISettingsReader* settings_global)
{
SSettings* settings = local_settings;
settings->clientid=clientid;
settings->image_file_format=settings_default->getValue("image_file_format", image_file_format_default);
settings->update_freq_incr=settings_default->getValue("update_freq_incr", convert(5*60*60) );
settings->update_freq_full=settings_default->getValue("update_freq_full", convert(30*24*60*60) );
settings->update_freq_image_incr=settings_default->getValue("update_freq_image_incr", convert( 7*24*60*60) );
if(getImageFileFormatInt(settings->image_file_format)==image_file_format_cowraw)
{
settings->update_freq_image_full=settings_default->getValue("update_freq_image_full", convert( 60*24*60*60) );
}
else
{
settings->update_freq_image_full=settings_default->getValue("update_freq_image_full", convert( -60*24*60*60) );
}
settings->max_file_incr=settings_default->getValue("max_file_incr", 100);
settings->min_file_incr=settings_default->getValue("min_file_incr", 40);
settings->max_file_full=settings_default->getValue("max_file_full", 10);
settings->min_file_full=settings_default->getValue("min_file_full", 2);
settings->min_image_incr=settings_default->getValue("min_image_incr", 4);
settings->max_image_incr=settings_default->getValue("max_image_incr", 30);
settings->min_image_full=settings_default->getValue("min_image_full", 2);
settings->max_image_full=settings_default->getValue("max_image_full", 5);
settings->no_images=(settings_global->getValue("no_images", "false")=="true");
settings->no_file_backups=(settings_global->getValue("no_file_backups", "false")=="true");
settings->overwrite=false;
settings->allow_overwrite=(settings_default->getValue("allow_overwrite", "true")=="true");
settings->backupfolder=trim(settings_global->getValue("backupfolder", "C:\\urbackup"));
settings->backupfolder_uncompr=trim(settings_global->getValue("backupfolder_uncompr", settings->backupfolder));
settings->autoshutdown=(settings_global->getValue("autoshutdown", "false")=="true");;
settings->startup_backup_delay=settings_default->getValue("startup_backup_delay", 0);
settings->download_client=(settings_global->getValue("download_client", "true")=="true");
settings->autoupdate_clients=(settings_global->getValue("autoupdate_clients", "true")=="true");
settings->backup_window_incr_file=settings_default->getValue("backup_window_incr_file", "1-7/0-24");
settings->backup_window_full_file=settings_default->getValue("backup_window_full_file", "1-7/0-24");
settings->backup_window_incr_image=settings_default->getValue("backup_window_incr_image", "1-7/0-24");
settings->backup_window_full_image=settings_default->getValue("backup_window_full_image", "1-7/0-24");
settings->max_active_clients= settings_global->getValue("max_active_clients", 10000);
settings->max_sim_backups= settings_global->getValue("max_sim_backups", 100);
settings->exclude_files=settings_default->getValue("exclude_files", "");
settings->include_files=settings_default->getValue("include_files", "");
settings->default_dirs=settings_default->getValue("default_dirs", "");
settings->cleanup_window= settings_global->getValue("cleanup_window", "1-7/3-4");
settings->allow_config_paths=(settings_default->getValue("allow_config_paths", "true")=="true");
settings->allow_starting_full_file_backups=(settings_default->getValue("allow_starting_full_file_backups", "true")=="true");
settings->allow_starting_incr_file_backups=(settings_default->getValue("allow_starting_incr_file_backups", "true")=="true");
settings->allow_starting_full_image_backups=(settings_default->getValue("allow_starting_full_image_backups", "true")=="true");
settings->allow_starting_incr_image_backups=(settings_default->getValue("allow_starting_incr_image_backups", "true")=="true");
settings->allow_pause=(settings_default->getValue("allow_pause", "true")=="true");
settings->allow_log_view=(settings_default->getValue("allow_log_view", "true")=="true");
settings->allow_tray_exit=(settings_default->getValue("allow_tray_exit", "true")=="true");
settings->image_letters=settings_default->getValue("image_letters", "C");
settings->backup_database=(settings_global->getValue("backup_database", "true")=="true");
settings->internet_server_port=(unsigned short)(atoi(settings_global->getValue("internet_server_port", "55415").c_str()));
settings->client_set_settings=false;
settings->internet_server= settings_global->getValue("internet_server", "");
settings->internet_image_backups=(settings_default->getValue("internet_image_backups", "false")=="true");
settings->internet_full_file_backups=(settings_default->getValue("internet_full_file_backups", "false")=="true");
settings->internet_encrypt=(settings_default->getValue("internet_encrypt", "true")=="true");
settings->internet_compress=(settings_default->getValue("internet_compress", "true")=="true");
settings->internet_compression_level=atoi(settings_default->getValue("internet_compression_level", "6").c_str());
settings->internet_speed=settings_default->getValue("internet_speed", "-1");
settings->local_speed=settings_default->getValue("local_speed", "-1");
settings->global_internet_speed= settings_global->getValue("global_internet_speed", "-1");
settings->global_local_speed= settings_global->getValue("global_local_speed", "-1");
settings->internet_mode_enabled=(settings_default->getValue("internet_mode_enabled", "false")=="true");
settings->silent_update=(settings_default->getValue("silent_update", "false")=="true");
settings->use_tmpfiles=(settings_global->getValue("use_tmpfiles", "false")=="true");
settings->use_tmpfiles_images=(settings_global->getValue("use_tmpfiles_images", "false")=="true");
settings->tmpdir= settings_global->getValue("tmpdir","");
settings->local_full_file_transfer_mode=settings_default->getValue("local_full_file_transfer_mode", "hashed");
settings->internet_full_file_transfer_mode=settings_default->getValue("internet_full_file_transfer_mode", "raw");
settings->local_incr_file_transfer_mode=settings_default->getValue("local_incr_file_transfer_mode", "hashed");
settings->internet_incr_file_transfer_mode=settings_default->getValue("internet_incr_file_transfer_mode", "blockhash");
settings->local_image_transfer_mode=settings_default->getValue("local_image_transfer_mode", "hashed");
settings->internet_image_transfer_mode=settings_default->getValue("internet_image_transfer_mode", "raw");
settings->update_stats_cachesize=static_cast(settings_global->getValue("update_stats_cachesize", 200*1024));
settings->global_soft_fs_quota= settings_global->getValue("global_soft_fs_quota", "95%");
settings->client_quota=settings_default->getValue("client_quota", "");
settings->end_to_end_file_backup_verification=(settings_default->getValue("end_to_end_file_backup_verification", "false")=="true");
settings->internet_calculate_filehashes_on_client=(settings_default->getValue("internet_calculate_filehashes_on_client", "true")=="true");
settings->internet_parallel_file_hashing = (settings_default->getValue("internet_parallel_file_hashing", "false") == "true");
settings->use_incremental_symlinks=(settings_global->getValue("use_incremental_symlinks", "true")=="true");
settings->internet_connect_always=(settings_default->getValue("internet_connect_always", "false")=="true");
settings->show_server_updates=(settings_global->getValue("show_server_updates", "true")=="true");
settings->server_url= trim(settings_global->getValue("server_url", ""));
settings->verify_using_client_hashes=(settings_default->getValue("verify_using_client_hashes", "false")=="true");
settings->internet_readd_file_entries=(settings_default->getValue("internet_readd_file_entries", "true")=="true");
settings->max_running_jobs_per_client=atoi(settings_default->getValue("max_running_jobs_per_client", "1").c_str());
settings->create_linked_user_views=(settings_default->getValue("create_linked_user_views", "false")=="true");
settings->background_backups=(settings_default->getValue("background_backups", "true")=="true");
settings->local_incr_image_style=settings_default->getValue("local_incr_image_style", incr_image_style_to_full);
settings->local_full_image_style=settings_default->getValue("local_full_image_style", full_image_style_full);
settings->internet_incr_image_style=settings_default->getValue("internet_incr_image_style", incr_image_style_to_last);
settings->internet_full_image_style=settings_default->getValue("internet_full_image_style", full_image_style_synthetic);
settings->backup_ok_mod_file = settings_default->getValue("backup_ok_mod_file", 3.f);
settings->backup_ok_mod_image = settings_default->getValue("backup_ok_mod_image", 3.f);
settings->cbt_volumes = settings_default->getValue("cbt_volumes", "ALL");
settings->cbt_crash_persistent_volumes = settings_default->getValue("cbt_crash_persistent_volumes", "-");
settings->ignore_disk_errors = (settings_default->getValue("ignore_disk_errors", "false") == "true");
settings->vss_select_components = settings_default->getValue("vss_select_components", "default=1");
settings->allow_file_restore = settings_default->getValue("allow_file_restore", "true")=="true";
settings->allow_component_restore = settings_default->getValue("allow_component_restore", "true") == "true";
settings->allow_component_config = settings_default->getValue("allow_component_config", "true") == "true";
settings->image_snapshot_groups = settings_default->getValue("image_snapshot_groups", "");
settings->file_snapshot_groups = settings_default->getValue("file_snapshot_groups", "");
settings->internet_file_dataplan_limit = settings_default->getValue("internet_file_dataplan_limit", 5LL*1000*1024*1024);
settings->internet_image_dataplan_limit = settings_default->getValue("internet_image_dataplan_limit", 20LL * 1000* 1024 * 1024);
settings->alert_script = settings_default->getValue("alert_script", 1);
settings->alert_params = settings_default->getValue("alert_params", "");
}
void ServerSettings::readSettingsClient(ISettingsReader* settings_client)
{
SSettings* settings = local_settings;
std::string stmp=settings_client->getValue("internet_authkey", std::string());
if(!stmp.empty())
{
settings->internet_authkey=stmp;
}
else
{
settings->internet_authkey=generateRandomAuthKey();
}
settings->client_access_key = settings_client->getValue("client_access_key", std::string());
readBoolClientSetting(settings_client, "overwrite", &settings->overwrite);
if(settings->overwrite)
{
readBoolClientSetting(settings_client, "allow_overwrite", &settings->allow_overwrite);
}
if(!settings->overwrite && !settings->allow_overwrite)
return;
stmp=settings_client->getValue("update_freq_incr", std::string());
if(!stmp.empty())
settings->update_freq_incr=stmp;
stmp=settings_client->getValue("update_freq_full", std::string());
if(!stmp.empty())
settings->update_freq_full=stmp;
stmp=settings_client->getValue("update_freq_image_incr", std::string());
if(!stmp.empty())
settings->update_freq_image_incr=stmp;
stmp=settings_client->getValue("update_freq_image_full", std::string());
if(!stmp.empty())
settings->update_freq_image_full=stmp;
int tmp=settings_client->getValue("max_file_incr", -1);
if(tmp!=-1)
settings->max_file_incr=tmp;
tmp=settings_client->getValue("min_file_incr", -1);
if(tmp!=-1)
settings->min_file_incr=tmp;
tmp=settings_client->getValue("max_file_full", -1);
if(tmp!=-1)
settings->max_file_full=tmp;
tmp=settings_client->getValue("min_file_full", -1);
if(tmp!=-1)
settings->min_file_full=tmp;
tmp=settings_client->getValue("min_image_incr", -1);
if(tmp!=-1)
settings->min_image_incr=tmp;
tmp=settings_client->getValue("max_image_incr", -1);
if(tmp!=-1)
settings->max_image_incr=tmp;
tmp=settings_client->getValue("min_image_full", -1);
if(tmp!=-1)
settings->min_image_full=tmp;
tmp=settings_client->getValue("max_image_full", -1);
if(tmp!=-1)
settings->max_image_full=tmp;
tmp=settings_client->getValue("startup_backup_delay", -1);
if(tmp!=-1)
settings->startup_backup_delay=tmp;
std::string swtmp=settings_client->getValue("computername", "");
if(!swtmp.empty())
settings->computername=swtmp;
if(settings_client->getValue("virtual_clients", &swtmp))
settings->virtual_clients=swtmp;
if(settings_client->getValue("exclude_files", &swtmp))
settings->exclude_files=swtmp;
if(settings_client->getValue("include_files", &swtmp))
settings->include_files=swtmp;
swtmp=settings_client->getValue("default_dirs", "");
if(!swtmp.empty())
settings->default_dirs=swtmp;
stmp=settings_client->getValue("image_letters", "");
if(!stmp.empty())
settings->image_letters=stmp;
stmp=settings_client->getValue("internet_speed", "");
if(!stmp.empty())
settings->internet_speed=stmp;
stmp=settings_client->getValue("local_speed", "");
if(!stmp.empty())
settings->local_speed=stmp;
readBoolClientSetting(settings_client, "client_set_settings", &settings->client_set_settings);
readBoolClientSetting(settings_client, "internet_mode_enabled", &settings->internet_mode_enabled);
readBoolClientSetting(settings_client, "internet_full_file_backups", &settings->internet_full_file_backups);
readBoolClientSetting(settings_client, "internet_image_backups", &settings->internet_image_backups);
readBoolClientSetting(settings_client, "internet_compress", &settings->internet_compress);
readBoolClientSetting(settings_client, "internet_encrypt", &settings->internet_encrypt);
readBoolClientSetting(settings_client, "internet_connect_always", &settings->internet_connect_always);
readStringClientSetting(settings_client, "vss_select_components", &settings->vss_select_components);
if (!settings->overwrite
&& settings->image_snapshot_groups.empty())
{
readStringClientSetting(settings_client, "image_snapshot_groups_def", &settings->image_snapshot_groups);
}
if (settings_client->getValue("virtual_clients_add", &stmp))
{
settings->virtual_clients_add = stmp;
}
if(!settings->overwrite)
return;
//Following settings are not configurable by the client
stmp=settings_client->getValue("backup_window_incr_file", "");
if(!stmp.empty())
settings->backup_window_incr_file=stmp;
stmp=settings_client->getValue("backup_window_full_file", "");
if(!stmp.empty())
settings->backup_window_full_file=stmp;
stmp=settings_client->getValue("backup_window_incr_image", "");
if(!stmp.empty())
settings->backup_window_incr_image=stmp;
stmp=settings_client->getValue("backup_window_full_image", "");
if(!stmp.empty())
settings->backup_window_full_image=stmp;
stmp=settings_client->getValue("client_quota", "");
if(!stmp.empty())
settings->client_quota=stmp;
stmp=settings_client->getValue("image_file_format", "");
if(!stmp.empty())
settings->image_file_format=stmp;
readStringClientSetting(settings_client, "local_incr_file_transfer_mode", &settings->local_incr_file_transfer_mode);
readStringClientSetting(settings_client, "local_full_file_transfer_mode", &settings->local_full_file_transfer_mode);
readStringClientSetting(settings_client, "internet_full_file_transfer_mode", &settings->internet_full_file_transfer_mode);
readStringClientSetting(settings_client, "internet_incr_file_transfer_mode", &settings->internet_incr_file_transfer_mode);
readStringClientSetting(settings_client, "local_image_transfer_mode", &settings->local_image_transfer_mode);
readStringClientSetting(settings_client, "internet_image_transfer_mode", &settings->internet_image_transfer_mode);
readBoolClientSetting(settings_client, "end_to_end_file_backup_verification", &settings->end_to_end_file_backup_verification);
readBoolClientSetting(settings_client, "internet_calculate_filehashes_on_client", &settings->internet_calculate_filehashes_on_client);
readBoolClientSetting(settings_client, "internet_parallel_file_hashing", &settings->internet_parallel_file_hashing);
readBoolClientSetting(settings_client, "silent_update", &settings->silent_update);
readBoolClientSetting(settings_client, "allow_config_paths", &settings->allow_config_paths);
readBoolClientSetting(settings_client, "allow_starting_full_file_backups", &settings->allow_starting_full_file_backups);
readBoolClientSetting(settings_client, "allow_starting_incr_file_backups", &settings->allow_starting_incr_file_backups);
readBoolClientSetting(settings_client, "allow_starting_full_image_backups", &settings->allow_starting_full_image_backups);
readBoolClientSetting(settings_client, "allow_starting_incr_image_backups", &settings->allow_starting_incr_image_backups);
readBoolClientSetting(settings_client, "allow_pause", &settings->allow_pause);
readBoolClientSetting(settings_client, "allow_log_view", &settings->allow_log_view);
readBoolClientSetting(settings_client, "allow_tray_exit", &settings->allow_tray_exit);
readBoolClientSetting(settings_client, "verify_using_client_hashes", &settings->verify_using_client_hashes);
readBoolClientSetting(settings_client, "internet_readd_file_entries", &settings->internet_readd_file_entries);
readBoolClientSetting(settings_client, "background_backups", &settings->background_backups);
readIntClientSetting(settings_client, "max_running_jobs_per_client", &settings->max_running_jobs_per_client);
readBoolClientSetting(settings_client, "create_linked_user_views", &settings->create_linked_user_views);
readStringClientSetting(settings_client, "local_incr_image_style", &settings->local_incr_image_style);
readStringClientSetting(settings_client, "local_full_image_style", &settings->local_full_image_style);
readStringClientSetting(settings_client, "internet_incr_image_style", &settings->internet_incr_image_style);
readStringClientSetting(settings_client, "internet_full_image_style", &settings->internet_full_image_style);
readStringClientSetting(settings_client, "cbt_volumes", &settings->cbt_volumes);
readStringClientSetting(settings_client, "cbt_crash_persistent_volumes", &settings->cbt_crash_persistent_volumes);
readBoolClientSetting(settings_client, "ignore_disk_errors", &settings->ignore_disk_errors);
readBoolClientSetting(settings_client, "allow_file_restore", &settings->allow_file_restore);
readBoolClientSetting(settings_client, "allow_component_config", &settings->allow_component_config);
readBoolClientSetting(settings_client, "allow_component_restore", &settings->allow_component_restore);
readStringClientSetting(settings_client, "image_snapshot_groups", &settings->image_snapshot_groups);
readStringClientSetting(settings_client, "file_snapshot_groups", &settings->file_snapshot_groups);
readInt64ClientSetting(settings_client, "internet_file_dataplan_limit", &settings->internet_file_dataplan_limit);
readInt64ClientSetting(settings_client, "internet_image_dataplan_limit", &settings->internet_image_dataplan_limit);
readIntClientSetting(settings_client, "alert_script", &settings->alert_script);
readStringClientSetting(settings_client, "alert_params", &settings->alert_params);
}
void ServerSettings::readBoolClientSetting(ISettingsReader* settings_client, const std::string &name, bool *output)
{
std::string value;
if(settings_client->getValue(name, &value) && !value.empty())
{
if(value=="true")
*output=true;
else if(value=="false")
*output=false;
}
}
void ServerSettings::readStringClientSetting(ISettingsReader* settings_client, const std::string &name, std::string *output)
{
std::string value;
if(settings_client->getValue(name, &value) && !value.empty())
{
*output=value;
}
}
void ServerSettings::readIntClientSetting(ISettingsReader* settings_client, const std::string &name, int *output)
{
std::string value;
if(settings_client->getValue(name, &value) && !value.empty())
{
*output=atoi(value.c_str());
}
}
void ServerSettings::readInt64ClientSetting(ISettingsReader* settings_client, const std::string &name, int64 *output)
{
std::string value;
if (settings_client->getValue(name, &value) && !value.empty())
{
*output = watoi64(value);
}
}
void ServerSettings::readSizeClientSetting(ISettingsReader* settings_client, const std::string &name, size_t *output)
{
std::string value;
if(settings_client->getValue(name, &value) && !value.empty())
{
*output=static_cast(os_atoi64(value));
}
}
std::vector ServerSettings::getCleanupWindow(void)
{
std::string window=getSettings()->cleanup_window;
return getWindow(window);
}
std::vector ServerSettings::getBackupWindowIncrFile(void)
{
std::string window=getSettings()->backup_window_incr_file;
return getWindow(window);
}
std::vector ServerSettings::getBackupWindowFullFile(void)
{
std::string window=getSettings()->backup_window_full_file;
return getWindow(window);
}
std::vector ServerSettings::getBackupWindowIncrImage(void)
{
std::string window=getSettings()->backup_window_incr_image;
return getWindow(window);
}
std::vector ServerSettings::getBackupWindowFullImage(void)
{
std::string window=getSettings()->backup_window_full_image;
return getWindow(window);
}
std::vector ServerSettings::getBackupVolumes(const std::string& all_volumes, const std::string& all_nonusb_volumes)
{
std::string vols=getSettings()->image_letters;
if(strlower(vols)=="all")
{
vols=all_volumes;
}
else if(strlower(vols)=="all_nonusb")
{
vols=all_nonusb_volumes;
}
std::vector ret;
Tokenize(vols, ret, ";,");
for(size_t i=0;i ServerSettings::getWindow(std::string window)
{
std::vector toks;
Tokenize(window, toks, ";");
std::vector ret;
for(size_t i=0;i add = parseTimeSpan(toks[i]);
ret.insert(ret.end(), add.begin(), add.end());
}
return ret;
}
float ServerSettings::parseTimeDet(std::string t)
{
if(t.find(":")!=std::string::npos)
{
std::string h=getuntil(":", t);
std::string m=getafter(":", t);
return (float)atoi(h.c_str())+(float)atoi(m.c_str())*(1.f/60.f);
}
else
{
return (float)atoi(t.c_str());
}
}
int ServerSettings::parseDayOfWeek(std::string dow)
{
if(dow.size()==1 && str_isnumber(dow[0])==true)
{
int r=atoi(dow.c_str());
if(r==0) r=7;
return r;
}
else
{
dow=strlower(dow);
if(dow=="mon" || dow=="mo" ) return 1;
if(dow=="tu" || dow=="tue" || dow=="tues" || dow=="di" ) return 2;
if(dow=="wed" || dow=="mi" ) return 3;
if(dow=="th" || dow=="thu" || dow=="thur" || dow=="thurs" || dow=="do" ) return 4;
if(dow=="fri" || dow=="fr" ) return 5;
if(dow=="sat" || dow=="sa" ) return 6;
if(dow=="sun" || dow=="so" ) return 7;
return -1;
}
}
STimeSpan ServerSettings::parseTime(std::string t)
{
if(t.find("-")!=std::string::npos)
{
std::string f=trim(getuntil("-", t));
std::string b=trim(getafter("-", t));
return STimeSpan(parseTimeDet(f), parseTimeDet(b) );
}
else
{
return STimeSpan();
}
}
std::string ServerSettings::generateRandomAuthKey(size_t len)
{
std::string rchars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
std::string key;
std::vector rnd_n=Server->getSecureRandomNumbers(len);
for(size_t j=0;jsecureRandomFill((char*)key.data(), 32);
return key;
}
int ServerSettings::getUpdateFreqImageIncr()
{
updateInternal(NULL);
return static_cast(currentTimeSpanValue(local_settings->update_freq_image_incr)+1);
}
int ServerSettings::getUpdateFreqFileIncr()
{
updateInternal(NULL);
return static_cast(currentTimeSpanValue(local_settings->update_freq_incr)+1);
}
int ServerSettings::getUpdateFreqImageFull()
{
updateInternal(NULL);
return static_cast(currentTimeSpanValue(local_settings->update_freq_image_full)+1);
}
int ServerSettings::getUpdateFreqFileFull()
{
updateInternal(NULL);
return static_cast(currentTimeSpanValue(local_settings->update_freq_full)+1);
}
std::string ServerSettings::getImageFileFormat()
{
std::string image_file_format = getSettings()->image_file_format;
return getImageFileFormatInt(image_file_format);
}
std::string ServerSettings::getImageFileFormatInt( const std::string& image_file_format )
{
if(image_file_format == image_file_format_default)
{
if(BackupServer::isImageSnapshotsEnabled()
|| BackupServer::canReflink())
{
return image_file_format_cowraw;
}
else
{
return image_file_format_default;
}
}
else
{
return image_file_format;
}
}
std::vector ServerSettings::parseTimeSpan(std::string time_span)
{
std::vector ret;
std::string c_tok=trim(time_span);
std::string f_o=getuntil("/", c_tok);
std::string b_o=getafter("/", c_tok);
std::vector dow_toks;
Tokenize(f_o, dow_toks, ",");
std::vector time_toks;
Tokenize(b_o, time_toks, ",");
for(size_t l=0;l7 || stop<1 || stop>7)
{
ret.clear();
return ret;
}
for(size_t o=0;o7)
{
ret.clear();
return ret;
}
for(size_t o=0;o > ServerSettings::parseTimeSpanValue(std::string time_span_value)
{
std::vector toks;
Tokenize(time_span_value, toks, ";");
std::vector > ret;
for(size_t i=0;i timespans = parseTimeSpan(getafter("@", toks[i]));
for(size_t i=0;i(round(currentTimeSpanValue(getSettings()->local_speed)));
}
int ServerSettings::getGlobalLocalSpeed()
{
return static_cast(round(currentTimeSpanValue(getSettings()->global_local_speed)));
}
int ServerSettings::getInternetSpeed()
{
return static_cast(round(currentTimeSpanValue(getSettings()->internet_speed)));
}
int ServerSettings::getGlobalInternetSpeed()
{
return static_cast(round(currentTimeSpanValue(getSettings()->global_internet_speed)));
}
std::string ServerSettings::getVirtualClients()
{
std::string ret = getSettings()->virtual_clients;
std::string add = getSettings()->virtual_clients_add;
if (!add.empty())
{
if (!ret.empty())ret += "|";
ret += add;
}
return ret;
}
double ServerSettings::currentTimeSpanValue(std::string time_span_value)
{
std::vector > time_span_values = parseTimeSpanValue(time_span_value);
double val = 0;
double selected_time_span_duration=25.f*7;
for(size_t i=0;i single_time_span;
single_time_span.push_back(time_span_values[i].second);
if(time_span_values[i].second.duration() bw)
{
if(bw.empty()) return true;
int dow=atoi(os_strftime("%w").c_str());
if(dow==0) dow=7;
float hm=(float)atoi(remLeadingZeros(os_strftime("%H")).c_str())+(float)atoi(remLeadingZeros(os_strftime("%M")).c_str())*(1.f/60.f);
for(size_t i=0;i=bw[i].start_hour && hm<=bw[i].stop_hour)
|| (bw[i].start_hour>bw[i].stop_hour && (hm>=bw[i].start_hour || hm<=bw[i].stop_hour) ) )
{
return true;
}
}
}
return false;
}
SLDAPSettings ServerSettings::getLDAPSettings()
{
std::auto_ptr settings_client, settings_default, settings_global;
createSettingsReaders(settings_default, settings_client, settings_global);
SLDAPSettings ldap_settings;
ldap_settings.login_enabled = settings_default->getValue("ldap_login_enabled", "false")=="true";
ldap_settings.server_name = settings_default->getValue("ldap_server_name", "example.com");
ldap_settings.server_port = settings_default->getValue("ldap_server_port", 3268);
ldap_settings.username_prefix = settings_default->getValue("ldap_username_prefix", "example\\");
ldap_settings.username_suffix = settings_default->getValue("ldap_username_suffix", "");
ldap_settings.group_class_query = settings_default->getValue("ldap_group_class_query", "DC=example,DC=com?memberOf,objectClass?sub?(sAMAccountName={USERNAME})");
ldap_settings.group_key_name = settings_default->getValue("ldap_group_key_name", "memberOf");
ldap_settings.class_key_name = settings_default->getValue("ldap_class_key_name", "objectClass");
ldap_settings.group_rights_map = parseLdapMap(settings_default->getValue("ldap_group_rights_map", "CN=Domain Admins,*==>all=all"));
ldap_settings.class_rights_map = parseLdapMap(settings_default->getValue("ldap_class_rights_map", "user==>lastacts={AUTOCLIENTS},progress={AUTOCLIENTS},status={AUTOCLIENTS},stop_backup={AUTOCLIENTS},start_backup=all,browse_backups=tokens"));
return ldap_settings;
}
std::map ServerSettings::parseLdapMap( const std::string& data )
{
std::vector mappings;
std::map ret;
Tokenize(data, mappings, "/");
for(size_t i=0;i", data);
std::string target = getafter("==>", data);
ret[source] = target;
}
return ret;
}
std::string ServerSettings::ldapMapToString( const std::map& ldap_map )
{
std::string ret;
for(std::map::const_iterator it=ldap_map.begin();
it!=ldap_map.end();++it)
{
if(!ret.empty())
{
ret+="/";
}
ret+=it->first+"==>"+it->second;
}
return ret;
}
#endif //CLIENT_ONLY