diff --git a/urbackupcommon/adler32.h b/urbackupcommon/adler32.h new file mode 100644 index 00000000..6e87e8e9 --- /dev/null +++ b/urbackupcommon/adler32.h @@ -0,0 +1,3 @@ +#pragma once + +unsigned int adler32(unsigned int adler, const char *buf, unsigned int len); \ No newline at end of file diff --git a/urbackupcommon/settingslist.cpp b/urbackupcommon/settingslist.cpp index 951824dc..6d584daa 100644 --- a/urbackupcommon/settingslist.cpp +++ b/urbackupcommon/settingslist.cpp @@ -120,5 +120,6 @@ std::vector getGlobalSettingsList(void) ret.push_back(L"global_soft_fs_quota"); ret.push_back(L"filescache_type"); ret.push_back(L"filescache_size"); + ret.push_back(L"trust_client_hashes"); return ret; } \ No newline at end of file diff --git a/urbackupserver/Makefile.am b/urbackupserver/Makefile.am index ac1425b4..f2be77ed 100644 --- a/urbackupserver/Makefile.am +++ b/urbackupserver/Makefile.am @@ -1,6 +1,6 @@ ACLOCAL_AMFLAGS = -I m4 lib_LTLIBRARIES = liburbackupserver.la -liburbackupserver_la_SOURCES = dllmain.cpp ../stringtools.cpp ../urbackupcommon/os_functions_lin.cpp server.cpp server_get.cpp server_hash.cpp server_image.cpp ../urbackupcommon/sha2/sha2.c ../common/data.cpp fileclient/FileClient.cpp ../urbackupcommon/fileclient/tcpstack.cpp server_prepare_hash.cpp server_update.cpp server_status.cpp server_channel.cpp server_ping.cpp server_log.cpp ../urbackupcommon/escape.cpp server_writer.cpp ../urbackupcommon/bufmgr.cpp server_running.cpp server_cleanup.cpp server_settings.cpp server_update_stats.cpp serverinterface/helper.cpp ../urbackupcommon/json.cpp serverinterface/lastacts.cpp serverinterface/login.cpp serverinterface/progress.cpp serverinterface/salt.cpp serverinterface/users.cpp serverinterface/piegraph.cpp serverinterface/usage.cpp serverinterface/usagegraph.cpp serverinterface/status.cpp serverinterface/settings.cpp serverinterface/backups.cpp serverinterface/logs.cpp serverinterface/getimage.cpp serverinterface/download_client.cpp treediff/TreeDiff.cpp treediff/TreeNode.cpp treediff/TreeReader.cpp ChunkPatcher.cpp ../urbackupcommon/CompressedPipe.cpp InternetServiceConnector.cpp ../urbackupcommon/InternetServicePipe.cpp ../md5.cpp ../urbackupcommon/settingslist.cpp fileclient/FileClientChunked.cpp ../urbackupcommon/adler32.cpp server_archive.cpp filedownload.cpp serverinterface/shutdown.cpp snapshot_helper.cpp verify_hashes.cpp apps/cleanup_cmd.cpp apps/repair_cmd.cpp dao/ServerCleanupDao.cpp lmdb/mdb.c lmdb/midl.c MDBFileCache.cpp DatabaseFileCache.cpp create_files_cache.cpp FileCache.cpp SQLiteFileCache.cpp serverinterface/livelog.cpp serverinterface/start_backup.cpp serverinterface/create_zip.cpp server_dir_links.cpp dao/ServerBackupDao.cpp apps/export_auth_log.cpp server_download.cpp +liburbackupserver_la_SOURCES = dllmain.cpp ../stringtools.cpp ../urbackupcommon/os_functions_lin.cpp server.cpp server_get.cpp server_hash.cpp server_image.cpp ../urbackupcommon/sha2/sha2.c ../common/data.cpp fileclient/FileClient.cpp ../urbackupcommon/fileclient/tcpstack.cpp server_prepare_hash.cpp server_update.cpp server_status.cpp server_channel.cpp server_ping.cpp server_log.cpp ../urbackupcommon/escape.cpp server_writer.cpp ../urbackupcommon/bufmgr.cpp server_running.cpp server_cleanup.cpp server_settings.cpp server_update_stats.cpp serverinterface/helper.cpp ../urbackupcommon/json.cpp serverinterface/lastacts.cpp serverinterface/login.cpp serverinterface/progress.cpp serverinterface/salt.cpp serverinterface/users.cpp serverinterface/piegraph.cpp serverinterface/usage.cpp serverinterface/usagegraph.cpp serverinterface/status.cpp serverinterface/settings.cpp serverinterface/backups.cpp serverinterface/logs.cpp serverinterface/getimage.cpp serverinterface/download_client.cpp treediff/TreeDiff.cpp treediff/TreeNode.cpp treediff/TreeReader.cpp ChunkPatcher.cpp ../urbackupcommon/CompressedPipe.cpp InternetServiceConnector.cpp ../urbackupcommon/InternetServicePipe.cpp ../md5.cpp ../urbackupcommon/settingslist.cpp fileclient/FileClientChunked.cpp ../urbackupcommon/adler32.cpp server_archive.cpp filedownload.cpp serverinterface/shutdown.cpp snapshot_helper.cpp verify_hashes.cpp apps/cleanup_cmd.cpp apps/repair_cmd.cpp dao/ServerCleanupDao.cpp lmdb/mdb.c lmdb/midl.c MDBFileCache.cpp DatabaseFileCache.cpp create_files_cache.cpp FileCache.cpp SQLiteFileCache.cpp serverinterface/livelog.cpp serverinterface/start_backup.cpp serverinterface/create_zip.cpp server_dir_links.cpp dao/ServerBackupDao.cpp apps/export_auth_log.cpp server_download.cpp server_hash_existing.cpp liburbackupserver_la_LDFLAGS = --no-undefined if WITH_FORTIFY AM_CPPFLAGS = -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 @@ -22,5 +22,5 @@ endif $(INSTALL_DATA) $(INSTALL_OPTS) $(srcdir)/www/*.gif "$(DESTDIR)$(localstatedir)/urbackup/www/" $(INSTALL_DATA) $(INSTALL_OPTS) $(srcdir)/urbackup_dsa.pub "$(DESTDIR)$(localstatedir)/urbackup/urbackup_dsa.pub" $(INSTALL_DATA) $(INSTALL_OPTS) $(srcdir)/www/*.swf "$(DESTDIR)$(localstatedir)/urbackup/www/" -noinst_HEADERS = server_ping.h server_cleanup.h ../urbackupcommon/os_functions.h server_image.h ../urbackupcommon/json.h serverinterface/helper.h serverinterface/action_header.h serverinterface/actions.h server_writer.h ../urbackupcommon/settings.h server_image.h server_settings.h zero_hash.h server_update.h server_log.h server_hash.h server_status.h ../urbackupcommon/bufmgr.h server_update_stats.h ../urbackupcommon/sha2/sha2.h ../md5.h fileclient/FileClient.h ../common/data.h fileclient/socket_header.h ../urbackupcommon/fileclient/tcpstack.h fileclient/packet_ids.h database.h mbr_code.h action_header.h ../urbackupcommon/escape.h server.h server_running.h server_prepare_hash.h actions.h server_channel.h server_get.h treediff/TreeDiff.h treediff/TreeNode.h treediff/TreeReader.h ../fileservplugin/IFileServFactory.h ../fileservplugin/IFileServ.h ../urlplugin/IUrlFactory.h ../urbackupcommon/capa_bits.h ../cryptoplugin/ICryptoFactory.h fileclient/FileClientChunked.h ChunkPatcher.h ../urbackupcommon/CompressedPipe.h ../urbackupcommon/InternetServicePipe.h ../urbackupcommon/InternetServiceIDs.h InternetServiceConnector.h ../md5.h ../urbackupcommon/settingslist.h server_archive.h ../cryptoplugin/IZlibCompression.h ../cryptoplugin/IZlibDecompression.h ../cryptoplugin/ICryptoFactory.h ../cryptoplugin/IAESEncryption.h ../cryptoplugin/IAESDecryption.h ../fileservplugin/chunk_settings.h ../urbackupcommon/internet_pipe_capabilities.h ../urbackupcommon/mbrdata.h filedownload.h snapshot_helper.h apps/cleanup_cmd.h apps/repair_cmd.h dao/ServerCleanupDao.h lmdb/lmdb.h lmdb/midl.h MDBFileCache.h DatabaseFileCache.h create_files_cache.h FileCache.h SQLiteFileCache.h serverinterface/rights.h ../common/miniz.c server_dir_links.h dao/ServerBackupDao.h apps/app.h apps/export_auth_log.h serverinterface/login.h server_download.h +noinst_HEADERS = server_ping.h server_cleanup.h ../urbackupcommon/os_functions.h server_image.h ../urbackupcommon/json.h serverinterface/helper.h serverinterface/action_header.h serverinterface/actions.h server_writer.h ../urbackupcommon/settings.h server_image.h server_settings.h zero_hash.h server_update.h server_log.h server_hash.h server_status.h ../urbackupcommon/bufmgr.h server_update_stats.h ../urbackupcommon/sha2/sha2.h ../md5.h fileclient/FileClient.h ../common/data.h fileclient/socket_header.h ../urbackupcommon/fileclient/tcpstack.h fileclient/packet_ids.h database.h mbr_code.h action_header.h ../urbackupcommon/escape.h server.h server_running.h server_prepare_hash.h actions.h server_channel.h server_get.h treediff/TreeDiff.h treediff/TreeNode.h treediff/TreeReader.h ../fileservplugin/IFileServFactory.h ../fileservplugin/IFileServ.h ../urlplugin/IUrlFactory.h ../urbackupcommon/capa_bits.h ../cryptoplugin/ICryptoFactory.h fileclient/FileClientChunked.h ChunkPatcher.h ../urbackupcommon/CompressedPipe.h ../urbackupcommon/InternetServicePipe.h ../urbackupcommon/InternetServiceIDs.h InternetServiceConnector.h ../md5.h ../urbackupcommon/settingslist.h server_archive.h ../cryptoplugin/IZlibCompression.h ../cryptoplugin/IZlibDecompression.h ../cryptoplugin/ICryptoFactory.h ../cryptoplugin/IAESEncryption.h ../cryptoplugin/IAESDecryption.h ../fileservplugin/chunk_settings.h ../urbackupcommon/internet_pipe_capabilities.h ../urbackupcommon/mbrdata.h filedownload.h snapshot_helper.h apps/cleanup_cmd.h apps/repair_cmd.h dao/ServerCleanupDao.h lmdb/lmdb.h lmdb/midl.h MDBFileCache.h DatabaseFileCache.h create_files_cache.h FileCache.h SQLiteFileCache.h serverinterface/rights.h ../common/miniz.c server_dir_links.h dao/ServerBackupDao.h apps/app.h apps/export_auth_log.h serverinterface/login.h server_download.h ../urbackupcommon/adler32.h server_hash_existing.h EXTRA_DIST = backup_server.db ../urbackup/status.htm www/*.js www/*.htm www/*.css www/*.png www/*.gif www/*.ico urbackup_dsa.pub www/*.swf diff --git a/urbackupserver/server_get.cpp b/urbackupserver/server_get.cpp index 28726986..db75452c 100644 --- a/urbackupserver/server_get.cpp +++ b/urbackupserver/server_get.cpp @@ -31,6 +31,7 @@ #include "InternetServiceConnector.h" #include "server_update_stats.h" #include "../urbackupcommon/escape.h" +#include "../urbackupcommon/adler32.h" #include "server_running.h" #include "server_cleanup.h" #include "treediff/TreeDiff.h" @@ -39,6 +40,7 @@ #include "../Interface/PipeThrottler.h" #include "snapshot_helper.h" #include "../cryptoplugin/ICryptoFactory.h" +#include "server_hash_existing.h" #include "server_dir_links.h" #include "server.h" #include @@ -125,6 +127,8 @@ BackupServerGet::BackupServerGet(IPipe *pPipe, sockaddr_in pAddr, const std::wst last_file_backup_try=0; count_file_backup_try=0; + + hash_existing_mutex = Server->createMutex(); } @@ -148,6 +152,8 @@ BackupServerGet::~BackupServerGet(void) local_hash->deinitDatabase(); delete local_hash; } + + Server->destroy(hash_existing_mutex); } namespace @@ -2292,8 +2298,12 @@ bool BackupServerGet::doIncrBackup(bool with_hashes, bool intra_file_diffs, bool } } + bool copy_file_entries_sparse = internet_connection && server_settings->getSettings()->internet_calculate_filehashes_on_client; + int copy_file_entries_sparse_modulo = server_settings->getSettings()->min_file_incr; + bool trust_client_hashes = server_settings->getSettings()->trust_client_hashes; + bool copy_file_entries=false; - if(resumed_backup) + if(resumed_backup || copy_file_entries_sparse) { copy_file_entries = backup_dao->createTemporaryNewFilesTable(); copy_file_entries = copy_file_entries && backup_dao->createTemporaryLastFilesTable(); @@ -2302,8 +2312,12 @@ bool BackupServerGet::doIncrBackup(bool with_hashes, bool intra_file_diffs, bool if ( copy_file_entries ) { copy_file_entries = copy_file_entries && backup_dao->copyToTemporaryLastFilesTable(last.backupid); + + if(copy_file_entries && resumed_full) + { + copy_file_entries_sparse = false; + } } - } IFile *clientlist=Server->openFile("urbackup/clientlist_"+nconvert(clientid)+"_new.ub", MODE_WRITE); @@ -2321,6 +2335,15 @@ bool BackupServerGet::doIncrBackup(bool with_hashes, bool intra_file_diffs, bool THREADPOOL_TICKET server_download_ticket = Server->getThreadPool()->execute(server_download.get()); + + std::auto_ptr server_hash_existing; + THREADPOOL_TICKET server_hash_existing_ticket = ILLEGAL_THREADPOOL_TICKET; + if(copy_file_entries_sparse && !trust_client_hashes) + { + server_hash_existing.reset(new ServerHashExisting(clientid, this)); + server_hash_existing_ticket = + Server->getThreadPool()->execute(server_hash_existing.get()); + } char buffer[4096]; _u32 read; @@ -2373,6 +2396,7 @@ bool BackupServerGet::doIncrBackup(bool with_hashes, bool intra_file_diffs, bool backup_stopped=true; ServerLogger::Log(clientid, L"Server admin stopped backup.", LL_ERROR); server_download->queueSkip(); + server_hash_existing->queueStop(true); } } @@ -2566,15 +2590,23 @@ bool BackupServerGet::doIncrBackup(bool with_hashes, bool intra_file_diffs, bool bool copy_curr_file_entry=false; bool curr_has_hash = false; - - if(indirchange==true || hasChange(line, diffs)) //is changed + bool copy_curr_file_entry_sparse=false; + std::string curr_sha2; { - std::map::iterator hash_it=( (local_hash==NULL)?extra_params.end():extra_params.find(L"sha512") ); - - bool f_ok=false; + std::map::iterator hash_it = + ( (local_hash==NULL)?extra_params.end():extra_params.find(L"sha512") ); if(hash_it!=extra_params.end()) { - if(link_file(cf.name, osspecific_name, curr_path, curr_os_path, with_hashes, base64_decode_dash(wnarrow(hash_it->second)), cf.size, false)) + curr_sha2 = base64_decode_dash(wnarrow(hash_it->second)); + } + } + + if(indirchange==true || hasChange(line, diffs)) //is changed + { + bool f_ok=false; + if(!curr_sha2.empty()) + { + if(link_file(cf.name, osspecific_name, curr_path, curr_os_path, with_hashes, curr_sha2 , cf.size, false)) { f_ok=true; } @@ -2624,13 +2656,13 @@ bool BackupServerGet::doIncrBackup(bool with_hashes, bool intra_file_diffs, bool } ++link_logcnt; - std::map::iterator hash_it=( (local_hash==NULL)?extra_params.end():extra_params.find(L"sha512") ); - - if(hash_it!=extra_params.end()) + if(!curr_sha2.empty()) { - if(link_file(cf.name, osspecific_name, curr_path, curr_os_path, with_hashes, base64_decode_dash(wnarrow(hash_it->second)), cf.size, false)) + if(link_file(cf.name, osspecific_name, curr_path, curr_os_path, with_hashes, curr_sha2, cf.size, false)) { f_ok=true; + copy_curr_file_entry=copy_file_entries; + copy_curr_file_entry_sparse = copy_file_entries_sparse; } } @@ -2649,6 +2681,7 @@ bool BackupServerGet::doIncrBackup(bool with_hashes, bool intra_file_diffs, bool else //created hard link successfully { copy_curr_file_entry=copy_file_entries; + copy_curr_file_entry_sparse = copy_file_entries_sparse; if(with_hashes) { @@ -2659,6 +2692,7 @@ bool BackupServerGet::doIncrBackup(bool with_hashes, bool intra_file_diffs, bool else { copy_curr_file_entry=copy_file_entries; + copy_curr_file_entry_sparse = copy_file_entries_sparse; curr_has_hash = with_hashes; } @@ -2670,6 +2704,27 @@ bool BackupServerGet::doIncrBackup(bool with_hashes, bool intra_file_diffs, bool { backup_dao->insertIntoTemporaryNewFilesTable(backuppath+local_curr_os_path, curr_has_hash?(backuppath_hashes+local_curr_os_path):std::wstring(), fileEntry.shahash, fileEntry.filesize); + + copy_curr_file_entry_sparse=false; + } + } + + if(copy_curr_file_entry_sparse) + { + std::string curr_path = curr_path + "/" + Server->ConvertToUTF8(cf.name); + int crc32 = static_cast(adler32(0, curr_path.c_str(), curr_path.size())); + if(crc32 % copy_file_entries_sparse_modulo == incremental_num ) + { + if(trust_client_hashes && !curr_sha2.empty()) + { + backup_dao->insertIntoTemporaryNewFilesTable(backuppath+local_curr_os_path, curr_has_hash?(backuppath_hashes+local_curr_os_path):std::wstring(), + curr_sha2, cf.size); + } + else if(server_hash_existing.get()) + { + addExistingHashesToDb(); + server_hash_existing->queueFile(backuppath+local_curr_os_path, curr_has_hash?(backuppath_hashes+local_curr_os_path):std::wstring()); + } } } } @@ -2685,6 +2740,8 @@ bool BackupServerGet::doIncrBackup(bool with_hashes, bool intra_file_diffs, bool } server_download->queueStop(false); + server_hash_existing->queueStop(false); + while(!Server->getThreadPool()->waitFor(server_download_ticket, 1000)) { @@ -2713,6 +2770,8 @@ bool BackupServerGet::doIncrBackup(bool with_hashes, bool intra_file_diffs, bool r_offline=true; } + sendBackupOkay(r_offline==false && c_has_error==false); + tmp->Seek(0); line = 0; resetEntryState(); @@ -2738,7 +2797,12 @@ bool BackupServerGet::doIncrBackup(bool with_hashes, bool intra_file_diffs, bool Server->destroy(clientlist); - sendBackupOkay(r_offline==false && c_has_error==false); + if(server_hash_existing_ticket!=ILLEGAL_THREADPOOL_TICKET) + { + Server->getThreadPool()->waitFor(server_hash_existing_ticket); + } + + addExistingHashesToDb(); if(copy_file_entries) { @@ -4817,3 +4881,27 @@ void BackupServerGet::calculateEtaFileBackup( int64 &last_eta_update, int64 ctim last_eta_received_bytes = received_data_bytes; } + +void BackupServerGet::addExistingHash( const std::wstring& fullpath, const std::wstring& hashpath, const std::string& shahash, int64 filesize ) +{ + ServerBackupDao::SFileEntry file_entry; + file_entry.exists = true; + file_entry.fullpath = fullpath; + file_entry.hashpath = hashpath; + file_entry.shahash = shahash; + file_entry.filesize = filesize; + + IScopedLock lock(hash_existing_mutex); + hash_existing.push_back(file_entry); +} + +void BackupServerGet::addExistingHashesToDb() +{ + IScopedLock lock(hash_existing_mutex); + for(size_t i=0;iinsertIntoTemporaryNewFilesTable(hash_existing[i].fullpath, hash_existing[i].hashpath, + hash_existing[i].shahash, hash_existing[i].filesize); + } + hash_existing.clear(); +} diff --git a/urbackupserver/server_get.h b/urbackupserver/server_get.h index 7534b9d3..03d7d92f 100644 --- a/urbackupserver/server_get.h +++ b/urbackupserver/server_get.h @@ -25,6 +25,7 @@ class IPipe; class ServerPingThread; class FileClient; class IPipeThrottler; +class ServerHashExisting; struct SBackup { @@ -43,6 +44,7 @@ class BackupServerGet : public IThread, public FileClientChunked::ReconnectionCa public FileClient::ReconnectionCallback, public INotEnoughSpaceCallback, public FileClient::NoFreeSpaceCallback, public FileClientChunked::NoFreeSpaceCallback { + friend ServerHashExisting; public: BackupServerGet(IPipe *pPipe, sockaddr_in pAddr, const std::wstring &pName, bool internet_connection, bool use_snapshots, bool use_reflink); ~BackupServerGet(void); @@ -181,6 +183,10 @@ private: bool authenticatePubKey(); + void addExistingHash(const std::wstring& fullpath, const std::wstring& hashpath, const std::string& shahash, int64 filesize); + + void addExistingHashesToDb(); + SSettings curr_intervals; IPipe *pipe; @@ -299,4 +305,7 @@ private: std::string session_identity; ServerBackupDao* backup_dao; + + IMutex* hash_existing_mutex; + std::vector hash_existing; }; diff --git a/urbackupserver/server_hash_existing.cpp b/urbackupserver/server_hash_existing.cpp new file mode 100644 index 00000000..a950bbe7 --- /dev/null +++ b/urbackupserver/server_hash_existing.cpp @@ -0,0 +1,88 @@ +#include "server_hash_existing.h" +#include "server_prepare_hash.h" +#include "../Interface/Server.h" +#include "server_log.h" + +ServerHashExisting::ServerHashExisting( int clientid, BackupServerGet* server_get ) + : has_error(false), clientid(clientid), server_get(server_get) +{ + mutex = Server->createMutex(); + cond = Server->createCondition(); +} + + +ServerHashExisting::~ServerHashExisting() +{ + Server->destroy(mutex); + Server->destroy(cond); +} + + +void ServerHashExisting::operator()() +{ + while(true) + { + SHashItem item; + { + IScopedLock lock(mutex); + while(queue.empty()) + { + cond->wait(&lock); + } + + item = queue.front(); + queue.pop_front(); + } + + if(item.do_stop) + { + return; + } + + IFile* f = Server->openFile(item.fullpath, MODE_READ); + + if(f==NULL) + { + ServerLogger::Log(clientid, L"Error opening file \""+item.hashpath+L"\" for hashing", LL_WARNING); + has_error = true; + } + else + { + ObjectScope destroy_f(f); + + int64 filesize = f->Size(); + std::string sha2 = BackupServerPrepareHash::hash_sha512(f); + + server_get->addExistingHash(item.fullpath, item.hashpath, sha2, filesize); + } + } +} + +void ServerHashExisting::queueStop( bool front ) +{ + SHashItem item; + item.do_stop = true; + IScopedLock lock(mutex); + if(front) + { + queue.push_front(item); + } + else + { + queue.push_back(item); + } + cond->notify_one(); +} + +void ServerHashExisting::queueFile( const std::wstring& fullpath, const std::wstring& hashpath ) +{ + SHashItem item; + item.fullpath = fullpath; + item.hashpath = hashpath; + + IScopedLock lock(mutex); + queue.push_back(item); + cond->notify_one(); +} + + diff --git a/urbackupserver/server_hash_existing.h b/urbackupserver/server_hash_existing.h new file mode 100644 index 00000000..8168fb03 --- /dev/null +++ b/urbackupserver/server_hash_existing.h @@ -0,0 +1,39 @@ +#pragma once + +#include "../Interface/Mutex.h" +#include "../Interface/Condition.h" +#include "server_get.h" +#include + +class ServerHashExisting : public IThread +{ +public: + ServerHashExisting(int clientid, BackupServerGet* server_get); + ~ServerHashExisting(); + + void queueStop(bool front); + + void queueFile(const std::wstring& fullpath, const std::wstring& hashpath); + + void operator()(); + +private: + + struct SHashItem + { + SHashItem() + : do_stop(false) + {} + + std::wstring fullpath; + std::wstring hashpath; + bool do_stop; + }; + + IMutex* mutex; + ICondition* cond; + std::deque queue; + bool has_error; + int clientid; + BackupServerGet* server_get; +}; \ No newline at end of file diff --git a/urbackupserver/server_prepare_hash.cpp b/urbackupserver/server_prepare_hash.cpp index d660dac2..58a007cb 100644 --- a/urbackupserver/server_prepare_hash.cpp +++ b/urbackupserver/server_prepare_hash.cpp @@ -120,7 +120,7 @@ void BackupServerPrepareHash::operator()(void) std::string h; if(!diff_file) { - h=hash(tf); + h=hash_sha512(tf); } else { @@ -150,24 +150,25 @@ void BackupServerPrepareHash::operator()(void) } } -std::string BackupServerPrepareHash::hash(IFile *f) +std::string BackupServerPrepareHash::hash_sha512(IFile *f) { f->Seek(0); - unsigned char buf[4096]; + unsigned char buf[32768]; _u32 rc; - sha512_init(&ctx); + sha512_ctx local_ctx; + sha512_init(&local_ctx); do { - rc=f->Read((char*)buf, 4096); + rc=f->Read((char*)buf, 32768); if(rc>0) - sha512_update(&ctx, buf, rc); + sha512_update(&local_ctx, buf, rc); } - while(rc==4096); + while(rc>0); std::string ret; ret.resize(64); - sha512_final(&ctx, (unsigned char*)&ret[0]); + sha512_final(&local_ctx, (unsigned char*)&ret[0]); return ret; } diff --git a/urbackupserver/server_prepare_hash.h b/urbackupserver/server_prepare_hash.h index 1f5ee30d..9c9b497a 100644 --- a/urbackupserver/server_prepare_hash.h +++ b/urbackupserver/server_prepare_hash.h @@ -32,9 +32,11 @@ public: void next_chunk_patcher_bytes(const char *buf, size_t bsize, bool changed); bool hasError(void); + + static std::string hash_sha512(IFile *f); private: - std::string hash(IFile *f); + std::string hash_with_patch(IFile *f, IFile *patch); IPipe *pipe; diff --git a/urbackupserver/server_settings.cpp b/urbackupserver/server_settings.cpp index 19b40ccc..92028a25 100644 --- a/urbackupserver/server_settings.cpp +++ b/urbackupserver/server_settings.cpp @@ -311,6 +311,7 @@ void ServerSettings::readSettingsDefault(void) settings->internet_calculate_filehashes_on_client=(settings_default->getValue("internet_calculate_filehashes_on_client", "false")=="true"); settings->use_incremental_symlinks=(settings_default->getValue("use_incremental_symlinks", "true")=="true"); settings->compress_images=(settings_default->getValue("compress_images", "true")=="true"); + settings->trust_client_hashes=(settings_default->getValue("trust_client_hashes", "true")=="true"); } void ServerSettings::readSettingsClient(void) diff --git a/urbackupserver/server_settings.h b/urbackupserver/server_settings.h index ae02330a..6fcf22e2 100644 --- a/urbackupserver/server_settings.h +++ b/urbackupserver/server_settings.h @@ -88,6 +88,7 @@ struct SSettings bool internet_calculate_filehashes_on_client; bool use_incremental_symlinks; bool compress_images; + bool trust_client_hashes; }; struct STimeSpan diff --git a/urbackupserver/serverinterface/settings.cpp b/urbackupserver/serverinterface/settings.cpp index e565e8d3..81ead0fc 100644 --- a/urbackupserver/serverinterface/settings.cpp +++ b/urbackupserver/serverinterface/settings.cpp @@ -181,6 +181,7 @@ void getGeneralSettings(JSON::Object& obj, IDatabase *db, ServerSettings &settin SET_SETTING(filescache_size); SET_SETTING(suspend_index_limit); SET_SETTING(use_incremental_symlinks); + SET_SETTING(trust_client_hashes); #undef SET_SETTING } diff --git a/urbackupserver/urbackupserver.vcxproj b/urbackupserver/urbackupserver.vcxproj index 99142de1..61646f2e 100644 --- a/urbackupserver/urbackupserver.vcxproj +++ b/urbackupserver/urbackupserver.vcxproj @@ -309,6 +309,7 @@ + @@ -331,6 +332,7 @@ + @@ -378,6 +380,7 @@ + diff --git a/urbackupserver/urbackupserver.vcxproj.filters b/urbackupserver/urbackupserver.vcxproj.filters index 06fd18e8..14735ef9 100644 --- a/urbackupserver/urbackupserver.vcxproj.filters +++ b/urbackupserver/urbackupserver.vcxproj.filters @@ -261,6 +261,9 @@ Quelldateien + + Quelldateien + @@ -461,5 +464,11 @@ Headerdateien + + fileclient + + + Headerdateien + \ No newline at end of file diff --git a/urbackupserver/www/templates.js b/urbackupserver/www/templates.js index fa9a4058..1e9922d8 100644 --- a/urbackupserver/www/templates.js +++ b/urbackupserver/www/templates.js @@ -1,64 +1,64 @@ (function(){dust.register("backups_backups_row",body_0);function body_0(chk,ctx){return chk.write(" ").reference(ctx._get(false, ["backuptime"]),ctx,"h").write("").reference(ctx._get(false, ["incr"]),ctx,"h").write("").reference(ctx._get(false, ["size_bytes"]),ctx,"h").write("").reference(ctx._get(false, ["archived"]),ctx,"h",["s"]).write("");}return body_0;})(); (function(){dust.register("backups_backups",body_0);function body_0(chk,ctx){return chk.write("").reference(ctx._get(false, ["tClients"]),ctx,"h").write(" > ").reference(ctx._get(false, ["clientname"]),ctx,"h").write("

").reference(ctx._get(false, ["rows"]),ctx,"h",["s"]).write("
 ").reference(ctx._get(false, ["tBackup time"]),ctx,"h").write("").reference(ctx._get(false, ["tIncremental"]),ctx,"h").write("").reference(ctx._get(false, ["tSize"]),ctx,"h").write("").reference(ctx._get(false, ["tArchived"]),ctx,"h").write("?
");}return body_0;})(); -(function(){dust.register("backups_clients_row",body_0);function body_0(chk,ctx){return chk.write(" ").reference(ctx._get(false, ["name"]),ctx,"h").write("").reference(ctx._get(false, ["lastbackup"]),ctx,"h",["s"]).write("");}return body_0;})(); (function(){dust.register("backups_clients",body_0);function body_0(chk,ctx){return chk.write("").reference(ctx._get(false, ["tClients"]),ctx,"h").write("

").reference(ctx._get(false, ["rows"]),ctx,"h",["s"]).write("
 ").reference(ctx._get(false, ["tComputer name"]),ctx,"h").write("").reference(ctx._get(false, ["tLast file backup"]),ctx,"h").write("
");}return body_0;})(); -(function(){dust.register("backups_files",body_0);function body_0(chk,ctx){return chk.write("").reference(ctx._get(false, ["tClients"]),ctx,"h").write(" > ").reference(ctx._get(false, ["clientname"]),ctx,"h").write(" > ").reference(ctx._get(false, ["cpath"]),ctx,"h",["s"]).write("

").reference(ctx._get(false, ["rows"]),ctx,"h",["s"]).write("
 ").reference(ctx._get(false, ["tFile"]),ctx,"h").write("").reference(ctx._get(false, ["tSize"]),ctx,"h").write("
").exists(ctx._get(false, ["download_zip"]),ctx,{"block":body_1},null);}function body_1(chk,ctx){return chk.write("
").reference(ctx._get(false, ["tDownload folder as ZIP"]),ctx,"h").write("");}return body_0;})(); -(function(){dust.register("change_pw_fail",body_0);function body_0(chk,ctx){return chk.write("
").reference(ctx._get(false, ["tChanging password failed:"]),ctx,"h").write("
").reference(ctx._get(false, ["fail_reason"]),ctx,"h");}return body_0;})(); -(function(){dust.register("change_pw_ok",body_0);function body_0(chk,ctx){return chk.write("
").reference(ctx._get(false, ["tChanged password successfully"]),ctx,"h");}return body_0;})(); -(function(){dust.register("database_error",body_0);function body_0(chk,ctx){return chk.write("\t\t\t
").reference(ctx._get(false, ["database_error_text"]),ctx,"h").write("


");}return body_0;})(); -(function(){dust.register("dir_error",body_0);function body_0(chk,ctx){return chk.write("\t\t\t

");}return body_0;})(); +(function(){dust.register("backups_clients_row",body_0);function body_0(chk,ctx){return chk.write("");}return body_0;})(); (function(){dust.register("backups_files_row",body_0);function body_0(chk,ctx){return chk.write("");}return body_0;})(); +(function(){dust.register("settings_inv_row",body_0);function body_0(chk,ctx){return chk.write("
").reference(ctx._get(false, ["dir_error_text"]),ctx,"h").reference(ctx._get(false, ["ext_text"]),ctx,"h").write("
 ").reference(ctx._get(false, ["name"]),ctx,"h").write("").reference(ctx._get(false, ["lastbackup"]),ctx,"h",["s"]).write("
 ").reference(ctx._get(false, ["name"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["size"]),ctx,"h",["s"]).write("
").reference(ctx._get(false, ["tInterval for incremental file backups"]),ctx,"h").write(": ").reference(ctx._get(false, ["thours"]),ctx,"h").write("   ").reference(ctx._get(false, ["tDisable"]),ctx,"h").write("
").reference(ctx._get(false, ["tInterval for full file backups"]),ctx,"h").write(": ").reference(ctx._get(false, ["tdays"]),ctx,"h").write("   ").reference(ctx._get(false, ["tDisable"]),ctx,"h").write("
").reference(ctx._get(false, ["tMaximal number of incremental file backups"]),ctx,"h").write(":
").reference(ctx._get(false, ["tMinimal number of incremental file backups"]),ctx,"h").write(":
").reference(ctx._get(false, ["tMaximal number of full file backups"]),ctx,"h").write(":
").reference(ctx._get(false, ["tMinimal number of full file backups"]),ctx,"h").write(":
").reference(ctx._get(false, ["tExcluded files (with wildcards)"]),ctx,"h").write(": ?
").reference(ctx._get(false, ["tIncluded files (with wildcards)"]),ctx,"h").write(": ?
").reference(ctx._get(false, ["tDefault directories to backup"]),ctx,"h").write(": ?
").reference(ctx._get(false, ["tInterval for incremental image backups"]),ctx,"h").write(": ").reference(ctx._get(false, ["tdays"]),ctx,"h").write("   ").reference(ctx._get(false, ["tDisable"]),ctx,"h").write("
").reference(ctx._get(false, ["tInterval for full image backups"]),ctx,"h").write(": ").reference(ctx._get(false, ["tdays"]),ctx,"h").write("   ").reference(ctx._get(false, ["tDisable"]),ctx,"h").write("
").reference(ctx._get(false, ["tMaximal number of incremental image backups"]),ctx,"h").write(":
").reference(ctx._get(false, ["tMinimal number of incremental image backups"]),ctx,"h").write(":
").reference(ctx._get(false, ["tMaximal number of full image backups"]),ctx,"h").write(":
").reference(ctx._get(false, ["tMinimal number of full image backups"]),ctx,"h").write(":
").reference(ctx._get(false, ["tVolumes to backup"]),ctx,"h").write(": ?
").reference(ctx._get(false, ["tCompress image backups"]),ctx,"h").write(":
").reference(ctx._get(false, ["tAllow client-side changing of the directories to backup"]),ctx,"h").write(":
").reference(ctx._get(false, ["tAllow client-side starting of full file backups"]),ctx,"h").write(":
").reference(ctx._get(false, ["tAllow client-side starting of incremental file backups"]),ctx,"h").write(":
").reference(ctx._get(false, ["tAllow client-side starting of full image backups"]),ctx,"h").write(":
").reference(ctx._get(false, ["tAllow client-side starting of incremental image backups"]),ctx,"h").write(":
").reference(ctx._get(false, ["tAllow client-side viewing of backup logs"]),ctx,"h").write(":
").reference(ctx._get(false, ["tAllow client-side pausing of backups"]),ctx,"h").write(":
").reference(ctx._get(false, ["tAllow client-side changing of settings"]),ctx,"h").write(":
").reference(ctx._get(false, ["no_compname_start"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["no_compname_end"]),ctx,"h",["s"]).write("
").reference(ctx._get(false, ["tDelay after system startup"]),ctx,"h").write(": ").reference(ctx._get(false, ["tmin"]),ctx,"h").write("
").reference(ctx._get(false, ["tBackup window"]),ctx,"h").write(" ").reference(ctx._get(false, ["tShow details"]),ctx,"h").write("  ?
").reference(ctx._get(false, ["tBackup window for incremental file backups"]),ctx,"h").write("?
").reference(ctx._get(false, ["tBackup window for full file backups"]),ctx,"h").write("?
").reference(ctx._get(false, ["tBackup window for incremental image backups"]),ctx,"h").write("?
").reference(ctx._get(false, ["tBackup window for full image backups"]),ctx,"h").write("?
").reference(ctx._get(false, ["tComputer name"]),ctx,"h").write("
").reference(ctx._get(false, ["tMax backup speed for local network"]),ctx,"h").write(": MBit/s
").reference(ctx._get(false, ["tPerform autoupdates silently"]),ctx,"h").write(":
").reference(ctx._get(false, ["tSoft client quota"]),ctx,"h").write(":
").reference(ctx._get(false, ["no_compname_start"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["no_compname_end"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["global_settings_start"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["global_settings_end"]),ctx,"h",["s"]).reference(ctx._get(false, ["no_compname_start"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["no_compname_end"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["no_compname_start"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["no_compname_end"]),ctx,"h",["s"]).write("
").reference(ctx._get(false, ["tArchive every"]),ctx,"h").write("").reference(ctx._get(false, ["tArchive for"]),ctx,"h").write("").reference(ctx._get(false, ["tArchive window"]),ctx,"h").write("?").reference(ctx._get(false, ["tBackup type"]),ctx,"h").write("").reference(ctx._get(false, ["tNext archival"]),ctx,"h").write(" 
 ").reference(ctx._get(false, ["global_settings_start"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["global_settings_end"]),ctx,"h",["s"]).reference(ctx._get(false, ["no_compname_start"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["no_compname_end"]),ctx,"h",["s"]).write("\t\t
").reference(ctx._get(false, ["internet_settings_start"]),ctx,"h",["s"]).write("
").reference(ctx._get(false, ["global_settings_start_inet"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["global_settings_end_inet"]),ctx,"h",["s"]).reference(ctx._get(false, ["no_compname_start_inet"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["no_compname_end_inet"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["global_settings_start_inet"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["global_settings_end_inet"]),ctx,"h",["s"]).write("
").reference(ctx._get(false, ["tEnable internet mode (requires server restart)"]),ctx,"h").write(":
").reference(ctx._get(false, ["tInternet server name/IP"]),ctx,"h").write(":
").reference(ctx._get(false, ["tInternet server port"]),ctx,"h").write(":
").reference(ctx._get(false, ["tEnable internet mode"]),ctx,"h").write(":
").reference(ctx._get(false, ["tInternet auth key"]),ctx,"h").write("
").reference(ctx._get(false, ["tDo image backups over internet"]),ctx,"h").write(":
").reference(ctx._get(false, ["tDo full file backups over internet"]),ctx,"h").write(":
").reference(ctx._get(false, ["tMax backup speed for internet connection"]),ctx,"h").write(": KBit/s
").reference(ctx._get(false, ["tTotal max backup speed for internet connection"]),ctx,"h").write(": KBit/s
").reference(ctx._get(false, ["tEncrypted transfer"]),ctx,"h").write(":
").reference(ctx._get(false, ["tCompressed transfer"]),ctx,"h").write(":
").reference(ctx._get(false, ["tCalculate file-hashes on the client"]),ctx,"h").write(":
").reference(ctx._get(false, ["internet_settings_end"]),ctx,"h",["s"]).write("
").reference(ctx._get(false, ["global_settings_start"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["global_settings_end"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["global_settings_start"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["global_settings_end"]),ctx,"h",["s"]).write("
").reference(ctx._get(false, ["tTemporary files as file backup buffer"]),ctx,"h").write(":
").reference(ctx._get(false, ["tTemporary files as image backup buffer"]),ctx,"h").write(":
").reference(ctx._get(false, ["tLocal full file backup transfer mode"]),ctx,"h").write(":
").reference(ctx._get(false, ["tInternet full file backup transfer mode"]),ctx,"h").write(":
").reference(ctx._get(false, ["tLocal incremental file backup transfer mode"]),ctx,"h").write(":
").reference(ctx._get(false, ["tInternet incremental file backup transfer mode"]),ctx,"h").write(":
").reference(ctx._get(false, ["tLocal image backup transfer mode"]),ctx,"h").write(":
").reference(ctx._get(false, ["tInternet image backup transfer mode"]),ctx,"h").write(":
").reference(ctx._get(false, ["tFile hash collection amount"]),ctx,"h").write(":
").reference(ctx._get(false, ["tFile hash collection timeout"]),ctx,"h").write(":
").reference(ctx._get(false, ["tFile hash collection database cachesize"]),ctx,"h").write(": ").reference(ctx._get(false, ["tMB"]),ctx,"h").write("
").reference(ctx._get(false, ["tUpdate stats database cachesize"]),ctx,"h").write(": ").reference(ctx._get(false, ["tMB"]),ctx,"h").write("
").reference(ctx._get(false, ["tCache database type for file entries"]),ctx,"h").write(":
").reference(ctx._get(false, ["tCache database size for file entries"]),ctx,"h").write(": ").reference(ctx._get(false, ["tMB"]),ctx,"h").write("
").reference(ctx._get(false, ["tSuspend index limit"]),ctx,"h").write(":
").reference(ctx._get(false, ["tUse symlinks during incremental file backups"]),ctx,"h").write(":
").reference(ctx._get(false, ["tTrust client hashes during incremental file backups"]),ctx,"h").write(":
").reference(ctx._get(false, ["tEnd-to-end verification of all file backups"]),ctx,"h").write(":
");}return body_0;})(); +(function(){dust.register("settings_general",body_0);function body_0(chk,ctx){return chk.write("
").reference(ctx._get(false, ["ONLY_WIN32_BEGIN"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["ONLY_WIN32_END"]),ctx,"h",["s"]).write("
").reference(ctx._get(false, ["tBackup storage path"]),ctx,"h").write(":
").reference(ctx._get(false, ["tDo not do image backups"]),ctx,"h").write(":
").reference(ctx._get(false, ["tDo not do file backups"]),ctx,"h").write(":
").reference(ctx._get(false, ["tAutomatically shut down server"]),ctx,"h").write(":
").reference(ctx._get(false, ["tDownload client from update server"]),ctx,"h").write(":
").reference(ctx._get(false, ["tAutoupdate clients"]),ctx,"h").write(":
").reference(ctx._get(false, ["tMax number of simultaneous backups"]),ctx,"h").write(":
").reference(ctx._get(false, ["tMax number of recently active clients"]),ctx,"h").write(":
").reference(ctx._get(false, ["tNondefault temporary file directory"]),ctx,"h").write(":
").reference(ctx._get(false, ["tCleanup time window"]),ctx,"h").write(":?
").reference(ctx._get(false, ["tAutomatically backup UrBackup database"]),ctx,"h").write(":
").reference(ctx._get(false, ["tTotal max backup speed for local network"]),ctx,"h").write(": MBit/s
").reference(ctx._get(false, ["tGlobal soft filesystem quota"]),ctx,"h").write(":?
").reference(ctx._get(false, ["settings_inv"]),ctx,"h",["s"]).write("


");}return body_0;})(); +(function(){dust.register("database_error",body_0);function body_0(chk,ctx){return chk.write("\t\t\t
").reference(ctx._get(false, ["database_error_text"]),ctx,"h").write("


");}return body_0;})(); (function(){dust.register("change_pw",body_0);function body_0(chk,ctx){return chk.write("
").reference(ctx._get(false, ["tChange password"]),ctx,"h").write("
").reference(ctx._get(false, ["tOld password"]),ctx,"h").write(":
").reference(ctx._get(false, ["tNew password"]),ctx,"h").write(":
").reference(ctx._get(false, ["tRepeat new password"]),ctx,"h").write(":


");}return body_0;})(); +(function(){dust.register("about_urbackup",body_0);function body_0(chk,ctx){return chk.write("UrBackup Server ").reference(ctx._get(false, ["version"]),ctx,"h").write("

Author: Martin Raiber

Translators:
Artem Alabin (Russian)
Martin Raiber (German)
Zhengyu Ren (Traditional and Simplified Chinese)
Luis Miguel Muñoz (Spanish)
mehdincd (French)
osiengine group (Farsi)

A lot of work has gone into UrBackup.If you like it and want to support the ongoing development please consider donating.
Via PayPal:

Contribution of build server or testing infrastructure is welcome as well. The most appreciated contribution would be your time in form of help.

UrBackup is using following libraries/code:
UrBackup License:
\"GPLv3\"/

UrBackup is licensed as GPLv3. The license text is available as license.txt in your installation or online.");}return body_0;})(); +(function(){dust.register("change_pw_ok",body_0);function body_0(chk,ctx){return chk.write("
").reference(ctx._get(false, ["tChanged password successfully"]),ctx,"h");}return body_0;})(); +(function(){dust.register("backups_files",body_0);function body_0(chk,ctx){return chk.write("").reference(ctx._get(false, ["tClients"]),ctx,"h").write(" > ").reference(ctx._get(false, ["clientname"]),ctx,"h").write(" > ").reference(ctx._get(false, ["cpath"]),ctx,"h",["s"]).write("

").reference(ctx._get(false, ["rows"]),ctx,"h",["s"]).write("
 ").reference(ctx._get(false, ["tFile"]),ctx,"h").write("").reference(ctx._get(false, ["tSize"]),ctx,"h").write("
").exists(ctx._get(false, ["download_zip"]),ctx,{"block":body_1},null);}function body_1(chk,ctx){return chk.write("
").reference(ctx._get(false, ["tDownload folder as ZIP"]),ctx,"h").write("");}return body_0;})(); +(function(){dust.register("lastacts_table",body_0);function body_0(chk,ctx){return chk.write("

").reference(ctx._get(false, ["tLast activities"]),ctx,"h").write("

\t\t\t").reference(ctx._get(false, ["rows"]),ctx,"h",["s"]).write("
").reference(ctx._get(false, ["tID"]),ctx,"h").write("").reference(ctx._get(false, ["tComputer name"]),ctx,"h").write("").reference(ctx._get(false, ["tAction"]),ctx,"h").write("").reference(ctx._get(false, ["tStarting time"]),ctx,"h").write("").reference(ctx._get(false, ["tRequired time"]),ctx,"h").write("").reference(ctx._get(false, ["tUsed Storage"]),ctx,"h").write("
");}return body_0;})(); (function(){dust.register("lastacts_row",body_0);function body_0(chk,ctx){return chk.write("").reference(ctx._get(false, ["id"]),ctx,"h").write("").reference(ctx._get(false, ["name"]),ctx,"h").write("").reference(ctx._get(false, ["action"]),ctx,"h").write("").reference(ctx._get(false, ["backuptime"]),ctx,"h").write("").reference(ctx._get(false, ["duration"]),ctx,"h").write("").reference(ctx._get(false, ["size"]),ctx,"h").write("");}return body_0;})(); (function(){dust.register("live_log_row",body_0);function body_0(chk,ctx){return chk.write("").reference(ctx._get(false, ["time"]),ctx,"h").write("  ").reference(ctx._get(false, ["loglevel"]),ctx,"h").write("  ").reference(ctx._get(false, ["message"]),ctx,"h",["s"]).write("");}return body_0;})(); -(function(){dust.register("login",body_0);function body_0(chk,ctx){return chk.write("
").reference(ctx._get(false, ["tUsername"]),ctx,"h").write(":
").reference(ctx._get(false, ["tPassword"]),ctx,"h").write(":


");}return body_0;})(); -(function(){dust.register("logs_table",body_0);function body_0(chk,ctx){return chk.write("

").reference(ctx._get(false, ["tLogs"]),ctx,"h").write("

\t").reference(ctx._get(false, ["rows"]),ctx,"h",["s"]).write("
 ").reference(ctx._get(false, ["tComputer name"]),ctx,"h").write("").reference(ctx._get(false, ["tBackup time"]),ctx,"h").write("").reference(ctx._get(false, ["tErrors"]),ctx,"h").write("").reference(ctx._get(false, ["tWarnings"]),ctx,"h").write("").reference(ctx._get(false, ["tAction"]),ctx,"h").write("

").reference(ctx._get(false, ["tLive Log"]),ctx,"h").write("

").reference(ctx._get(false, ["tReports"]),ctx,"h").write("

").reference(ctx._get(false, ["tSend reports to"]),ctx,"h").write(" [+].
").reference(ctx._get(false, ["tSend"]),ctx,"h").write("  ").reference(ctx._get(false, ["tBackups with a log message of at least log level"]),ctx,"h").write(" 
");}return body_0;})(); -(function(){dust.register("log_single_none",body_0);function body_0(chk,ctx){return chk.write("").reference(ctx._get(false, ["tNo entries for this filter"]),ctx,"h").write("");}return body_0;})(); -(function(){dust.register("log_single_row",body_0);function body_0(chk,ctx){return chk.write("
").reference(ctx._get(false, ["level"]),ctx,"h").write("
").reference(ctx._get(false, ["time"]),ctx,"h").write("
").reference(ctx._get(false, ["message"]),ctx,"h",["s"]).write("");}return body_0;})(); +(function(){dust.register("log_single_filter",body_0);function body_0(chk,ctx){return chk.reference(ctx._get(false, ["tFilter"]),ctx,"h").write(":");}return body_0;})(); (function(){dust.register("logs_filter",body_0);function body_0(chk,ctx){return chk.write("");}return body_0;})(); -(function(){dust.register("logs_report_mail",body_0);function body_0(chk,ctx){return chk.reference(ctx._get(false, ["report_single_mail"]),ctx,"h").write("[-], ");}return body_0;})(); -(function(){dust.register("logs_row",body_0);function body_0(chk,ctx){return chk.write(" ").reference(ctx._get(false, ["name"]),ctx,"h").write("").reference(ctx._get(false, ["time"]),ctx,"h").write("
").reference(ctx._get(false, ["errors"]),ctx,"h").write("
").reference(ctx._get(false, ["warnings"]),ctx,"h").write("
").reference(ctx._get(false, ["action"]),ctx,"h").write("");}return body_0;})(); -(function(){dust.register("about_urbackup",body_0);function body_0(chk,ctx){return chk.write("UrBackup Server ").reference(ctx._get(false, ["version"]),ctx,"h").write("

Author: Martin Raiber

Translators:
Artem Alabin (Russian)
Martin Raiber (German)
Zhengyu Ren (Traditional and Simplified Chinese)
Luis Miguel Muñoz (Spanish)
mehdincd (French)
osiengine group (Farsi)

A lot of work has gone into UrBackup.If you like it and want to support the ongoing development please consider donating.
Via PayPal:

Contribution of build server or testing infrastructure is welcome as well. The most appreciated contribution would be your time in form of help.

UrBackup is using following libraries/code:
UrBackup License:
\"GPLv3\"/

UrBackup is licensed as GPLv3. The license text is available as license.txt in your installation or online.");}return body_0;})(); -(function(){dust.register("main_nav",body_0);function body_0(chk,ctx){return chk.write("").reference(ctx._get(false, ["name"]),ctx,"h").write("");}return body_0;})(); -(function(){dust.register("logs_none",body_0);function body_0(chk,ctx){return chk.write("").reference(ctx._get(false, ["tNo entries for this filter"]),ctx,"h").write("");}return body_0;})(); +(function(){dust.register("log_single_row",body_0);function body_0(chk,ctx){return chk.write("
").reference(ctx._get(false, ["level"]),ctx,"h").write("
").reference(ctx._get(false, ["time"]),ctx,"h").write("
").reference(ctx._get(false, ["message"]),ctx,"h",["s"]).write("");}return body_0;})(); (function(){dust.register("live_log",body_0);function body_0(chk,ctx){return chk.write("").reference(ctx._get(false, ["tUrBackup live log"]),ctx,"h").write(": ").reference(ctx._get(false, ["clientname"]),ctx,"h").write("
 
");}return body_0;})(); -(function(){dust.register("nospc_fatal",body_0);function body_0(chk,ctx){return chk.write("\t\t\t
").reference(ctx._get(false, ["nospc_fatal_text"]),ctx,"h").write("


");}return body_0;})(); -(function(){dust.register("main_nav_sel",body_0);function body_0(chk,ctx){return chk.write("").reference(ctx._get(false, ["name"]),ctx,"h").write("");}return body_0;})(); -(function(){dust.register("new_version_available",body_0);function body_0(chk,ctx){return chk.reference(ctx._get(false, ["tThere is a new version of UrBackup server available"]),ctx,"h").write(" (").reference(ctx._get(false, ["new_version_number"]),ctx,"h").write("). Download it here.

");}return body_0;})(); -(function(){dust.register("nospc_stalled",body_0);function body_0(chk,ctx){return chk.write("\t\t\t
").reference(ctx._get(false, ["nospc_stalled_text"]),ctx,"h").write("


");}return body_0;})(); -(function(){dust.register("settings_user_create",body_0);function body_0(chk,ctx){return chk.write("
").reference(ctx._get(false, ["tUsername"]),ctx,"h").write(":
").reference(ctx._get(false, ["tPassword"]),ctx,"h").write(":
").reference(ctx._get(false, ["tRepeat password"]),ctx,"h").write(":
").reference(ctx._get(false, ["tRights for"]),ctx,"h").write(":").reference(ctx._get(false, ["rights"]),ctx,"h",["s"]).write("


");}return body_0;})(); -(function(){dust.register("settings_user_create_admin",body_0);function body_0(chk,ctx){return chk.write("
").reference(ctx._get(false, ["tUsername"]),ctx,"h").write(":
").reference(ctx._get(false, ["tPassword"]),ctx,"h").write(":
").reference(ctx._get(false, ["tRepeat password"]),ctx,"h").write(":
").reference(ctx._get(false, ["tRights for"]),ctx,"h").write("").reference(ctx._get(false, ["rights"]),ctx,"h",["s"]).write("


");}return body_0;})(); -(function(){dust.register("settings_user_rights_change",body_0);function body_0(chk,ctx){return chk.write("
").reference(ctx._get(false, ["tChange rights for user"]),ctx,"h").write(": ").reference(ctx._get(false, ["username"]),ctx,"h").write("
").reference(ctx._get(false, ["rows"]),ctx,"h",["s"]).write("
").reference(ctx._get(false, ["tDomain"]),ctx,"h").write("").reference(ctx._get(false, ["tRights"]),ctx,"h").write("").reference(ctx._get(false, ["tTranslation"]),ctx,"h").write("").reference(ctx._get(false, ["tActions"]),ctx,"h").write("

").reference(ctx._get(false, ["tNew domain"]),ctx,"h").write("

");}return body_0;})(); -(function(){dust.register("progress_row",body_0);function body_0(chk,ctx){return chk.write("").reference(ctx._get(false, ["name"]),ctx,"h").write("").reference(ctx._get(false, ["action"]),ctx,"h").write("
").exists(ctx._get(false, ["percent"]),ctx,{"block":body_3},null).exists(ctx._get(false, ["indexing"]),ctx,{"block":body_4},null).write("").reference(ctx._get(false, ["queue"]),ctx,"h").write("");}function body_1(chk,ctx){return chk.write("0%");}function body_2(chk,ctx){return chk.reference(ctx._get(false, ["pcdone"]),ctx,"h").write("%");}function body_3(chk,ctx){return chk.reference(ctx._get(false, ["pcdone"]),ctx,"h").write("%");}function body_4(chk,ctx){return chk.reference(ctx._get(false, ["tIndexing..."]),ctx,"h");}return body_0;})(); -(function(){dust.register("progress_table",body_0);function body_0(chk,ctx){return chk.write("

").reference(ctx._get(false, ["tActivities"]),ctx,"h").write("

\t\t\t").reference(ctx._get(false, ["rows"]),ctx,"h",["s"]).write("
").reference(ctx._get(false, ["tComputer name"]),ctx,"h").write("").reference(ctx._get(false, ["tAction"]),ctx,"h").write("").reference(ctx._get(false, ["tProgress"]),ctx,"h").write("").reference(ctx._get(false, ["tFiles in queue"]),ctx,"h").write(" 
");}return body_0;})(); -(function(){dust.register("progress_table_none",body_0);function body_0(chk,ctx){return chk.write("

").reference(ctx._get(false, ["tActivities"]),ctx,"h").write("

\t\t\t
").reference(ctx._get(false, ["tComputer name"]),ctx,"h").write("").reference(ctx._get(false, ["tAction"]),ctx,"h").write("").reference(ctx._get(false, ["tProgress"]),ctx,"h").write("").reference(ctx._get(false, ["tFiles in queue"]),ctx,"h").write(" 
").reference(ctx._get(false, ["tNo activities"]),ctx,"h").write("
");}return body_0;})(); -(function(){dust.register("stat_general",body_0);function body_0(chk,ctx){return chk.write("

").reference(ctx._get(false, ["tStorage allocation"]),ctx,"h").write("

").reference(ctx._get(false, ["tLoading"]),ctx,"h").write("...


\t\t\t").reference(ctx._get(false, ["rows"]),ctx,"h",["s"]).write("
").reference(ctx._get(false, ["tComputer name"]),ctx,"h").write("").reference(ctx._get(false, ["tImages"]),ctx,"h").write("").reference(ctx._get(false, ["tFiles"]),ctx,"h").write("").reference(ctx._get(false, ["tAll"]),ctx,"h").write("

").reference(ctx._get(false, ["tSum"]),ctx,"h").write("

").reference(ctx._get(false, ["tImages"]),ctx,"h").write("").reference(ctx._get(false, ["images_total"]),ctx,"h").write("
").reference(ctx._get(false, ["tFiles"]),ctx,"h").write("").reference(ctx._get(false, ["files_total"]),ctx,"h").write("
").reference(ctx._get(false, ["tAll"]),ctx,"h").write("").reference(ctx._get(false, ["used_total"]),ctx,"h").write("

").reference(ctx._get(false, ["tStorage usage"]),ctx,"h").write("

").reference(ctx._get(false, ["tLoading"]),ctx,"h").write("...
");}return body_0;})(); -(function(){dust.register("settings_archive_row",body_0);function body_0(chk,ctx){return chk.write("").reference(ctx._get(false, ["archive_every"]),ctx,"h").write("").reference(ctx._get(false, ["archive_for"]),ctx,"h").write("").reference(ctx._get(false, ["archive_window"]),ctx,"h").write("
").reference(ctx._get(false, ["archive_backup_type_str"]),ctx,"h").write("").reference(ctx._get(false, ["next_start"]),ctx,"h",["s"]).write(" ").reference(ctx._get(false, ["archive_timeleft"]),ctx,"h").write("").reference(ctx._get(false, ["next_end"]),ctx,"h",["s"]).write("");}return body_0;})(); -(function(){dust.register("status_detail",body_0);function body_0(chk,ctx){return chk.write("

").reference(ctx._get(false, ["tBackup status"]),ctx,"h").write("

").reference(ctx._get(false, ["nospc_fatal"]),ctx,"h",["s"]).reference(ctx._get(false, ["nospc_stalled"]),ctx,"h",["s"]).reference(ctx._get(false, ["dir_error"]),ctx,"h",["s"]).reference(ctx._get(false, ["tmpdir_error"]),ctx,"h",["s"]).reference(ctx._get(false, ["database_error"]),ctx,"h",["s"]).write("

\t\t\t").reference(ctx._get(false, ["Actions_start"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["rows"]),ctx,"h",["s"]).write("
").reference(ctx._get(false, ["tComputer name"]),ctx,"h").write("").reference(ctx._get(false, ["tOnline"]),ctx,"h").write("").reference(ctx._get(false, ["tStatus"]),ctx,"h").write("").reference(ctx._get(false, ["tLast seen"]),ctx,"h").write("").reference(ctx._get(false, ["tLast file backup"]),ctx,"h").write("").reference(ctx._get(false, ["tLast image backup"]),ctx,"h").write("").reference(ctx._get(false, ["tFile backup status"]),ctx,"h").write("").reference(ctx._get(false, ["tImage backup status"]),ctx,"h").write("").reference(ctx._get(false, ["tIP"]),ctx,"h").write("").reference(ctx._get(false, ["tClient version"]),ctx,"h").write("").reference(ctx._get(false, ["tOperating System"]),ctx,"h").write(" ").reference(ctx._get(false, ["Actions_end"]),ctx,"h",["s"]).write("


").reference(ctx._get(false, ["modify_clients"]),ctx,"h",["s"]).exists(ctx._get(false, ["status_can_show_all"]),ctx,{"block":body_1},null).exists(ctx._get(false, ["removed_clients_table"]),ctx,{"block":body_2},null).write("
").reference(ctx._get(false, ["status_client_download"]),ctx,"h",["s"]).write("

").reference(ctx._get(false, ["tExtra clients"]),ctx,"h").write("

").exists(ctx._get(false, ["status_extra_clients"]),ctx,{"block":body_5},null);}function body_1(chk,ctx){return chk.write(" | ").reference(ctx._get(false, ["tShow all clients"]),ctx,"h").write("

");}function body_2(chk,ctx){return chk.write("

").section(ctx._get(false, ["removed_clients"]),ctx,{"block":body_3},null).write("
").reference(ctx._get(false, ["tComputer name"]),ctx,"h").write(" 
");}function body_3(chk,ctx){return chk.write("").reference(ctx._get(false, ["name"]),ctx,"h").write("").reference(ctx._get(false, ["tThis client is going to be removed. "]),ctx,"h").write(" ").exists(ctx._get(false, ["remove_client"]),ctx,{"block":body_4},null).reference(ctx._get(false, ["tClients are removed during the cleanup in the cleanup time window. "]),ctx,"h").write("");}function body_4(chk,ctx){return chk.write("").reference(ctx._get(false, ["tStop removing client"]),ctx,"h").write(". ");}function body_5(chk,ctx){return chk.write("\t\t\t").reference(ctx._get(false, ["extra_clients_rows"]),ctx,"h",["s"]).write("
").reference(ctx._get(false, ["tHostname/IP"]),ctx,"h").write("").reference(ctx._get(false, ["tOnline"]),ctx,"h").write("").reference(ctx._get(false, ["tActions"]),ctx,"h").write("
").reference(ctx._get(false, ["tHostname/IP"]),ctx,"h").write(":

").reference(ctx._get(false, ["tInternet clients"]),ctx,"h").write("


").reference(ctx._get(false, ["internet_client_added"]),ctx,"h",["s"]).reference(ctx._get(false, ["tAdd additional internet clients"]),ctx,"h").write(":
").reference(ctx._get(false, ["tClient name"]),ctx,"h").write(":

").reference(ctx._get(false, ["tServer identity"]),ctx,"h").write("

").reference(ctx._get(false, ["server_identity"]),ctx,"h").write("
");}return body_0;})(); -(function(){dust.register("settings_mail_test_ok",body_0);function body_0(chk,ctx){return chk.write("

").reference(ctx._get(false, ["tTest Mail sent successfully"]),ctx,"h").write(".");}return body_0;})(); -(function(){dust.register("settings_mail_test_failed",body_0);function body_0(chk,ctx){return chk.write("

").reference(ctx._get(false, ["tSending test mail failed. Error:"]),ctx,"h").write(" ").reference(ctx._get(false, ["mail_err"]),ctx,"h");}return body_0;})(); -(function(){dust.register("settings_save_ok",body_0);function body_0(chk,ctx){return chk.write("

").reference(ctx._get(false, ["tSaved settings successfully"]),ctx,"h").write(".");}return body_0;})(); -(function(){dust.register("settings_user_add_done",body_0);function body_0(chk,ctx){return chk.write("
").reference(ctx._get(false, ["msg"]),ctx,"h").write("
");}return body_0;})(); -(function(){dust.register("settings_user_pw_change",body_0);function body_0(chk,ctx){return chk.write("
").reference(ctx._get(false, ["tChange password for user"]),ctx,"h").write(": ").reference(ctx._get(false, ["username"]),ctx,"h").write("
").reference(ctx._get(false, ["tPassword"]),ctx,"h").write(":
").reference(ctx._get(false, ["tRepeat password"]),ctx,"h").write(":


");}return body_0;})(); -(function(){dust.register("settings_user_rights_change_row",body_0);function body_0(chk,ctx){return chk.write("");}return body_0;})(); -(function(){dust.register("settings_users_start",body_0);function body_0(chk,ctx){return chk.write("


\t\t\t").reference(ctx._get(false, ["rows"]),ctx,"h",["s"]).write("
").reference(ctx._get(false, ["tUsername"]),ctx,"h").write("").reference(ctx._get(false, ["tRights"]),ctx,"h").write("").reference(ctx._get(false, ["tActions"]),ctx,"h").write("


");}return body_0;})(); -(function(){dust.register("settings_users_start_row_empty",body_0);function body_0(chk,ctx){return chk.write("").reference(ctx._get(false, ["tNo Users"]),ctx,"h").write("");}return body_0;})(); -(function(){dust.register("settings_users_start_row",body_0);function body_0(chk,ctx){return chk.write("").reference(ctx._get(false, ["name"]),ctx,"h").write("").reference(ctx._get(false, ["rights"]),ctx,"h").write(" ");}return body_0;})(); -(function(){dust.register("settings_inv_row",body_0);function body_0(chk,ctx){return chk.write("
").reference(ctx._get(false, ["tInterval for incremental file backups"]),ctx,"h").write(": ").reference(ctx._get(false, ["thours"]),ctx,"h").write("   ").reference(ctx._get(false, ["tDisable"]),ctx,"h").write("
").reference(ctx._get(false, ["tInterval for full file backups"]),ctx,"h").write(": ").reference(ctx._get(false, ["tdays"]),ctx,"h").write("   ").reference(ctx._get(false, ["tDisable"]),ctx,"h").write("
").reference(ctx._get(false, ["tMaximal number of incremental file backups"]),ctx,"h").write(":
").reference(ctx._get(false, ["tMinimal number of incremental file backups"]),ctx,"h").write(":
").reference(ctx._get(false, ["tMaximal number of full file backups"]),ctx,"h").write(":
").reference(ctx._get(false, ["tMinimal number of full file backups"]),ctx,"h").write(":
").reference(ctx._get(false, ["tExcluded files (with wildcards)"]),ctx,"h").write(": ?
").reference(ctx._get(false, ["tIncluded files (with wildcards)"]),ctx,"h").write(": ?
").reference(ctx._get(false, ["tDefault directories to backup"]),ctx,"h").write(": ?
").reference(ctx._get(false, ["tInterval for incremental image backups"]),ctx,"h").write(": ").reference(ctx._get(false, ["tdays"]),ctx,"h").write("   ").reference(ctx._get(false, ["tDisable"]),ctx,"h").write("
").reference(ctx._get(false, ["tInterval for full image backups"]),ctx,"h").write(": ").reference(ctx._get(false, ["tdays"]),ctx,"h").write("   ").reference(ctx._get(false, ["tDisable"]),ctx,"h").write("
").reference(ctx._get(false, ["tMaximal number of incremental image backups"]),ctx,"h").write(":
").reference(ctx._get(false, ["tMinimal number of incremental image backups"]),ctx,"h").write(":
").reference(ctx._get(false, ["tMaximal number of full image backups"]),ctx,"h").write(":
").reference(ctx._get(false, ["tMinimal number of full image backups"]),ctx,"h").write(":
").reference(ctx._get(false, ["tVolumes to backup"]),ctx,"h").write(": ?
").reference(ctx._get(false, ["tCompress image backups"]),ctx,"h").write(":
").reference(ctx._get(false, ["tAllow client-side changing of the directories to backup"]),ctx,"h").write(":
").reference(ctx._get(false, ["tAllow client-side starting of full file backups"]),ctx,"h").write(":
").reference(ctx._get(false, ["tAllow client-side starting of incremental file backups"]),ctx,"h").write(":
").reference(ctx._get(false, ["tAllow client-side starting of full image backups"]),ctx,"h").write(":
").reference(ctx._get(false, ["tAllow client-side starting of incremental image backups"]),ctx,"h").write(":
").reference(ctx._get(false, ["tAllow client-side viewing of backup logs"]),ctx,"h").write(":
").reference(ctx._get(false, ["tAllow client-side pausing of backups"]),ctx,"h").write(":
").reference(ctx._get(false, ["tAllow client-side changing of settings"]),ctx,"h").write(":
").reference(ctx._get(false, ["no_compname_start"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["no_compname_end"]),ctx,"h",["s"]).write("
").reference(ctx._get(false, ["tDelay after system startup"]),ctx,"h").write(": ").reference(ctx._get(false, ["tmin"]),ctx,"h").write("
").reference(ctx._get(false, ["tBackup window"]),ctx,"h").write(" ").reference(ctx._get(false, ["tShow details"]),ctx,"h").write("  ?
").reference(ctx._get(false, ["tBackup window for incremental file backups"]),ctx,"h").write("?
").reference(ctx._get(false, ["tBackup window for full file backups"]),ctx,"h").write("?
").reference(ctx._get(false, ["tBackup window for incremental image backups"]),ctx,"h").write("?
").reference(ctx._get(false, ["tBackup window for full image backups"]),ctx,"h").write("?
").reference(ctx._get(false, ["tComputer name"]),ctx,"h").write("
").reference(ctx._get(false, ["tMax backup speed for local network"]),ctx,"h").write(": MBit/s
").reference(ctx._get(false, ["tPerform autoupdates silently"]),ctx,"h").write(":
").reference(ctx._get(false, ["tSoft client quota"]),ctx,"h").write(":
").reference(ctx._get(false, ["no_compname_start"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["no_compname_end"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["global_settings_start"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["global_settings_end"]),ctx,"h",["s"]).reference(ctx._get(false, ["no_compname_start"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["no_compname_end"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["no_compname_start"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["no_compname_end"]),ctx,"h",["s"]).write("
").reference(ctx._get(false, ["tArchive every"]),ctx,"h").write("").reference(ctx._get(false, ["tArchive for"]),ctx,"h").write("").reference(ctx._get(false, ["tArchive window"]),ctx,"h").write("?").reference(ctx._get(false, ["tBackup type"]),ctx,"h").write("").reference(ctx._get(false, ["tNext archival"]),ctx,"h").write(" 
 ").reference(ctx._get(false, ["global_settings_start"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["global_settings_end"]),ctx,"h",["s"]).reference(ctx._get(false, ["no_compname_start"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["no_compname_end"]),ctx,"h",["s"]).write("\t\t
").reference(ctx._get(false, ["internet_settings_start"]),ctx,"h",["s"]).write("
").reference(ctx._get(false, ["global_settings_start_inet"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["global_settings_end_inet"]),ctx,"h",["s"]).reference(ctx._get(false, ["no_compname_start_inet"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["no_compname_end_inet"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["global_settings_start_inet"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["global_settings_end_inet"]),ctx,"h",["s"]).write("
").reference(ctx._get(false, ["tEnable internet mode (requires server restart)"]),ctx,"h").write(":
").reference(ctx._get(false, ["tInternet server name/IP"]),ctx,"h").write(":
").reference(ctx._get(false, ["tInternet server port"]),ctx,"h").write(":
").reference(ctx._get(false, ["tEnable internet mode"]),ctx,"h").write(":
").reference(ctx._get(false, ["tInternet auth key"]),ctx,"h").write("
").reference(ctx._get(false, ["tDo image backups over internet"]),ctx,"h").write(":
").reference(ctx._get(false, ["tDo full file backups over internet"]),ctx,"h").write(":
").reference(ctx._get(false, ["tMax backup speed for internet connection"]),ctx,"h").write(": KBit/s
").reference(ctx._get(false, ["tTotal max backup speed for internet connection"]),ctx,"h").write(": KBit/s
").reference(ctx._get(false, ["tEncrypted transfer"]),ctx,"h").write(":
").reference(ctx._get(false, ["tCompressed transfer"]),ctx,"h").write(":
").reference(ctx._get(false, ["tCalculate file-hashes on the client"]),ctx,"h").write(":
").reference(ctx._get(false, ["internet_settings_end"]),ctx,"h",["s"]).write("
").reference(ctx._get(false, ["global_settings_start"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["global_settings_end"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["global_settings_start"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["global_settings_end"]),ctx,"h",["s"]).write("
").reference(ctx._get(false, ["tTemporary files as file backup buffer"]),ctx,"h").write(":
").reference(ctx._get(false, ["tTemporary files as image backup buffer"]),ctx,"h").write(":
").reference(ctx._get(false, ["tLocal full file backup transfer mode"]),ctx,"h").write(":
").reference(ctx._get(false, ["tInternet full file backup transfer mode"]),ctx,"h").write(":
").reference(ctx._get(false, ["tLocal incremental file backup transfer mode"]),ctx,"h").write(":
").reference(ctx._get(false, ["tInternet incremental file backup transfer mode"]),ctx,"h").write(":
").reference(ctx._get(false, ["tLocal image backup transfer mode"]),ctx,"h").write(":
").reference(ctx._get(false, ["tInternet image backup transfer mode"]),ctx,"h").write(":
").reference(ctx._get(false, ["tFile hash collection amount"]),ctx,"h").write(":
").reference(ctx._get(false, ["tFile hash collection timeout"]),ctx,"h").write(":
").reference(ctx._get(false, ["tFile hash collection database cachesize"]),ctx,"h").write(": ").reference(ctx._get(false, ["tMB"]),ctx,"h").write("
").reference(ctx._get(false, ["tUpdate stats database cachesize"]),ctx,"h").write(": ").reference(ctx._get(false, ["tMB"]),ctx,"h").write("
").reference(ctx._get(false, ["tCache database type for file entries"]),ctx,"h").write(":
").reference(ctx._get(false, ["tCache database size for file entries"]),ctx,"h").write(": ").reference(ctx._get(false, ["tMB"]),ctx,"h").write("
").reference(ctx._get(false, ["tSuspend index limit"]),ctx,"h").write(":
").reference(ctx._get(false, ["tUse symlinks during incremental file backups"]),ctx,"h").write(":
").reference(ctx._get(false, ["tEnd-to-end verification of all file backups"]),ctx,"h").write(":
");}return body_0;})(); -(function(){dust.register("status_client_download",body_0);function body_0(chk,ctx){return chk.write("

").reference(ctx._get(false, ["tClient download"]),ctx,"h").write("

");}return body_0;})(); -(function(){dust.register("file_cache_error",body_0);function body_0(chk,ctx){return chk.write("\t\t\t
").reference(ctx._get(false, ["creating_filescache_text"]),ctx,"h").write("
").reference(ctx._get(false, ["tNumber of file entries processed"]),ctx,"h").write(": ").reference(ctx._get(false, ["processed_file_entries"]),ctx,"h").write("


");}return body_0;})(); -(function(){dust.register("stat_general_row",body_0);function body_0(chk,ctx){return chk.write("").reference(ctx._get(false, ["name"]),ctx,"h").write("").reference(ctx._get(false, ["images"]),ctx,"h").write("").reference(ctx._get(false, ["files"]),ctx,"h").write("").reference(ctx._get(false, ["used"]),ctx,"h").write("");}return body_0;})(); -(function(){dust.register("status_detail_extra_empty",body_0);function body_0(chk,ctx){return chk.write("").reference(ctx._get(false, ["tNo extra clients"]),ctx,"h").write("");}return body_0;})(); -(function(){dust.register("status_detail_extra_row",body_0);function body_0(chk,ctx){return chk.write("").reference(ctx._get(false, ["hostname"]),ctx,"h").write("").reference(ctx._get(false, ["online"]),ctx,"h").write("");}return body_0;})(); -(function(){dust.register("stat_user",body_0);function body_0(chk,ctx){return chk.write("

").reference(ctx._get(false, ["tStorage usage of"]),ctx,"h").write(" ").reference(ctx._get(false, ["clientname"]),ctx,"h").write("

").reference(ctx._get(false, ["tLoading"]),ctx,"h").write("...
");}return body_0;})(); -(function(){dust.register("status_percent_done",body_0);function body_0(chk,ctx){return chk.write("
");}return body_0;})(); -(function(){dust.register("settings_general",body_0);function body_0(chk,ctx){return chk.write("
").reference(ctx._get(false, ["ONLY_WIN32_BEGIN"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["ONLY_WIN32_END"]),ctx,"h",["s"]).write("
").reference(ctx._get(false, ["tBackup storage path"]),ctx,"h").write(":
").reference(ctx._get(false, ["tDo not do image backups"]),ctx,"h").write(":
").reference(ctx._get(false, ["tDo not do file backups"]),ctx,"h").write(":
").reference(ctx._get(false, ["tAutomatically shut down server"]),ctx,"h").write(":
").reference(ctx._get(false, ["tDownload client from update server"]),ctx,"h").write(":
").reference(ctx._get(false, ["tAutoupdate clients"]),ctx,"h").write(":
").reference(ctx._get(false, ["tMax number of simultaneous backups"]),ctx,"h").write(":
").reference(ctx._get(false, ["tMax number of recently active clients"]),ctx,"h").write(":
").reference(ctx._get(false, ["tNondefault temporary file directory"]),ctx,"h").write(":
").reference(ctx._get(false, ["tCleanup time window"]),ctx,"h").write(":?
").reference(ctx._get(false, ["tAutomatically backup UrBackup database"]),ctx,"h").write(":
").reference(ctx._get(false, ["tTotal max backup speed for local network"]),ctx,"h").write(": MBit/s
").reference(ctx._get(false, ["tGlobal soft filesystem quota"]),ctx,"h").write(":?
").reference(ctx._get(false, ["settings_inv"]),ctx,"h",["s"]).write("


");}return body_0;})(); +(function(){dust.register("dir_error",body_0);function body_0(chk,ctx){return chk.write("\t\t\t

");}return body_0;})(); (function(){dust.register("log_single",body_0);function body_0(chk,ctx){return chk.write("").reference(ctx._get(false, ["tBack"]),ctx,"h").write("

").reference(ctx._get(false, ["tLog"]),ctx,"h").write(" (").reference(ctx._get(false, ["name"]),ctx,"h").write(")

").reference(ctx._get(false, ["dir_error_text"]),ctx,"h").reference(ctx._get(false, ["ext_text"]),ctx,"h").write("
\t").reference(ctx._get(false, ["rows"]),ctx,"h",["s"]).write("
").reference(ctx._get(false, ["tLevel"]),ctx,"h").write("").reference(ctx._get(false, ["tTime"]),ctx,"h").write("").reference(ctx._get(false, ["tMessage"]),ctx,"h").write("
");}return body_0;})(); -(function(){dust.register("lastacts_table",body_0);function body_0(chk,ctx){return chk.write("

").reference(ctx._get(false, ["tLast activities"]),ctx,"h").write("

\t\t\t").reference(ctx._get(false, ["rows"]),ctx,"h",["s"]).write("
").reference(ctx._get(false, ["tID"]),ctx,"h").write("").reference(ctx._get(false, ["tComputer name"]),ctx,"h").write("").reference(ctx._get(false, ["tAction"]),ctx,"h").write("").reference(ctx._get(false, ["tStarting time"]),ctx,"h").write("").reference(ctx._get(false, ["tRequired time"]),ctx,"h").write("").reference(ctx._get(false, ["tUsed Storage"]),ctx,"h").write("
");}return body_0;})(); -(function(){dust.register("status_modify_clients",body_0);function body_0(chk,ctx){return chk.write("").reference(ctx._get(false, ["tSelect all"]),ctx,"h").write(" | ").reference(ctx._get(false, ["tSelect none"]),ctx,"h").write(" | ").reference(ctx._get(false, ["rem_start"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["tRemove selected"]),ctx,"h").write(" | ").reference(ctx._get(false, ["rem_stop"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["tStart for selected"]),ctx,"h").write("");}return body_0;})(); +(function(){dust.register("logs_report_mail",body_0);function body_0(chk,ctx){return chk.reference(ctx._get(false, ["report_single_mail"]),ctx,"h").write("[-], ");}return body_0;})(); +(function(){dust.register("logs_none",body_0);function body_0(chk,ctx){return chk.write("").reference(ctx._get(false, ["tNo entries for this filter"]),ctx,"h").write("");}return body_0;})(); +(function(){dust.register("log_single_none",body_0);function body_0(chk,ctx){return chk.write("").reference(ctx._get(false, ["tNo entries for this filter"]),ctx,"h").write("");}return body_0;})(); +(function(){dust.register("login",body_0);function body_0(chk,ctx){return chk.write("
").reference(ctx._get(false, ["tUsername"]),ctx,"h").write(":
").reference(ctx._get(false, ["tPassword"]),ctx,"h").write(":


");}return body_0;})(); +(function(){dust.register("progress_row",body_0);function body_0(chk,ctx){return chk.write("").reference(ctx._get(false, ["name"]),ctx,"h").write("").reference(ctx._get(false, ["action"]),ctx,"h").write("
").exists(ctx._get(false, ["percent"]),ctx,{"block":body_3},null).exists(ctx._get(false, ["indexing"]),ctx,{"block":body_4},null).write("").reference(ctx._get(false, ["queue"]),ctx,"h").write("");}function body_1(chk,ctx){return chk.write("0%");}function body_2(chk,ctx){return chk.reference(ctx._get(false, ["pcdone"]),ctx,"h").write("%");}function body_3(chk,ctx){return chk.reference(ctx._get(false, ["pcdone"]),ctx,"h").write("%");}function body_4(chk,ctx){return chk.reference(ctx._get(false, ["tIndexing..."]),ctx,"h");}return body_0;})(); +(function(){dust.register("main_nav",body_0);function body_0(chk,ctx){return chk.write("").reference(ctx._get(false, ["name"]),ctx,"h").write("");}return body_0;})(); +(function(){dust.register("nospc_stalled",body_0);function body_0(chk,ctx){return chk.write("\t\t\t
").reference(ctx._get(false, ["nospc_stalled_text"]),ctx,"h").write("


");}return body_0;})(); +(function(){dust.register("main_nav_sel",body_0);function body_0(chk,ctx){return chk.write("").reference(ctx._get(false, ["name"]),ctx,"h").write("");}return body_0;})(); +(function(){dust.register("progress_table",body_0);function body_0(chk,ctx){return chk.write("

").reference(ctx._get(false, ["tActivities"]),ctx,"h").write("

\t\t\t").reference(ctx._get(false, ["rows"]),ctx,"h",["s"]).write("
").reference(ctx._get(false, ["tComputer name"]),ctx,"h").write("").reference(ctx._get(false, ["tAction"]),ctx,"h").write("").reference(ctx._get(false, ["tProgress"]),ctx,"h").write("").reference(ctx._get(false, ["tFiles in queue"]),ctx,"h").write(" 
");}return body_0;})(); +(function(){dust.register("nospc_fatal",body_0);function body_0(chk,ctx){return chk.write("\t\t\t
").reference(ctx._get(false, ["nospc_fatal_text"]),ctx,"h").write("


");}return body_0;})(); +(function(){dust.register("settings_archive_row",body_0);function body_0(chk,ctx){return chk.write("").reference(ctx._get(false, ["archive_every"]),ctx,"h").write("").reference(ctx._get(false, ["archive_for"]),ctx,"h").write("").reference(ctx._get(false, ["archive_window"]),ctx,"h").write("
").reference(ctx._get(false, ["archive_backup_type_str"]),ctx,"h").write("").reference(ctx._get(false, ["next_start"]),ctx,"h",["s"]).write(" ").reference(ctx._get(false, ["archive_timeleft"]),ctx,"h").write("").reference(ctx._get(false, ["next_end"]),ctx,"h",["s"]).write("");}return body_0;})(); +(function(){dust.register("progress_table_none",body_0);function body_0(chk,ctx){return chk.write("

").reference(ctx._get(false, ["tActivities"]),ctx,"h").write("

\t\t\t
").reference(ctx._get(false, ["tComputer name"]),ctx,"h").write("").reference(ctx._get(false, ["tAction"]),ctx,"h").write("").reference(ctx._get(false, ["tProgress"]),ctx,"h").write("").reference(ctx._get(false, ["tFiles in queue"]),ctx,"h").write(" 
").reference(ctx._get(false, ["tNo activities"]),ctx,"h").write("
");}return body_0;})(); +(function(){dust.register("settings_mail_test_failed",body_0);function body_0(chk,ctx){return chk.write("

").reference(ctx._get(false, ["tSending test mail failed. Error:"]),ctx,"h").write(" ").reference(ctx._get(false, ["mail_err"]),ctx,"h");}return body_0;})(); +(function(){dust.register("logs_row",body_0);function body_0(chk,ctx){return chk.write(" ").reference(ctx._get(false, ["name"]),ctx,"h").write("").reference(ctx._get(false, ["time"]),ctx,"h").write("
").reference(ctx._get(false, ["errors"]),ctx,"h").write("
").reference(ctx._get(false, ["warnings"]),ctx,"h").write("
").reference(ctx._get(false, ["action"]),ctx,"h").write("");}return body_0;})(); +(function(){dust.register("file_cache_error",body_0);function body_0(chk,ctx){return chk.write("\t\t\t
").reference(ctx._get(false, ["creating_filescache_text"]),ctx,"h").write("
").reference(ctx._get(false, ["tNumber of file entries processed"]),ctx,"h").write(": ").reference(ctx._get(false, ["processed_file_entries"]),ctx,"h").write("


");}return body_0;})(); +(function(){dust.register("settings_user",body_0);function body_0(chk,ctx){return chk.write("
").reference(ctx._get(false, ["tSeparate settings for this client"]),ctx,"h").write("

").reference(ctx._get(false, ["settings_inv"]),ctx,"h",["s"]).write("


").reference(ctx._get(false, ["overwrite_warning_start"]),ctx,"h",["s"]).write("
").reference(ctx._get(false, ["tWarning: The settings configured on the client will overwrite the settings configured here. If you want to change this behaviour do not allow the client to change settings. "]),ctx,"h").write("


").reference(ctx._get(false, ["overwrite_warning_end"]),ctx,"h",["s"]).write("");}return body_0;})(); +(function(){dust.register("new_version_available",body_0);function body_0(chk,ctx){return chk.reference(ctx._get(false, ["tThere is a new version of UrBackup server available"]),ctx,"h").write(" (").reference(ctx._get(false, ["new_version_number"]),ctx,"h").write("). Download it here.

");}return body_0;})(); +(function(){dust.register("settings_user_create",body_0);function body_0(chk,ctx){return chk.write("
").reference(ctx._get(false, ["tUsername"]),ctx,"h").write(":
").reference(ctx._get(false, ["tPassword"]),ctx,"h").write(":
").reference(ctx._get(false, ["tRepeat password"]),ctx,"h").write(":
").reference(ctx._get(false, ["tRights for"]),ctx,"h").write(":").reference(ctx._get(false, ["rights"]),ctx,"h",["s"]).write("


");}return body_0;})(); +(function(){dust.register("settings_save_ok",body_0);function body_0(chk,ctx){return chk.write("

").reference(ctx._get(false, ["tSaved settings successfully"]),ctx,"h").write(".");}return body_0;})(); +(function(){dust.register("settings_mail",body_0);function body_0(chk,ctx){return chk.write("
").reference(ctx._get(false, ["tMail server name"]),ctx,"h").write(":
").reference(ctx._get(false, ["tMail server port"]),ctx,"h").write(":
").reference(ctx._get(false, ["tMail server username (empty for none)"]),ctx,"h").write(":
").reference(ctx._get(false, ["tMail server password"]),ctx,"h").write(":
").reference(ctx._get(false, ["tSender E-Mail Address"]),ctx,"h").write(":
").reference(ctx._get(false, ["tSend mails only with SSL/TLS"]),ctx,"h").write(":
").reference(ctx._get(false, ["tCheck SSL/TLS certificate"]),ctx,"h").write(":
").reference(ctx._get(false, ["tServer admin mail address"]),ctx,"h").write(":



").reference(ctx._get(false, ["tSend test mail to this email address after saving the settings (leave empty to not send a test mail)"]),ctx,"h").write(":
");}return body_0;})(); +(function(){dust.register("settings_user_pw_change",body_0);function body_0(chk,ctx){return chk.write("
").reference(ctx._get(false, ["tChange password for user"]),ctx,"h").write(": ").reference(ctx._get(false, ["username"]),ctx,"h").write("
").reference(ctx._get(false, ["tPassword"]),ctx,"h").write(":
").reference(ctx._get(false, ["tRepeat password"]),ctx,"h").write(":


");}return body_0;})(); +(function(){dust.register("settings_users_start",body_0);function body_0(chk,ctx){return chk.write("


\t\t\t").reference(ctx._get(false, ["rows"]),ctx,"h",["s"]).write("
").reference(ctx._get(false, ["tUsername"]),ctx,"h").write("").reference(ctx._get(false, ["tRights"]),ctx,"h").write("").reference(ctx._get(false, ["tActions"]),ctx,"h").write("


");}return body_0;})(); +(function(){dust.register("settings_mail_test_ok",body_0);function body_0(chk,ctx){return chk.write("

").reference(ctx._get(false, ["tTest Mail sent successfully"]),ctx,"h").write(".");}return body_0;})(); +(function(){dust.register("settings_user_rights_change_row",body_0);function body_0(chk,ctx){return chk.write("");}return body_0;})(); +(function(){dust.register("settings_user_add_done",body_0);function body_0(chk,ctx){return chk.write("
").reference(ctx._get(false, ["msg"]),ctx,"h").write("
");}return body_0;})(); +(function(){dust.register("stat_general_row",body_0);function body_0(chk,ctx){return chk.write("").reference(ctx._get(false, ["name"]),ctx,"h").write("").reference(ctx._get(false, ["images"]),ctx,"h").write("").reference(ctx._get(false, ["files"]),ctx,"h").write("").reference(ctx._get(false, ["used"]),ctx,"h").write("");}return body_0;})(); +(function(){dust.register("change_pw_fail",body_0);function body_0(chk,ctx){return chk.write("
").reference(ctx._get(false, ["tChanging password failed:"]),ctx,"h").write("
").reference(ctx._get(false, ["fail_reason"]),ctx,"h");}return body_0;})(); +(function(){dust.register("status_client_download",body_0);function body_0(chk,ctx){return chk.write("

").reference(ctx._get(false, ["tClient download"]),ctx,"h").write("

");}return body_0;})(); +(function(){dust.register("stat_user",body_0);function body_0(chk,ctx){return chk.write("

").reference(ctx._get(false, ["tStorage usage of"]),ctx,"h").write(" ").reference(ctx._get(false, ["clientname"]),ctx,"h").write("

").reference(ctx._get(false, ["tLoading"]),ctx,"h").write("...
");}return body_0;})(); +(function(){dust.register("settings_users_start_row",body_0);function body_0(chk,ctx){return chk.write("").reference(ctx._get(false, ["name"]),ctx,"h").write("").reference(ctx._get(false, ["rights"]),ctx,"h").write(" ");}return body_0;})(); +(function(){dust.register("settings_users_start_row_empty",body_0);function body_0(chk,ctx){return chk.write("").reference(ctx._get(false, ["tNo Users"]),ctx,"h").write("");}return body_0;})(); +(function(){dust.register("status_detail_extra_row",body_0);function body_0(chk,ctx){return chk.write("").reference(ctx._get(false, ["hostname"]),ctx,"h").write("").reference(ctx._get(false, ["online"]),ctx,"h").write("");}return body_0;})(); +(function(){dust.register("status_percent_done",body_0);function body_0(chk,ctx){return chk.write("
");}return body_0;})(); (function(){dust.register("tmpdir_error",body_0);function body_0(chk,ctx){return chk.write("\t\t\t
").reference(ctx._get(false, ["tmpdir_error_text"]),ctx,"h").write("


");}return body_0;})(); (function(){dust.register("upgrade_error",body_0);function body_0(chk,ctx){return chk.write("\t\t\t
").reference(ctx._get(false, ["upgrade_error_text"]),ctx,"h").write("
").reference(ctx._get(false, ["tCurrent version"]),ctx,"h").write(": ").reference(ctx._get(false, ["curr_db_version"]),ctx,"h").write("
").reference(ctx._get(false, ["tTarget version"]),ctx,"h").write(": ").reference(ctx._get(false, ["target_db_version"]),ctx,"h").write("


");}return body_0;})(); +(function(){dust.register("settings_user_create_admin",body_0);function body_0(chk,ctx){return chk.write("
").reference(ctx._get(false, ["tUsername"]),ctx,"h").write(":
").reference(ctx._get(false, ["tPassword"]),ctx,"h").write(":
").reference(ctx._get(false, ["tRepeat password"]),ctx,"h").write(":
").reference(ctx._get(false, ["tRights for"]),ctx,"h").write("").reference(ctx._get(false, ["rights"]),ctx,"h",["s"]).write("


");}return body_0;})(); +(function(){dust.register("logs_table",body_0);function body_0(chk,ctx){return chk.write("

").reference(ctx._get(false, ["tLogs"]),ctx,"h").write("

\t").reference(ctx._get(false, ["rows"]),ctx,"h",["s"]).write("
 ").reference(ctx._get(false, ["tComputer name"]),ctx,"h").write("").reference(ctx._get(false, ["tBackup time"]),ctx,"h").write("").reference(ctx._get(false, ["tErrors"]),ctx,"h").write("").reference(ctx._get(false, ["tWarnings"]),ctx,"h").write("").reference(ctx._get(false, ["tAction"]),ctx,"h").write("

").reference(ctx._get(false, ["tLive Log"]),ctx,"h").write("

").reference(ctx._get(false, ["tReports"]),ctx,"h").write("

").reference(ctx._get(false, ["tSend reports to"]),ctx,"h").write(" [+].
").reference(ctx._get(false, ["tSend"]),ctx,"h").write("  ").reference(ctx._get(false, ["tBackups with a log message of at least log level"]),ctx,"h").write(" 
");}return body_0;})(); (function(){dust.register("status_detail_row",body_0);function body_0(chk,ctx){return chk.write("").reference(ctx._get(false, ["name"]),ctx,"h").write("").reference(ctx._get(false, ["online"]),ctx,"h").write("").reference(ctx._get(false, ["status"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["lastseen"]),ctx,"h").write("").reference(ctx._get(false, ["lastbackup"]),ctx,"h").reference(ctx._get(false, ["start_file_backup"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["lastbackup_image"]),ctx,"h").reference(ctx._get(false, ["start_image_backup"]),ctx,"h",["s"]).write("
").reference(ctx._get(false, ["file_ok_t"]),ctx,"h").write("
").reference(ctx._get(false, ["image_ok_t"]),ctx,"h").write("
").reference(ctx._get(false, ["ip"]),ctx,"h").write("").reference(ctx._get(false, ["client_version_string"]),ctx,"h").write("").reference(ctx._get(false, ["os_version_string"]),ctx,"h").write("").reference(ctx._get(false, ["dtl_c1"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["dtl_c2"]),ctx,"h",["s"]).write("");}return body_0;})(); -(function(){dust.register("log_single_filter",body_0);function body_0(chk,ctx){return chk.reference(ctx._get(false, ["tFilter"]),ctx,"h").write(":");}return body_0;})(); -(function(){dust.register("settings_user",body_0);function body_0(chk,ctx){return chk.write("
").reference(ctx._get(false, ["tSeparate settings for this client"]),ctx,"h").write("

").reference(ctx._get(false, ["settings_inv"]),ctx,"h",["s"]).write("


").reference(ctx._get(false, ["overwrite_warning_start"]),ctx,"h",["s"]).write("
").reference(ctx._get(false, ["tWarning: The settings configured on the client will overwrite the settings configured here. If you want to change this behaviour do not allow the client to change settings. "]),ctx,"h").write("


").reference(ctx._get(false, ["overwrite_warning_end"]),ctx,"h",["s"]).write("");}return body_0;})(); -(function(){dust.register("settings_mail",body_0);function body_0(chk,ctx){return chk.write("
").reference(ctx._get(false, ["tMail server name"]),ctx,"h").write(":
").reference(ctx._get(false, ["tMail server port"]),ctx,"h").write(":
").reference(ctx._get(false, ["tMail server username (empty for none)"]),ctx,"h").write(":
").reference(ctx._get(false, ["tMail server password"]),ctx,"h").write(":
").reference(ctx._get(false, ["tSender E-Mail Address"]),ctx,"h").write(":
").reference(ctx._get(false, ["tSend mails only with SSL/TLS"]),ctx,"h").write(":
").reference(ctx._get(false, ["tCheck SSL/TLS certificate"]),ctx,"h").write(":
").reference(ctx._get(false, ["tServer admin mail address"]),ctx,"h").write(":



").reference(ctx._get(false, ["tSend test mail to this email address after saving the settings (leave empty to not send a test mail)"]),ctx,"h").write(":
");}return body_0;})(); +(function(){dust.register("status_modify_clients",body_0);function body_0(chk,ctx){return chk.write("").reference(ctx._get(false, ["tSelect all"]),ctx,"h").write(" | ").reference(ctx._get(false, ["tSelect none"]),ctx,"h").write(" | ").reference(ctx._get(false, ["rem_start"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["tRemove selected"]),ctx,"h").write(" | ").reference(ctx._get(false, ["rem_stop"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["tStart for selected"]),ctx,"h").write("");}return body_0;})(); +(function(){dust.register("stat_general",body_0);function body_0(chk,ctx){return chk.write("

").reference(ctx._get(false, ["tStorage allocation"]),ctx,"h").write("

").reference(ctx._get(false, ["tLoading"]),ctx,"h").write("...


\t\t\t").reference(ctx._get(false, ["rows"]),ctx,"h",["s"]).write("
").reference(ctx._get(false, ["tComputer name"]),ctx,"h").write("").reference(ctx._get(false, ["tImages"]),ctx,"h").write("").reference(ctx._get(false, ["tFiles"]),ctx,"h").write("").reference(ctx._get(false, ["tAll"]),ctx,"h").write("

").reference(ctx._get(false, ["tSum"]),ctx,"h").write("

").reference(ctx._get(false, ["tImages"]),ctx,"h").write("").reference(ctx._get(false, ["images_total"]),ctx,"h").write("
").reference(ctx._get(false, ["tFiles"]),ctx,"h").write("").reference(ctx._get(false, ["files_total"]),ctx,"h").write("
").reference(ctx._get(false, ["tAll"]),ctx,"h").write("").reference(ctx._get(false, ["used_total"]),ctx,"h").write("

").reference(ctx._get(false, ["tStorage usage"]),ctx,"h").write("

").reference(ctx._get(false, ["tLoading"]),ctx,"h").write("...
");}return body_0;})(); +(function(){dust.register("status_detail",body_0);function body_0(chk,ctx){return chk.write("

").reference(ctx._get(false, ["tBackup status"]),ctx,"h").write("

").reference(ctx._get(false, ["nospc_fatal"]),ctx,"h",["s"]).reference(ctx._get(false, ["nospc_stalled"]),ctx,"h",["s"]).reference(ctx._get(false, ["dir_error"]),ctx,"h",["s"]).reference(ctx._get(false, ["tmpdir_error"]),ctx,"h",["s"]).reference(ctx._get(false, ["database_error"]),ctx,"h",["s"]).write("

\t\t\t").reference(ctx._get(false, ["Actions_start"]),ctx,"h",["s"]).write("").reference(ctx._get(false, ["rows"]),ctx,"h",["s"]).write("
").reference(ctx._get(false, ["tComputer name"]),ctx,"h").write("").reference(ctx._get(false, ["tOnline"]),ctx,"h").write("").reference(ctx._get(false, ["tStatus"]),ctx,"h").write("").reference(ctx._get(false, ["tLast seen"]),ctx,"h").write("").reference(ctx._get(false, ["tLast file backup"]),ctx,"h").write("").reference(ctx._get(false, ["tLast image backup"]),ctx,"h").write("").reference(ctx._get(false, ["tFile backup status"]),ctx,"h").write("").reference(ctx._get(false, ["tImage backup status"]),ctx,"h").write("").reference(ctx._get(false, ["tIP"]),ctx,"h").write("").reference(ctx._get(false, ["tClient version"]),ctx,"h").write("").reference(ctx._get(false, ["tOperating System"]),ctx,"h").write(" ").reference(ctx._get(false, ["Actions_end"]),ctx,"h",["s"]).write("


").reference(ctx._get(false, ["modify_clients"]),ctx,"h",["s"]).exists(ctx._get(false, ["status_can_show_all"]),ctx,{"block":body_1},null).exists(ctx._get(false, ["removed_clients_table"]),ctx,{"block":body_2},null).write("
").reference(ctx._get(false, ["status_client_download"]),ctx,"h",["s"]).write("

").reference(ctx._get(false, ["tExtra clients"]),ctx,"h").write("

").exists(ctx._get(false, ["status_extra_clients"]),ctx,{"block":body_5},null);}function body_1(chk,ctx){return chk.write(" | ").reference(ctx._get(false, ["tShow all clients"]),ctx,"h").write("

");}function body_2(chk,ctx){return chk.write("

").section(ctx._get(false, ["removed_clients"]),ctx,{"block":body_3},null).write("
").reference(ctx._get(false, ["tComputer name"]),ctx,"h").write(" 
");}function body_3(chk,ctx){return chk.write("").reference(ctx._get(false, ["name"]),ctx,"h").write("").reference(ctx._get(false, ["tThis client is going to be removed. "]),ctx,"h").write(" ").exists(ctx._get(false, ["remove_client"]),ctx,{"block":body_4},null).reference(ctx._get(false, ["tClients are removed during the cleanup in the cleanup time window. "]),ctx,"h").write("");}function body_4(chk,ctx){return chk.write("").reference(ctx._get(false, ["tStop removing client"]),ctx,"h").write(". ");}function body_5(chk,ctx){return chk.write("\t\t\t").reference(ctx._get(false, ["extra_clients_rows"]),ctx,"h",["s"]).write("
").reference(ctx._get(false, ["tHostname/IP"]),ctx,"h").write("").reference(ctx._get(false, ["tOnline"]),ctx,"h").write("").reference(ctx._get(false, ["tActions"]),ctx,"h").write("
").reference(ctx._get(false, ["tHostname/IP"]),ctx,"h").write(":

").reference(ctx._get(false, ["tInternet clients"]),ctx,"h").write("


").reference(ctx._get(false, ["internet_client_added"]),ctx,"h",["s"]).reference(ctx._get(false, ["tAdd additional internet clients"]),ctx,"h").write(":
").reference(ctx._get(false, ["tClient name"]),ctx,"h").write(":

").reference(ctx._get(false, ["tServer identity"]),ctx,"h").write("

").reference(ctx._get(false, ["server_identity"]),ctx,"h").write("
");}return body_0;})(); +(function(){dust.register("status_detail_extra_empty",body_0);function body_0(chk,ctx){return chk.write("").reference(ctx._get(false, ["tNo extra clients"]),ctx,"h").write("");}return body_0;})(); +(function(){dust.register("settings_user_rights_change",body_0);function body_0(chk,ctx){return chk.write("
").reference(ctx._get(false, ["tChange rights for user"]),ctx,"h").write(": ").reference(ctx._get(false, ["username"]),ctx,"h").write("
").reference(ctx._get(false, ["rows"]),ctx,"h",["s"]).write("
").reference(ctx._get(false, ["tDomain"]),ctx,"h").write("").reference(ctx._get(false, ["tRights"]),ctx,"h").write("").reference(ctx._get(false, ["tTranslation"]),ctx,"h").write("").reference(ctx._get(false, ["tActions"]),ctx,"h").write("

").reference(ctx._get(false, ["tNew domain"]),ctx,"h").write("

");}return body_0;})(); diff --git a/urbackupserver/www/templates/settings_inv_row.htm b/urbackupserver/www/templates/settings_inv_row.htm index af353cd8..102f0c03 100644 --- a/urbackupserver/www/templates/settings_inv_row.htm +++ b/urbackupserver/www/templates/settings_inv_row.htm @@ -331,6 +331,10 @@ {tUse symlinks during incremental file backups}: + +{tTrust client hashes during incremental file backups}: + + {global_settings_end|s} {tEnd-to-end verification of all file backups}: diff --git a/urbackupserver/www/urbackup.js b/urbackupserver/www/urbackup.js index be139fa7..7e38e534 100644 --- a/urbackupserver/www/urbackup.js +++ b/urbackupserver/www/urbackup.js @@ -1448,6 +1448,7 @@ function show_settings2(data) data.settings.silent_update=getCheckboxValue(data.settings.silent_update); data.settings.end_to_end_file_backup_verification=getCheckboxValue(data.settings.end_to_end_file_backup_verification); data.settings.internet_calculate_filehashes_on_client=getCheckboxValue(data.settings.internet_calculate_filehashes_on_client); + data.settings.trust_client_hashes=getCheckboxValue(data.settings.trust_client_hashes); var transfer_mode_params1=["raw", "hashed"]; var transfer_mode_params2=["raw", "hashed", "blockhash"]; @@ -1856,7 +1857,8 @@ g.general_settings_list=[ "filescache_type", "filescache_size", "suspend_index_limit", -"use_incremental_symlinks" +"use_incremental_symlinks", +"trust_client_hashes" ]; g.mail_settings_list=[ "mail_servername",