From boxbackup-dev at fluffy.co.uk Thu Sep 4 00:06:21 2008 From: boxbackup-dev at fluffy.co.uk (boxbackup-dev at fluffy.co.uk) Date: Thu, 4 Sep 2008 00:06:21 +0100 (BST) Subject: [Box Backup-commit] COMMIT r2266 - box/trunk/test/bbackupd Message-ID: <20080903230621.141A632687B@www.boxbackup.org> Author: chris Date: 2008-09-04 00:06:20 +0100 (Thu, 04 Sep 2008) New Revision: 2266 Modified: box/trunk/test/bbackupd/testbbackupd.cpp Log: Include signal.h if it exists. Modified: box/trunk/test/bbackupd/testbbackupd.cpp =================================================================== --- box/trunk/test/bbackupd/testbbackupd.cpp 2008-08-25 14:18:32 UTC (rev 2265) +++ box/trunk/test/bbackupd/testbbackupd.cpp 2008-09-03 23:06:20 UTC (rev 2266) @@ -32,6 +32,10 @@ #include #endif +#ifdef HAVE_SIGNAL_H + #include +#endif + #include #ifdef HAVE_SYSCALL From boxbackup-dev at fluffy.co.uk Fri Sep 5 20:08:27 2008 From: boxbackup-dev at fluffy.co.uk (boxbackup-dev at fluffy.co.uk) Date: Fri, 5 Sep 2008 20:08:27 +0100 (BST) Subject: [Box Backup-commit] COMMIT r2267 - box/trunk/infrastructure Message-ID: <20080905190827.9A89832687B@www.boxbackup.org> Author: jamesog Date: 2008-09-05 20:08:26 +0100 (Fri, 05 Sep 2008) New Revision: 2267 Modified: box/trunk/infrastructure/makeparcels.pl.in Log: Fix GNUism in use of xargs (xargs -r is a GNU extension) - just get find to perform the delete using -exec. Modified: box/trunk/infrastructure/makeparcels.pl.in =================================================================== --- box/trunk/infrastructure/makeparcels.pl.in 2008-09-03 23:06:20 UTC (rev 2266) +++ box/trunk/infrastructure/makeparcels.pl.in 2008-09-05 19:08:26 UTC (rev 2267) @@ -101,7 +101,7 @@ print MAKE "\trm -rf ",parcel_dir($parcel),"\n"; print MAKE "\trm -f ",parcel_target($parcel),"\n"; } -print MAKE "\tfind release debug -type f | xargs -r rm\n"; +print MAKE "\tfind release debug -type f -exec rm -f {} \\;\n"; print MAKE "\n"; print MAKE "test:\trelease/common/test\n\nrelease/common/test:\n\t./runtest.pl ALL release\n\n"; From boxbackup-dev at fluffy.co.uk Fri Sep 5 20:28:21 2008 From: boxbackup-dev at fluffy.co.uk (boxbackup-dev at fluffy.co.uk) Date: Fri, 5 Sep 2008 20:28:21 +0100 (BST) Subject: [Box Backup-commit] COMMIT r2268 - box/trunk Message-ID: <20080905192821.67D9D32687B@www.boxbackup.org> Author: jamesog Date: 2008-09-05 20:28:21 +0100 (Fri, 05 Sep 2008) New Revision: 2268 Modified: box/trunk/parcels.txt Log: Remove LICENSE.txt from being installed into the binary location. This is definitely not the right place for it. The license needs to be in the distribution tarball but should not be installed. Modified: box/trunk/parcels.txt =================================================================== --- box/trunk/parcels.txt 2008-09-05 19:08:26 UTC (rev 2267) +++ box/trunk/parcels.txt 2008-09-05 19:28:21 UTC (rev 2268) @@ -8,7 +8,6 @@ bin bbackupquery bin bbackupctl script bin/bbackupd/bbackupd-config - script LICENSE.txt ONLY:mingw32,mingw32msvc script bin/bbackupd/win32/installer.iss From boxbackup-dev at fluffy.co.uk Sat Sep 6 11:41:20 2008 From: boxbackup-dev at fluffy.co.uk (boxbackup-dev at fluffy.co.uk) Date: Sat, 6 Sep 2008 11:41:20 +0100 (BST) Subject: [Box Backup-commit] COMMIT r2269 - box/trunk/test/backupstorefix Message-ID: <20080906104120.CA02432686D@www.boxbackup.org> Author: chris Date: 2008-09-06 11:41:18 +0100 (Sat, 06 Sep 2008) New Revision: 2269 Modified: box/trunk/test/backupstorefix/testbackupstorefix.cpp Log: Shorten long line Modified: box/trunk/test/backupstorefix/testbackupstorefix.cpp =================================================================== --- box/trunk/test/backupstorefix/testbackupstorefix.cpp 2008-09-05 19:28:21 UTC (rev 2268) +++ box/trunk/test/backupstorefix/testbackupstorefix.cpp 2008-09-06 10:41:18 UTC (rev 2269) @@ -598,7 +598,7 @@ " testfiles/testbackupstorefix.pl reroot 6") == 0); - // ------------------------------------------------------------------------------------------------ + // --------------------------------------------------------- // Stop server TEST_THAT(KillServer(pid)); From boxbackup-dev at fluffy.co.uk Sat Sep 6 11:44:47 2008 From: boxbackup-dev at fluffy.co.uk (boxbackup-dev at fluffy.co.uk) Date: Sat, 6 Sep 2008 11:44:47 +0100 (BST) Subject: [Box Backup-commit] COMMIT r2270 - box/trunk/infrastructure Message-ID: <20080906104447.B519D32686D@www.boxbackup.org> Author: chris Date: 2008-09-06 11:44:47 +0100 (Sat, 06 Sep 2008) New Revision: 2270 Modified: box/trunk/infrastructure/makebuildenv.pl.in Log: Don't try to kill daemons if not running, avoid error messages. Modified: box/trunk/infrastructure/makebuildenv.pl.in =================================================================== --- box/trunk/infrastructure/makebuildenv.pl.in 2008-09-06 10:41:18 UTC (rev 2269) +++ box/trunk/infrastructure/makebuildenv.pl.in 2008-09-06 10:44:47 UTC (rev 2270) @@ -419,7 +419,6 @@ __E } - print TESTFILE <<__E; echo Removing old test files... chmod -R a+rwx testfiles @@ -444,9 +443,15 @@ if(-d "$module/testfiles") { print TESTFILE <<__E; + # echo Killing any running daemons... -test -r testfiles/bbackupd.pid && kill `cat testfiles/bbackupd.pid` -test -r testfiles/bbstored.pid && kill `cat testfiles/bbstored.pid` +test -r testfiles/bbackupd.pid \\ +&& kill -0 `cat testfiles/bbackupd.pid` \\ +&& kill `cat testfiles/bbackupd.pid` + +test -r testfiles/bbstored.pid \\ +&& kill -0 `cat testfiles/bbstored.pid` \\ +&& kill `cat testfiles/bbstored.pid` __E } From boxbackup-dev at fluffy.co.uk Sat Sep 6 11:47:43 2008 From: boxbackup-dev at fluffy.co.uk (boxbackup-dev at fluffy.co.uk) Date: Sat, 6 Sep 2008 11:47:43 +0100 (BST) Subject: [Box Backup-commit] COMMIT r2271 - box/trunk/infrastructure/msvc/2005 Message-ID: <20080906104743.09E7E32686D@www.boxbackup.org> Author: chris Date: 2008-09-06 11:47:41 +0100 (Sat, 06 Sep 2008) New Revision: 2271 Modified: box/trunk/infrastructure/msvc/2005/bbackupctl.vcproj box/trunk/infrastructure/msvc/2005/bbackupd.vcproj box/trunk/infrastructure/msvc/2005/boxquery.vcproj box/trunk/infrastructure/msvc/2005/common.vcproj box/trunk/infrastructure/msvc/2005/win32test.vcproj Log: Add missing include dirs for pcre, and missing link to advapi32.dll. Modified: box/trunk/infrastructure/msvc/2005/bbackupctl.vcproj =================================================================== --- box/trunk/infrastructure/msvc/2005/bbackupctl.vcproj 2008-09-06 10:44:47 UTC (rev 2270) +++ box/trunk/infrastructure/msvc/2005/bbackupctl.vcproj 2008-09-06 10:47:41 UTC (rev 2271) @@ -62,7 +62,7 @@ /> Author: chris Date: 2008-09-06 11:50:33 +0100 (Sat, 06 Sep 2008) New Revision: 2272 Modified: box/trunk/lib/backupclient/BackupClientCryptoKeys.cpp Log: Reformat for readability. Use SecureZeroMemory rather than memset() to wipe key material on Windows. Modified: box/trunk/lib/backupclient/BackupClientCryptoKeys.cpp =================================================================== --- box/trunk/lib/backupclient/BackupClientCryptoKeys.cpp 2008-09-06 10:47:41 UTC (rev 2271) +++ box/trunk/lib/backupclient/BackupClientCryptoKeys.cpp 2008-09-06 10:50:33 UTC (rev 2272) @@ -35,33 +35,51 @@ // Open the file FileStream file(rKeyMaterialFilename); + // Read in data if(!file.ReadFullBuffer(KeyMaterial, BACKUPCRYPTOKEYS_FILE_SIZE, 0)) { THROW_EXCEPTION(BackupStoreException, CouldntLoadClientKeyMaterial) } - // Tell the filename how to encrypt - BackupStoreFilenameClear::SetBlowfishKey(KeyMaterial + BACKUPCRYPTOKEYS_FILENAME_KEY_START, BACKUPCRYPTOKEYS_FILENAME_KEY_LENGTH, - KeyMaterial + BACKUPCRYPTOKEYS_FILENAME_IV_START, BACKUPCRYPTOKEYS_FILENAME_IV_LENGTH); - BackupStoreFilenameClear::SetEncodingMethod(BackupStoreFilename::Encoding_Blowfish); + // Setup keys and encoding method for filename encryption + BackupStoreFilenameClear::SetBlowfishKey( + KeyMaterial + BACKUPCRYPTOKEYS_FILENAME_KEY_START, + BACKUPCRYPTOKEYS_FILENAME_KEY_LENGTH, + KeyMaterial + BACKUPCRYPTOKEYS_FILENAME_IV_START, + BACKUPCRYPTOKEYS_FILENAME_IV_LENGTH); + BackupStoreFilenameClear::SetEncodingMethod( + BackupStoreFilename::Encoding_Blowfish); - // Tell the attributes how to encrypt - BackupClientFileAttributes::SetBlowfishKey(KeyMaterial + BACKUPCRYPTOKEYS_ATTRIBUTES_KEY_START, BACKUPCRYPTOKEYS_ATTRIBUTES_KEY_LENGTH); - // and the secret for hashing - BackupClientFileAttributes::SetAttributeHashSecret(KeyMaterial + BACKUPCRYPTOKEYS_ATTRIBUTE_HASH_SECRET_START, BACKUPCRYPTOKEYS_ATTRIBUTE_HASH_SECRET_LENGTH); + // Setup key for attributes encryption + BackupClientFileAttributes::SetBlowfishKey( + KeyMaterial + BACKUPCRYPTOKEYS_ATTRIBUTES_KEY_START, + BACKUPCRYPTOKEYS_ATTRIBUTES_KEY_LENGTH); - // Tell the files how to encrypt - BackupStoreFile::SetBlowfishKeys(KeyMaterial + BACKUPCRYPTOKEYS_ATTRIBUTES_KEY_START, BACKUPCRYPTOKEYS_ATTRIBUTES_KEY_LENGTH, - KeyMaterial + BACKUPCRYPTOKEYS_FILE_BLOCK_ENTRY_KEY_START, BACKUPCRYPTOKEYS_FILE_BLOCK_ENTRY_KEY_LENGTH); + // Setup secret for attribute hashing + BackupClientFileAttributes::SetAttributeHashSecret( + KeyMaterial + BACKUPCRYPTOKEYS_ATTRIBUTE_HASH_SECRET_START, + BACKUPCRYPTOKEYS_ATTRIBUTE_HASH_SECRET_LENGTH); + + // Setup keys for file data encryption + BackupStoreFile::SetBlowfishKeys( + KeyMaterial + BACKUPCRYPTOKEYS_ATTRIBUTES_KEY_START, + BACKUPCRYPTOKEYS_ATTRIBUTES_KEY_LENGTH, + KeyMaterial + BACKUPCRYPTOKEYS_FILE_BLOCK_ENTRY_KEY_START, + BACKUPCRYPTOKEYS_FILE_BLOCK_ENTRY_KEY_LENGTH); + #ifndef HAVE_OLD_SSL // Use AES where available - BackupStoreFile::SetAESKey(KeyMaterial + BACKUPCRYPTOKEYS_FILE_AES_KEY_START, BACKUPCRYPTOKEYS_FILE_AES_KEY_LENGTH); + BackupStoreFile::SetAESKey( + KeyMaterial + BACKUPCRYPTOKEYS_FILE_AES_KEY_START, + BACKUPCRYPTOKEYS_FILE_AES_KEY_LENGTH); #endif // Wipe the key material from memory - ::memset(KeyMaterial, 0, BACKUPCRYPTOKEYS_FILE_SIZE); + #ifdef _MSC_VER // not defined on MinGW + SecureZeroMemory(KeyMaterial, BACKUPCRYPTOKEYS_FILE_SIZE); + #else + ::memset(KeyMaterial, 0, BACKUPCRYPTOKEYS_FILE_SIZE); + #endif } - - From boxbackup-dev at fluffy.co.uk Sat Sep 6 11:52:56 2008 From: boxbackup-dev at fluffy.co.uk (boxbackup-dev at fluffy.co.uk) Date: Sat, 6 Sep 2008 11:52:56 +0100 (BST) Subject: [Box Backup-commit] COMMIT r2273 - box/chris/general/lib/common Message-ID: <20080906105256.8ED0832686D@www.boxbackup.org> Author: chris Date: 2008-09-06 11:52:56 +0100 (Sat, 06 Sep 2008) New Revision: 2273 Added: box/chris/general/lib/common/Test.cpp Modified: box/chris/general/lib/common/Test.h Log: Move inline test functions out of line to make debugging easier and reduce size of include file. Copied: box/chris/general/lib/common/Test.cpp (from rev 1989, box/chris/general/lib/common/Test.h) =================================================================== --- box/chris/general/lib/common/Test.cpp (rev 0) +++ box/chris/general/lib/common/Test.cpp 2008-09-06 10:52:56 UTC (rev 2273) @@ -0,0 +1,412 @@ +// -------------------------------------------------------------------------- +// +// File +// Name: Test.cpp +// Purpose: Useful stuff for tests +// Created: 2007/12/09 +// +// -------------------------------------------------------------------------- + +#include "Box.h" + +#include +#include +#include +#include + +#include +#include + +#ifdef HAVE_UNISTD_H + #include +#endif + +#include + +#include "Test.h" + +bool TestFileExists(const char *Filename) +{ + struct stat st; + return ::stat(Filename, &st) == 0 && (st.st_mode & S_IFDIR) == 0; +} + +bool TestDirExists(const char *Filename) +{ + struct stat st; + return ::stat(Filename, &st) == 0 && (st.st_mode & S_IFDIR) == S_IFDIR; +} + +// -1 if doesn't exist +int TestGetFileSize(const char *Filename) +{ + struct stat st; + if(::stat(Filename, &st) == 0) + { + return st.st_size; + } + return -1; +} + +std::string ConvertPaths(const std::string& rOriginal) +{ +#ifdef WIN32 + // convert UNIX paths to native + + std::string converted; + for (size_t i = 0; i < rOriginal.size(); i++) + { + if (rOriginal[i] == '/') + { + converted += '\\'; + } + else + { + converted += rOriginal[i]; + } + } + return converted; + +#else // !WIN32 + return rOriginal; +#endif +} + +int RunCommand(const std::string& rCommandLine) +{ + return ::system(ConvertPaths(rCommandLine).c_str()); +} + +#ifdef WIN32 +#include +#endif + +bool ServerIsAlive(int pid) +{ + #ifdef WIN32 + + HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, + false, pid); + if (hProcess == NULL) + { + if (GetLastError() != ERROR_INVALID_PARAMETER) + { + BOX_ERROR("Failed to open process " << pid << + ": " << + GetErrorMessage(GetLastError())); + } + return false; + } + + DWORD exitCode; + BOOL result = GetExitCodeProcess(hProcess, &exitCode); + CloseHandle(hProcess); + + if (result == 0) + { + BOX_ERROR("Failed to get exit code for process " << + pid << ": " << + GetErrorMessage(GetLastError())) + return false; + } + + if (exitCode == STILL_ACTIVE) + { + return true; + } + + return false; + + #else // !WIN32 + + if(pid == 0) return false; + return ::kill(pid, 0) != -1; + + #endif // WIN32 +} + +int ReadPidFile(const char *pidFile) +{ + if(!TestFileExists(pidFile)) + { + TEST_FAIL_WITH_MESSAGE("Server didn't save PID file " + "(perhaps one was already running?)"); + return -1; + } + + int pid = -1; + + FILE *f = fopen(pidFile, "r"); + if(f == NULL || fscanf(f, "%d", &pid) != 1) + { + TEST_FAIL_WITH_MESSAGE("Couldn't read PID file"); + return -1; + } + fclose(f); + + return pid; +} + +int LaunchServer(const std::string& rCommandLine, const char *pidFile) +{ +#ifdef WIN32 + + PROCESS_INFORMATION procInfo; + + STARTUPINFO startInfo; + startInfo.cb = sizeof(startInfo); + startInfo.lpReserved = NULL; + startInfo.lpDesktop = NULL; + startInfo.lpTitle = NULL; + startInfo.dwFlags = 0; + startInfo.cbReserved2 = 0; + startInfo.lpReserved2 = NULL; + + std::string cmd = ConvertPaths(rCommandLine); + CHAR* tempCmd = strdup(cmd.c_str()); + + DWORD result = CreateProcess + ( + NULL, // lpApplicationName, naughty! + tempCmd, // lpCommandLine + NULL, // lpProcessAttributes + NULL, // lpThreadAttributes + false, // bInheritHandles + 0, // dwCreationFlags + NULL, // lpEnvironment + NULL, // lpCurrentDirectory + &startInfo, // lpStartupInfo + &procInfo // lpProcessInformation + ); + + free(tempCmd); + + if (result == 0) + { + DWORD err = GetLastError(); + printf("Launch failed: %s: error %d\n", rCommandLine.c_str(), + (int)err); + return -1; + } + + CloseHandle(procInfo.hProcess); + CloseHandle(procInfo.hThread); + +#else // !WIN32 + + if(RunCommand(rCommandLine) != 0) + { + printf("Server: %s\n", rCommandLine.c_str()); + TEST_FAIL_WITH_MESSAGE("Couldn't start server"); + return -1; + } + +#endif // WIN32 + + #ifdef WIN32 + // on other platforms there is no other way to get + // the PID, so a NULL pidFile doesn't make sense. + + if (pidFile == NULL) + { + return (int)procInfo.dwProcessId; + } + #endif + + // time for it to start up + ::fprintf(stdout, "Starting server: %s\n", rCommandLine.c_str()); + ::fprintf(stdout, "Waiting for server to start: "); + + for (int i = 0; i < 15; i++) + { + if (TestFileExists(pidFile)) + { + break; + } + + #ifdef WIN32 + if (!ServerIsAlive((int)procInfo.dwProcessId)) + { + break; + } + #endif + + ::fprintf(stdout, "."); + ::fflush(stdout); + ::sleep(1); + } + + #ifdef WIN32 + // on Win32 we can check whether the process is alive + // without even checking the PID file + + if (!ServerIsAlive((int)procInfo.dwProcessId)) + { + ::fprintf(stdout, "server died!\n"); + TEST_FAIL_WITH_MESSAGE("Server died!"); + return -1; + } + #endif + + if (!TestFileExists(pidFile)) + { + ::fprintf(stdout, "timed out!\n"); + TEST_FAIL_WITH_MESSAGE("Server didn't save PID file"); + return -1; + } + + ::fprintf(stdout, "done.\n"); + + // wait a second for the pid to be written to the file + ::sleep(1); + + // read pid file + int pid = ReadPidFile(pidFile); + + #ifdef WIN32 + // On Win32 we can check whether the PID in the pidFile matches + // the one returned by the system, which it always should. + + if (pid != (int)procInfo.dwProcessId) + { + printf("Server wrote wrong pid to file (%s): expected %d " + "but found %d\n", pidFile, + (int)procInfo.dwProcessId, pid); + TEST_FAIL_WITH_MESSAGE("Server wrote wrong pid to file"); + return -1; + } + #endif + + return pid; +} + +void TestRemoteProcessMemLeaksFunc(const char *filename, + const char* file, int line) +{ +#ifdef BOX_MEMORY_LEAK_TESTING + // Does the file exist? + if(!TestFileExists(filename)) + { + if (failures == 0) + { + first_fail_file = file; + first_fail_line = line; + } + ++failures; + printf("FAILURE: MemLeak report not available (file %s) " + "at %s:%d\n", filename, file, line); + } + else + { + // Is it empty? + if(TestGetFileSize(filename) > 0) + { + if (failures == 0) + { + first_fail_file = file; + first_fail_line = line; + } + ++failures; + printf("FAILURE: Memory leaks found in other process " + "(file %s) at %s:%d\n==========\n", + filename, file, line); + FILE *f = fopen(filename, "r"); + char linebuf[512]; + while(::fgets(linebuf, sizeof(linebuf), f) != 0) + { + printf("%s", linebuf); + } + fclose(f); + printf("==========\n"); + } + + // Delete it + ::unlink(filename); + } +#endif +} + +void force_sync() +{ + TEST_THAT(::system(BBACKUPCTL " -q -c testfiles/bbackupd.conf " + "force-sync") == 0); + TestRemoteProcessMemLeaks("bbackupctl.memleaks"); +} + +void wait_for_sync_start() +{ + TEST_THAT(::system(BBACKUPCTL " -q -c testfiles/bbackupd.conf " + "wait-for-sync") == 0); + TestRemoteProcessMemLeaks("bbackupctl.memleaks"); +} + +void wait_for_sync_end() +{ + TEST_THAT(::system(BBACKUPCTL " -q -c testfiles/bbackupd.conf " + "wait-for-end") == 0); + TestRemoteProcessMemLeaks("bbackupctl.memleaks"); +} + +void sync_and_wait() +{ + TEST_THAT(::system(BBACKUPCTL " -q -c testfiles/bbackupd.conf " + "sync-and-wait") == 0); + TestRemoteProcessMemLeaks("bbackupctl.memleaks"); +} + +void terminate_bbackupd(int pid) +{ + TEST_THAT(::system(BBACKUPCTL " -q -c testfiles/bbackupd.conf " + "terminate") == 0); + TestRemoteProcessMemLeaks("bbackupctl.memleaks"); + + for (int i = 0; i < 20; i++) + { + if (!ServerIsAlive(pid)) break; + fprintf(stdout, "."); + fflush(stdout); + sleep(1); + } + + TEST_THAT(!ServerIsAlive(pid)); + TestRemoteProcessMemLeaks("bbackupd.memleaks"); +} + + +// Wait a given number of seconds for something to complete +void wait_for_operation(int seconds) +{ + printf("Waiting: "); + fflush(stdout); + for(int l = 0; l < seconds; ++l) + { + sleep(1); + printf("."); + fflush(stdout); + } + printf(" done.\n"); + fflush(stdout); +} + +void safe_sleep(int seconds) +{ + BOX_TRACE("sleeping for " << seconds << " seconds"); + +#ifdef WIN32 + Sleep(seconds * 1000); +#else + struct timespec ts; + memset(&ts, 0, sizeof(ts)); + ts.tv_sec = seconds; + ts.tv_nsec = 0; + while (nanosleep(&ts, &ts) == -1 && errno == EINTR) + { + BOX_TRACE("safe_sleep interrupted with " << + ts.tv_sec << "." << ts.tv_nsec << + " secs remaining, sleeping again"); + /* sleep again */ + } +#endif + + BOX_TRACE("sleep finished"); +} Modified: box/chris/general/lib/common/Test.h =================================================================== --- box/chris/general/lib/common/Test.h 2008-09-06 10:50:33 UTC (rev 2272) +++ box/chris/general/lib/common/Test.h 2008-09-06 10:52:56 UTC (rev 2273) @@ -10,20 +10,10 @@ #ifndef TEST__H #define TEST__H -#include -#include -#include -#include - -#include -#include - -#ifdef HAVE_UNISTD_H - #include -#endif - #include +#include "Logging.h" + #ifdef WIN32 #define BBACKUPCTL "..\\..\\bin\\bbackupctl\\bbackupctl.exe" #define BBACKUPD "..\\..\\bin\\bbackupd\\bbackupd.exe" @@ -53,7 +43,7 @@ first_fail_line = __LINE__; \ } \ failures++; \ - printf("FAILURE: " msg " at " __FILE__ "(%d)\n", __LINE__); \ + BOX_ERROR("FAILURE: " msg " at " __FILE__ ":" << __LINE__); \ } #define TEST_ABORT_WITH_MESSAGE(msg) {TEST_FAIL_WITH_MESSAGE(msg); return 1;} @@ -62,393 +52,60 @@ #define TEST_THAT_ABORTONFAIL(condition) {if(!(condition)) TEST_ABORT_WITH_MESSAGE("Condition [" #condition "] failed")} // NOTE: The 0- bit is to allow this to work with stuff which has negative constants for flags (eg ConnectionException) -#define TEST_CHECK_THROWS(statement, excepttype, subtype) \ - { \ - bool didthrow = false; \ - try \ - { \ - statement; \ - } \ - catch(excepttype &e) \ - { \ - if(e.GetSubType() != ((unsigned int)excepttype::subtype) \ - && e.GetSubType() != (unsigned int)(0-excepttype::subtype)) \ - { \ - throw; \ - } \ - didthrow = true; \ - } \ - catch(...) \ - { \ - throw; \ - } \ - if(!didthrow) \ - { \ - TEST_FAIL_WITH_MESSAGE("Didn't throw exception " #excepttype "(" #subtype ")") \ - } \ +#define TEST_CHECK_THROWS(statement, excepttype, subtype) \ + { \ + bool didthrow = false; \ + try \ + { \ + statement; \ + } \ + catch(excepttype &e) \ + { \ + if(e.GetSubType() != ((unsigned int)excepttype::subtype) \ + && e.GetSubType() != (unsigned int)(0-excepttype::subtype)) \ + { \ + throw; \ + } \ + didthrow = true; \ + } \ + catch(...) \ + { \ + throw; \ + } \ + if(!didthrow) \ + { \ + TEST_FAIL_WITH_MESSAGE("Didn't throw exception " #excepttype "(" #subtype ")") \ + } \ } -inline bool TestFileExists(const char *Filename) -{ - struct stat st; - return ::stat(Filename, &st) == 0 && (st.st_mode & S_IFDIR) == 0; -} +bool TestFileExists(const char *Filename); +bool TestDirExists(const char *Filename); -inline bool TestDirExists(const char *Filename) -{ - struct stat st; - return ::stat(Filename, &st) == 0 && (st.st_mode & S_IFDIR) == S_IFDIR; -} +// TestGetFileSize() returns -1 if the file doesn't exist +int TestGetFileSize(const char *Filename); +std::string ConvertPaths(const std::string& rOriginal); +int RunCommand(const std::string& rCommandLine); +bool ServerIsAlive(int pid); +int ReadPidFile(const char *pidFile); +int LaunchServer(const std::string& rCommandLine, const char *pidFile); -// -1 if doesn't exist -inline int TestGetFileSize(const char *Filename) -{ - struct stat st; - if(::stat(Filename, &st) == 0) - { - return st.st_size; - } - return -1; -} - -inline std::string ConvertPaths(const std::string& rOriginal) -{ -#ifdef WIN32 - // convert UNIX paths to native - - std::string converted; - for (size_t i = 0; i < rOriginal.size(); i++) - { - if (rOriginal[i] == '/') - { - converted += '\\'; - } - else - { - converted += rOriginal[i]; - } - } - return converted; - -#else // !WIN32 - return rOriginal; -#endif -} - -inline int RunCommand(const std::string& rCommandLine) -{ - return ::system(ConvertPaths(rCommandLine).c_str()); -} - -#ifdef WIN32 -#include -#endif - -inline bool ServerIsAlive(int pid) -{ -#ifdef WIN32 - HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, false, pid); - if (hProcess == NULL) - { - if (GetLastError() != ERROR_INVALID_PARAMETER) - { - printf("Failed to open process %d: error %d\n", - pid, (int)GetLastError()); - } - return false; - } - CloseHandle(hProcess); - return true; -#else // !WIN32 - if(pid == 0) return false; - return ::kill(pid, 0) != -1; -#endif // WIN32 -} - -inline int ReadPidFile(const char *pidFile) -{ - if(!TestFileExists(pidFile)) - { - TEST_FAIL_WITH_MESSAGE("Server didn't save PID file " - "(perhaps one was already running?)"); - return -1; - } - - int pid = -1; - - FILE *f = fopen(pidFile, "r"); - if(f == NULL || fscanf(f, "%d", &pid) != 1) - { - TEST_FAIL_WITH_MESSAGE("Couldn't read PID file"); - return -1; - } - fclose(f); - - return pid; -} - -inline int LaunchServer(const std::string& rCommandLine, const char *pidFile) -{ -#ifdef WIN32 - - PROCESS_INFORMATION procInfo; - - STARTUPINFO startInfo; - startInfo.cb = sizeof(startInfo); - startInfo.lpReserved = NULL; - startInfo.lpDesktop = NULL; - startInfo.lpTitle = NULL; - startInfo.dwFlags = 0; - startInfo.cbReserved2 = 0; - startInfo.lpReserved2 = NULL; - - std::string cmd = ConvertPaths(rCommandLine); - CHAR* tempCmd = strdup(cmd.c_str()); - - DWORD result = CreateProcess - ( - NULL, // lpApplicationName, naughty! - tempCmd, // lpCommandLine - NULL, // lpProcessAttributes - NULL, // lpThreadAttributes - false, // bInheritHandles - 0, // dwCreationFlags - NULL, // lpEnvironment - NULL, // lpCurrentDirectory - &startInfo, // lpStartupInfo - &procInfo // lpProcessInformation - ); - - free(tempCmd); - - if (result == 0) - { - DWORD err = GetLastError(); - printf("Launch failed: %s: error %d\n", rCommandLine.c_str(), - (int)err); - return -1; - } - - CloseHandle(procInfo.hProcess); - CloseHandle(procInfo.hThread); - -#else // !WIN32 - - if(RunCommand(rCommandLine) != 0) - { - printf("Server: %s\n", rCommandLine.c_str()); - TEST_FAIL_WITH_MESSAGE("Couldn't start server"); - return -1; - } - -#endif // WIN32 - - #ifdef WIN32 - // on other platforms there is no other way to get - // the PID, so a NULL pidFile doesn't make sense. - - if (pidFile == NULL) - { - return (int)procInfo.dwProcessId; - } - #endif - - // time for it to start up - ::fprintf(stdout, "Starting server: %s\n", rCommandLine.c_str()); - ::fprintf(stdout, "Waiting for server to start: "); - - for (int i = 0; i < 15; i++) - { - if (TestFileExists(pidFile)) - { - break; - } - - #ifdef WIN32 - if (!ServerIsAlive((int)procInfo.dwProcessId)) - { - break; - } - #endif - - ::fprintf(stdout, "."); - ::fflush(stdout); - ::sleep(1); - } - - #ifdef WIN32 - // on Win32 we can check whether the process is alive - // without even checking the PID file - - if (!ServerIsAlive((int)procInfo.dwProcessId)) - { - ::fprintf(stdout, "server died!\n"); - TEST_FAIL_WITH_MESSAGE("Server died!"); - return -1; - } - #endif - - if (!TestFileExists(pidFile)) - { - ::fprintf(stdout, "timed out!\n"); - TEST_FAIL_WITH_MESSAGE("Server didn't save PID file"); - return -1; - } - - ::fprintf(stdout, "done.\n"); - - // wait a second for the pid to be written to the file - ::sleep(1); - - // read pid file - int pid = ReadPidFile(pidFile); - - #ifdef WIN32 - // On Win32 we can check whether the PID in the pidFile matches - // the one returned by the system, which it always should. - - if (pid != (int)procInfo.dwProcessId) - { - printf("Server wrote wrong pid to file (%s): expected %d " - "but found %d\n", pidFile, - (int)procInfo.dwProcessId, pid); - TEST_FAIL_WITH_MESSAGE("Server wrote wrong pid to file"); - return -1; - } - #endif - - return pid; -} - #define TestRemoteProcessMemLeaks(filename) \ TestRemoteProcessMemLeaksFunc(filename, __FILE__, __LINE__) -inline void TestRemoteProcessMemLeaksFunc(const char *filename, - const char* file, int line) -{ -#ifdef BOX_MEMORY_LEAK_TESTING - // Does the file exist? - if(!TestFileExists(filename)) - { - if (failures == 0) - { - first_fail_file = file; - first_fail_line = line; - } - ++failures; - printf("FAILURE: MemLeak report not available (file %s) " - "at %s:%d\n", filename, file, line); - } - else - { - // Is it empty? - if(TestGetFileSize(filename) > 0) - { - if (failures == 0) - { - first_fail_file = file; - first_fail_line = line; - } - ++failures; - printf("FAILURE: Memory leaks found in other process " - "(file %s) at %s:%d\n==========\n", - filename, file, line); - FILE *f = fopen(filename, "r"); - char linebuf[512]; - while(::fgets(linebuf, sizeof(linebuf), f) != 0) - { - printf("%s", linebuf); - } - fclose(f); - printf("==========\n"); - } - - // Delete it - ::unlink(filename); - } -#endif -} +void TestRemoteProcessMemLeaksFunc(const char *filename, + const char* file, int line); -inline void force_sync() -{ - TEST_THAT(::system(BBACKUPCTL " -q -c testfiles/bbackupd.conf " - "force-sync") == 0); - TestRemoteProcessMemLeaks("bbackupctl.memleaks"); -} +// functions to send commands to bbackupd +void force_sync(); +void wait_for_sync_start(); +void wait_for_sync_end(); +void sync_and_wait(); +void terminate_bbackupd(int pid); -inline void wait_for_sync_start() -{ - TEST_THAT(::system(BBACKUPCTL " -q -c testfiles/bbackupd.conf " - "wait-for-sync") == 0); - TestRemoteProcessMemLeaks("bbackupctl.memleaks"); -} - -inline void wait_for_sync_end() -{ - TEST_THAT(::system(BBACKUPCTL " -q -c testfiles/bbackupd.conf " - "wait-for-end") == 0); - TestRemoteProcessMemLeaks("bbackupctl.memleaks"); -} - -inline void sync_and_wait() -{ - TEST_THAT(::system(BBACKUPCTL " -q -c testfiles/bbackupd.conf " - "sync-and-wait") == 0); - TestRemoteProcessMemLeaks("bbackupctl.memleaks"); -} - -inline void terminate_bbackupd(int pid) -{ - TEST_THAT(::system(BBACKUPCTL " -q -c testfiles/bbackupd.conf " - "terminate") == 0); - TestRemoteProcessMemLeaks("bbackupctl.memleaks"); - - for (int i = 0; i < 20; i++) - { - if (!ServerIsAlive(pid)) break; - fprintf(stdout, "."); - fflush(stdout); - sleep(1); - } - - TEST_THAT(!ServerIsAlive(pid)); - TestRemoteProcessMemLeaks("bbackupd.memleaks"); -} - - // Wait a given number of seconds for something to complete -inline void wait_for_operation(int seconds) -{ - printf("Waiting: "); - fflush(stdout); - for(int l = 0; l < seconds; ++l) - { - sleep(1); - printf("."); - fflush(stdout); - } - printf(" done.\n"); - fflush(stdout); -} +void wait_for_operation(int seconds); -inline void safe_sleep(int seconds) -{ -#ifdef WIN32 - Sleep(seconds * 1000); -#else - struct timespec ts; - memset(&ts, 0, sizeof(ts)); - ts.tv_sec = seconds; - ts.tv_nsec = 0; - BOX_TRACE("sleeping for " << seconds << " seconds"); - while (nanosleep(&ts, &ts) == -1 && errno == EINTR) - { - BOX_TRACE("safe_sleep interrupted with " << - ts.tv_sec << "." << ts.tv_nsec << - " secs remaining, sleeping again"); - /* sleep again */ - } -#endif -} +// Sleep without interruption on Unix (resleep if interrupted) +void safe_sleep(int seconds); #endif // TEST__H From boxbackup-dev at fluffy.co.uk Sat Sep 6 11:58:49 2008 From: boxbackup-dev at fluffy.co.uk (boxbackup-dev at fluffy.co.uk) Date: Sat, 6 Sep 2008 11:58:49 +0100 (BST) Subject: [Box Backup-commit] COMMIT r2274 - in box/trunk/contrib: . windows windows/installer windows/installer/tools Message-ID: <20080906105849.75D4A32686D@www.boxbackup.org> Author: chris Date: 2008-09-06 11:58:49 +0100 (Sat, 06 Sep 2008) New Revision: 2274 Added: box/trunk/contrib/windows/ box/trunk/contrib/windows/installer/ box/trunk/contrib/windows/installer/boxbackup.mpi box/trunk/contrib/windows/installer/tools/ box/trunk/contrib/windows/installer/tools/InstallService.bat box/trunk/contrib/windows/installer/tools/KillBackupProcess.bat box/trunk/contrib/windows/installer/tools/QueryOutputAll.bat box/trunk/contrib/windows/installer/tools/QueryOutputCurrent.bat box/trunk/contrib/windows/installer/tools/ReloadConfig.bat box/trunk/contrib/windows/installer/tools/RemoteControl.exe box/trunk/contrib/windows/installer/tools/RemoveService.bat box/trunk/contrib/windows/installer/tools/RestartService.bat box/trunk/contrib/windows/installer/tools/ShowUsage.bat box/trunk/contrib/windows/installer/tools/StartService.bat box/trunk/contrib/windows/installer/tools/StopService.bat box/trunk/contrib/windows/installer/tools/Sync.bat Log: Add Windows Installer (InstallJammer) to version control, thanks to Pete Jalajas. Added: box/trunk/contrib/windows/installer/boxbackup.mpi =================================================================== --- box/trunk/contrib/windows/installer/boxbackup.mpi (rev 0) +++ box/trunk/contrib/windows/installer/boxbackup.mpi 2008-09-06 10:58:49 UTC (rev 2274) @@ -0,0 +1,3391 @@ +array set info { +AccountNo +10005005 + +AllowLanguageSelection +No + +AppName +{GigaLock Backup Service} + +ApplicationID +E10C6FD9-E524-28BD-B0AB3588F16C + +ApplicationURL +http://<%BrandName%>.com/ + +AutoFileGroups +No + +AutoRefreshFiles +Yes + +BBVersionNo +1857 + +BrandName +GigaLock + +BuildFailureAction +{Fail (recommended)} + +CancelledInstallAction +{Rollback and Stop} + +CleanupCancelledInstall +Yes + +CommandLineFailureAction +{Fail (recommended)} + +Company +{Tebuco, Inc.} + +CompressionLevel +6 + +CompressionMethod +zlib + +ConfigFileName +{<%InstallDir%>\bbackupd.conf} + +ConfigFileTemplate +{<%InstallDir%>\template.conf} + +Copyright +{2007-2008 Tebuco, Inc., & Ben Summers and Contributors} + +CreateDesktopShortcut +No + +CreateQuickLaunchShortcut +No + +DefaultDirectoryLocation +{} + +DefaultLanguage +English + +EncryptedKeyFilePassword +Enter_EncryptedKeys_Password_Here + +Ext +.exe + +ExtractSolidArchivesOnStartup +No + +Icon +/home/petjal/doc/teb/cli/bu/installer/win/icon.png + +Image +/home/petjal/doc/teb/cli/bu/installer/win/image.png + +IncludeDebugging +Yes + +InstallDirSuffix +<%ShortAppName%> + +InstallPassword +{} + +InstallVersion +0.10.18.57 + +Language,de +No + +Language,en +Yes + +Language,es +No + +Language,fr +No + +Language,hu +Yes + +Language,it +Yes + +Language,nl +Yes + +Language,pl +No + +Language,pt_br +No + +Language,ru +Yes + +LaunchApplication +No + +PackageDescription +{<%BrandName%> Backup Service} + +PackageLicense +{} + +PackageMaintainer +{Tebuco, Inc.} + +PackageName +<%ShortAppName%> + +PackagePackager +{Tebuco, Inc.} + +PackageRelease +<%PatchVersion%> + +PackageSummary +{} + +PackageVersion +<%MajorVersion%>.<%MinorVersion%> + +PreserveFileAttributes +Yes + +PreserveFilePermissions +Yes + +ProjectID +140B9882-3327-FEA8-13415A62FBB2 + +ProjectVersion +1.2.9.0 + +SaveOnlyToplevelDirs +No + +ScriptExt +.bat + +ServiceExeName +bu_service.exe + +ServiceName +<%BrandName%> + +ShortAppName +<%BrandName%> + +SkipUnusedFileGroups +Yes + +SystemLanguage +en_us + +Theme +Modern_Wizard + +ThemeDir +Modern_Wizard + +ThemeVersion +1 + +UpgradeApplicationID +{} + +UserInfoAcctNo +<%AccountNo%> + +UserInfoCompany +{} + +UserInfoEmail +{} + +UserInfoName +{} + +UserInfoPhone +{} + +Version +0.10.1857 + +ViewReadme +No + +WizardHeight +365 + +WizardWidth +500 + +} + +array set ::InstallJammer::InstallCommandLineOptions { +D +{{} Prefix No No {} {set the value of an option in the installer}} + +S +{InstallMode Switch No No Silent {run the installer in silent mode}} + +T +{Testing Switch Yes No {} {run installer without installing any files}} + +Y +{InstallMode Switch No No Default {accept all defaults and run the installer}} + +debug +{Debugging Switch Yes No {} {run installer in debug mode}} + +debugconsole +{ShowConsole Switch Yes No {} {run installer with a debug console open}} + +mode +{InstallMode Choice No No {Console Default Silent Standard} {set the mode to run the installer in}} + +prefix +{InstallDir String No No {} {set the installation directory}} + +test +{Testing Switch Yes No {} {run installer without installing any files}} + +} +array set ::InstallJammer::UninstallCommandLineOptions { +S +{InstallMode Switch No No Silent {run the uninstaller in silent mode}} + +Y +{InstallMode Switch No No Default {accept all defaults and run the uninstaller}} + +debugconsole +{ShowConsole Switch Yes No {} {run uninstaller with a debug console open}} + +mode +{UninstallMode Choice No No {Console Silent Standard} {set the mode to run the uninstaller in}} + +test +{Testing Switch Yes No {} {run uninstaller without uninstalling any files}} + +} +FileGroup ::481451CC-F49C-D389-8645076F595B -setup Install -active Yes -platforms {Windows MacOS-X} -name {Program Files} -parent FileGroups +File ::B9F58CFC-EE7A-BEE4-62CB-2C10665095A2 -filemethod {Update files with more recent dates} -type dir -directory <%InstallDir%> -name /home/petjal/doc/teb/cli/bu/installer/win/2.2 -location C:/cygwin/home/Chris/general/parcels/boxbackup-chris_general_1988M-backup-client-mingw32 -parent 481451CC-F49C-D389-8645076F595B +File ::CDDED10B-2747-DD07-5F9D-42A7FD7BB7E6 -name LICENSE.txt -parent B9F58CFC-EE7A-BEE4-62CB-2C10665095A2 +File ::D6E262BC-8A84-B6DB-794B-8FDC8AECB079 -name mgwz.dll -parent B9F58CFC-EE7A-BEE4-62CB-2C10665095A2 +File ::E56A0360-7D7F-D99E-E9A4-3C20BC4C2B99 -name mingwm10.dll -parent B9F58CFC-EE7A-BEE4-62CB-2C10665095A2 +File ::A7F6806E-A2E9-7259-23E1-2045261004AC -type dir -name service -parent B9F58CFC-EE7A-BEE4-62CB-2C10665095A2 +File ::3A3BF87F-8FA9-2849-A300-669BC209112C -type dir -name templates -parent B9F58CFC-EE7A-BEE4-62CB-2C10665095A2 +File ::B485E910-8884-1CF0-2A98-13E9E34223C9 -name NotifySysAdmin.template.vbs -parent 3A3BF87F-8FA9-2849-A300-669BC209112C +File ::E412715D-AA11-7A0D-15EF-78DC817579E6 -name SyncAllowScript.template.bat -parent 3A3BF87F-8FA9-2849-A300-669BC209112C +File ::01B412CF-48EB-05DF-A350-46BA0944B4D8 -name template.conf -parent 3A3BF87F-8FA9-2849-A300-669BC209112C +File ::E2EF2B48-8708-DE29-451C-AC1BCDB472EB -name original.conf -parent 3A3BF87F-8FA9-2849-A300-669BC209112C +File ::47602DF7-8463-AB89-E13F-11983610CAA2 -type dir -name tools -parent B9F58CFC-EE7A-BEE4-62CB-2C10665095A2 +File ::92EA29C5-2DE9-7366-B966-E5F25388080E -name copying.txt -parent 47602DF7-8463-AB89-E13F-11983610CAA2 +File ::1E499466-5B3A-A1BC-B8FE-5F52F3D9BBB4 -name EditConfig.bat -parent 47602DF7-8463-AB89-E13F-11983610CAA2 +File ::F7F61231-C340-5CD5-686B-01F521994B0C -name InstallService.bat -parent 47602DF7-8463-AB89-E13F-11983610CAA2 +File ::68DAE474-165D-81FE-1396-FDD2E6081B41 -name KillBackupProcess.bat -parent 47602DF7-8463-AB89-E13F-11983610CAA2 +File ::9FD80105-AF11-2C52-A212-620945F797B5 -name readme.txt -parent 47602DF7-8463-AB89-E13F-11983610CAA2 +File ::2436C940-3332-13AA-7613-8EE67C35CE9B -name ReloadConfig.bat -parent 47602DF7-8463-AB89-E13F-11983610CAA2 +File ::336DDAC3-F3BA-1117-73D4-11DFEF9E98AB -name RemoveService.bat -parent 47602DF7-8463-AB89-E13F-11983610CAA2 +File ::0C15AE46-0FF3-3B7F-FC55-D91EF279DBD3 -name RestartService.bat -parent 47602DF7-8463-AB89-E13F-11983610CAA2 +File ::58D97EDE-58F2-15D7-7113-BEE3047F0782 -name StartService.bat -parent 47602DF7-8463-AB89-E13F-11983610CAA2 +File ::BE7CDB16-D3FE-30FA-2153-7C0509CD5E78 -name StopService.bat -parent 47602DF7-8463-AB89-E13F-11983610CAA2 +File ::73BD5859-FB38-71F8-24BD-BDCF871F9FD3 -name Sync.bat -parent 47602DF7-8463-AB89-E13F-11983610CAA2 +File ::B9A4E416-DBBC-082A-DA03-351CE8B00548 -name VariableMapping.txt -parent 47602DF7-8463-AB89-E13F-11983610CAA2 +File ::67B3838F-4EF7-2C1C-2E86-78DB8ADD6682 -name ShowUsage.bat -parent 47602DF7-8463-AB89-E13F-11983610CAA2 +File ::2646A97C-C0D9-A29C-E145-C5C371F44938 -name QueryOutputAll.bat -parent 47602DF7-8463-AB89-E13F-11983610CAA2 +File ::2F41E3D2-DA4D-2FCB-B3D5-F04032D17A63 -name QueryOutputCurrent.bat -parent 47602DF7-8463-AB89-E13F-11983610CAA2 +File ::C6430BDD-8A07-B80E-FC0C-426C16EB4187 -name RemoteControl.exe -parent 47602DF7-8463-AB89-E13F-11983610CAA2 +File ::8E96CC1E-CF8F-81FB-78F2-95DA83B4ED22 -name QueryUpload.bat -parent 47602DF7-8463-AB89-E13F-11983610CAA2 +File ::0DE45C2C-EB7F-6574-9D55-72A22B5296C9 -type dir -name templates -parent 47602DF7-8463-AB89-E13F-11983610CAA2 +File ::40CFA47A-45A1-8C30-FFCF-08DEB67EF185 -name backup.template.conf -parent 0DE45C2C-EB7F-6574-9D55-72A22B5296C9 +File ::14A3E208-A250-1D52-1E73-E3C84DCCCD9A -name NotifySysAdmin.template.vbs~ -parent 0DE45C2C-EB7F-6574-9D55-72A22B5296C9 +File ::2BC3D48B-59D1-132D-F6A9-25FEDAE89BD6 -name NotifySysAdmin.template.vbs -parent 0DE45C2C-EB7F-6574-9D55-72A22B5296C9 +File ::D7D9A52B-3CAC-4090-72EC-768DD7D94400 -name SyncAllowScript.template.bat -parent 0DE45C2C-EB7F-6574-9D55-72A22B5296C9 +File ::61917543-36C2-A1CB-BA81-6265F4F4C3AA -name backup.original.conf -parent 0DE45C2C-EB7F-6574-9D55-72A22B5296C9 +File ::5EADAB59-F559-44CB-A3EE-9A56D4EF17C8 -type dir -name .svn -active 0 -parent 47602DF7-8463-AB89-E13F-11983610CAA2 +File ::31429CC4-525E-4E30-9328-4774AFA9F619 -name entries -parent 5EADAB59-F559-44CB-A3EE-9A56D4EF17C8 +File ::A27BEFB6-1421-4030-8F11-F04316BCE57C -name format -parent 5EADAB59-F559-44CB-A3EE-9A56D4EF17C8 +File ::C99700CE-1035-498C-9A96-B60835652077 -type dir -name prop-base -parent 5EADAB59-F559-44CB-A3EE-9A56D4EF17C8 +File ::2A77AF5B-4761-45B5-A543-6328A7F0F39B -type dir -name props -parent 5EADAB59-F559-44CB-A3EE-9A56D4EF17C8 +File ::BF74F2C1-3CE7-4875-9B52-CD0F527E01C7 -type dir -name text-base -parent 5EADAB59-F559-44CB-A3EE-9A56D4EF17C8 +File ::90695C82-0000-4F6A-8FE7-0ABDEAA17CAE -type dir -name tmp -parent 5EADAB59-F559-44CB-A3EE-9A56D4EF17C8 +File ::7DFF0EE4-7298-4C8C-A5BC-56BBDD81CFC8 -type dir -name prop-base -parent 90695C82-0000-4F6A-8FE7-0ABDEAA17CAE +File ::4C60E473-119E-4B0B-9B01-56240F24D9D5 -type dir -name props -parent 90695C82-0000-4F6A-8FE7-0ABDEAA17CAE +File ::E1E25ACC-487B-4191-B8CF-9E7C8C88EA09 -type dir -name text-base -parent 90695C82-0000-4F6A-8FE7-0ABDEAA17CAE +File ::EC7489EC-9BC7-CF1C-8D3F-40C4203F422D -name query.exe -parent B9F58CFC-EE7A-BEE4-62CB-2C10665095A2 +File ::7EA24716-8F12-19BF-8825-6E1CB828EC2B -name ServiceControl.exe -parent B9F58CFC-EE7A-BEE4-62CB-2C10665095A2 +File ::FFDEA5C6-74A8-EB75-7E4B-CEC1E3A36DCD -name bu_service.exe -parent B9F58CFC-EE7A-BEE4-62CB-2C10665095A2 +File ::E54B0E4B-4825-7F47-F7A5-FD6003230BE8 -name serverCA.pem -parent B9F58CFC-EE7A-BEE4-62CB-2C10665095A2 +File ::2448E6EE-D5C6-DC53-3A49-30D013107F37 -targetfilename <%AccountNo%>-key.pem -name key.pem -parent B9F58CFC-EE7A-BEE4-62CB-2C10665095A2 +File ::68FC4607-EF29-EAA7-155F-09AD23FD6BC3 -targetfilename <%AccountNo%>-cert.pem -name cert.pem -parent B9F58CFC-EE7A-BEE4-62CB-2C10665095A2 +File ::9D8A4908-8D06-D6DF-9016-2C29EB15EEC4 -targetfilename <%AccountNo%>-FileEncKeys.raw -name FileEncKeys.raw -parent B9F58CFC-EE7A-BEE4-62CB-2C10665095A2 +File ::9E11F400-C675-74F6-1233-89B3E0638A3B -type dir -name keys -parent B9F58CFC-EE7A-BEE4-62CB-2C10665095A2 +File ::1F544B9C-1F8D-6C7A-189B-BB12796BB011 -name service.exe -parent B9F58CFC-EE7A-BEE4-62CB-2C10665095A2 +File ::DF0BE0B1-6360-2B38-8CF7-C2FEE5B2E450 -name control.exe -parent B9F58CFC-EE7A-BEE4-62CB-2C10665095A2 +File ::BB9FF6C0-C34E-4D2E-8FC4-54E64D710ACC -type dir -name .svn -active 0 -parent B9F58CFC-EE7A-BEE4-62CB-2C10665095A2 +File ::AB8EBBB3-6D82-4AFF-AE41-97738D9B1A1A -name boxbackup.mpi -active 0 -parent B9F58CFC-EE7A-BEE4-62CB-2C10665095A2 +Component ::4A9C852B-647E-EED5-5482FFBCC2AF -setup Install -active Yes -platforms {Windows MacOS-X} -name {Default Component} -parent Components +SetupType ::8202CECC-54A0-9B6C-D24D111BA52E -setup Install -active Yes -platforms {Windows MacOS-X} -name Typical -parent SetupTypes + +InstallComponent AE3BD5B4-35DE-4240-B79914D43E56 -setup Install -type pane -title {Welcome Screen} -component Welcome -active No -parent StandardInstall +InstallComponent 2AC89879-6E9D-3D4E-F28E-5985EEBFAAA8 -setup Install -type pane -conditions 4EE35849-FAD7-170B-0E45-FA30636467B1 -title {Install Password} -component InstallPassword -command insert -active Yes -parent StandardInstall +Condition 4EE35849-FAD7-170B-0E45-FA30636467B1 -active Yes -parent 2AC89879-6E9D-3D4E-F28E-5985EEBFAAA8 -title {Password Test Condition} -component PasswordTestCondition -TreeObject::id 4EE35849-FAD7-170B-0E45-FA30636467B1 +InstallComponent B3B99E2D-C368-A921-B7BC-A71EBDE3AD4D -setup Install -type action -title {Set Install Password} -component SetInstallPassword -active Yes -parent 2AC89879-6E9D-3D4E-F28E-5985EEBFAAA8 +InstallComponent 1BEFB82C-C073-73D4-CFCE-F5DE7A674D9E -setup Install -type pane -title {User Information} -component UserInformation -active Yes -parent StandardInstall +InstallComponent 9013E862-8E81-5290-64F9-D8BCD13EC7E5 -setup Install -type pane -title {User Information Phone Email} -component UserInformation -active Yes -parent StandardInstall +InstallComponent F8FD4BD6-F1DF-3F8D-B857-98310E4B1143 -setup Install -type pane -title {User Information Account No} -component UserInformation -active Yes -parent StandardInstall +InstallComponent 58E1119F-639E-17C9-5D3898F385AA -setup Install -type pane -conditions 84DA7F05-9FB7-CC36-9EC98F8A6826 -title {Select Destination} -component SelectDestination -command insert -active Yes -parent StandardInstall +Condition 84DA7F05-9FB7-CC36-9EC98F8A6826 -active Yes -parent 58E1119F-639E-17C9-5D3898F385AA -title {File Permission Condition} -component FilePermissionCondition -TreeObject::id 84DA7F05-9FB7-CC36-9EC98F8A6826 +InstallComponent 0FDBA082-90AB-808C-478A-A13E7C525336 -setup Install -type action -title BackupLocationNumber -component ExecuteScript -active Yes -parent 58E1119F-639E-17C9-5D3898F385AA +InstallComponent 0047FF40-0139-2A59-AAC0-A44D46D6F5CC -setup Install -type action -title BackupLocationName -component ExecuteScript -active No -parent 58E1119F-639E-17C9-5D3898F385AA +InstallComponent 2BB06B72-DE53-2319-B1B8-351CDCBA2008 -setup Install -type action -title AddBackupLocation -component ExecuteScript -active Yes -parent 58E1119F-639E-17C9-5D3898F385AA +InstallComponent B506E7DA-E7C4-4D42-8C03-FD27BA16D078 -setup Install -type pane -title {License Agreement} -component License -active Yes -parent StandardInstall +InstallComponent B93D2216-1DDB-484C-A9AC-D6C18ED7DE23 -setup Install -type action -conditions {6D9D1ABC-7146-443F-9EE9-205D5CA6C830 79DAC913-A33D-4ED6-9BAE-B3A2053C0F2C} -title {Modify Widget} -component ModifyWidget -command insert -active Yes -parent B506E7DA-E7C4-4D42-8C03-FD27BA16D078 +Condition 6D9D1ABC-7146-443F-9EE9-205D5CA6C830 -active Yes -parent B93D2216-1DDB-484C-A9AC-D6C18ED7DE23 -title {String Is Condition} -component StringIsCondition -TreeObject::id 6D9D1ABC-7146-443F-9EE9-205D5CA6C830 +Condition 79DAC913-A33D-4ED6-9BAE-B3A2053C0F2C -active Yes -parent B93D2216-1DDB-484C-A9AC-D6C18ED7DE23 -title {String Is Condition} -component StringIsCondition -TreeObject::id 79DAC913-A33D-4ED6-9BAE-B3A2053C0F2C +InstallComponent 37E627F2-E04B-AEF2-D566C017A4D6 -setup Install -type pane -title {Copying Files} -component CopyFiles -active Yes -parent StandardInstall +InstallComponent 3CFFF099-6122-46DD-9CE4-F5819434AC53 -setup Install -type action -title {Stop running service} -component ExecuteExternalProgram -active Yes -parent 37E627F2-E04B-AEF2-D566C017A4D6 +InstallComponent FB697A88-2842-468E-9776-85E84B009340 -setup Install -type action -title {Remove installed service} -component ExecuteExternalProgram -active No -parent 37E627F2-E04B-AEF2-D566C017A4D6 +InstallComponent 41CDE776-2667-5CEB-312A-FC4C33A83E7F -setup Install -type action -title {Backup File} -component BackupFile -active Yes -parent 37E627F2-E04B-AEF2-D566C017A4D6 +InstallComponent 0D93323D-779D-44A8-1E0614E5285D -setup Install -type action -title {Disable Buttons} -component ModifyWidget -active Yes -parent 37E627F2-E04B-AEF2-D566C017A4D6 +InstallComponent 5CA3EA16-E37C-AABE-E576C4636EB0 -setup Install -type action -title {Execute Action} -component ExecuteAction -active Yes -parent 37E627F2-E04B-AEF2-D566C017A4D6 +InstallComponent F5F21749-8B3A-49C6-9138-9C4D6D703D26 -setup Install -type action -title {Unpack Keys} -component ExecuteExternalProgram -active No -parent 37E627F2-E04B-AEF2-D566C017A4D6 +InstallComponent FDF68FD6-BEA8-4A74-867D-5139F4D9E793 -setup Install -type action -title Wait -component Wait -active No -parent 37E627F2-E04B-AEF2-D566C017A4D6 +InstallComponent E56ADFF4-C15E-AEDB-A599-C468AF72C4BB -setup Install -type action -title {Copy File NotifySysAdmin} -component CopyFile -active Yes -parent 37E627F2-E04B-AEF2-D566C017A4D6 +InstallComponent D9F88AC1-3D2D-F6DB-871E-3A0E016770B1 -setup Install -type action -title {Copy File config} -component CopyFile -active Yes -parent 37E627F2-E04B-AEF2-D566C017A4D6 +InstallComponent 5F2C1F1C-B9F7-1642-59D9-A18318C1D70B -setup Install -type action -title {Replace Text In File} -component ReplaceTextInFile -active Yes -parent 37E627F2-E04B-AEF2-D566C017A4D6 +InstallComponent 2EC82FBD-8294-A3E4-7F39-1CBA0582FA64 -setup Install -type action -title {Write Text To File} -component WriteTextToFile -active Yes -parent 37E627F2-E04B-AEF2-D566C017A4D6 +InstallComponent 28E76C8B-2605-4739-9FFE-9C2880C17E59 -setup Install -type action -title {Edit config file} -component ExecuteExternalProgram -active No -parent 37E627F2-E04B-AEF2-D566C017A4D6 +InstallComponent 52F0A238-57E1-A578-2CE4DA177B32 -setup Install -type action -title {Move Forward} -component MoveForward -active Yes -parent 37E627F2-E04B-AEF2-D566C017A4D6 +InstallComponent 3FD9BFF3-2F6E-E4FC-2FAE-98F2017916A7 -setup Install -type pane -title SetBackupLocations -component CustomBlankPane2 -command reorder -active Yes -parent StandardInstall +InstallComponent A5B32DA1-B2FE-C1FA-6057-FBC3059EF076 -setup Install -type action -title {Execute Script} -component ExecuteScript -active Yes -parent 3FD9BFF3-2F6E-E4FC-2FAE-98F2017916A7 +InstallComponent 614C45B2-7515-780C-E444-7F165CF02DD7 -setup Install -type action -title {Execute Script} -component ExecuteScript -active No -parent 3FD9BFF3-2F6E-E4FC-2FAE-98F2017916A7 +InstallComponent F9E38720-6ABA-8B99-2471-496902E4CBC2 -setup Install -type action -title {Execute Script} -component ExecuteScript -active No -parent 3FD9BFF3-2F6E-E4FC-2FAE-98F2017916A7 +InstallComponent 362B6D6A-11BC-83CE-AFF6-410D8FBCF54D -setup Install -type action -title {Execute Script} -component ExecuteScript -active No -parent 3FD9BFF3-2F6E-E4FC-2FAE-98F2017916A7 +InstallComponent 2E2963BD-DDBD-738D-A910-B7F3F04946F9 -setup Install -type action -title ShowAddAnotherValue -component AddWidget -active Yes -parent 3FD9BFF3-2F6E-E4FC-2FAE-98F2017916A7 +InstallComponent 93AA298C-B64E-5683-14D2-7B86F7DEFD2C -setup Install -type action -title BackupLocationName -component ExecuteScript -active No -parent 3FD9BFF3-2F6E-E4FC-2FAE-98F2017916A7 +InstallComponent 3FDB57ED-598D-8A4E-CEF7-D90833305558 -setup Install -type action -title {Backup Directory} -component AddWidget -active Yes -parent 3FD9BFF3-2F6E-E4FC-2FAE-98F2017916A7 +InstallComponent B927A5AF-4DFE-82A3-DCA8-35FA4D91EC5A -setup Install -type action -title BackupLocationShortName -component AddWidget -active Yes -parent 3FD9BFF3-2F6E-E4FC-2FAE-98F2017916A7 +InstallComponent 855DE408-060E-3D35-08B5-1D9AB05C2865 -setup Install -type action -title Exclusions -component AddWidget -active Yes -parent 3FD9BFF3-2F6E-E4FC-2FAE-98F2017916A7 +InstallComponent 9892B25C-689B-5B8F-F0C9-B14FF6ACC40C -setup Install -type action -title {Execute Script} -component ExecuteScript -active No -parent 3FD9BFF3-2F6E-E4FC-2FAE-98F2017916A7 +InstallComponent 8419AAAD-5860-F73E-8D11-4D1BDA4D7D37 -setup Install -type action -title AddAnother -component AddWidget -active Yes -parent 3FD9BFF3-2F6E-E4FC-2FAE-98F2017916A7 +InstallComponent C7762473-273F-E3CA-17E3-65789B14CDB0 -setup Install -type action -title {Write Text To File} -component WriteTextToFile -active Yes -parent 3FD9BFF3-2F6E-E4FC-2FAE-98F2017916A7 +InstallComponent D7FBBEBB-2186-5674-BA87-BB7151859D4E -setup Install -type action -title BackupLocationNumber -component ExecuteScript -active Yes -parent 3FD9BFF3-2F6E-E4FC-2FAE-98F2017916A7 +InstallComponent 49E80443-62DB-1C10-392D-1091AEA5ED88 -setup Install -type action -conditions EB532611-5F30-3C24-66EB-F3826D9054FD -title {Move to Pane} -component MoveToPane -command insert -active Yes -parent 3FD9BFF3-2F6E-E4FC-2FAE-98F2017916A7 +Condition EB532611-5F30-3C24-66EB-F3826D9054FD -active Yes -parent 49E80443-62DB-1C10-392D-1091AEA5ED88 -title {String Is Condition} -component StringIsCondition -TreeObject::id EB532611-5F30-3C24-66EB-F3826D9054FD +InstallComponent 9A23D3ED-4D9D-9C57-C2A7-71DE0FFF0266 -setup Install -type pane -title {Click Next to Continue} -component CustomBlankPane2 -active Yes -parent StandardInstall +InstallComponent DDBBD8A9-13D7-9509-9202-419E989F60A9 -setup Install -type action -title {Add Widget} -component AddWidget -active No -parent 9A23D3ED-4D9D-9C57-C2A7-71DE0FFF0266 +InstallComponent 8E095096-F018-A880-429D-A2177A9B70EA -setup Install -type action -title {Add Widget} -component AddWidget -active No -parent 9A23D3ED-4D9D-9C57-C2A7-71DE0FFF0266 +InstallComponent 88A50FD5-480F-19A5-DA74-C915EB0A9765 -setup Install -type action -conditions 5EE78EF7-37CA-D440-3DB5-09136CD566B3 -title {Move to Pane} -component MoveToPane -command insert -active No -parent 9A23D3ED-4D9D-9C57-C2A7-71DE0FFF0266 +Condition 5EE78EF7-37CA-D440-3DB5-09136CD566B3 -active Yes -parent 88A50FD5-480F-19A5-DA74-C915EB0A9765 -title {String Is Condition} -component StringIsCondition -TreeObject::id 5EE78EF7-37CA-D440-3DB5-09136CD566B3 +InstallComponent 908CE221-5A3D-0A78-24A1-E7C91EBE38D4 -setup Install -type pane -title {Next-Build Config} -component CustomBlankPane2 -active No -parent StandardInstall +InstallComponent DA33B826-E633-A845-4646-76DFA78B907B -setup Install -type pane -title {Custom Blank Pane 2} -component CustomBlankPane2 -active Yes -parent StandardInstall +InstallComponent 6FEE2889-0338-1D49-60BF-1471F465AB26 -setup Install -type action -title {Write Text To File} -component WriteTextToFile -active Yes -parent DA33B826-E633-A845-4646-76DFA78B907B +InstallComponent 73DD4D07-B1DC-BA38-2B12-07EB24A7F0C8 -setup Install -type action -title {Copy File} -component CopyFile -active Yes -parent DA33B826-E633-A845-4646-76DFA78B907B +InstallComponent D23DD94C-E517-7F34-FD59-802CB18AB887 -setup Install -type action -title {Adjust Line Feeds} -component AdjustLineFeeds -active Yes -parent DA33B826-E633-A845-4646-76DFA78B907B +InstallComponent 7D8E1902-2BC4-80D8-2C18771E7C22 -setup Install -type action -title {Installing service} -component ExecuteExternalProgram -active Yes -parent DA33B826-E633-A845-4646-76DFA78B907B +InstallComponent 1C14291C-0971-4283-92E9-3808401303F5 -setup Install -type action -title {Starting service} -component ExecuteExternalProgram -active No -parent DA33B826-E633-A845-4646-76DFA78B907B +InstallComponent 6C323815-B9AB-FA94-4F5D152EBC51 -setup Install -type pane -title {Setup Complete} -component SetupComplete -active Yes -parent StandardInstall +InstallComponent 574198A7-7322-2F5E-02EF185D965C -setup Install -type pane -title {Copying Files} -component CopyFiles -active Yes -parent DefaultInstall +InstallComponent 8A761DBD-0640-D98C-9B3AD7672A8F -setup Install -type action -title {Disable Buttons} -component ModifyWidget -active Yes -parent 574198A7-7322-2F5E-02EF185D965C +InstallComponent 6E70FB1F-6A43-6C23-3242E965A0D0 -setup Install -type action -title {Execute Action} -component ExecuteAction -active Yes -parent 574198A7-7322-2F5E-02EF185D965C +InstallComponent 8E1A5944-5AF5-5906-16D395E386D8 -setup Install -type action -title {Move Forward} -component MoveForward -active Yes -parent 574198A7-7322-2F5E-02EF185D965C +InstallComponent 1F0926EE-6884-1330-B4A1DB11C1BF -setup Install -type pane -title {Setup Complete} -component SetupComplete -active Yes -parent DefaultInstall +InstallComponent 3B6E2E7C-1A26-27F1-D578E383B128 -setup Install -type action -conditions {13BD88FE-CD71-5AC7-E99C10B6CB28 E02368C5-95B5-03A7-3282740037B0} -title {View Readme Checkbutton} -component AddWidget -command insert -active Yes -parent 1F0926EE-6884-1330-B4A1DB11C1BF +Condition 13BD88FE-CD71-5AC7-E99C10B6CB28 -active Yes -parent 3B6E2E7C-1A26-27F1-D578E383B128 -title {File Exists Condition} -component FileExistsCondition -TreeObject::id 13BD88FE-CD71-5AC7-E99C10B6CB28 +Condition E02368C5-95B5-03A7-3282740037B0 -active Yes -parent 3B6E2E7C-1A26-27F1-D578E383B128 -title {String Is Condition} -component StringIsCondition -TreeObject::id E02368C5-95B5-03A7-3282740037B0 +InstallComponent CFFA27AF-A641-E41C-B4A0E3BB3CBB -setup Install -type action -conditions {592F46AE-8CEE-01F3-0BA7EBDCA4F4 793D8178-0F51-7F07-BC5886586D3C} -title {Launch Application Checkbutton} -component AddWidget -command insert -active Yes -parent 1F0926EE-6884-1330-B4A1DB11C1BF +Condition 592F46AE-8CEE-01F3-0BA7EBDCA4F4 -active Yes -parent CFFA27AF-A641-E41C-B4A0E3BB3CBB -title {File Exists Condition} -component FileExistsCondition -TreeObject::id 592F46AE-8CEE-01F3-0BA7EBDCA4F4 +Condition 793D8178-0F51-7F07-BC5886586D3C -active Yes -parent CFFA27AF-A641-E41C-B4A0E3BB3CBB -title {String Is Condition} -component StringIsCondition -TreeObject::id 793D8178-0F51-7F07-BC5886586D3C +InstallComponent 16D53E40-546B-54C3-088B1B5E3BBB -setup Install -type action -conditions {4E643D8A-CA31-018D-57D7053C2CE8 B39C0455-D1B6-7DDC-E2717F83463E} -title {Desktop Shortcut Checkbutton} -component AddWidget -command insert -active Yes -parent 1F0926EE-6884-1330-B4A1DB11C1BF +Condition 4E643D8A-CA31-018D-57D7053C2CE8 -active Yes -parent 16D53E40-546B-54C3-088B1B5E3BBB -title {File Exists Condition} -component FileExistsCondition -TreeObject::id 4E643D8A-CA31-018D-57D7053C2CE8 +Condition B39C0455-D1B6-7DDC-E2717F83463E -active Yes -parent 16D53E40-546B-54C3-088B1B5E3BBB -title {String Is Condition} -component StringIsCondition -TreeObject::id B39C0455-D1B6-7DDC-E2717F83463E +InstallComponent 937C3FDD-FB28-98BD-3DAB276E59ED -setup Install -type action -conditions {6B966959-05D9-DB32-8D9C4AD2A3DF 748D673B-DFE6-5F74-329903ACE4DB 3379F80B-36D6-73DC-6FC1D6223A26} -title {Quick Launch Shortcut Checkbutton} -component AddWidget -command insert -active Yes -parent 1F0926EE-6884-1330-B4A1DB11C1BF +Condition 6B966959-05D9-DB32-8D9C4AD2A3DF -active Yes -parent 937C3FDD-FB28-98BD-3DAB276E59ED -title {Platform Condition} -component PlatformCondition -TreeObject::id 6B966959-05D9-DB32-8D9C4AD2A3DF +Condition 748D673B-DFE6-5F74-329903ACE4DB -active Yes -parent 937C3FDD-FB28-98BD-3DAB276E59ED -title {File Exists Condition} -component FileExistsCondition -TreeObject::id 748D673B-DFE6-5F74-329903ACE4DB +Condition 3379F80B-36D6-73DC-6FC1D6223A26 -active Yes -parent 937C3FDD-FB28-98BD-3DAB276E59ED -title {String Is Condition} -component StringIsCondition -TreeObject::id 3379F80B-36D6-73DC-6FC1D6223A26 +InstallComponent 3FE82C17-A3E2-4A57-A563-F80818B00B81 -setup Install -type action -title {Console Ask Yes Or No} -component ConsoleAskYesOrNo -active Yes -parent ConsoleInstall +InstallComponent 56EE5149-6AA2-4E0C-8841-F66A2EF9276E -setup Install -type action -conditions 241BBFCE-4EB1-432F-94DD-69D444DDB6C0 -title Exit -component Exit -command insert -active Yes -parent ConsoleInstall +Condition 241BBFCE-4EB1-432F-94DD-69D444DDB6C0 -active Yes -parent 56EE5149-6AA2-4E0C-8841-F66A2EF9276E -title {String Is Condition} -component StringIsCondition -TreeObject::id 241BBFCE-4EB1-432F-94DD-69D444DDB6C0 +InstallComponent 0C12D2D3-AEBC-42FE-A73A-0815EFB10DA5 -setup Install -type action -conditions BC4EA5FD-50BD-4D6E-953F-5E3EDB957360 -title {Console Get User Input} -component ConsoleGetUserInput -command insert -active Yes -parent ConsoleInstall +Condition BC4EA5FD-50BD-4D6E-953F-5E3EDB957360 -active Yes -parent 0C12D2D3-AEBC-42FE-A73A-0815EFB10DA5 -title {File Permission Condition} -component FilePermissionCondition -TreeObject::id BC4EA5FD-50BD-4D6E-953F-5E3EDB957360 +InstallComponent B002A311-F8E7-41DE-B039-521391924E5B -setup Install -type action -title {Console Message} -component ConsoleMessage -active Yes -parent ConsoleInstall +InstallComponent D4FC6EB5-DDEE-4E4A-B8E1-D4B588A7928B -setup Install -type action -title {Execute Action} -component ExecuteAction -active Yes -parent ConsoleInstall +InstallComponent 2BF07B5A-9B06-4C1E-810D-5B5E9303D2C6 -setup Install -type action -title {Console Message} -component ConsoleMessage -active Yes -parent ConsoleInstall +InstallComponent 6B4CB3C2-4799-4C9F-BA8E-1EE47C4606E1 -setup Install -type action -title Exit -component Exit -active Yes -parent ConsoleInstall +InstallComponent D8F0AA0F-AD79-C566-15CC508F503B -setup Install -type action -title {Execute Action} -component ExecuteAction -active Yes -parent SilentInstall +InstallComponent 175CBE81-9EBE-1E21-A91479BEEFAE -setup Install -type action -title Exit -component Exit -active Yes -parent SilentInstall +InstallComponent A1DD1DC2-85D7-9BC6-998AC3D4A3A9 -setup Install -type actiongroup -title {Startup Actions} -active Yes -parent ActionGroupsInstall +InstallComponent 1F9E8CB8-02C1-0416-1F7445B4147F -setup Install -type action -conditions {3D0D1898-4C65-3E66-F82F56581E87 32F5B0AF-EB83-7A03-D8FAE1ECE473} -title Exit -component Exit -command insert -active Yes -parent A1DD1DC2-85D7-9BC6-998AC3D4A3A9 +Condition 3D0D1898-4C65-3E66-F82F56581E87 -active Yes -parent 1F9E8CB8-02C1-0416-1F7445B4147F -title {String Is Condition} -component StringIsCondition -TreeObject::id 3D0D1898-4C65-3E66-F82F56581E87 +Condition 32F5B0AF-EB83-7A03-D8FAE1ECE473 -active Yes -parent 1F9E8CB8-02C1-0416-1F7445B4147F -title {Ask Yes or No} -component AskYesOrNo -TreeObject::id 32F5B0AF-EB83-7A03-D8FAE1ECE473 +InstallComponent 32DC8FB1-A04B-71AA-EC18496D4BD0 -setup Install -type action -title {Create Install Panes} -component CreateInstallPanes -active Yes -parent A1DD1DC2-85D7-9BC6-998AC3D4A3A9 +InstallComponent 198905FB-9FAC-23DE-7422D25B8ECA -setup Install -type actiongroup -title {Install Actions} -active Yes -parent ActionGroupsInstall +InstallComponent 4D4A7BF0-7CCE-46E6-BDE5222F82D7 -setup Install -type action -title {Install Selected Files} -component InstallSelectedFiles -active Yes -parent 198905FB-9FAC-23DE-7422D25B8ECA +InstallComponent 53588803-6B41-D9FC-A385906A5106 -setup Install -type action -title {Install Uninstaller} -component InstallUninstaller -active Yes -parent 198905FB-9FAC-23DE-7422D25B8ECA +InstallComponent 73EA65C1-3BE3-B190-55C3E99F6269 -setup Install -type action -conditions 4EF787E3-0643-DE46-15E64BAF0816 -title {Windows Uninstall Registry} -component AddWindowsUninstallEntry -command insert -active Yes -parent 198905FB-9FAC-23DE-7422D25B8ECA +Condition 4EF787E3-0643-DE46-15E64BAF0816 -active Yes -parent 73EA65C1-3BE3-B190-55C3E99F6269 -title {Platform Condition} -component PlatformCondition -TreeObject::id 4EF787E3-0643-DE46-15E64BAF0816 +InstallComponent 39B2B666-78D8-75E6-6EA071594D34 -setup Install -type action -conditions 18C00430-D6B1-151F-307762B3A045 -title {Uninstall Shortcut} -component InstallWindowsShortcut -command insert -active Yes -parent 198905FB-9FAC-23DE-7422D25B8ECA +Condition 18C00430-D6B1-151F-307762B3A045 -active Yes -parent 39B2B666-78D8-75E6-6EA071594D34 -title {Platform Condition} -component PlatformCondition -TreeObject::id 18C00430-D6B1-151F-307762B3A045 +InstallComponent 6652193C-5D4B-44B6-ABC6-D6E96D89E5DC -setup Install -type action -title {Install Program Folder Shortcut} -component InstallProgramFolderShortcut -active No -parent 198905FB-9FAC-23DE-7422D25B8ECA +InstallComponent 9D101299-B80C-441B-8685-6E3AC61808E8 -setup Install -type action -title {RemoteControl Shortcut} -component InstallProgramFolderShortcut -active Yes -parent 198905FB-9FAC-23DE-7422D25B8ECA +InstallComponent B01CBBB2-6A78-CA53-9ED9-C3C4CFC9239E -setup Install -type action -title {stopservice Shortcut} -component InstallProgramFolderShortcut -active Yes -parent 198905FB-9FAC-23DE-7422D25B8ECA +InstallComponent DE800F1C-CB1A-E1CE-AEB8-B0A6DB4818E7 -setup Install -type action -title {Install Backup Service} -component InstallProgramFolderShortcut -active Yes -parent 198905FB-9FAC-23DE-7422D25B8ECA +InstallComponent 25AA533E-02FC-47D9-9273-25266B8FA1F9 -setup Install -type action -title {Remove Backup Service} -component InstallProgramFolderShortcut -active Yes -parent 198905FB-9FAC-23DE-7422D25B8ECA +InstallComponent CDD84DE3-C970-458F-9162-1A3CE0AA716B -setup Install -type action -title {startservice Shortcut} -component InstallProgramFolderShortcut -active Yes -parent 198905FB-9FAC-23DE-7422D25B8ECA +InstallComponent B5DFEC63-92A9-4686-909E-0CE78A7069D6 -setup Install -type action -title {restartservice Shortcut} -component InstallProgramFolderShortcut -active Yes -parent 198905FB-9FAC-23DE-7422D25B8ECA +InstallComponent C0452595-F3EB-43AD-BCA2-661437584636 -setup Install -type action -title {editconfig Shortcut} -component InstallProgramFolderShortcut -active Yes -parent 198905FB-9FAC-23DE-7422D25B8ECA +InstallComponent 1AF5CD58-65C0-49CB-9A9D-994816CF414E -setup Install -type action -title {QueryUpload Shortcut} -component InstallProgramFolderShortcut -active No -parent 198905FB-9FAC-23DE-7422D25B8ECA +InstallComponent 1681CF85-A5D2-4D73-A3FC-52B2A6A1847D -setup Install -type action -title {killbackupprocess Shortcut} -component InstallProgramFolderShortcut -active Yes -parent 198905FB-9FAC-23DE-7422D25B8ECA +InstallComponent D8B8A9BF-5F2E-4236-A63E-5A8C5FFA8968 -setup Install -type action -title {reloadconfig Shortcut} -component InstallProgramFolderShortcut -active Yes -parent 198905FB-9FAC-23DE-7422D25B8ECA +InstallComponent 6F61CDA8-30C9-454F-82A3-9987E1203079 -setup Install -type action -title {sync Shortcut} -component InstallProgramFolderShortcut -active Yes -parent 198905FB-9FAC-23DE-7422D25B8ECA +InstallComponent 9A663209-495B-ED16-09BE-457B61148022 -setup Install -type action -title QueryCurrent -component InstallProgramFolderShortcut -active Yes -parent 198905FB-9FAC-23DE-7422D25B8ECA +InstallComponent C0AF7C05-A31A-8376-BCB9-BA8B3A666252 -setup Install -type action -title SafeQueryAll -component InstallProgramFolderShortcut -active Yes -parent 198905FB-9FAC-23DE-7422D25B8ECA +InstallComponent 32B08FB1-99DF-234E-8BAF-333E80AAC9F5 -setup Install -type action -title Usage -component InstallProgramFolderShortcut -active Yes -parent 198905FB-9FAC-23DE-7422D25B8ECA +InstallComponent FEFD090D-C133-BC95-B3564F693CD3 -setup Install -type actiongroup -title {Finish Actions} -active Yes -parent ActionGroupsInstall +InstallComponent DECC120D-6904-7F17-45A49184A5A3 -setup Install -type action -conditions {E44CFF46-6302-C518-B9C30D2E43F7 B0AA6839-AAB6-A602-C0E4ECA2E4FF} -title {Install Desktop Shortcut} -component InstallDesktopShortcut -command insert -active No -parent FEFD090D-C133-BC95-B3564F693CD3 +Condition E44CFF46-6302-C518-B9C30D2E43F7 -active Yes -parent DECC120D-6904-7F17-45A49184A5A3 -title {String Is Condition} -component StringIsCondition -TreeObject::id E44CFF46-6302-C518-B9C30D2E43F7 +Condition B0AA6839-AAB6-A602-C0E4ECA2E4FF -active Yes -parent DECC120D-6904-7F17-45A49184A5A3 -title {File Exists Condition} -component FileExistsCondition -TreeObject::id B0AA6839-AAB6-A602-C0E4ECA2E4FF +InstallComponent 7B770A07-A785-5215-956FA82CF14E -setup Install -type action -conditions {6F94698F-0839-3ABF-0CF2DF05A4C8 738DD098-7E3B-BC89-875CDB93CBE2 8C866252-8760-9B08-FE569C25B60D} -title {Install Quick Launch Shortcut} -component InstallWindowsShortcut -command insert -active No -parent FEFD090D-C133-BC95-B3564F693CD3 +Condition 6F94698F-0839-3ABF-0CF2DF05A4C8 -active Yes -parent 7B770A07-A785-5215-956FA82CF14E -title {String Is Condition} -component StringIsCondition -TreeObject::id 6F94698F-0839-3ABF-0CF2DF05A4C8 +Condition 738DD098-7E3B-BC89-875CDB93CBE2 -active Yes -parent 7B770A07-A785-5215-956FA82CF14E -title {Platform Condition} -component PlatformCondition -TreeObject::id 738DD098-7E3B-BC89-875CDB93CBE2 +Condition 8C866252-8760-9B08-FE569C25B60D -active Yes -parent 7B770A07-A785-5215-956FA82CF14E -title {File Exists Condition} -component FileExistsCondition -TreeObject::id 8C866252-8760-9B08-FE569C25B60D +InstallComponent C105AAAE-7C16-2C9E-769FE4535B60 -setup Install -type action -conditions {2583A547-11DE-1C27-B6D04B023CC0 A6E1B027-A1B4-5848-4F868D028D00 0357FAE9-FCFD-26D8-6541D810CD61} -title {View Readme Window} -component TextWindow -command insert -active No -parent FEFD090D-C133-BC95-B3564F693CD3 +Condition 2583A547-11DE-1C27-B6D04B023CC0 -active Yes -parent C105AAAE-7C16-2C9E-769FE4535B60 -title {String Is Condition} -component StringIsCondition -TreeObject::id 2583A547-11DE-1C27-B6D04B023CC0 +Condition A6E1B027-A1B4-5848-4F868D028D00 -active Yes -parent C105AAAE-7C16-2C9E-769FE4535B60 -title {String Is Condition} -component StringIsCondition -TreeObject::id A6E1B027-A1B4-5848-4F868D028D00 +Condition 0357FAE9-FCFD-26D8-6541D810CD61 -active Yes -parent C105AAAE-7C16-2C9E-769FE4535B60 -title {File Exists Condition} -component FileExistsCondition -TreeObject::id 0357FAE9-FCFD-26D8-6541D810CD61 +InstallComponent C33D74B2-26FA-16F5-433A10C6A747 -setup Install -type action -conditions {CC4337CC-F3B5-757C-DFCF5D1D365A 795EE61F-6C0D-4A8B-93E02AA3894A 1528F4F0-145C-A48D-A8526DBB6289} -title {Launch Application} -component ExecuteExternalProgram -command insert -active No -parent FEFD090D-C133-BC95-B3564F693CD3 +Condition CC4337CC-F3B5-757C-DFCF5D1D365A -active Yes -parent C33D74B2-26FA-16F5-433A10C6A747 -title {String Is Condition} -component StringIsCondition -TreeObject::id CC4337CC-F3B5-757C-DFCF5D1D365A +Condition 795EE61F-6C0D-4A8B-93E02AA3894A -active Yes -parent C33D74B2-26FA-16F5-433A10C6A747 -title {String Is Condition} -component StringIsCondition -TreeObject::id 795EE61F-6C0D-4A8B-93E02AA3894A +Condition 1528F4F0-145C-A48D-A8526DBB6289 -active Yes -parent C33D74B2-26FA-16F5-433A10C6A747 -title {File Exists Condition} -component FileExistsCondition -TreeObject::id 1528F4F0-145C-A48D-A8526DBB6289 +InstallComponent E23AC50D-7CFB-800E-A99C6F4068F8 -setup Install -type actiongroup -title {Cancel Actions} -active Yes -parent ActionGroupsInstall +InstallComponent 3B8CDC8E-1239-D2E9-DF4CA6B1756D -setup Uninstall -type pane -title Uninstall -component Uninstall -active Yes -parent StandardUninstall +InstallComponent 19ADBDDB-1690-4A57-913E32A026C4 -setup Uninstall -type action -title {Modify Widget} -component ModifyWidget -active Yes -parent 3B8CDC8E-1239-D2E9-DF4CA6B1756D +InstallComponent 7A983CD8-302C-4942-BE59-525C5B5FA2F2 -setup Uninstall -type action -title {Stop Backup Process} -component ExecuteExternalProgram -active Yes -parent 3B8CDC8E-1239-D2E9-DF4CA6B1756D +InstallComponent E4DEA723-FC78-45D7-BAB1-A3E4C4C96EA1 -setup Uninstall -type action -title {Stop Service} -component ExecuteExternalProgram -active Yes -parent 3B8CDC8E-1239-D2E9-DF4CA6B1756D +InstallComponent B4D31D1E-ADB1-DE8F-18EB7294DDA8 -setup Uninstall -type action -title {Remove Service} -component ExecuteExternalProgram -active Yes -parent 3B8CDC8E-1239-D2E9-DF4CA6B1756D +InstallComponent D55BA4AF-E73B-60D1-E26F79175227 -setup Uninstall -type action -title {Execute Action} -component ExecuteAction -active Yes -parent 3B8CDC8E-1239-D2E9-DF4CA6B1756D +InstallComponent 69FD7409-5E2A-143B-DABD1C3B1E67 -setup Uninstall -type action -conditions {96A68CAC-9ED7-806C-086B104720FD E161F216-E597-B340-C1A71C476E2C} -title {Uninstall Leftover Files} -component UninstallLeftoverFiles -command insert -active Yes -parent 3B8CDC8E-1239-D2E9-DF4CA6B1756D +Condition 96A68CAC-9ED7-806C-086B104720FD -active Yes -parent 69FD7409-5E2A-143B-DABD1C3B1E67 -title {String Is Condition} -component StringIsCondition -TreeObject::id 96A68CAC-9ED7-806C-086B104720FD +Condition E161F216-E597-B340-C1A71C476E2C -active Yes -parent 69FD7409-5E2A-143B-DABD1C3B1E67 -title {Ask Yes or No} -component AskYesOrNo -TreeObject::id E161F216-E597-B340-C1A71C476E2C +InstallComponent 05060263-E852-87AB-8D0F2954CAA6 -setup Uninstall -type action -title {Move Forward} -component MoveForward -active Yes -parent 3B8CDC8E-1239-D2E9-DF4CA6B1756D +InstallComponent 41D3E165-C263-5F80-0FEEC0AEE47A -setup Uninstall -type pane -conditions EB2B31A1-C111-3582-0C8A5656692A -title {Uninstall Details} -component UninstallDetails -command insert -active Yes -parent StandardUninstall +Condition EB2B31A1-C111-3582-0C8A5656692A -active Yes -parent 41D3E165-C263-5F80-0FEEC0AEE47A -title {String Is Condition} -component StringIsCondition -TreeObject::id EB2B31A1-C111-3582-0C8A5656692A +InstallComponent 3D33AA8C-0037-204B-39A339FD38BD -setup Uninstall -type pane -title {Uninstall Complete} -component UninstallComplete -active Yes -parent StandardUninstall +InstallComponent 49E59F91-27F7-46D1-A1C1-19865C2392D3 -setup Uninstall -type action -title {Console Ask Yes Or No} -component ConsoleAskYesOrNo -active Yes -parent ConsoleUninstall +InstallComponent ADA6EB2F-8820-4366-BBEF-ED1335B7F828 -setup Uninstall -type action -conditions 87DE6D78-81E1-495B-A214-B3FF3E7E5614 -title Exit -component Exit -command insert -active Yes -parent ConsoleUninstall +Condition 87DE6D78-81E1-495B-A214-B3FF3E7E5614 -active Yes -parent ADA6EB2F-8820-4366-BBEF-ED1335B7F828 -title {String Is Condition} -component StringIsCondition -TreeObject::id 87DE6D78-81E1-495B-A214-B3FF3E7E5614 +InstallComponent B4ED4636-22D8-41DC-9E3D-BD1E1CAD2174 -setup Uninstall -type action -title {Console Message} -component ConsoleMessage -active Yes -parent ConsoleUninstall +InstallComponent 3C7130B3-3206-403D-B09E-59D4A758FBAD -setup Uninstall -type action -title {Execute Action} -component ExecuteAction -active Yes -parent ConsoleUninstall +InstallComponent 20CBDBEA-2217-457B-8D98-D692C4F591E9 -setup Uninstall -type action -title {Console Message} -component ConsoleMessage -active Yes -parent ConsoleUninstall +InstallComponent 7F85263E-CAE2-46BA-AAC0-6B89D20FD2DE -setup Uninstall -type action -title Exit -component Exit -active Yes -parent ConsoleUninstall +InstallComponent 17D8BA8E-5992-AA5C-F5ECB73A3433 -setup Uninstall -type action -title {Execute Action} -component ExecuteAction -active Yes -parent SilentUninstall +InstallComponent D3D73C76-D9D3-07DA-63D4163A44BE -setup Uninstall -type action -title Exit -component Exit -active Yes -parent SilentUninstall +InstallComponent 848844B5-6103-9343-8B731B0BE4E0 -setup Uninstall -type actiongroup -title {Startup Actions} -active Yes -parent ActionGroupsUninstall +InstallComponent 97ACF525-C075-8635-E019202A83D8 -setup Uninstall -type action -conditions {DFFF91A9-2CA5-6ABE-8474D814AF88 4ACB0B47-42B3-2B3A-BFE9AA4EC707} -title Exit -component Exit -command insert -active Yes -parent 848844B5-6103-9343-8B731B0BE4E0 +Condition DFFF91A9-2CA5-6ABE-8474D814AF88 -active Yes -parent 97ACF525-C075-8635-E019202A83D8 -title {String Is Condition} -component StringIsCondition -TreeObject::id DFFF91A9-2CA5-6ABE-8474D814AF88 +Condition 4ACB0B47-42B3-2B3A-BFE9AA4EC707 -active Yes -parent 97ACF525-C075-8635-E019202A83D8 -title {Ask Yes or No} -component AskYesOrNo -TreeObject::id 4ACB0B47-42B3-2B3A-BFE9AA4EC707 +InstallComponent F4024A3E-9A6D-2726-5E0CFFA93054 -setup Uninstall -type actiongroup -title {Uninstall Actions} -active Yes -parent ActionGroupsUninstall +InstallComponent 39D7394E-04E9-CA70-0034DB830BFE -setup Uninstall -type action -title {Uninstall Selected Files} -component UninstallSelectedFiles -active Yes -parent F4024A3E-9A6D-2726-5E0CFFA93054 +InstallComponent 39270FD8-932E-6132-7EF795ED9B93 -setup Uninstall -type actiongroup -title {Finish Actions} -active Yes -parent ActionGroupsUninstall +InstallComponent 905DA2E9-988C-2F27-BB1F5F274AC9 -setup Uninstall -type actiongroup -title {Cancel Actions} -active Yes -parent ActionGroupsUninstall + +array set Properties { +0047FF40-0139-2A59-AAC0-A44D46D6F5CC,Active +No + +0047FF40-0139-2A59-AAC0-A44D46D6F5CC,Comment +{set BackupLocationName "BackupLocation_${BackupLocationNumber}"} + +0047FF40-0139-2A59-AAC0-A44D46D6F5CC,Conditions +{0 conditions} + +0047FF40-0139-2A59-AAC0-A44D46D6F5CC,ExecuteAction +{Before Next Pane is Displayed} + +0047FF40-0139-2A59-AAC0-A44D46D6F5CC,ResultVirtualText +BackupLocationName + +0047FF40-0139-2A59-AAC0-A44D46D6F5CC,TclScript +{set BackupLocationName "BackupLocation_${BackupLocationNumber}"} + +0357FAE9-FCFD-26D8-6541D810CD61,CheckCondition +{Before Action is Executed} + +0357FAE9-FCFD-26D8-6541D810CD61,Filename +<%ProgramReadme%> + +05060263-E852-87AB-8D0F2954CAA6,Conditions +{0 conditions} + +0C12D2D3-AEBC-42FE-A73A-0815EFB10DA5,Prompt +<%ConsoleSelectDestinationText%> + +0C12D2D3-AEBC-42FE-A73A-0815EFB10DA5,VirtualText +InstallDir + +0D93323D-779D-44A8-1E0614E5285D,Conditions +{0 conditions} + +0D93323D-779D-44A8-1E0614E5285D,State +disabled + +0D93323D-779D-44A8-1E0614E5285D,Widget +{Back Button;Next Button} + +0FDBA082-90AB-808C-478A-A13E7C525336,Conditions +{0 conditions} + +0FDBA082-90AB-808C-478A-A13E7C525336,ExecuteAction +{Before Next Pane is Displayed} + +0FDBA082-90AB-808C-478A-A13E7C525336,ResultVirtualText +BackupLocationNumber + +0FDBA082-90AB-808C-478A-A13E7C525336,TclScript +{set BackupLocationNumber 1} + +13BD88FE-CD71-5AC7-E99C10B6CB28,CheckCondition +{Before Action is Executed} + +13BD88FE-CD71-5AC7-E99C10B6CB28,Filename +<%ProgramReadme%> + +1528F4F0-145C-A48D-A8526DBB6289,CheckCondition +{Before Action is Executed} + +1528F4F0-145C-A48D-A8526DBB6289,Filename +<%ProgramExecutable%> + +1681CF85-A5D2-4D73-A3FC-52B2A6A1847D,Alias +{Stop Backup Windows Process} + +1681CF85-A5D2-4D73-A3FC-52B2A6A1847D,Conditions +{0 conditions} + +1681CF85-A5D2-4D73-A3FC-52B2A6A1847D,FileName +<%ShortAppName%>-program-killbackupprocess + +1681CF85-A5D2-4D73-A3FC-52B2A6A1847D,ShortcutName +{Stop backup process} + +1681CF85-A5D2-4D73-A3FC-52B2A6A1847D,TargetFileName +<%InstallDir%>/tools/KillBackupProcess.bat + +1681CF85-A5D2-4D73-A3FC-52B2A6A1847D,WorkingDirectory +<%InstallDir%> + +16D53E40-546B-54C3-088B1B5E3BBB,Background +white + +16D53E40-546B-54C3-088B1B5E3BBB,Conditions +{2 conditions} + +16D53E40-546B-54C3-088B1B5E3BBB,Text,subst +1 + +16D53E40-546B-54C3-088B1B5E3BBB,Type +checkbutton + +16D53E40-546B-54C3-088B1B5E3BBB,VirtualText +CreateDesktopShortcut + +16D53E40-546B-54C3-088B1B5E3BBB,X +185 + +16D53E40-546B-54C3-088B1B5E3BBB,Y +180 + +175CBE81-9EBE-1E21-A91479BEEFAE,ExitType +Finish + +17D8BA8E-5992-AA5C-F5ECB73A3433,Action +{Uninstall Actions} + +17D8BA8E-5992-AA5C-F5ECB73A3433,Conditions +{0 conditions} + +18C00430-D6B1-151F-307762B3A045,CheckCondition +{Before Action is Executed} + +18C00430-D6B1-151F-307762B3A045,Platform +Windows + +198905FB-9FAC-23DE-7422D25B8ECA,Alias +{Install Actions} + +198905FB-9FAC-23DE-7422D25B8ECA,Conditions +{0 conditions} + +19ADBDDB-1690-4A57-913E32A026C4,Conditions +{0 conditions} + +19ADBDDB-1690-4A57-913E32A026C4,State +disabled + +19ADBDDB-1690-4A57-913E32A026C4,Widget +{NextButton; CancelButton} + +1AF5CD58-65C0-49CB-9A9D-994816CF414E,Active +No + +1AF5CD58-65C0-49CB-9A9D-994816CF414E,Alias +{Upload File Listing} + +1AF5CD58-65C0-49CB-9A9D-994816CF414E,Comment +{Upload list of backed up files for Tech Support purposes. May be blocked by firewalls.} + +1AF5CD58-65C0-49CB-9A9D-994816CF414E,Conditions +{0 conditions} + +1AF5CD58-65C0-49CB-9A9D-994816CF414E,FileName +<%ShortAppName%>-program-TebucoSafeQuerypload + +1AF5CD58-65C0-49CB-9A9D-994816CF414E,ShortcutName +{Upload Filelisting to TebucoSafe for review} + +1AF5CD58-65C0-49CB-9A9D-994816CF414E,TargetFileName +<%InstallDir%>/tools/TebucoSafeQueryUpload.bat + +1AF5CD58-65C0-49CB-9A9D-994816CF414E,WorkingDirectory +<%InstallDir%> + +1BEFB82C-C073-73D4-CFCE-F5DE7A674D9E,Active +Yes + +1BEFB82C-C073-73D4-CFCE-F5DE7A674D9E,BackButton,subst +1 + +1BEFB82C-C073-73D4-CFCE-F5DE7A674D9E,CancelButton,subst +1 + +1BEFB82C-C073-73D4-CFCE-F5DE7A674D9E,Caption,subst +1 + +1BEFB82C-C073-73D4-CFCE-F5DE7A674D9E,CompanyLabel,subst +0 + +1BEFB82C-C073-73D4-CFCE-F5DE7A674D9E,Conditions +{0 conditions} + +1BEFB82C-C073-73D4-CFCE-F5DE7A674D9E,Message,subst +1 + +1BEFB82C-C073-73D4-CFCE-F5DE7A674D9E,NextButton,subst +1 + +1BEFB82C-C073-73D4-CFCE-F5DE7A674D9E,Subtitle,subst +1 + +1BEFB82C-C073-73D4-CFCE-F5DE7A674D9E,Title,subst +1 + +1BEFB82C-C073-73D4-CFCE-F5DE7A674D9E,UserNameLabel,subst +0 + +1C14291C-0971-4283-92E9-3808401303F5,Active +No + +1C14291C-0971-4283-92E9-3808401303F5,Comment +{Don't start it yet, need to install keys by hand.} + +1C14291C-0971-4283-92E9-3808401303F5,Conditions +{0 conditions} + +1C14291C-0971-4283-92E9-3808401303F5,ProgramCommandLine +{net start <%ServiceName%>} + +1C14291C-0971-4283-92E9-3808401303F5,WorkingDirectory +<%InstallDir%> + +1F0926EE-6884-1330-B4A1DB11C1BF,BackButton,subst +1 + +1F0926EE-6884-1330-B4A1DB11C1BF,CancelButton,subst +1 + +1F0926EE-6884-1330-B4A1DB11C1BF,Caption,subst +1 + +1F0926EE-6884-1330-B4A1DB11C1BF,Message,subst +1 + +1F0926EE-6884-1330-B4A1DB11C1BF,NextButton,subst +1 + +1F9E8CB8-02C1-0416-1F7445B4147F,Comment +{Ask the user if they want to proceed with the install.} + +1F9E8CB8-02C1-0416-1F7445B4147F,Conditions +{2 conditions} + +20CBDBEA-2217-457B-8D98-D692C4F591E9,Message,subst +1 + +241BBFCE-4EB1-432F-94DD-69D444DDB6C0,CheckCondition +{Before Action is Executed} + +241BBFCE-4EB1-432F-94DD-69D444DDB6C0,Operator +false + +241BBFCE-4EB1-432F-94DD-69D444DDB6C0,String +<%Answer%> + +2583A547-11DE-1C27-B6D04B023CC0,CheckCondition +{Before Action is Executed} + +2583A547-11DE-1C27-B6D04B023CC0,Operator +false + +2583A547-11DE-1C27-B6D04B023CC0,String +<%SilentMode%> + +25AA533E-02FC-47D9-9273-25266B8FA1F9,Alias +{Remove Backup Service} + +25AA533E-02FC-47D9-9273-25266B8FA1F9,Comment +{Remove the Backup Windows Service} + +25AA533E-02FC-47D9-9273-25266B8FA1F9,Conditions +{0 conditions} + +25AA533E-02FC-47D9-9273-25266B8FA1F9,FileName +<%ShortAppName%>-program-removeService + +25AA533E-02FC-47D9-9273-25266B8FA1F9,ShortcutName +{Remove Service} + +25AA533E-02FC-47D9-9273-25266B8FA1F9,TargetFileName +<%InstallDir%>/tools/RemoveService.bat + +25AA533E-02FC-47D9-9273-25266B8FA1F9,WorkingDirectory +<%InstallDir%> + +28E76C8B-2605-4739-9FFE-9C2880C17E59,Active +No + +28E76C8B-2605-4739-9FFE-9C2880C17E59,Conditions +{0 conditions} + +28E76C8B-2605-4739-9FFE-9C2880C17E59,ProgramCommandLine +{notepad <%ConfigFileName%>} + +28E76C8B-2605-4739-9FFE-9C2880C17E59,WorkingDirectory +<%InstallDir%> + +2AC89879-6E9D-3D4E-F28E-5985EEBFAAA8,Active +Yes + +2AC89879-6E9D-3D4E-F28E-5985EEBFAAA8,BackButton,subst +1 + +2AC89879-6E9D-3D4E-F28E-5985EEBFAAA8,CancelButton,subst +1 + +2AC89879-6E9D-3D4E-F28E-5985EEBFAAA8,Caption,subst +1 + +2AC89879-6E9D-3D4E-F28E-5985EEBFAAA8,Conditions +{1 condition} + +2AC89879-6E9D-3D4E-F28E-5985EEBFAAA8,Message,subst +1 + +2AC89879-6E9D-3D4E-F28E-5985EEBFAAA8,NextButton,subst +1 + +2AC89879-6E9D-3D4E-F28E-5985EEBFAAA8,Subtitle,subst +1 + +2AC89879-6E9D-3D4E-F28E-5985EEBFAAA8,Title,subst +1 + +2BB06B72-DE53-2319-B1B8-351CDCBA2008,Conditions +{0 conditions} + +2BB06B72-DE53-2319-B1B8-351CDCBA2008,ExecuteAction +{Before Next Pane is Displayed} + +2BB06B72-DE53-2319-B1B8-351CDCBA2008,ResultVirtualText +AddBackupLocation + +2BB06B72-DE53-2319-B1B8-351CDCBA2008,TclScript +{set AddBackupLocation no} + +2BF07B5A-9B06-4C1E-810D-5B5E9303D2C6,Message,subst +1 + +2E2963BD-DDBD-738D-A910-B7F3F04946F9,Conditions +{0 conditions} + +2E2963BD-DDBD-738D-A910-B7F3F04946F9,Text,subst +1 + +2E2963BD-DDBD-738D-A910-B7F3F04946F9,Value +<%AddBackupLocation%> + +2E2963BD-DDBD-738D-A910-B7F3F04946F9,X +400 + +2E2963BD-DDBD-738D-A910-B7F3F04946F9,Y +70 + +2EC82FBD-8294-A3E4-7F39-1CBA0582FA64,AppendNewline +No + +2EC82FBD-8294-A3E4-7F39-1CBA0582FA64,Comment +{.conf doesn't exist yet} + +2EC82FBD-8294-A3E4-7F39-1CBA0582FA64,Conditions +{0 conditions} + +2EC82FBD-8294-A3E4-7F39-1CBA0582FA64,FileOpenAction +{Append to file} + +2EC82FBD-8294-A3E4-7F39-1CBA0582FA64,Files +<%ConfigFileTemplate%> + +2EC82FBD-8294-A3E4-7F39-1CBA0582FA64,TextToWrite,subst +1 + +32B08FB1-99DF-234E-8BAF-333E80AAC9F5,Conditions +{0 conditions} + +32B08FB1-99DF-234E-8BAF-333E80AAC9F5,FileName +<%ShortAppName%>-program-Usage + +32B08FB1-99DF-234E-8BAF-333E80AAC9F5,ShortcutName +Usage + +32B08FB1-99DF-234E-8BAF-333E80AAC9F5,TargetFileName +<%InstallDir%>/tools/ShowUsage.bat + +32B08FB1-99DF-234E-8BAF-333E80AAC9F5,WorkingDirectory +<%InstallDir%> + +32DC8FB1-A04B-71AA-EC18496D4BD0,Conditions +{0 conditions} + +32F5B0AF-EB83-7A03-D8FAE1ECE473,CheckCondition +{Before Action is Executed} + +32F5B0AF-EB83-7A03-D8FAE1ECE473,Message,subst +1 + +32F5B0AF-EB83-7A03-D8FAE1ECE473,Title,subst +1 + +32F5B0AF-EB83-7A03-D8FAE1ECE473,TrueValue +No + +3379F80B-36D6-73DC-6FC1D6223A26,CheckCondition +{Before Action is Executed} + +3379F80B-36D6-73DC-6FC1D6223A26,Operator +false + +3379F80B-36D6-73DC-6FC1D6223A26,String +<%InstallStopped%> + +362B6D6A-11BC-83CE-AFF6-410D8FBCF54D,Active +No + +362B6D6A-11BC-83CE-AFF6-410D8FBCF54D,Conditions +{0 conditions} + +362B6D6A-11BC-83CE-AFF6-410D8FBCF54D,ResultVirtualText +BackupLocationExclusions + +362B6D6A-11BC-83CE-AFF6-410D8FBCF54D,TclScript +{set BackupLocationExclusions ""} + +37E627F2-E04B-AEF2-D566C017A4D6,BackButton,subst +1 + +37E627F2-E04B-AEF2-D566C017A4D6,CancelButton,subst +1 + +37E627F2-E04B-AEF2-D566C017A4D6,Caption,subst +1 + +37E627F2-E04B-AEF2-D566C017A4D6,Conditions +{0 conditions} + +37E627F2-E04B-AEF2-D566C017A4D6,FileLabel,subst +1 + +37E627F2-E04B-AEF2-D566C017A4D6,Message,subst +1 + +37E627F2-E04B-AEF2-D566C017A4D6,NextButton,subst +1 + +37E627F2-E04B-AEF2-D566C017A4D6,ProgressValue,subst +1 + +37E627F2-E04B-AEF2-D566C017A4D6,Subtitle,subst +1 + +37E627F2-E04B-AEF2-D566C017A4D6,Title,subst +1 + +39270FD8-932E-6132-7EF795ED9B93,Alias +{Finish Actions} + +39270FD8-932E-6132-7EF795ED9B93,Conditions +{0 conditions} + +39B2B666-78D8-75E6-6EA071594D34,Conditions +{1 condition} + +39B2B666-78D8-75E6-6EA071594D34,ShortcutName +{Uninstall <%BrandName%>} + +39B2B666-78D8-75E6-6EA071594D34,TargetFileName +<%Uninstaller%> + +39B2B666-78D8-75E6-6EA071594D34,WorkingDirectory +<%InstallDir%> + +39D7394E-04E9-CA70-0034DB830BFE,Conditions +{0 conditions} + +3B6E2E7C-1A26-27F1-D578E383B128,Background +white + +3B6E2E7C-1A26-27F1-D578E383B128,Conditions +{2 conditions} + +3B6E2E7C-1A26-27F1-D578E383B128,Text,subst +1 + +3B6E2E7C-1A26-27F1-D578E383B128,Type +checkbutton + +3B6E2E7C-1A26-27F1-D578E383B128,VirtualText +ViewReadme + +3B6E2E7C-1A26-27F1-D578E383B128,X +185 + +3B6E2E7C-1A26-27F1-D578E383B128,Y +140 + +3B8CDC8E-1239-D2E9-DF4CA6B1756D,BackButton,subst +1 + +3B8CDC8E-1239-D2E9-DF4CA6B1756D,CancelButton,subst +1 + +3B8CDC8E-1239-D2E9-DF4CA6B1756D,Caption,subst +1 + +3B8CDC8E-1239-D2E9-DF4CA6B1756D,Conditions +{0 conditions} + +3B8CDC8E-1239-D2E9-DF4CA6B1756D,FileValue,subst +1 + +3B8CDC8E-1239-D2E9-DF4CA6B1756D,Message,subst +1 + +3B8CDC8E-1239-D2E9-DF4CA6B1756D,NextButton,subst +1 + +3B8CDC8E-1239-D2E9-DF4CA6B1756D,ProgressValue,subst +1 + +3B8CDC8E-1239-D2E9-DF4CA6B1756D,Subtitle,subst +1 + +3B8CDC8E-1239-D2E9-DF4CA6B1756D,Title,subst +1 + +3C7130B3-3206-403D-B09E-59D4A758FBAD,Action +{Uninstall Actions} + +3CFFF099-6122-46DD-9CE4-F5819434AC53,Conditions +{0 conditions} + +3CFFF099-6122-46DD-9CE4-F5819434AC53,IgnoreErrors +Yes + +3CFFF099-6122-46DD-9CE4-F5819434AC53,ProgramCommandLine +{net stop <%ServiceName%>} + +3CFFF099-6122-46DD-9CE4-F5819434AC53,ProgressiveOutputWidget +Message + +3CFFF099-6122-46DD-9CE4-F5819434AC53,WorkingDirectory +<%Temp%> + +3D0D1898-4C65-3E66-F82F56581E87,CheckCondition +{Before Action is Executed} + +3D0D1898-4C65-3E66-F82F56581E87,Operator +false + +3D0D1898-4C65-3E66-F82F56581E87,String +<%SilentMode%> + +3D33AA8C-0037-204B-39A339FD38BD,BackButton,subst +1 + +3D33AA8C-0037-204B-39A339FD38BD,CancelButton,subst +1 + +3D33AA8C-0037-204B-39A339FD38BD,Caption,subst +1 + +3D33AA8C-0037-204B-39A339FD38BD,Conditions +{0 conditions} + +3D33AA8C-0037-204B-39A339FD38BD,Message,subst +1 + +3D33AA8C-0037-204B-39A339FD38BD,NextButton,subst +1 + +3FD9BFF3-2F6E-E4FC-2FAE-98F2017916A7,Active +Yes + +3FD9BFF3-2F6E-E4FC-2FAE-98F2017916A7,Alias +SetBackupLocations + +3FD9BFF3-2F6E-E4FC-2FAE-98F2017916A7,BackButton,subst +1 + +3FD9BFF3-2F6E-E4FC-2FAE-98F2017916A7,CancelButton,subst +1 + +3FD9BFF3-2F6E-E4FC-2FAE-98F2017916A7,Caption,subst +1 + +3FD9BFF3-2F6E-E4FC-2FAE-98F2017916A7,Conditions +{0 conditions} + +3FD9BFF3-2F6E-E4FC-2FAE-98F2017916A7,Message,subst +1 + +3FD9BFF3-2F6E-E4FC-2FAE-98F2017916A7,NextButton,subst +1 + +3FD9BFF3-2F6E-E4FC-2FAE-98F2017916A7,Subtitle,subst +1 + +3FD9BFF3-2F6E-E4FC-2FAE-98F2017916A7,Title,subst +1 + +3FDB57ED-598D-8A4E-CEF7-D90833305558,Conditions +{0 conditions} + +3FDB57ED-598D-8A4E-CEF7-D90833305558,LabelSide +left + +3FDB57ED-598D-8A4E-CEF7-D90833305558,Text,subst +1 + +3FDB57ED-598D-8A4E-CEF7-D90833305558,Type +{browse entry} + +3FDB57ED-598D-8A4E-CEF7-D90833305558,VirtualText +BackupLocationPath + +3FDB57ED-598D-8A4E-CEF7-D90833305558,Y +70 + +3FE82C17-A3E2-4A57-A563-F80818B00B81,Default +Yes + +3FE82C17-A3E2-4A57-A563-F80818B00B81,Prompt +<%InstallStartupText%> + +41CDE776-2667-5CEB-312A-FC4C33A83E7F,Conditions +{0 conditions} + +41CDE776-2667-5CEB-312A-FC4C33A83E7F,Files +{*/*.conf;*/*.txt;*/*.pem;*/*.raw;*/*.exe;*/*.bat;*/*.dll} + +41CDE776-2667-5CEB-312A-FC4C33A83E7F,RenameFiles +Yes + +41D3E165-C263-5F80-0FEEC0AEE47A,BackButton,subst +1 + +41D3E165-C263-5F80-0FEEC0AEE47A,CancelButton,subst +1 + +41D3E165-C263-5F80-0FEEC0AEE47A,Caption,subst +1 + +41D3E165-C263-5F80-0FEEC0AEE47A,Conditions +{1 condition} + +41D3E165-C263-5F80-0FEEC0AEE47A,Message,subst +1 + +41D3E165-C263-5F80-0FEEC0AEE47A,NextButton,subst +1 + +41D3E165-C263-5F80-0FEEC0AEE47A,Subtitle,subst +1 + +41D3E165-C263-5F80-0FEEC0AEE47A,Text,subst +1 + +41D3E165-C263-5F80-0FEEC0AEE47A,Title,subst +1 + +481451CC-F49C-D389-8645076F595B,Destination +<%InstallDir%> + +481451CC-F49C-D389-8645076F595B,FileSize +19437406 + +481451CC-F49C-D389-8645076F595B,Name +{Program Files} + +49E59F91-27F7-46D1-A1C1-19865C2392D3,Default +Yes + +49E59F91-27F7-46D1-A1C1-19865C2392D3,Prompt +<%UninstallStartupText%> + +49E80443-62DB-1C10-392D-1091AEA5ED88,Conditions +{1 condition} + +49E80443-62DB-1C10-392D-1091AEA5ED88,ExecuteAction +{Before Next Pane is Displayed} + +49E80443-62DB-1C10-392D-1091AEA5ED88,Pane +3FD9BFF3-2F6E-E4FC-2FAE-98F2017916A7 + +4A9C852B-647E-EED5-5482FFBCC2AF,Description,subst +1 + +4A9C852B-647E-EED5-5482FFBCC2AF,DisplayName,subst +1 + +4A9C852B-647E-EED5-5482FFBCC2AF,FileGroups +481451CC-F49C-D389-8645076F595B + +4A9C852B-647E-EED5-5482FFBCC2AF,Name +{Default Component} + +4A9C852B-647E-EED5-5482FFBCC2AF,RequiredComponent +Yes + +4ACB0B47-42B3-2B3A-BFE9AA4EC707,CheckCondition +{Before Action is Executed} + +4ACB0B47-42B3-2B3A-BFE9AA4EC707,Message,subst +1 + +4ACB0B47-42B3-2B3A-BFE9AA4EC707,Title,subst +1 + +4ACB0B47-42B3-2B3A-BFE9AA4EC707,TrueValue +No + +4D4A7BF0-7CCE-46E6-BDE5222F82D7,Conditions +{0 conditions} + +4D4A7BF0-7CCE-46E6-BDE5222F82D7,UpdateFilePercentage +Yes + +4D4A7BF0-7CCE-46E6-BDE5222F82D7,UpdateFileText +Yes + +4E643D8A-CA31-018D-57D7053C2CE8,CheckCondition +{Before Action is Executed} + +4E643D8A-CA31-018D-57D7053C2CE8,Filename +<%ProgramExecutable%> + +4EE35849-FAD7-170B-0E45-FA30636467B1,CheckCondition +{Before Next Pane is Displayed} + +4EE35849-FAD7-170B-0E45-FA30636467B1,EncryptedPassword +<%InstallPasswordEncrypted%> + +4EE35849-FAD7-170B-0E45-FA30636467B1,FailureFocus +{Password Entry} + +4EE35849-FAD7-170B-0E45-FA30636467B1,FailureMessage +<%PasswordIncorrectText%> + +4EE35849-FAD7-170B-0E45-FA30636467B1,UnencryptedPassword +<%InstallPassword%> + +4EF787E3-0643-DE46-15E64BAF0816,CheckCondition +{Before Action is Executed} + +4EF787E3-0643-DE46-15E64BAF0816,Platform +Windows + +52F0A238-57E1-A578-2CE4DA177B32,Conditions +{0 conditions} + +53588803-6B41-D9FC-A385906A5106,Conditions +{0 conditions} + +574198A7-7322-2F5E-02EF185D965C,BackButton,subst +1 + +574198A7-7322-2F5E-02EF185D965C,CancelButton,subst +1 + +574198A7-7322-2F5E-02EF185D965C,Caption,subst +1 + +574198A7-7322-2F5E-02EF185D965C,Conditions +{0 conditions} + +574198A7-7322-2F5E-02EF185D965C,FileLabel,subst +1 + +574198A7-7322-2F5E-02EF185D965C,Message,subst +1 + +574198A7-7322-2F5E-02EF185D965C,NextButton,subst +1 + +574198A7-7322-2F5E-02EF185D965C,ProgressValue,subst +1 + +574198A7-7322-2F5E-02EF185D965C,Subtitle,subst +1 + +574198A7-7322-2F5E-02EF185D965C,Title,subst +1 + +58E1119F-639E-17C9-5D3898F385AA,BackButton,subst +1 + +58E1119F-639E-17C9-5D3898F385AA,BrowseButton,subst +1 + +58E1119F-639E-17C9-5D3898F385AA,BrowseText,subst +1 + +58E1119F-639E-17C9-5D3898F385AA,CancelButton,subst +1 + +58E1119F-639E-17C9-5D3898F385AA,Caption,subst +1 + +58E1119F-639E-17C9-5D3898F385AA,Conditions +{1 condition} + +58E1119F-639E-17C9-5D3898F385AA,DestinationLabel,subst +0 + +58E1119F-639E-17C9-5D3898F385AA,Message,subst +1 + +58E1119F-639E-17C9-5D3898F385AA,NextButton,subst +1 + +58E1119F-639E-17C9-5D3898F385AA,Subtitle,subst +1 + +58E1119F-639E-17C9-5D3898F385AA,Title,subst +1 + +592F46AE-8CEE-01F3-0BA7EBDCA4F4,CheckCondition +{Before Action is Executed} + +592F46AE-8CEE-01F3-0BA7EBDCA4F4,Filename +<%ProgramExecutable%> + +5CA3EA16-E37C-AABE-E576C4636EB0,Action +{Install Actions} + +5CA3EA16-E37C-AABE-E576C4636EB0,Conditions +{0 conditions} + +5EE78EF7-37CA-D440-3DB5-09136CD566B3,CheckCondition +{Before Action is Executed} + +5EE78EF7-37CA-D440-3DB5-09136CD566B3,String +<%AddBackupLocation%> + +5F2C1F1C-B9F7-1642-59D9-A18318C1D70B,Conditions +{0 conditions} + +5F2C1F1C-B9F7-1642-59D9-A18318C1D70B,Files +{<%ConfigFileTemplate%>;*/*.bat;<%InstallDir%>/*.vbs} + +5F2C1F1C-B9F7-1642-59D9-A18318C1D70B,LineFeed +Windows + +5F2C1F1C-B9F7-1642-59D9-A18318C1D70B,StringMap +{"@@CUSTOMERCOMPANY@@" <%UserInfoCompany%> +"@@BRANDNAME@@" <%BrandName%> +"@@SERVICENAME@@" <%ServiceName%> +"@@CUSTOMERUSERNAME@@" <%UserInfoName%> +"@@CUSTOMERUSERPHONE@@" <%UserInfoPhone%> +"@@CUSTOMERUSEREMAIL@@" <%UserInfoEmail%> +"@@ACCTNO@@" <%UserInfoAcctNo%> +"@@INSTALLDIR@@" <%InstallDir%>} + +614C45B2-7515-780C-E444-7F165CF02DD7,Active +No + +614C45B2-7515-780C-E444-7F165CF02DD7,Conditions +{0 conditions} + +614C45B2-7515-780C-E444-7F165CF02DD7,ResultVirtualText +BackupLocationShortName + +614C45B2-7515-780C-E444-7F165CF02DD7,TclScript +{set BackupLocationShortName ""} + +6652193C-5D4B-44B6-ABC6-D6E96D89E5DC,Active +No + +6652193C-5D4B-44B6-ABC6-D6E96D89E5DC,Comment +{PJ removed. Is this the one at the top leve?} + +6652193C-5D4B-44B6-ABC6-D6E96D89E5DC,Conditions +{0 conditions} + +69FD7409-5E2A-143B-DABD1C3B1E67,Conditions +{2 conditions} + +6B4CB3C2-4799-4C9F-BA8E-1EE47C4606E1,ExitType +Finish + +6B966959-05D9-DB32-8D9C4AD2A3DF,CheckCondition +{Before Action is Executed} + +6B966959-05D9-DB32-8D9C4AD2A3DF,Platform +Windows + +6C323815-B9AB-FA94-4F5D152EBC51,BackButton,subst +1 + +6C323815-B9AB-FA94-4F5D152EBC51,CancelButton,subst +1 + +6C323815-B9AB-FA94-4F5D152EBC51,Caption,subst +1 + +6C323815-B9AB-FA94-4F5D152EBC51,Conditions +{0 conditions} + +6C323815-B9AB-FA94-4F5D152EBC51,Message,subst +1 + +6C323815-B9AB-FA94-4F5D152EBC51,NextButton,subst +1 + +6D9D1ABC-7146-443F-9EE9-205D5CA6C830,CheckCondition +{Before Action is Executed} + +6D9D1ABC-7146-443F-9EE9-205D5CA6C830,String +{<%Property <%CurrentPane%> UserMustAcceptLicense%>} + +6E70FB1F-6A43-6C23-3242E965A0D0,Action +{Install Actions} + +6E70FB1F-6A43-6C23-3242E965A0D0,Conditions +{0 conditions} + +6F61CDA8-30C9-454F-82A3-9987E1203079,Alias +{Start a sync now.} + +6F61CDA8-30C9-454F-82A3-9987E1203079,Conditions +{0 conditions} + +6F61CDA8-30C9-454F-82A3-9987E1203079,FileName +<%ShortAppName%>-program-sync + +6F61CDA8-30C9-454F-82A3-9987E1203079,ShortcutName +{Sync now} + +6F61CDA8-30C9-454F-82A3-9987E1203079,TargetFileName +<%InstallDir%>/tools/Sync.bat + +6F61CDA8-30C9-454F-82A3-9987E1203079,WorkingDirectory +<%InstallDir%> + +6F94698F-0839-3ABF-0CF2DF05A4C8,CheckCondition +{Before Action is Executed} + +6F94698F-0839-3ABF-0CF2DF05A4C8,String +<%CreateQuickLaunchShortcut%> + +6FEE2889-0338-1D49-60BF-1471F465AB26,AppendNewline +No + +6FEE2889-0338-1D49-60BF-1471F465AB26,Comment +{Closing final BackupLocations bracket} + +6FEE2889-0338-1D49-60BF-1471F465AB26,Conditions +{0 conditions} + +6FEE2889-0338-1D49-60BF-1471F465AB26,FileOpenAction +{Append to file} + +6FEE2889-0338-1D49-60BF-1471F465AB26,Files +<%ConfigFileTemplate%> + +6FEE2889-0338-1D49-60BF-1471F465AB26,LineFeed +Windows + +6FEE2889-0338-1D49-60BF-1471F465AB26,TextToWrite,subst +1 + +738DD098-7E3B-BC89-875CDB93CBE2,CheckCondition +{Before Action is Executed} + +738DD098-7E3B-BC89-875CDB93CBE2,Platform +Windows + +73DD4D07-B1DC-BA38-2B12-07EB24A7F0C8,Conditions +{0 conditions} + +73DD4D07-B1DC-BA38-2B12-07EB24A7F0C8,Destination +<%ConfigFileName%> + +73DD4D07-B1DC-BA38-2B12-07EB24A7F0C8,Source +<%ConfigFileTemplate%> + +73EA65C1-3BE3-B190-55C3E99F6269,Conditions +{1 condition} + +748D673B-DFE6-5F74-329903ACE4DB,CheckCondition +{Before Action is Executed} + +748D673B-DFE6-5F74-329903ACE4DB,Filename +<%ProgramExecutable%> + +793D8178-0F51-7F07-BC5886586D3C,CheckCondition +{Before Action is Executed} + +793D8178-0F51-7F07-BC5886586D3C,Operator +false + +793D8178-0F51-7F07-BC5886586D3C,String +<%InstallStopped%> + +795EE61F-6C0D-4A8B-93E02AA3894A,CheckCondition +{Before Action is Executed} + +795EE61F-6C0D-4A8B-93E02AA3894A,String +<%LaunchApplication%> + +79DAC913-A33D-4ED6-9BAE-B3A2053C0F2C,CheckCondition +{Before Action is Executed} + +79DAC913-A33D-4ED6-9BAE-B3A2053C0F2C,Operator +false + +79DAC913-A33D-4ED6-9BAE-B3A2053C0F2C,String +<%LicenseAccepted%> + +7A983CD8-302C-4942-BE59-525C5B5FA2F2,Conditions +{0 conditions} + +7A983CD8-302C-4942-BE59-525C5B5FA2F2,ProgramCommandLine +{ServiceControl terminate} + +7A983CD8-302C-4942-BE59-525C5B5FA2F2,WorkingDirectory +<%InstallDir%> + +7B770A07-A785-5215-956FA82CF14E,Active +No + +7B770A07-A785-5215-956FA82CF14E,Conditions +{3 conditions} + +7B770A07-A785-5215-956FA82CF14E,ShortcutDirectory +<%QUICK_LAUNCH%> + +7B770A07-A785-5215-956FA82CF14E,ShortcutName +<%BrandName%> + +7B770A07-A785-5215-956FA82CF14E,TargetFileName +<%ProgramExecutable%> + +7B770A07-A785-5215-956FA82CF14E,WorkingDirectory +<%InstallDir%> + +7D8E1902-2BC4-80D8-2C18771E7C22,Conditions +{0 conditions} + +7D8E1902-2BC4-80D8-2C18771E7C22,ProgramCommandLine +{<%ServiceExeName%> -i -S <%ServiceName%> -c "<%ConfigFileName%>"} + +7D8E1902-2BC4-80D8-2C18771E7C22,ProgressiveOutputWidget +Message + +7D8E1902-2BC4-80D8-2C18771E7C22,ShowProgressiveOutput +Yes + +7D8E1902-2BC4-80D8-2C18771E7C22,WorkingDirectory +<%InstallDir%> + +7F85263E-CAE2-46BA-AAC0-6B89D20FD2DE,ExitType +Finish + +8202CECC-54A0-9B6C-D24D111BA52E,Components +4A9C852B-647E-EED5-5482FFBCC2AF + +8202CECC-54A0-9B6C-D24D111BA52E,Description,subst +1 + +8202CECC-54A0-9B6C-D24D111BA52E,DisplayName,subst +1 + +8202CECC-54A0-9B6C-D24D111BA52E,Name +Typical + +8419AAAD-5860-F73E-8D11-4D1BDA4D7D37,Checked +No + +8419AAAD-5860-F73E-8D11-4D1BDA4D7D37,Conditions +{0 conditions} + +8419AAAD-5860-F73E-8D11-4D1BDA4D7D37,Text,subst +1 + +8419AAAD-5860-F73E-8D11-4D1BDA4D7D37,Type +checkbutton + +8419AAAD-5860-F73E-8D11-4D1BDA4D7D37,Value +Yes + +8419AAAD-5860-F73E-8D11-4D1BDA4D7D37,VirtualText +AddBackupLocation + +8419AAAD-5860-F73E-8D11-4D1BDA4D7D37,Y +250 + +848844B5-6103-9343-8B731B0BE4E0,Alias +{Startup Actions} + +848844B5-6103-9343-8B731B0BE4E0,Conditions +{0 conditions} + +84DA7F05-9FB7-CC36-9EC98F8A6826,CheckCondition +{Before Next Pane is Displayed} + +84DA7F05-9FB7-CC36-9EC98F8A6826,FailureMessage +<%DirectoryPermissionText%> + +84DA7F05-9FB7-CC36-9EC98F8A6826,Filename +<%InstallDir%> + +84DA7F05-9FB7-CC36-9EC98F8A6826,Permission +{can create} + +855DE408-060E-3D35-08B5-1D9AB05C2865,Conditions +{0 conditions} + +855DE408-060E-3D35-08B5-1D9AB05C2865,Height +100 + +855DE408-060E-3D35-08B5-1D9AB05C2865,Text,subst +1 + +855DE408-060E-3D35-08B5-1D9AB05C2865,Type +text + +855DE408-060E-3D35-08B5-1D9AB05C2865,VirtualText +BackupLocationExclusions + +855DE408-060E-3D35-08B5-1D9AB05C2865,Y +130 + +87DE6D78-81E1-495B-A214-B3FF3E7E5614,CheckCondition +{Before Action is Executed} + +87DE6D78-81E1-495B-A214-B3FF3E7E5614,Operator +false + +87DE6D78-81E1-495B-A214-B3FF3E7E5614,String +<%Answer%> + +88A50FD5-480F-19A5-DA74-C915EB0A9765,Active +No + +88A50FD5-480F-19A5-DA74-C915EB0A9765,Conditions +{1 condition} + +88A50FD5-480F-19A5-DA74-C915EB0A9765,ExecuteAction +{After Pane is Finished} + +88A50FD5-480F-19A5-DA74-C915EB0A9765,Pane +3FD9BFF3-2F6E-E4FC-2FAE-98F2017916A7 + +8A761DBD-0640-D98C-9B3AD7672A8F,Conditions +{0 conditions} + +8A761DBD-0640-D98C-9B3AD7672A8F,State +disabled + +8A761DBD-0640-D98C-9B3AD7672A8F,Widget +{Back Button;Next Button} + +8C866252-8760-9B08-FE569C25B60D,CheckCondition +{Before Action is Executed} + +8C866252-8760-9B08-FE569C25B60D,Filename +<%ProgramExecutable%> + +8E095096-F018-A880-429D-A2177A9B70EA,Active +No + +8E095096-F018-A880-429D-A2177A9B70EA,Conditions +{0 conditions} + +8E095096-F018-A880-429D-A2177A9B70EA,Text,subst +1 + +8E095096-F018-A880-429D-A2177A9B70EA,X +50 + +8E095096-F018-A880-429D-A2177A9B70EA,Y +150 + +8E1A5944-5AF5-5906-16D395E386D8,Conditions +{0 conditions} + +9013E862-8E81-5290-64F9-D8BCD13EC7E5,Active +Yes + +9013E862-8E81-5290-64F9-D8BCD13EC7E5,BackButton,subst +1 + +9013E862-8E81-5290-64F9-D8BCD13EC7E5,CancelButton,subst +1 + +9013E862-8E81-5290-64F9-D8BCD13EC7E5,Caption,subst +1 + +9013E862-8E81-5290-64F9-D8BCD13EC7E5,CompanyLabel,subst +1 + +9013E862-8E81-5290-64F9-D8BCD13EC7E5,Conditions +{0 conditions} + +9013E862-8E81-5290-64F9-D8BCD13EC7E5,Message,subst +1 + +9013E862-8E81-5290-64F9-D8BCD13EC7E5,NextButton,subst +1 + +9013E862-8E81-5290-64F9-D8BCD13EC7E5,Subtitle,subst +1 + +9013E862-8E81-5290-64F9-D8BCD13EC7E5,Title,subst +1 + +9013E862-8E81-5290-64F9-D8BCD13EC7E5,UserNameLabel,subst +1 + +905DA2E9-988C-2F27-BB1F5F274AC9,Alias +{Cancel Actions} + +905DA2E9-988C-2F27-BB1F5F274AC9,Conditions +{0 conditions} + +908CE221-5A3D-0A78-24A1-E7C91EBE38D4,BackButton,subst +1 + +908CE221-5A3D-0A78-24A1-E7C91EBE38D4,CancelButton,subst +1 + +908CE221-5A3D-0A78-24A1-E7C91EBE38D4,Caption,subst +1 + +908CE221-5A3D-0A78-24A1-E7C91EBE38D4,Conditions +{0 conditions} + +908CE221-5A3D-0A78-24A1-E7C91EBE38D4,Message,subst +1 + +908CE221-5A3D-0A78-24A1-E7C91EBE38D4,NextButton,subst +1 + +908CE221-5A3D-0A78-24A1-E7C91EBE38D4,Subtitle,subst +1 + +908CE221-5A3D-0A78-24A1-E7C91EBE38D4,Title,subst +1 + +937C3FDD-FB28-98BD-3DAB276E59ED,Background +white + +937C3FDD-FB28-98BD-3DAB276E59ED,Conditions +{3 conditions} + +937C3FDD-FB28-98BD-3DAB276E59ED,Text,subst +1 + +937C3FDD-FB28-98BD-3DAB276E59ED,Type +checkbutton + +937C3FDD-FB28-98BD-3DAB276E59ED,VirtualText +CreateQuickLaunchShortcut + +937C3FDD-FB28-98BD-3DAB276E59ED,X +185 + +937C3FDD-FB28-98BD-3DAB276E59ED,Y +200 + +93AA298C-B64E-5683-14D2-7B86F7DEFD2C,Active +No + +93AA298C-B64E-5683-14D2-7B86F7DEFD2C,Comment +{set BackupLocationName "BackupLocation_${BackupLocationNumber}"} + +93AA298C-B64E-5683-14D2-7B86F7DEFD2C,Conditions +{0 conditions} + +93AA298C-B64E-5683-14D2-7B86F7DEFD2C,ResultVirtualText +BackupLocationName + +93AA298C-B64E-5683-14D2-7B86F7DEFD2C,TclScript +{set BackupLocationName "BackupLocation_${BackupLocationNumber}"} + +96A68CAC-9ED7-806C-086B104720FD,CheckCondition +{Before Action is Executed} + +96A68CAC-9ED7-806C-086B104720FD,String +<%ErrorsOccurred%> + +97ACF525-C075-8635-E019202A83D8,Comment +{Ask the user if they want to proceed with the uninstall.} + +9892B25C-689B-5B8F-F0C9-B14FF6ACC40C,Active +No + +9892B25C-689B-5B8F-F0C9-B14FF6ACC40C,Conditions +{0 conditions} + +9892B25C-689B-5B8F-F0C9-B14FF6ACC40C,ResultVirtualText +AddBackupLocation + +9892B25C-689B-5B8F-F0C9-B14FF6ACC40C,TclScript +{set AddBackupLocation no} + +9A23D3ED-4D9D-9C57-C2A7-71DE0FFF0266,Active +Yes + +9A23D3ED-4D9D-9C57-C2A7-71DE0FFF0266,BackButton,subst +1 + +9A23D3ED-4D9D-9C57-C2A7-71DE0FFF0266,CancelButton,subst +1 + +9A23D3ED-4D9D-9C57-C2A7-71DE0FFF0266,Caption,subst +1 + +9A23D3ED-4D9D-9C57-C2A7-71DE0FFF0266,Conditions +{0 conditions} + +9A23D3ED-4D9D-9C57-C2A7-71DE0FFF0266,Message,subst +1 + +9A23D3ED-4D9D-9C57-C2A7-71DE0FFF0266,NextButton,subst +1 + +9A23D3ED-4D9D-9C57-C2A7-71DE0FFF0266,Subtitle,subst +1 + +9A23D3ED-4D9D-9C57-C2A7-71DE0FFF0266,Title,subst +1 + +9A663209-495B-ED16-09BE-457B61148022,Conditions +{0 conditions} + +9A663209-495B-ED16-09BE-457B61148022,FileName +<%ShortAppName%>-program-QueryCurrent + +9A663209-495B-ED16-09BE-457B61148022,ShortcutName +{Query Current Only} + +9A663209-495B-ED16-09BE-457B61148022,TargetFileName +<%InstallDir%>/tools/QueryOutputCurrent.bat + +9A663209-495B-ED16-09BE-457B61148022,WorkingDirectory +<%InstallDir%> + +9D101299-B80C-441B-8685-6E3AC61808E8,Alias +{Remote Control} + +9D101299-B80C-441B-8685-6E3AC61808E8,Comment +{Get tech support via remote control} + +9D101299-B80C-441B-8685-6E3AC61808E8,Conditions +{0 conditions} + +9D101299-B80C-441B-8685-6E3AC61808E8,FileName +<%ShortAppName%>-program-RemoteControl + +9D101299-B80C-441B-8685-6E3AC61808E8,ShortcutName +RemoteControl + +9D101299-B80C-441B-8685-6E3AC61808E8,TargetFileName +<%InstallDir%>/tools/RemoteControl.exe + +9D101299-B80C-441B-8685-6E3AC61808E8,WorkingDirectory +<%InstallDir%> + +A1DD1DC2-85D7-9BC6-998AC3D4A3A9,Alias +{Startup Actions} + +A1DD1DC2-85D7-9BC6-998AC3D4A3A9,Conditions +{0 conditions} + +A5B32DA1-B2FE-C1FA-6057-FBC3059EF076,Conditions +{0 conditions} + +A5B32DA1-B2FE-C1FA-6057-FBC3059EF076,ResultVirtualText +AddBackupLocation + +A5B32DA1-B2FE-C1FA-6057-FBC3059EF076,TclScript +{set AddBackupLocation no } + +A6E1B027-A1B4-5848-4F868D028D00,CheckCondition +{Before Action is Executed} + +A6E1B027-A1B4-5848-4F868D028D00,String +<%ViewReadme%> + +ADA6EB2F-8820-4366-BBEF-ED1335B7F828,Conditions +{1 condition} + +AE3BD5B4-35DE-4240-B79914D43E56,Active +No + +AE3BD5B4-35DE-4240-B79914D43E56,BackButton,subst +1 + +AE3BD5B4-35DE-4240-B79914D43E56,CancelButton,subst +1 + +AE3BD5B4-35DE-4240-B79914D43E56,Caption,subst +1 + +AE3BD5B4-35DE-4240-B79914D43E56,Conditions +{0 conditions} + +AE3BD5B4-35DE-4240-B79914D43E56,Message,subst +1 + +AE3BD5B4-35DE-4240-B79914D43E56,NextButton,subst +1 + +AIX-ppc,Active +No + +AIX-ppc,DefaultDirectoryPermission +0755 + +AIX-ppc,DefaultFilePermission +0755 + +AIX-ppc,Executable +<%AppName%>-<%Version%>-<%Platform%>-Install<%Ext%> + +AIX-ppc,FallBackToConsole +Yes + +AIX-ppc,InstallDir +<%Home%>/<%ShortAppName%> + +AIX-ppc,InstallMode +Standard + +AIX-ppc,InstallType +Typical + +AIX-ppc,ProgramExecutable +{} + +AIX-ppc,ProgramFolderAllUsers +No + +AIX-ppc,ProgramFolderName +<%AppName%> + +AIX-ppc,ProgramLicense +<%InstallDir%>/LICENSE.txt + +AIX-ppc,ProgramName +{} + +AIX-ppc,ProgramReadme +<%InstallDir%>/README.txt + +AIX-ppc,PromptForRoot +Yes + +AIX-ppc,RequireRoot +No + +AIX-ppc,RootInstallDir +/usr/local/<%ShortAppName%> + +B002A311-F8E7-41DE-B039-521391924E5B,Message,subst +1 + +B01CBBB2-6A78-CA53-9ED9-C3C4CFC9239E,Alias +{Stop Backup Service} + +B01CBBB2-6A78-CA53-9ED9-C3C4CFC9239E,Comment +{Stop the Backup Windows Service} + +B01CBBB2-6A78-CA53-9ED9-C3C4CFC9239E,Conditions +{0 conditions} + +B01CBBB2-6A78-CA53-9ED9-C3C4CFC9239E,FileName +<%ShortAppName%>-program-stopservice + +B01CBBB2-6A78-CA53-9ED9-C3C4CFC9239E,ShortcutName +{Stop Service} + +B01CBBB2-6A78-CA53-9ED9-C3C4CFC9239E,TargetFileName +<%InstallDir%>/tools/StopService.bat + +B01CBBB2-6A78-CA53-9ED9-C3C4CFC9239E,WorkingDirectory +<%InstallDir%> + +B0AA6839-AAB6-A602-C0E4ECA2E4FF,CheckCondition +{Before Action is Executed} + +B0AA6839-AAB6-A602-C0E4ECA2E4FF,Filename +<%ProgramExecutable%> + +B39C0455-D1B6-7DDC-E2717F83463E,CheckCondition +{Before Action is Executed} + +B39C0455-D1B6-7DDC-E2717F83463E,Operator +false + +B39C0455-D1B6-7DDC-E2717F83463E,String +<%InstallStopped%> + +B3B99E2D-C368-A921-B7BC-A71EBDE3AD4D,Conditions +{0 conditions} + +B3B99E2D-C368-A921-B7BC-A71EBDE3AD4D,ExecuteAction +{Before Next Pane is Displayed} + +B3B99E2D-C368-A921-B7BC-A71EBDE3AD4D,Password +<%InstallPassword%> + +B4D31D1E-ADB1-DE8F-18EB7294DDA8,Conditions +{0 conditions} + +B4D31D1E-ADB1-DE8F-18EB7294DDA8,ProgramCommandLine +{<%ServiceExeName%> -r -S <%ServiceName%>} + +B4D31D1E-ADB1-DE8F-18EB7294DDA8,WorkingDirectory +<%InstallDir%> + +B4ED4636-22D8-41DC-9E3D-BD1E1CAD2174,Message,subst +1 + +B506E7DA-E7C4-4D42-8C03-FD27BA16D078,AcceptRadiobutton,subst +0 + +B506E7DA-E7C4-4D42-8C03-FD27BA16D078,Active +Yes + +B506E7DA-E7C4-4D42-8C03-FD27BA16D078,BackButton,subst +1 + +B506E7DA-E7C4-4D42-8C03-FD27BA16D078,CancelButton,subst +1 + +B506E7DA-E7C4-4D42-8C03-FD27BA16D078,Caption,subst +1 + +B506E7DA-E7C4-4D42-8C03-FD27BA16D078,Conditions +{0 conditions} + +B506E7DA-E7C4-4D42-8C03-FD27BA16D078,DeclineRadiobutton,subst +0 + +B506E7DA-E7C4-4D42-8C03-FD27BA16D078,Message,subst +1 + +B506E7DA-E7C4-4D42-8C03-FD27BA16D078,NextButton,subst +1 + +B506E7DA-E7C4-4D42-8C03-FD27BA16D078,Subtitle,subst +1 + +B506E7DA-E7C4-4D42-8C03-FD27BA16D078,Text,subst +1 + +B506E7DA-E7C4-4D42-8C03-FD27BA16D078,Title,subst +1 + +B5DFEC63-92A9-4686-909E-0CE78A7069D6,Alias +{Restart Backup Service} + +B5DFEC63-92A9-4686-909E-0CE78A7069D6,Comment +{Stop and restart the Backup Windows Service} + +B5DFEC63-92A9-4686-909E-0CE78A7069D6,Conditions +{0 conditions} + +B5DFEC63-92A9-4686-909E-0CE78A7069D6,FileName +<%ShortAppName%>-program-restartservice + +B5DFEC63-92A9-4686-909E-0CE78A7069D6,ShortcutName +{Restart Service} + +B5DFEC63-92A9-4686-909E-0CE78A7069D6,TargetFileName +{<%InstallDir%>\tools\RestartService.bat} + +B5DFEC63-92A9-4686-909E-0CE78A7069D6,WorkingDirectory +<%InstallDir%> + +B927A5AF-4DFE-82A3-DCA8-35FA4D91EC5A,Conditions +{0 conditions} + +B927A5AF-4DFE-82A3-DCA8-35FA4D91EC5A,LabelSide +left + +B927A5AF-4DFE-82A3-DCA8-35FA4D91EC5A,Text,subst +1 + +B927A5AF-4DFE-82A3-DCA8-35FA4D91EC5A,Type +entry + +B927A5AF-4DFE-82A3-DCA8-35FA4D91EC5A,VirtualText +BackupLocationShortName + +B927A5AF-4DFE-82A3-DCA8-35FA4D91EC5A,Y +100 + +B93D2216-1DDB-484C-A9AC-D6C18ED7DE23,Conditions +{2 conditions} + +B93D2216-1DDB-484C-A9AC-D6C18ED7DE23,State +disabled + +B93D2216-1DDB-484C-A9AC-D6C18ED7DE23,Widget +NextButton + +BC4EA5FD-50BD-4D6E-953F-5E3EDB957360,CheckCondition +{Before Next Action is Executed} + +BC4EA5FD-50BD-4D6E-953F-5E3EDB957360,FailureMessage +<%DirectoryPermissionText%> + +BC4EA5FD-50BD-4D6E-953F-5E3EDB957360,Filename +<%InstallDir%> + +BC4EA5FD-50BD-4D6E-953F-5E3EDB957360,Permission +{can create} + +C0452595-F3EB-43AD-BCA2-661437584636,Alias +{Modify Backup Configuration} + +C0452595-F3EB-43AD-BCA2-661437584636,Comment +{Modify your Backup Configuration} + +C0452595-F3EB-43AD-BCA2-661437584636,Conditions +{0 conditions} + +C0452595-F3EB-43AD-BCA2-661437584636,FileName +<%ShortAppName%>-program-editconfig + +C0452595-F3EB-43AD-BCA2-661437584636,ShortcutName +{Edit Config File} + +C0452595-F3EB-43AD-BCA2-661437584636,TargetFileName +<%InstallDir%>/tools/EditConfig.bat + +C0452595-F3EB-43AD-BCA2-661437584636,WorkingDirectory +<%InstallDir%> + +C0AF7C05-A31A-8376-BCB9-BA8B3A666252,Conditions +{0 conditions} + +C0AF7C05-A31A-8376-BCB9-BA8B3A666252,FileName +<%ShortAppName%>-program-QueryAll + +C0AF7C05-A31A-8376-BCB9-BA8B3A666252,ShortcutName +{Query All} + +C0AF7C05-A31A-8376-BCB9-BA8B3A666252,TargetFileName +<%InstallDir%>/tools/QueryOutputAll.bat + +C0AF7C05-A31A-8376-BCB9-BA8B3A666252,WorkingDirectory +<%InstallDir%> + +C105AAAE-7C16-2C9E-769FE4535B60,Active +No + +C105AAAE-7C16-2C9E-769FE4535B60,Caption,subst +1 + +C105AAAE-7C16-2C9E-769FE4535B60,CloseButton,subst +1 + +C105AAAE-7C16-2C9E-769FE4535B60,Conditions +{3 conditions} + +C105AAAE-7C16-2C9E-769FE4535B60,Message,subst +1 + +C105AAAE-7C16-2C9E-769FE4535B60,TextFile +<%ProgramReadme%> + +C105AAAE-7C16-2C9E-769FE4535B60,Title,subst +1 + +C33D74B2-26FA-16F5-433A10C6A747,Active +No + +C33D74B2-26FA-16F5-433A10C6A747,Conditions +{3 conditions} + +C33D74B2-26FA-16F5-433A10C6A747,ProgramCommandLine +<%ProgramExecutable%> + +C33D74B2-26FA-16F5-433A10C6A747,WaitForProgram +No + +C33D74B2-26FA-16F5-433A10C6A747,WorkingDirectory +<%InstallDir%> + +C7762473-273F-E3CA-17E3-65789B14CDB0,Conditions +{0 conditions} + +C7762473-273F-E3CA-17E3-65789B14CDB0,ExecuteAction +{Before Next Pane is Displayed} + +C7762473-273F-E3CA-17E3-65789B14CDB0,FileOpenAction +{Append to file} + +C7762473-273F-E3CA-17E3-65789B14CDB0,Files +<%ConfigFileTemplate%> + +C7762473-273F-E3CA-17E3-65789B14CDB0,TextToWrite,subst +1 + +CC4337CC-F3B5-757C-DFCF5D1D365A,CheckCondition +{Before Action is Executed} + +CC4337CC-F3B5-757C-DFCF5D1D365A,Operator +false + +CC4337CC-F3B5-757C-DFCF5D1D365A,String +<%SilentMode%> + +CDD84DE3-C970-458F-9162-1A3CE0AA716B,Alias +{Start Backup Service} + +CDD84DE3-C970-458F-9162-1A3CE0AA716B,Comment +{Start Backup Windows Service} + +CDD84DE3-C970-458F-9162-1A3CE0AA716B,Conditions +{0 conditions} + +CDD84DE3-C970-458F-9162-1A3CE0AA716B,FileName +<%ShortAppName%>-program-startservice + +CDD84DE3-C970-458F-9162-1A3CE0AA716B,ShortcutName +{Start Service} + +CDD84DE3-C970-458F-9162-1A3CE0AA716B,TargetFileName +{<%InstallDir%>\tools\StartService.bat} + +CDD84DE3-C970-458F-9162-1A3CE0AA716B,WorkingDirectory +<%InstallDir%> + +CFFA27AF-A641-E41C-B4A0E3BB3CBB,Background +white + +CFFA27AF-A641-E41C-B4A0E3BB3CBB,Conditions +{2 conditions} + +CFFA27AF-A641-E41C-B4A0E3BB3CBB,Text,subst +1 + +CFFA27AF-A641-E41C-B4A0E3BB3CBB,Type +checkbutton + +CFFA27AF-A641-E41C-B4A0E3BB3CBB,VirtualText +LaunchApplication + +CFFA27AF-A641-E41C-B4A0E3BB3CBB,X +185 + +CFFA27AF-A641-E41C-B4A0E3BB3CBB,Y +160 + +D23DD94C-E517-7F34-FD59-802CB18AB887,Comment +{Need to do before starting anything else.} + +D23DD94C-E517-7F34-FD59-802CB18AB887,Conditions +{0 conditions} + +D23DD94C-E517-7F34-FD59-802CB18AB887,Files +{*/*.conf;*/*.txt;*/*.bat} + +D23DD94C-E517-7F34-FD59-802CB18AB887,LineFeed +Windows + +D3D73C76-D9D3-07DA-63D4163A44BE,Conditions +{0 conditions} + +D3D73C76-D9D3-07DA-63D4163A44BE,ExitType +Finish + +D4FC6EB5-DDEE-4E4A-B8E1-D4B588A7928B,Action +{Install Actions} + +D55BA4AF-E73B-60D1-E26F79175227,Action +{Uninstall Actions} + +D55BA4AF-E73B-60D1-E26F79175227,Conditions +{0 conditions} + +D7FBBEBB-2186-5674-BA87-BB7151859D4E,Conditions +{0 conditions} + +D7FBBEBB-2186-5674-BA87-BB7151859D4E,ResultVirtualText +BackupLocationNumber + +D7FBBEBB-2186-5674-BA87-BB7151859D4E,TclScript +{incr BackupLocationNumber} + +D8B8A9BF-5F2E-4236-A63E-5A8C5FFA8968,Alias +{Reload Configuration File, after editing it.} + +D8B8A9BF-5F2E-4236-A63E-5A8C5FFA8968,Conditions +{0 conditions} + +D8B8A9BF-5F2E-4236-A63E-5A8C5FFA8968,FileName +<%ShortAppName%>-program-reloadconfig + +D8B8A9BF-5F2E-4236-A63E-5A8C5FFA8968,ShortcutName +{Reload configuration file} + +D8B8A9BF-5F2E-4236-A63E-5A8C5FFA8968,TargetFileName +<%InstallDir%>/tools/ReloadConfig.bat + +D8B8A9BF-5F2E-4236-A63E-5A8C5FFA8968,WorkingDirectory +<%InstallDir%> + +D8F0AA0F-AD79-C566-15CC508F503B,Action +{Install Actions} + +D8F0AA0F-AD79-C566-15CC508F503B,Conditions +{0 conditions} + +D9F88AC1-3D2D-F6DB-871E-3A0E016770B1,Conditions +{0 conditions} + +D9F88AC1-3D2D-F6DB-871E-3A0E016770B1,Destination +<%ConfigFileTemplate%> + +D9F88AC1-3D2D-F6DB-871E-3A0E016770B1,Source +<%InstallDir%>/templates/template.conf + +DA33B826-E633-A845-4646-76DFA78B907B,Active +Yes + +DA33B826-E633-A845-4646-76DFA78B907B,BackButton,subst +1 + +DA33B826-E633-A845-4646-76DFA78B907B,CancelButton,subst +1 + +DA33B826-E633-A845-4646-76DFA78B907B,Caption,subst +1 + +DA33B826-E633-A845-4646-76DFA78B907B,Conditions +{0 conditions} + +DA33B826-E633-A845-4646-76DFA78B907B,Message,subst +1 + +DA33B826-E633-A845-4646-76DFA78B907B,NextButton,subst +1 + +DA33B826-E633-A845-4646-76DFA78B907B,Subtitle,subst +1 + +DA33B826-E633-A845-4646-76DFA78B907B,Title,subst +1 + +DDBBD8A9-13D7-9509-9202-419E989F60A9,Active +No + +DDBBD8A9-13D7-9509-9202-419E989F60A9,Checked +No + +DDBBD8A9-13D7-9509-9202-419E989F60A9,Conditions +{0 conditions} + +DDBBD8A9-13D7-9509-9202-419E989F60A9,Text,subst +1 + +DDBBD8A9-13D7-9509-9202-419E989F60A9,Type +checkbutton + +DDBBD8A9-13D7-9509-9202-419E989F60A9,VirtualText +AddBackupLocation + +DDBBD8A9-13D7-9509-9202-419E989F60A9,X +50 + +DDBBD8A9-13D7-9509-9202-419E989F60A9,Y +200 + +DE800F1C-CB1A-E1CE-AEB8-B0A6DB4818E7,Alias +{Install Backup Service} + +DE800F1C-CB1A-E1CE-AEB8-B0A6DB4818E7,Comment +{Install the Backup Windows Service} + +DE800F1C-CB1A-E1CE-AEB8-B0A6DB4818E7,Conditions +{0 conditions} + +DE800F1C-CB1A-E1CE-AEB8-B0A6DB4818E7,FileName +<%ShortAppName%>-program-installService + +DE800F1C-CB1A-E1CE-AEB8-B0A6DB4818E7,ShortcutName +{Install Service} + +DE800F1C-CB1A-E1CE-AEB8-B0A6DB4818E7,TargetFileName +<%InstallDir%>/tools/InstallService.bat + +DE800F1C-CB1A-E1CE-AEB8-B0A6DB4818E7,WorkingDirectory +<%InstallDir%> + +DECC120D-6904-7F17-45A49184A5A3,Active +No + +DECC120D-6904-7F17-45A49184A5A3,Conditions +{2 conditions} + +DECC120D-6904-7F17-45A49184A5A3,ShortcutName +<%AppName%> + +DECC120D-6904-7F17-45A49184A5A3,TargetFileName +<%ProgramExecutable%> + +DECC120D-6904-7F17-45A49184A5A3,WorkingDirectory +<%InstallDir%> + +DFFF91A9-2CA5-6ABE-8474D814AF88,CheckCondition +{Before Action is Executed} + +DFFF91A9-2CA5-6ABE-8474D814AF88,Operator +false + +DFFF91A9-2CA5-6ABE-8474D814AF88,String +<%SilentMode%> + +E02368C5-95B5-03A7-3282740037B0,CheckCondition +{Before Action is Executed} + +E02368C5-95B5-03A7-3282740037B0,Operator +false + +E02368C5-95B5-03A7-3282740037B0,String +<%InstallStopped%> + +E161F216-E597-B340-C1A71C476E2C,CheckCondition +{Before Action is Executed} + +E161F216-E597-B340-C1A71C476E2C,Message,subst +1 + +E161F216-E597-B340-C1A71C476E2C,Title,subst +1 + +E23AC50D-7CFB-800E-A99C6F4068F8,Alias +{Cancel Actions} + +E23AC50D-7CFB-800E-A99C6F4068F8,Conditions +{0 conditions} + +E44CFF46-6302-C518-B9C30D2E43F7,CheckCondition +{Before Action is Executed} + +E44CFF46-6302-C518-B9C30D2E43F7,String +<%CreateDesktopShortcut%> + +E4DEA723-FC78-45D7-BAB1-A3E4C4C96EA1,Conditions +{0 conditions} + +E4DEA723-FC78-45D7-BAB1-A3E4C4C96EA1,ProgramCommandLine +{net stop <%ServiceName%>} + +E56ADFF4-C15E-AEDB-A599-C468AF72C4BB,Conditions +{0 conditions} + +E56ADFF4-C15E-AEDB-A599-C468AF72C4BB,Destination +{<%InstallDir%>\NotifySysAdmin.vbs} + +E56ADFF4-C15E-AEDB-A599-C468AF72C4BB,Source +{<%InstallDir%>\templates\NotifySysAdmin.template.vbs} + +EB2B31A1-C111-3582-0C8A5656692A,String +<%ErrorsOccurred%> + +EB532611-5F30-3C24-66EB-F3826D9054FD,CheckCondition +{Before Action is Executed} + +EB532611-5F30-3C24-66EB-F3826D9054FD,String +<%AddBackupLocation%> + +F4024A3E-9A6D-2726-5E0CFFA93054,Alias +{Uninstall Actions} + +F4024A3E-9A6D-2726-5E0CFFA93054,Conditions +{0 conditions} + +F5F21749-8B3A-49C6-9138-9C4D6D703D26,Active +No + +F5F21749-8B3A-49C6-9138-9C4D6D703D26,Conditions +{0 conditions} + +F5F21749-8B3A-49C6-9138-9C4D6D703D26,ProgramCommandLine +{cmd /k tools/7za.exe encrypted_keys.exe -p<%InstallPassword%>} + +F5F21749-8B3A-49C6-9138-9C4D6D703D26,ProgressiveOutputWidget +Message + +F5F21749-8B3A-49C6-9138-9C4D6D703D26,ShowProgressiveOutput +Yes + +F5F21749-8B3A-49C6-9138-9C4D6D703D26,WorkingDirectory +<%InstallDir%> + +F8FD4BD6-F1DF-3F8D-B857-98310E4B1143,Active +Yes + +F8FD4BD6-F1DF-3F8D-B857-98310E4B1143,BackButton,subst +1 + +F8FD4BD6-F1DF-3F8D-B857-98310E4B1143,CancelButton,subst +1 + +F8FD4BD6-F1DF-3F8D-B857-98310E4B1143,Caption,subst +1 + +F8FD4BD6-F1DF-3F8D-B857-98310E4B1143,CompanyLabel,subst +0 + +F8FD4BD6-F1DF-3F8D-B857-98310E4B1143,Conditions +{0 conditions} + +F8FD4BD6-F1DF-3F8D-B857-98310E4B1143,Message,subst +1 + +F8FD4BD6-F1DF-3F8D-B857-98310E4B1143,NextButton,subst +1 + +F8FD4BD6-F1DF-3F8D-B857-98310E4B1143,Subtitle,subst +1 + +F8FD4BD6-F1DF-3F8D-B857-98310E4B1143,Title,subst +1 + +F8FD4BD6-F1DF-3F8D-B857-98310E4B1143,UserNameLabel,subst +1 + +F9E38720-6ABA-8B99-2471-496902E4CBC2,Active +No + +F9E38720-6ABA-8B99-2471-496902E4CBC2,Conditions +{0 conditions} + +F9E38720-6ABA-8B99-2471-496902E4CBC2,ResultVirtualText +BackupLocationPath + +F9E38720-6ABA-8B99-2471-496902E4CBC2,TclScript +{set BackupLocationPath "" } + +FB697A88-2842-468E-9776-85E84B009340,Active +No + +FB697A88-2842-468E-9776-85E84B009340,Conditions +{0 conditions} + +FB697A88-2842-468E-9776-85E84B009340,IgnoreErrors +Yes + +FB697A88-2842-468E-9776-85E84B009340,ProgramCommandLine +{"<%InstallDir%>\<%ServiceExeName%> -r -S <%ServiceName%>} + +FB697A88-2842-468E-9776-85E84B009340,WorkingDirectory +<%Temp%> + +FDF68FD6-BEA8-4A74-867D-5139F4D9E793,Active +No + +FDF68FD6-BEA8-4A74-867D-5139F4D9E793,Conditions +{0 conditions} + +FDF68FD6-BEA8-4A74-867D-5139F4D9E793,WaitTime +2000 + +FEFD090D-C133-BC95-B3564F693CD3,Alias +{Finish Actions} + +FEFD090D-C133-BC95-B3564F693CD3,Conditions +{0 conditions} + +FreeBSD-4-x86,Active +No + +FreeBSD-4-x86,DefaultDirectoryPermission +0755 + +FreeBSD-4-x86,DefaultFilePermission +0755 + +FreeBSD-4-x86,Executable +<%AppName%>-<%Version%>-<%Platform%>-Install<%Ext%> + +FreeBSD-4-x86,FallBackToConsole +Yes + +FreeBSD-4-x86,InstallDir +<%Home%>/<%ShortAppName%> + +FreeBSD-4-x86,InstallMode +Standard + +FreeBSD-4-x86,InstallType +Typical + +FreeBSD-4-x86,ProgramExecutable +{} + +FreeBSD-4-x86,ProgramFolderAllUsers +No + +FreeBSD-4-x86,ProgramFolderName +<%AppName%> + +FreeBSD-4-x86,ProgramLicense +<%InstallDir%>/LICENSE.txt + +FreeBSD-4-x86,ProgramName +{} + +FreeBSD-4-x86,ProgramReadme +<%InstallDir%>/README.txt + +FreeBSD-4-x86,PromptForRoot +Yes + +FreeBSD-4-x86,RequireRoot +No + +FreeBSD-4-x86,RootInstallDir +/usr/local/<%ShortAppName%> + +FreeBSD-x86,Active +No + +FreeBSD-x86,DefaultDirectoryPermission +0755 + +FreeBSD-x86,DefaultFilePermission +0755 + +FreeBSD-x86,Executable +<%AppName%>-<%Version%>-<%Platform%>-Install<%Ext%> + +FreeBSD-x86,FallBackToConsole +Yes + +FreeBSD-x86,InstallDir +<%Home%>/<%ShortAppName%> + +FreeBSD-x86,InstallMode +Standard + +FreeBSD-x86,InstallType +Typical + +FreeBSD-x86,ProgramExecutable +{} + +FreeBSD-x86,ProgramFolderAllUsers +No + +FreeBSD-x86,ProgramFolderName +<%AppName%> + +FreeBSD-x86,ProgramLicense +<%InstallDir%>/LICENSE.txt + +FreeBSD-x86,ProgramName +{} + +FreeBSD-x86,ProgramReadme +<%InstallDir%>/README.txt + +FreeBSD-x86,PromptForRoot +Yes + +FreeBSD-x86,RequireRoot +No + +FreeBSD-x86,RootInstallDir +/usr/local/<%ShortAppName%> + +HPUX-hppa,Active +No + +HPUX-hppa,DefaultDirectoryPermission +0755 + +HPUX-hppa,DefaultFilePermission +0755 + +HPUX-hppa,Executable +<%AppName%>-<%Version%>-<%Platform%>-Install<%Ext%> + +HPUX-hppa,FallBackToConsole +Yes + +HPUX-hppa,InstallDir +<%Home%>/<%ShortAppName%> + +HPUX-hppa,InstallMode +Standard + +HPUX-hppa,InstallType +Typical + +HPUX-hppa,ProgramExecutable +{} + +HPUX-hppa,ProgramFolderAllUsers +No + +HPUX-hppa,ProgramFolderName +<%AppName%> + +HPUX-hppa,ProgramLicense +<%InstallDir%>/LICENSE.txt + +HPUX-hppa,ProgramName +{} + +HPUX-hppa,ProgramReadme +<%InstallDir%>/README.txt + +HPUX-hppa,PromptForRoot +Yes + +HPUX-hppa,RequireRoot +No + +HPUX-hppa,RootInstallDir +/usr/local/<%ShortAppName%> + +Linux-x86,Active +No + +Linux-x86,BuildType +dynamic + +Linux-x86,DefaultDirectoryPermission +00755 + +Linux-x86,DefaultFilePermission +00755 + +Linux-x86,Executable +<%AppName%>-<%Version%>-<%Platform%>-Install<%Ext%> + +Linux-x86,FallBackToConsole +Yes + +Linux-x86,InstallDir +<%Home%>/<%ShortAppName%> + +Linux-x86,InstallMode +Standard + +Linux-x86,InstallType +Typical + +Linux-x86,ProgramExecutable +<%InstallDir%>/TebucoSafe + +Linux-x86,ProgramFolderAllUsers +No + +Linux-x86,ProgramFolderName +<%AppName%> + +Linux-x86,ProgramLicense +<%InstallDir%>/LICENSE.txt + +Linux-x86,ProgramName +{} + +Linux-x86,ProgramReadme +<%InstallDir%>/README.txt + +Linux-x86,PromptForRoot +Yes + +Linux-x86,RequireRoot +No + +Linux-x86,RootInstallDir +/usr/local/<%ShortAppName%> + +Solaris-sparc,Active +No + +Solaris-sparc,DefaultDirectoryPermission +0755 + +Solaris-sparc,DefaultFilePermission +0755 + +Solaris-sparc,Executable +<%AppName%>-<%Version%>-<%Platform%>-Install<%Ext%> + +Solaris-sparc,FallBackToConsole +Yes + +Solaris-sparc,InstallDir +<%Home%>/<%ShortAppName%> + +Solaris-sparc,InstallMode +Standard + +Solaris-sparc,InstallType +Typical + +Solaris-sparc,ProgramExecutable +{} + +Solaris-sparc,ProgramFolderAllUsers +No + +Solaris-sparc,ProgramFolderName +<%AppName%> + +Solaris-sparc,ProgramLicense +<%InstallDir%>/LICENSE.txt + +Solaris-sparc,ProgramName +{} + +Solaris-sparc,ProgramReadme +<%InstallDir%>/README.txt + +Solaris-sparc,PromptForRoot +Yes + +Solaris-sparc,RequireRoot +No + +Solaris-sparc,RootInstallDir +/usr/local/<%ShortAppName%> + +TarArchive,Active +No + +TarArchive,CompressionLevel +6 + +TarArchive,DefaultDirectoryPermission +0755 + +TarArchive,DefaultFilePermission +0755 + +TarArchive,Executable +<%AppName%>-<%Version%>-<%Platform%>-Install<%Ext%> + +TarArchive,FallBackToConsole +Yes + +TarArchive,InstallDir +<%Home%>/<%ShortAppName%> + +TarArchive,InstallMode +Standard + +TarArchive,InstallType +Typical + +TarArchive,OutputFileName +<%ShortAppName%>-<%Version%>.tar.gz + +TarArchive,ProgramExecutable +{} + +TarArchive,ProgramFolderAllUsers +No + +TarArchive,ProgramFolderName +<%AppName%> + +TarArchive,ProgramLicense +<%InstallDir%>/LICENSE.txt + +TarArchive,ProgramName +{} + +TarArchive,ProgramReadme +<%InstallDir%>/README.txt + +TarArchive,PromptForRoot +Yes + +TarArchive,RequireRoot +No + +TarArchive,RootInstallDir +/usr/local/<%ShortAppName%> + +TarArchive,VirtualTextMap +{<%InstallDir%> <%ShortAppName%>} + +Windows,Active +Yes + +Windows,BuildType +{} + +Windows,Executable +<%BrandName%>BackupService-Setup-3.3-<%AccountNo%><%Ext%> + +Windows,IncludeTWAPI +No + +Windows,InstallDir +{D:\Program Files\<%BrandName%> Backup Service} + +Windows,InstallMode +Standard + +Windows,InstallType +Typical + +Windows,ProgramExecutable +{} + +Windows,ProgramFolderAllUsers +No + +Windows,ProgramFolderName +{<%BrandName%> Backup Service} + +Windows,ProgramLicense +{<%InstallDir%>\LICENSE.txt} + +Windows,ProgramName +{} + +Windows,ProgramReadme +{} + +Windows,WindowsIcon +/home/petjal/doc/teb/cli/bu/installer/win/favicon.ico + +ZipArchive,Active +No + +ZipArchive,CompressionLevel +6 + +ZipArchive,DefaultDirectoryPermission +0755 + +ZipArchive,DefaultFilePermission +0755 + +ZipArchive,Executable +<%AppName%>-<%Version%>-<%Platform%>-Install<%Ext%> + +ZipArchive,FallBackToConsole +Yes + +ZipArchive,InstallDir +<%Home%>/<%ShortAppName%> + +ZipArchive,InstallMode +Standard + +ZipArchive,InstallType +Typical + +ZipArchive,OutputFileName +<%ShortAppName%>-<%Version%>.zip + +ZipArchive,ProgramExecutable +{} + +ZipArchive,ProgramFolderAllUsers +No + +ZipArchive,ProgramFolderName +<%AppName%> + +ZipArchive,ProgramLicense +<%InstallDir%>/LICENSE.txt + +ZipArchive,ProgramName +{} + +ZipArchive,ProgramReadme +<%InstallDir%>/README.txt + +ZipArchive,PromptForRoot +Yes + +ZipArchive,RequireRoot +No + +ZipArchive,RootInstallDir +/usr/local/<%ShortAppName%> + +ZipArchive,VirtualTextMap +{<%InstallDir%> <%ShortAppName%>} + +} + +::msgcat::mcmset de { +20CBDBEA-2217-457B-8D98-D692C4F591E9,Message +<%UninstallCompleteText%> + +2BF07B5A-9B06-4C1E-810D-5B5E9303D2C6,Message +<%InstallationCompleteText%> + +B002A311-F8E7-41DE-B039-521391924E5B,Message +<%InstallingApplicationText%> + +B4ED4636-22D8-41DC-9E3D-BD1E1CAD2174,Message +<%UninstallingApplicationText%> + +} +::msgcat::mcmset en { +16D53E40-546B-54C3-088B1B5E3BBB,Text +<%CreateDesktopShortcutText%> + +20CBDBEA-2217-457B-8D98-D692C4F591E9,Message +<%UninstallCompleteText%> + +2BF07B5A-9B06-4C1E-810D-5B5E9303D2C6,Message +<%InstallationCompleteText%> + +2E2963BD-DDBD-738D-A910-B7F3F04946F9,Text +{No:<%BackupLocationNumber%> } + +2EC82FBD-8294-A3E4-7F39-1CBA0582FA64,TextToWrite +BackupLocations\n\{\n + +32F5B0AF-EB83-7A03-D8FAE1ECE473,Message +<%InstallStartupText%> + +32F5B0AF-EB83-7A03-D8FAE1ECE473,Title +<%InstallApplicationText%> + +36FF8915-8148-0F1F-27D7239CBFA1,Text +<%ViewReadmeText%> + +3B6E2E7C-1A26-27F1-D578E383B128,Text +<%ViewReadmeText%> + +3D33AA8C-0037-204B-39A339FD38BD,Message +{<%BrandName%> has been removed from your system. Thank you for using the <%BrandName%> Backup Service. If you need further assistance, please contact us at http://<%BrandName%>.com or support@<%BrandName%>.com.} + +3FD9BFF3-2F6E-E4FC-2FAE-98F2017916A7,Caption +{} + +3FD9BFF3-2F6E-E4FC-2FAE-98F2017916A7,Message +{} + +3FD9BFF3-2F6E-E4FC-2FAE-98F2017916A7,Subtitle +{Add a directory to backup, nickname it, and add some exclusions.} + +3FD9BFF3-2F6E-E4FC-2FAE-98F2017916A7,Title +{Backup Locations} + +3FDB57ED-598D-8A4E-CEF7-D90833305558,Text +{Backup Directory} + +4A9C852B-647E-EED5-5482FFBCC2AF,Description +<%ProgramFilesDescription%> + +4ACB0B47-42B3-2B3A-BFE9AA4EC707,Message +<%UninstallStartupText%> + +4ACB0B47-42B3-2B3A-BFE9AA4EC707,Title +<%UninstallApplicationText%> + +58E1119F-639E-17C9-5D3898F385AA,Caption +{Setup will install <%ShortAppName%> in the following folder. + +To install to this folder, click Next. To install to a different folder, click Browse and select another folder.} + +58E1119F-639E-17C9-5D3898F385AA,Subtitle +{Where should <%ShortAppName%> be installed?} + +59395A3B-6116-F93A-84E1-5E079C2CD44B,Caption +{Backup Exclusions} + +59395A3B-6116-F93A-84E1-5E079C2CD44B,Message +{} + +59395A3B-6116-F93A-84E1-5E079C2CD44B,Subtitle +{Enter your backup exclusions for this Backup Location <%BackupLocationName_ShortName%> here.} + +59395A3B-6116-F93A-84E1-5E079C2CD44B,Text +{} + +59395A3B-6116-F93A-84E1-5E079C2CD44B,Title +{Backup Exclusions} + +640DA2B2-6CF3-0873-D7AE-ABCDDE39EFCF,Text +{Put your custom text here. +<%AddBackupLocation%> +<%BackupLocationNumber%> +<%BackupLocationName%>} + +6C323815-B9AB-FA94-4F5D152EBC51,Caption +{Installation Wizard Complete} + +6C323815-B9AB-FA94-4F5D152EBC51,Message +{The Installation Wizard has successfully installed the <%BrandName%> Backup Service. Click Finish to exit the wizard.} + +6CFBBE13-6B70-4B7C-B5EF-0677752D95A8,Caption +{Installing encryption keys...} + +6CFBBE13-6B70-4B7C-B5EF-0677752D95A8,Message +{Click next to install encrypted keys and configuration file (bbackupd.conf)... + +You will be presented with the current configuration file so that you may make any last minute changes...} + +6FEE2889-0338-1D49-60BF-1471F465AB26,TextToWrite +\}\n + +8202CECC-54A0-9B6C-D24D111BA52E,Description +<%TypicalInstallDescription%> + +8419AAAD-5860-F73E-8D11-4D1BDA4D7D37,Text +{Add another backup location?} + +855DE408-060E-3D35-08B5-1D9AB05C2865,Text +Exclusions + +8E095096-F018-A880-429D-A2177A9B70EA,Text +{AddAnother: <%AddBackupLocation%>} + +9013E862-8E81-5290-64F9-D8BCD13EC7E5,Caption +{Please enter your phone number and email address.} + +9013E862-8E81-5290-64F9-D8BCD13EC7E5,CompanyLabel +Email: + +9013E862-8E81-5290-64F9-D8BCD13EC7E5,UserNameLabel +Phone: + +937C3FDD-FB28-98BD-3DAB276E59ED,Text +<%CreateQuickLaunchShortcutText%> + +9A23D3ED-4D9D-9C57-C2A7-71DE0FFF0266,Caption +{Click Next to continue...} + +9A23D3ED-4D9D-9C57-C2A7-71DE0FFF0266,Message +{Building configuration file...} + +9A23D3ED-4D9D-9C57-C2A7-71DE0FFF0266,Subtitle +{} + +9A23D3ED-4D9D-9C57-C2A7-71DE0FFF0266,Title +Continue + +9BAB328D-414B-D351-CA8D-824DF94B9DCA,Text +{Add another backup location after this one?} + +A18C2977-1409-C1FB-892415711F72,Text +<%LaunchApplicationText%> + +AAF2142A-9FC9-4664-DFF2-13B9EB7BA0E1,CompanyLabel +Company: + +AE3BD5B4-35DE-4240-B79914D43E56,Caption +{Welcome to the Installation Wizard for <%BrandName%> Backup Service!} + +AE3BD5B4-35DE-4240-B79914D43E56,Message +{Thank you for installing the <%BrandName%>(SM) Backup Service. + +If you need any assistance, please contact us at http://<%BrandName%>.com or support@<%BrandName%>.com. + +This will install <%BrandName%> version <%Version%> on your computer. + +It is recommended that you close all other applications before continuing. + +Click Next to continue or Cancel to exit Setup. +} + +B002A311-F8E7-41DE-B039-521391924E5B,Message +<%InstallingApplicationText%> + +B4404713-AF4F-4F4B-670F3115517F,Description +<%CustomInstallDescription%> + +B4ED4636-22D8-41DC-9E3D-BD1E1CAD2174,Message +<%UninstallingApplicationText%> + +B506E7DA-E7C4-4D42-8C03-FD27BA16D078,Text +{Box Backup, http://www.fluffy.co.uk/boxbackup +Copyright (c) 2003-2007 Ben Summers and contributors. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. All use of this software and associated advertising materials must display the following acknowledgement: + This product includes software developed by Ben Summers and contributors. + +4. The names of the Authors may not be used to endorse or promote products derived from this software without specific prior written permission. + +[Where legally impermissible the Authors do not disclaim liability for direct physical injury or death caused solely by defects in the software unless it is modified by a third party.] + +THIS SOFTWARE IS PROVIDED BY THE AUTHORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE} + +B57F8C91-2439-CFD3-7EB5-57D4EA48D3C6,Caption +{<%BrandName%> will backup the following folder. + +To backup this folder, click Next. To backup a different folder, click Browse and select another folder.} + +B57F8C91-2439-CFD3-7EB5-57D4EA48D3C6,DestinationLabel +{Backup This Folder} + +B57F8C91-2439-CFD3-7EB5-57D4EA48D3C6,Message +{} + +B57F8C91-2439-CFD3-7EB5-57D4EA48D3C6,Subtitle +{What directory should <%BrandName%> backup?} + +B57F8C91-2439-CFD3-7EB5-57D4EA48D3C6,Title +{Choose Backup Location} + +B927A5AF-4DFE-82A3-DCA8-35FA4D91EC5A,Text +{Short Name} + +B9B85EF1-1D76-4BF5-ABB9-092A8DB35851,Caption +{Please enter the agreed-upon password for your encrypted key file...} + +B9B85EF1-1D76-4BF5-ABB9-092A8DB35851,CompanyLabel +Password: + +B9B85EF1-1D76-4BF5-ABB9-092A8DB35851,Subtitle +{Please enter your encrypted key file password.} + +C105AAAE-7C16-2C9E-769FE4535B60,Caption +<%ApplicationReadmeText%> + +C105AAAE-7C16-2C9E-769FE4535B60,Message +{} + +C105AAAE-7C16-2C9E-769FE4535B60,Title +<%ApplicationReadmeText%> + +C7762473-273F-E3CA-17E3-65789B14CDB0,TextToWrite +{<%BackupLocationShortName%> +{ +Path = <%BackupLocationPath%> +<%BackupLocationExclusions%> +} +} + +CB058DBA-C3B7-2F48-D985-BE2F7107A76D,BrowseText +{To continue, click Next. If you would like to select a folder to backup, click Browse.} + +CB058DBA-C3B7-2F48-D985-BE2F7107A76D,Caption +{} + +CB058DBA-C3B7-2F48-D985-BE2F7107A76D,DestinationLabel +{Backup This Folder} + +CB058DBA-C3B7-2F48-D985-BE2F7107A76D,Subtitle +{What directories should <%BrandName%> backup?} + +CB058DBA-C3B7-2F48-D985-BE2F7107A76D,Title +{Choose Backup Location} + +CFFA27AF-A641-E41C-B4A0E3BB3CBB,Text +<%LaunchApplicationText%> + +D4625CA6-9864-D8EF-F252D7B7DC87,Text +<%CreateDesktopShortcutText%> + +D47BE952-79F2-844E-D2E5-8F22044E7A9D,Text +{Account Number:} + +DA33B826-E633-A845-4646-76DFA78B907B,Caption +{Click Next to continue...} + +DA33B826-E633-A845-4646-76DFA78B907B,Message +{Completing configuration file...} + +DA33B826-E633-A845-4646-76DFA78B907B,Subtitle +{} + +DA33B826-E633-A845-4646-76DFA78B907B,Title +Continue + +DDBBD8A9-13D7-9509-9202-419E989F60A9,Text +{Add another Backup Location?} + +E0CADC4E-08A6-E429-3B49-BB8CFB7B097F,Text +{Simple name for this Backup Location (short, no spaces or special characters)} + +E161F216-E597-B340-C1A71C476E2C,Message +<%UninstallLeftoverText%> + +E161F216-E597-B340-C1A71C476E2C,Title +{Uninstall <%BrandName%>} + +EA2C57E8-CCFB-CF3D-92CA-83369EFF1B08,Text +{Add (another) Backup Location after this one?} + +EDE364D6-22C7-5108-D398-26FC24E0A55A,Text +{Enter your Backup Exclusions for this Backup Location...} + +F59AF47D-4136-64F8-82C7-4506BD4327FD,Text +{Add another Backup Location after this one?} + +F8FD4BD6-F1DF-3F8D-B857-98310E4B1143,Caption +{Please enter your Account Number.} + +F8FD4BD6-F1DF-3F8D-B857-98310E4B1143,UserNameLabel +{Account Number (like 10005004):} + +F98784B1-1965-0F42-6BB0542AE1A9,Caption +{Installing and starting the TebucoSafe Backup Service...} + +F98784B1-1965-0F42-6BB0542AE1A9,Message +{Click Next to install the TebucoSafe Backup Service as an operating system service on your computer (see services.msc), and start up that service. } + +FC678E76-6823-2E55-204CA01C35EF,Text +<%CreateQuickLaunchShortcutText%> + +FF4F6EEA-F4CC-428E-AF33-EB0E88E2147E,Text +{ +Copyright (c) 2003 - 2006 + Ben Summers and contributors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. All use of this software and associated advertising materials must + display the following acknowledgment: + This product includes software developed by Ben Summers. +4. The names of the Authors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +Where legally impermissible the Authors do not disclaim liability for +direct physical injury or death caused solely by defects in the software +unless it is modified by a third party.] + +THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + + + } + +} +::msgcat::mcmset es { +20CBDBEA-2217-457B-8D98-D692C4F591E9,Message +<%UninstallCompleteText%> + +2BF07B5A-9B06-4C1E-810D-5B5E9303D2C6,Message +<%InstallationCompleteText%> + +B002A311-F8E7-41DE-B039-521391924E5B,Message +<%InstallingApplicationText%> + +B4ED4636-22D8-41DC-9E3D-BD1E1CAD2174,Message +<%UninstallingApplicationText%> + +} +::msgcat::mcmset fr { +20CBDBEA-2217-457B-8D98-D692C4F591E9,Message +<%UninstallCompleteText%> + +2BF07B5A-9B06-4C1E-810D-5B5E9303D2C6,Message +<%InstallationCompleteText%> + +B002A311-F8E7-41DE-B039-521391924E5B,Message +<%InstallingApplicationText%> + +B4ED4636-22D8-41DC-9E3D-BD1E1CAD2174,Message +<%UninstallingApplicationText%> + +} +::msgcat::mcmset pl { +20CBDBEA-2217-457B-8D98-D692C4F591E9,Message +<%UninstallCompleteText%> + +2BF07B5A-9B06-4C1E-810D-5B5E9303D2C6,Message +<%InstallationCompleteText%> + +B002A311-F8E7-41DE-B039-521391924E5B,Message +<%InstallingApplicationText%> + +B4ED4636-22D8-41DC-9E3D-BD1E1CAD2174,Message +<%UninstallingApplicationText%> + +} +::msgcat::mcmset pt_br { +20CBDBEA-2217-457B-8D98-D692C4F591E9,Message +<%UninstallCompleteText%> + +2BF07B5A-9B06-4C1E-810D-5B5E9303D2C6,Message +<%InstallationCompleteText%> + +B002A311-F8E7-41DE-B039-521391924E5B,Message +<%InstallingApplicationText%> + +B4ED4636-22D8-41DC-9E3D-BD1E1CAD2174,Message +<%UninstallingApplicationText%> + +} + Property changes on: box/trunk/contrib/windows/installer/boxbackup.mpi ___________________________________________________________________ Name: svn:executable + * Added: box/trunk/contrib/windows/installer/tools/InstallService.bat =================================================================== --- box/trunk/contrib/windows/installer/tools/InstallService.bat (rev 0) +++ box/trunk/contrib/windows/installer/tools/InstallService.bat 2008-09-06 10:58:49 UTC (rev 2274) @@ -0,0 +1,3 @@ +service.exe -i -S GigaLock +echo off +ping 192.168.254.254 -n 5 -w 1000 > nul Property changes on: box/trunk/contrib/windows/installer/tools/InstallService.bat ___________________________________________________________________ Name: svn:executable + * Added: box/trunk/contrib/windows/installer/tools/KillBackupProcess.bat =================================================================== --- box/trunk/contrib/windows/installer/tools/KillBackupProcess.bat (rev 0) +++ box/trunk/contrib/windows/installer/tools/KillBackupProcess.bat 2008-09-06 10:58:49 UTC (rev 2274) @@ -0,0 +1,3 @@ +control.exe terminate +echo off +ping 192.168.254.254 -n 5 -w 1000 > nul Property changes on: box/trunk/contrib/windows/installer/tools/KillBackupProcess.bat ___________________________________________________________________ Name: svn:executable + * Added: box/trunk/contrib/windows/installer/tools/QueryOutputAll.bat =================================================================== --- box/trunk/contrib/windows/installer/tools/QueryOutputAll.bat (rev 0) +++ box/trunk/contrib/windows/installer/tools/QueryOutputAll.bat 2008-09-06 10:58:49 UTC (rev 2274) @@ -0,0 +1,5 @@ + at ECHO OFF +: o=old, d=deleted, s=size info, t=timestamp, r=recursive +set Queryopts=-odstr +::set Queryopts=-str +query.exe "list %Queryopts%" quit > QueryOutputAllResults.txt Property changes on: box/trunk/contrib/windows/installer/tools/QueryOutputAll.bat ___________________________________________________________________ Name: svn:executable + * Added: box/trunk/contrib/windows/installer/tools/QueryOutputCurrent.bat =================================================================== --- box/trunk/contrib/windows/installer/tools/QueryOutputCurrent.bat (rev 0) +++ box/trunk/contrib/windows/installer/tools/QueryOutputCurrent.bat 2008-09-06 10:58:49 UTC (rev 2274) @@ -0,0 +1,5 @@ + at ECHO OFF +: o=old, d=deleted, s=size info, t=timestamp, r=recursive +::set Queryopts=-odstr +set Queryopts=-str +query.exe "list %Queryopts%" quit > QueryOutputCurrentResults.txt Property changes on: box/trunk/contrib/windows/installer/tools/QueryOutputCurrent.bat ___________________________________________________________________ Name: svn:executable + * Added: box/trunk/contrib/windows/installer/tools/ReloadConfig.bat =================================================================== --- box/trunk/contrib/windows/installer/tools/ReloadConfig.bat (rev 0) +++ box/trunk/contrib/windows/installer/tools/ReloadConfig.bat 2008-09-06 10:58:49 UTC (rev 2274) @@ -0,0 +1,3 @@ +control.exe reload +echo off +ping 192.168.254.254 -n 8 -w 1000 > nul Property changes on: box/trunk/contrib/windows/installer/tools/ReloadConfig.bat ___________________________________________________________________ Name: svn:executable + * Added: box/trunk/contrib/windows/installer/tools/RemoteControl.exe =================================================================== (Binary files differ) Property changes on: box/trunk/contrib/windows/installer/tools/RemoteControl.exe ___________________________________________________________________ Name: svn:executable + * Name: svn:mime-type + application/octet-stream Added: box/trunk/contrib/windows/installer/tools/RemoveService.bat =================================================================== --- box/trunk/contrib/windows/installer/tools/RemoveService.bat (rev 0) +++ box/trunk/contrib/windows/installer/tools/RemoveService.bat 2008-09-06 10:58:49 UTC (rev 2274) @@ -0,0 +1,3 @@ +@@SERVICEEXENAME@ -r -S GigaLock +echo off +ping 192.168.254.254 -n 5 -w 1000 > nul Property changes on: box/trunk/contrib/windows/installer/tools/RemoveService.bat ___________________________________________________________________ Name: svn:executable + * Added: box/trunk/contrib/windows/installer/tools/RestartService.bat =================================================================== --- box/trunk/contrib/windows/installer/tools/RestartService.bat (rev 0) +++ box/trunk/contrib/windows/installer/tools/RestartService.bat 2008-09-06 10:58:49 UTC (rev 2274) @@ -0,0 +1,5 @@ +net stop GigaLock +ping 192.168.254.254 -n 2 -w 1000 > nul +net start GigaLock +echo off +ping 192.168.254.254 -n 5 -w 1000 > nul Property changes on: box/trunk/contrib/windows/installer/tools/RestartService.bat ___________________________________________________________________ Name: svn:executable + * Added: box/trunk/contrib/windows/installer/tools/ShowUsage.bat =================================================================== --- box/trunk/contrib/windows/installer/tools/ShowUsage.bat (rev 0) +++ box/trunk/contrib/windows/installer/tools/ShowUsage.bat 2008-09-06 10:58:49 UTC (rev 2274) @@ -0,0 +1,3 @@ +query.exe usage quit +ping 192.168.254.254 -n 10 -w 1000 > nul + Property changes on: box/trunk/contrib/windows/installer/tools/ShowUsage.bat ___________________________________________________________________ Name: svn:executable + * Added: box/trunk/contrib/windows/installer/tools/StartService.bat =================================================================== --- box/trunk/contrib/windows/installer/tools/StartService.bat (rev 0) +++ box/trunk/contrib/windows/installer/tools/StartService.bat 2008-09-06 10:58:49 UTC (rev 2274) @@ -0,0 +1,3 @@ +net start GigaLock +echo off +ping 192.168.254.254 -n 5 -w 1000 > nul Property changes on: box/trunk/contrib/windows/installer/tools/StartService.bat ___________________________________________________________________ Name: svn:executable + * Added: box/trunk/contrib/windows/installer/tools/StopService.bat =================================================================== --- box/trunk/contrib/windows/installer/tools/StopService.bat (rev 0) +++ box/trunk/contrib/windows/installer/tools/StopService.bat 2008-09-06 10:58:49 UTC (rev 2274) @@ -0,0 +1,3 @@ +net stop GigaLock +echo off +ping 192.168.254.254 -n 5 -w 1000 > nul Property changes on: box/trunk/contrib/windows/installer/tools/StopService.bat ___________________________________________________________________ Name: svn:executable + * Added: box/trunk/contrib/windows/installer/tools/Sync.bat =================================================================== --- box/trunk/contrib/windows/installer/tools/Sync.bat (rev 0) +++ box/trunk/contrib/windows/installer/tools/Sync.bat 2008-09-06 10:58:49 UTC (rev 2274) @@ -0,0 +1,3 @@ +control.exe sync +echo off +ping 192.168.254.254 -n 5 -w 1000 > nul Property changes on: box/trunk/contrib/windows/installer/tools/Sync.bat ___________________________________________________________________ Name: svn:executable + * From boxbackup-dev at fluffy.co.uk Sun Sep 7 14:20:16 2008 From: boxbackup-dev at fluffy.co.uk (boxbackup-dev at fluffy.co.uk) Date: Sun, 7 Sep 2008 14:20:16 +0100 (BST) Subject: [Box Backup-commit] COMMIT r2275 - box/trunk/lib/common Message-ID: <20080907132016.3E33C32686D@www.boxbackup.org> Author: chris Date: 2008-09-07 14:20:14 +0100 (Sun, 07 Sep 2008) New Revision: 2275 Modified: box/trunk/lib/common/FileStream.cpp box/trunk/lib/common/FileStream.h Log: Fix test regression on Windows where a const char pointer was treated as a file handle instead of as a string. Modified: box/trunk/lib/common/FileStream.cpp =================================================================== --- box/trunk/lib/common/FileStream.cpp 2008-09-06 10:58:49 UTC (rev 2274) +++ box/trunk/lib/common/FileStream.cpp 2008-09-07 13:20:14 UTC (rev 2275) @@ -33,7 +33,33 @@ mIsEOF(false), mFileName(rFilename) { + AfterOpen(); +} + +// -------------------------------------------------------------------------- +// +// Function +// Name: FileStream::FileStream(const char *, int, int) +// Purpose: Alternative constructor, takes a const char *, +// avoids const strings being interpreted as handles! +// Created: 2003/07/31 +// +// -------------------------------------------------------------------------- +FileStream::FileStream(const char *pFilename, int flags, int mode) #ifdef WIN32 + : mOSFileHandle(::openfile(pFilename, flags, mode)), +#else + : mOSFileHandle(::open(pFilename, flags, mode)), +#endif + mIsEOF(false), + mFileName(pFilename) +{ + AfterOpen(); +} + +void FileStream::AfterOpen() +{ +#ifdef WIN32 if(mOSFileHandle == INVALID_HANDLE_VALUE) #else if(mOSFileHandle < 0) @@ -48,7 +74,7 @@ else { BOX_LOG_SYS_WARNING("Failed to open file: " << - rFilename); + mFileName); THROW_EXCEPTION(CommonException, OSFileOpenError) } } Modified: box/trunk/lib/common/FileStream.h =================================================================== --- box/trunk/lib/common/FileStream.h 2008-09-06 10:58:49 UTC (rev 2274) +++ box/trunk/lib/common/FileStream.h 2008-09-07 13:20:14 UTC (rev 2275) @@ -38,6 +38,18 @@ int flags = O_RDONLY, #endif int mode = (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH)); + + // Ensure that const char * name doesn't end up as a handle + // on Windows! + + FileStream(const char *pFilename, +#ifdef WIN32 + int flags = (O_RDONLY | O_BINARY), +#else + int flags = O_RDONLY, +#endif + int mode = (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH)); + FileStream(tOSFileHandle FileDescriptor); virtual ~FileStream(); @@ -56,6 +68,7 @@ tOSFileHandle mOSFileHandle; bool mIsEOF; FileStream(const FileStream &rToCopy) { /* do not call */ } + void AfterOpen(); // for debugging.. std::string mFileName; From boxbackup-dev at fluffy.co.uk Fri Sep 12 21:39:45 2008 From: boxbackup-dev at fluffy.co.uk (boxbackup-dev at fluffy.co.uk) Date: Fri, 12 Sep 2008 21:39:45 +0100 (BST) Subject: [Box Backup-commit] COMMIT r2276 - box/trunk/test/bbackupd Message-ID: <20080912203945.C429632686D@www.boxbackup.org> Author: chris Date: 2008-09-12 21:39:45 +0100 (Fri, 12 Sep 2008) New Revision: 2276 Modified: box/trunk/test/bbackupd/testbbackupd.cpp Log: Test for read errors being reported at more points during the tests. Test that symlink to self does not cause restore to fail. Modified: box/trunk/test/bbackupd/testbbackupd.cpp =================================================================== --- box/trunk/test/bbackupd/testbbackupd.cpp 2008-09-07 13:20:14 UTC (rev 2275) +++ box/trunk/test/bbackupd/testbbackupd.cpp 2008-09-12 20:39:45 UTC (rev 2276) @@ -1230,6 +1230,9 @@ } #endif // PLATFORM_CLIB_FNS_INTERCEPTION_IMPOSSIBLE + // Check that no read error has been reported yet + TEST_THAT(!TestFileExists("testfiles/notifyran.read-error.1")); + std::string cmd = BBACKUPD " " + bbackupd_args + " testfiles/bbackupd.conf"; @@ -1658,6 +1661,9 @@ } } + // Check that no read error has been reported yet + TEST_THAT(!TestFileExists("testfiles/notifyran.read-error.1")); + #ifndef WIN32 // requires fork printf("\n==== Testing that bbackupd responds correctly to " "connection failure\n"); @@ -1820,6 +1826,9 @@ DIRECTORY_SEPARATOR "b" DIRECTORY_SEPARATOR "link") == 0); + // also test symlink-to-self loop does not break restore + TEST_THAT(symlink("self", SYM_DIR "/self") == 0); + ::wait_for_operation(4); ::sync_and_wait(); @@ -1919,6 +1928,9 @@ } #endif // !WIN32 + // Check that no read error has been reported yet + TEST_THAT(!TestFileExists("testfiles/notifyran.read-error.1")); + printf("\n==== Testing that redundant locations are deleted on time\n"); // BLOCK @@ -2023,6 +2035,9 @@ if(bbackupd_pid > 0) { + // Check that no read error has been reported yet + TEST_THAT(!TestFileExists("testfiles/notifyran.read-error.1")); + printf("\n==== Check that read-only directories and " "their contents can be restored.\n"); @@ -2383,6 +2398,9 @@ BackupQueries::ReturnCode::Compare_Different); #endif // WIN32 + // Check that no read error has been reported yet + TEST_THAT(!TestFileExists("testfiles/notifyran.read-error.1")); + TEST_THAT(ServerIsAlive(bbackupd_pid)); TEST_THAT(ServerIsAlive(bbstored_pid)); if (!ServerIsAlive(bbackupd_pid)) return 1; @@ -2495,6 +2513,9 @@ } } + // Check that no read error has been reported yet + TEST_THAT(!TestFileExists("testfiles/notifyran.read-error.1")); + TEST_THAT(ServerIsAlive(bbackupd_pid)); TEST_THAT(ServerIsAlive(bbstored_pid)); if (!ServerIsAlive(bbackupd_pid)) return 1; @@ -3009,6 +3030,9 @@ BackupQueries::ReturnCode::Compare_Same); TestRemoteProcessMemLeaks("bbackupquery.memleaks"); + // Check that no read error has been reported yet + TEST_THAT(!TestFileExists("testfiles/notifyran.read-error.1")); + TEST_THAT(ServerIsAlive(bbackupd_pid)); TEST_THAT(ServerIsAlive(bbstored_pid)); if (!ServerIsAlive(bbackupd_pid)) return 1; @@ -3049,6 +3073,9 @@ if (!ServerIsAlive(bbackupd_pid)) return 1; if (!ServerIsAlive(bbstored_pid)) return 1; + // Check that no read error has been reported yet + TEST_THAT(!TestFileExists("testfiles/notifyran.read-error.1")); + // Check that modifying files with old timestamps // still get added printf("\n==== Modify existing file, but change timestamp " @@ -3108,6 +3135,9 @@ if (!ServerIsAlive(bbackupd_pid)) return 1; if (!ServerIsAlive(bbstored_pid)) return 1; + // Check that no read error has been reported yet + TEST_THAT(!TestFileExists("testfiles/notifyran.read-error.1")); + // Add some files and directories which are marked as excluded printf("\n==== Add files and dirs for exclusion test\n"); #ifdef WIN32 @@ -3194,6 +3224,9 @@ // These tests only work as non-root users. if(::getuid() != 0) { + // Check that the error has not been reported yet + TEST_THAT(!TestFileExists("testfiles/notifyran.read-error.1")); + // Check that read errors are reported neatly printf("\n==== Add unreadable files\n"); @@ -3816,6 +3849,8 @@ // backed up on the next run. CloseHandle(handle); wait_for_sync_end(); + + // still no read errors? TEST_THAT(!TestFileExists("testfiles/" "notifyran.read-error.2")); From boxbackup-dev at fluffy.co.uk Sat Sep 13 14:47:22 2008 From: boxbackup-dev at fluffy.co.uk (boxbackup-dev at fluffy.co.uk) Date: Sat, 13 Sep 2008 14:47:22 +0100 (BST) Subject: [Box Backup-commit] COMMIT r2277 - box/trunk Message-ID: <20080913134722.AF82432687B@www.boxbackup.org> Author: chris Date: 2008-09-13 14:47:21 +0100 (Sat, 13 Sep 2008) New Revision: 2277 Modified: box/trunk/configure.ac Log: Fix cross-compiling checks for ar, ranlib and windres. Modified: box/trunk/configure.ac =================================================================== --- box/trunk/configure.ac 2008-09-12 20:39:45 UTC (rev 2276) +++ box/trunk/configure.ac 2008-09-13 13:47:21 UTC (rev 2277) @@ -47,11 +47,18 @@ AC_DEFINE_UNQUOTED([PERL_EXECUTABLE], ["$TARGET_PERL"], [Location of the perl executable]) -AC_CHECK_PROGS([AR], [ar], +AC_CHECK_TOOL([AR], [ar], [AC_MSG_ERROR([[cannot find ar executable]])]) -AC_CHECK_PROGS([RANLIB], [ranlib], +AC_CHECK_TOOL([RANLIB], [ranlib], [AC_MSG_ERROR([[cannot find ranlib executable]])]) +case $target_os in +mingw*) + AC_CHECK_TOOL([WINDRES], [windres], + [AC_MSG_ERROR([[cannot find windres executable]])]) + ;; +esac + ### Checks for libraries. case $target_os in From boxbackup-dev at fluffy.co.uk Sat Sep 13 14:48:39 2008 From: boxbackup-dev at fluffy.co.uk (boxbackup-dev at fluffy.co.uk) Date: Sat, 13 Sep 2008 14:48:39 +0100 (BST) Subject: [Box Backup-commit] COMMIT r2278 - box/trunk/infrastructure Message-ID: <20080913134839.B963F32687B@www.boxbackup.org> Author: chris Date: 2008-09-13 14:48:39 +0100 (Sat, 13 Sep 2008) New Revision: 2278 Modified: box/trunk/infrastructure/makebuildenv.pl.in Log: Use cross-compiling windres detected by configure. Modified: box/trunk/infrastructure/makebuildenv.pl.in =================================================================== --- box/trunk/infrastructure/makebuildenv.pl.in 2008-09-13 13:47:21 UTC (rev 2277) +++ box/trunk/infrastructure/makebuildenv.pl.in 2008-09-13 13:48:39 UTC (rev 2278) @@ -544,7 +544,7 @@ AR = @AR@ RANLIB = @RANLIB@ PERL = @PERL@ -WINDRES = windres +WINDRES = @WINDRES@ DEFAULT_CXXFLAGS = @CPPFLAGS@ $default_cxxflags @CXXFLAGS_STRICT@ \\ $include_paths $extra_platform_defines \\ From boxbackup-dev at fluffy.co.uk Sat Sep 13 16:11:36 2008 From: boxbackup-dev at fluffy.co.uk (boxbackup-dev at fluffy.co.uk) Date: Sat, 13 Sep 2008 16:11:36 +0100 (BST) Subject: [Box Backup-commit] COMMIT r2279 - in box/trunk: infrastructure lib/common lib/server Message-ID: <20080913151136.E29D232687B@www.boxbackup.org> Author: chris Date: 2008-09-13 16:11:35 +0100 (Sat, 13 Sep 2008) New Revision: 2279 Modified: box/trunk/infrastructure/buildenv-testmain-template.cpp box/trunk/lib/common/Logging.cpp box/trunk/lib/common/Logging.h box/trunk/lib/server/Daemon.cpp Log: Unify program name and console logging tags. Add a new class, Logging::Tagger, which can be used to temporarily add information to the program name, such as the client ID in bbstored. Modified: box/trunk/infrastructure/buildenv-testmain-template.cpp =================================================================== --- box/trunk/infrastructure/buildenv-testmain-template.cpp 2008-09-13 13:48:39 UTC (rev 2278) +++ box/trunk/infrastructure/buildenv-testmain-template.cpp 2008-09-13 15:11:35 UTC (rev 2279) @@ -257,7 +257,8 @@ case 't': { - Console::SetTag(optarg); + Logging::SetProgramName(optarg); + Console::SetShowTag(true); } break; Modified: box/trunk/lib/common/Logging.cpp =================================================================== --- box/trunk/lib/common/Logging.cpp 2008-09-13 13:48:39 UTC (rev 2278) +++ box/trunk/lib/common/Logging.cpp 2008-09-13 15:11:35 UTC (rev 2279) @@ -35,6 +35,7 @@ Syslog* Logging::spSyslog = NULL; Log::Level Logging::sGlobalLevel = Log::EVERYTHING; Logging Logging::sGlobalLogging; //automatic initialisation +std::string Logging::sProgramName; Logging::Logging() { @@ -206,6 +207,8 @@ void Logging::SetProgramName(const std::string& rProgramName) { + sProgramName = rProgramName; + for (std::vector::iterator i = sLoggers.begin(); i != sLoggers.end(); i++) { @@ -230,12 +233,16 @@ bool Console::sShowPID = false; std::string Console::sTag; -void Console::SetTag(const std::string& rTag) +void Console::SetProgramName(const std::string& rProgramName) { - sTag = rTag; - sShowTag = true; + sTag = rProgramName; } +void Console::SetShowTag(bool enabled) +{ + sShowTag = enabled; +} + void Console::SetShowTime(bool enabled) { sShowTime = enabled; Modified: box/trunk/lib/common/Logging.h =================================================================== --- box/trunk/lib/common/Logging.h 2008-09-13 13:48:39 UTC (rev 2278) +++ box/trunk/lib/common/Logging.h 2008-09-13 15:11:35 UTC (rev 2279) @@ -143,19 +143,19 @@ class Console : public Logger { private: + static bool sShowTag; static bool sShowTime; static bool sShowTimeMicros; - static bool sShowTag; + static bool sShowPID; static std::string sTag; - static bool sShowPID; public: virtual bool Log(Log::Level level, const std::string& rFile, int line, std::string& rMessage); virtual const char* GetType() { return "Console"; } - virtual void SetProgramName(const std::string& rProgramName) { } + virtual void SetProgramName(const std::string& rProgramName); - static void SetTag(const std::string& rTag); + static void SetShowTag(bool enabled); static void SetShowTime(bool enabled); static void SetShowTimeMicros(bool enabled); static void SetShowPID(bool enabled); @@ -206,6 +206,7 @@ static Syslog* spSyslog; static Log::Level sGlobalLevel; static Logging sGlobalLogging; + static std::string sProgramName; public: Logging (); @@ -230,6 +231,7 @@ return (int)sGlobalLevel >= (int)level; } static void SetProgramName(const std::string& rProgramName); + static std::string GetProgramName() { return sProgramName; } class Guard { @@ -247,6 +249,23 @@ Logging::SetGlobalLevel(mOldLevel); } }; + + class Tagger + { + private: + std::string mOldTag; + + public: + Tagger(const std::string& rTempTag) + { + mOldTag = Logging::GetProgramName(); + Logging::SetProgramName(mOldTag + " " + rTempTag); + } + ~Tagger() + { + Logging::SetProgramName(mOldTag); + } + }; }; #endif // LOGGING__H Modified: box/trunk/lib/server/Daemon.cpp =================================================================== --- box/trunk/lib/server/Daemon.cpp 2008-09-13 13:48:39 UTC (rev 2278) +++ box/trunk/lib/server/Daemon.cpp 2008-09-13 15:11:35 UTC (rev 2279) @@ -235,7 +235,8 @@ case 't': { - Console::SetTag(optarg); + Logging::SetProgramName(optarg); + Console::SetShowTag(true); } break; From boxbackup-dev at fluffy.co.uk Sat Sep 13 16:12:18 2008 From: boxbackup-dev at fluffy.co.uk (boxbackup-dev at fluffy.co.uk) Date: Sat, 13 Sep 2008 16:12:18 +0100 (BST) Subject: [Box Backup-commit] COMMIT r2280 - box/trunk/bin/bbstored Message-ID: <20080913151218.0CB9F32687B@www.boxbackup.org> Author: chris Date: 2008-09-13 16:12:17 +0100 (Sat, 13 Sep 2008) New Revision: 2280 Modified: box/trunk/bin/bbstored/BackupStoreDaemon.cpp Log: Use logging tagger to identify clients during connections, both in syslog and on the console. Modified: box/trunk/bin/bbstored/BackupStoreDaemon.cpp =================================================================== --- box/trunk/bin/bbstored/BackupStoreDaemon.cpp 2008-09-13 15:11:35 UTC (rev 2279) +++ box/trunk/bin/bbstored/BackupStoreDaemon.cpp 2008-09-13 15:12:17 UTC (rev 2280) @@ -321,7 +321,10 @@ } // Make ps listings clearer - SetProcessTitle("client %08x", id); + std::ostringstream tag; + tag << "client=" << BOX_FORMAT_ACCOUNT(id); + SetProcessTitle(tag.str().c_str()); + Logging::Tagger tagWithClientID(tag.str()); // Create a context, using this ID BackupStoreContext context(id, *this); From boxbackup-dev at fluffy.co.uk Sat Sep 13 16:28:38 2008 From: boxbackup-dev at fluffy.co.uk (boxbackup-dev at fluffy.co.uk) Date: Sat, 13 Sep 2008 16:28:38 +0100 (BST) Subject: [Box Backup-commit] COMMIT r2281 - box/trunk/bin/bbstored Message-ID: <20080913152838.83D6F32687B@www.boxbackup.org> Author: chris Date: 2008-09-13 16:28:38 +0100 (Sat, 13 Sep 2008) New Revision: 2281 Modified: box/trunk/bin/bbstored/BBStoreDHousekeeping.cpp Log: Allow stopping housekeeping during a run, between accounts, when the daemon is requested to terminate or to reload its configuration. Modified: box/trunk/bin/bbstored/BBStoreDHousekeeping.cpp =================================================================== --- box/trunk/bin/bbstored/BBStoreDHousekeeping.cpp 2008-09-13 15:12:17 UTC (rev 2280) +++ box/trunk/bin/bbstored/BBStoreDHousekeeping.cpp 2008-09-13 15:28:38 UTC (rev 2281) @@ -46,6 +46,12 @@ { RunHousekeepingIfNeeded(); + // Stop early? + if(StopRun()) + { + break; + } + // Calculate how long should wait before doing the next // housekeeping run int64_t timeNow = GetCurrentBoxTime(); From boxbackup-dev at fluffy.co.uk Sat Sep 13 16:29:27 2008 From: boxbackup-dev at fluffy.co.uk (boxbackup-dev at fluffy.co.uk) Date: Sat, 13 Sep 2008 16:29:27 +0100 (BST) Subject: [Box Backup-commit] COMMIT r2282 - box/trunk/bin/bbstored Message-ID: <20080913152927.1803732687B@www.boxbackup.org> Author: chris Date: 2008-09-13 16:29:26 +0100 (Sat, 13 Sep 2008) New Revision: 2282 Modified: box/trunk/bin/bbstored/BackupCommands.cpp box/trunk/bin/bbstored/BackupStoreContext.cpp box/trunk/bin/bbstored/BackupStoreContext.h box/trunk/bin/bbstored/backupprotocol.txt Log: Add command to undelete a file, to complete the set of commands implemented by the bbstored server. Modified: box/trunk/bin/bbstored/BackupCommands.cpp =================================================================== --- box/trunk/bin/bbstored/BackupCommands.cpp 2008-09-13 15:28:38 UTC (rev 2281) +++ box/trunk/bin/bbstored/BackupCommands.cpp 2008-09-13 15:29:26 UTC (rev 2282) @@ -610,6 +610,30 @@ // -------------------------------------------------------------------------- // // Function +// Name: BackupProtocolServerUndeleteFile::DoCommand( +// BackupProtocolServer &, BackupStoreContext &) +// Purpose: Undelete a file +// Created: 2008-09-12 +// +// -------------------------------------------------------------------------- +std::auto_ptr BackupProtocolServerUndeleteFile::DoCommand( + BackupProtocolServer &rProtocol, BackupStoreContext &rContext) +{ + CHECK_PHASE(Phase_Commands) + CHECK_WRITEABLE_SESSION + + // Context handles this + bool result = rContext.UndeleteFile(mObjectID, mInDirectory); + + // return the object ID or zero for not found + return std::auto_ptr( + new BackupProtocolServerSuccess(result ? mObjectID : 0)); +} + + +// -------------------------------------------------------------------------- +// +// Function // Name: BackupProtocolServerDeleteDirectory::DoCommand(BackupProtocolServer &, BackupStoreContext &) // Purpose: Delete a directory // Created: 2003/10/21 Modified: box/trunk/bin/bbstored/BackupStoreContext.cpp =================================================================== --- box/trunk/bin/bbstored/BackupStoreContext.cpp 2008-09-13 15:28:38 UTC (rev 2281) +++ box/trunk/bin/bbstored/BackupStoreContext.cpp 2008-09-13 15:29:26 UTC (rev 2282) @@ -695,6 +695,7 @@ { THROW_EXCEPTION(BackupStoreException, StoreInfoNotLoaded) } + if(mReadOnly) { THROW_EXCEPTION(BackupStoreException, ContextIsReadOnly) @@ -759,14 +760,93 @@ RemoveDirectoryFromCache(InDirectory); throw; } - return fileExisted; } +// -------------------------------------------------------------------------- +// +// Function +// Name: BackupStoreContext::DeleteFile(const BackupStoreFilename &, int64_t, int64_t &) +// Purpose: Deletes a file, returning true if the file existed. Object ID returned too, set to zero if not found. +// Created: 2003/10/21 +// +// -------------------------------------------------------------------------- +bool BackupStoreContext::UndeleteFile(int64_t ObjectID, int64_t InDirectory) +{ + // Essential checks! + if(mpStoreInfo.get() == 0) + { + THROW_EXCEPTION(BackupStoreException, StoreInfoNotLoaded) + } + if(mReadOnly) + { + THROW_EXCEPTION(BackupStoreException, ContextIsReadOnly) + } + // Find the directory the file is in (will exception if it fails) + BackupStoreDirectory &dir(GetDirectoryInternal(InDirectory)); + + // Setup flags + bool fileExisted = false; + bool madeChanges = false; + + // Count of deleted blocks + int64_t blocksDel = 0; + + try + { + // Iterate through directory, only looking at files which have been deleted + BackupStoreDirectory::Iterator i(dir); + BackupStoreDirectory::Entry *e = 0; + while((e = i.Next(BackupStoreDirectory::Entry::Flags_File | + BackupStoreDirectory::Entry::Flags_Deleted, 0)) != 0) + { + // Compare name + if(e->GetObjectID() == ObjectID) + { + // Check that it's definitely already deleted + ASSERT((e->GetFlags() & BackupStoreDirectory::Entry::Flags_Deleted) != 0); + // Clear deleted flag + e->RemoveFlags(BackupStoreDirectory::Entry::Flags_Deleted); + // Mark as made a change + madeChanges = true; + blocksDel -= e->GetSizeInBlocks(); + + // Is this the last version? + if((e->GetFlags() & BackupStoreDirectory::Entry::Flags_OldVersion) == 0) + { + // Yes. It's been found. + fileExisted = true; + } + } + } + + // Save changes? + if(madeChanges) + { + // Save the directory back + SaveDirectory(dir, InDirectory); + + // Modify the store info, and write + mpStoreInfo->ChangeBlocksInDeletedFiles(blocksDel); + + // Maybe postponed save of store info + SaveStoreInfo(); + } + } + catch(...) + { + RemoveDirectoryFromCache(InDirectory); + throw; + } + + return fileExisted; +} + + // -------------------------------------------------------------------------- // // Function Modified: box/trunk/bin/bbstored/BackupStoreContext.h =================================================================== --- box/trunk/bin/bbstored/BackupStoreContext.h 2008-09-13 15:28:38 UTC (rev 2281) +++ box/trunk/bin/bbstored/BackupStoreContext.h 2008-09-13 15:29:26 UTC (rev 2282) @@ -112,6 +112,7 @@ void ChangeDirAttributes(int64_t Directory, const StreamableMemBlock &Attributes, int64_t AttributesModTime); bool ChangeFileAttributes(const BackupStoreFilename &rFilename, int64_t InDirectory, const StreamableMemBlock &Attributes, int64_t AttributesHash, int64_t &rObjectIDOut); bool DeleteFile(const BackupStoreFilename &rFilename, int64_t InDirectory, int64_t &rObjectIDOut); + bool UndeleteFile(int64_t ObjectID, int64_t InDirectory); void DeleteDirectory(int64_t ObjectID, bool Undelete = false); void MoveObject(int64_t ObjectID, int64_t MoveFromDirectory, int64_t MoveToDirectory, const BackupStoreFilename &rNewFilename, bool MoveAllWithSameName, bool AllowMoveOverDeletedObject); Modified: box/trunk/bin/bbstored/backupprotocol.txt =================================================================== --- box/trunk/bin/bbstored/backupprotocol.txt 2008-09-13 15:28:38 UTC (rev 2281) +++ box/trunk/bin/bbstored/backupprotocol.txt 2008-09-13 15:29:26 UTC (rev 2282) @@ -204,6 +204,12 @@ # stream of the block index follows the reply if found ID != 0 +UndeleteFile 36 Command(Success) + int64 InDirectory + int64 ObjectID + # will return 0 if the object couldn't be found in the specified directory + + # ------------------------------------------------------------------------------------- # Information commands # ------------------------------------------------------------------------------------- From boxbackup-dev at fluffy.co.uk Sat Sep 13 16:31:27 2008 From: boxbackup-dev at fluffy.co.uk (boxbackup-dev at fluffy.co.uk) Date: Sat, 13 Sep 2008 16:31:27 +0100 (BST) Subject: [Box Backup-commit] COMMIT r2283 - box/trunk/bin/bbackupquery Message-ID: <20080913153127.196D832687B@www.boxbackup.org> Author: chris Date: 2008-09-13 16:31:26 +0100 (Sat, 13 Sep 2008) New Revision: 2283 Modified: box/trunk/bin/bbackupquery/BackupQueries.cpp box/trunk/bin/bbackupquery/BackupQueries.h box/trunk/bin/bbackupquery/bbackupquery.cpp box/trunk/bin/bbackupquery/documentation.txt Log: Allow undelete command to work on files as well as directories. Add delete command that works on files and directories. Document both commands. Modified: box/trunk/bin/bbackupquery/BackupQueries.cpp =================================================================== --- box/trunk/bin/bbackupquery/BackupQueries.cpp 2008-09-13 15:29:26 UTC (rev 2282) +++ box/trunk/bin/bbackupquery/BackupQueries.cpp 2008-09-13 15:31:26 UTC (rev 2283) @@ -71,8 +71,10 @@ // Created: 2003/10/10 // // -------------------------------------------------------------------------- -BackupQueries::BackupQueries(BackupProtocolClient &rConnection, const Configuration &rConfiguration) - : mrConnection(rConnection), +BackupQueries::BackupQueries(BackupProtocolClient &rConnection, + const Configuration &rConfiguration, bool readWrite) + : mReadWrite(readWrite), + mrConnection(rConnection), mrConfiguration(rConfiguration), mQuitNow(false), mRunningAsRoot(false), @@ -222,24 +224,32 @@ { "help", "" }, { "usage", "" }, { "undelete", "" }, + { "delete", "" }, { NULL, NULL } }; - #define COMMAND_Quit 0 - #define COMMAND_Exit 1 - #define COMMAND_List 2 - #define COMMAND_pwd 3 - #define COMMAND_cd 4 - #define COMMAND_lcd 5 - #define COMMAND_sh 6 - #define COMMAND_GetObject 7 - #define COMMAND_Get 8 - #define COMMAND_Compare 9 - #define COMMAND_Restore 10 - #define COMMAND_Help 11 - #define COMMAND_Usage 12 - #define COMMAND_Undelete 13 - static const char *alias[] = {"ls", 0}; - static const int aliasIs[] = {COMMAND_List, 0}; + + typedef enum + { + Command_Quit = 0, + Command_Exit, + Command_List, + Command_pwd, + Command_cd, + Command_lcd, + Command_sh, + Command_GetObject, + Command_Get, + Command_Compare, + Command_Restore, + Command_Help, + Command_Usage, + Command_Undelete, + Command_Delete, + } + CommandType; + + static const char *alias[] = {"ls", 0}; + static const int aliasIs[] = {Command_List, 0}; // Work out which command it is... int cmd = 0; @@ -293,7 +303,7 @@ } } - if(cmd != COMMAND_Quit && cmd != COMMAND_Exit) + if(cmd != Command_Quit && cmd != Command_Exit) { // If not a quit command, set the return code to zero SetReturnCode(ReturnCode::Command_OK); @@ -302,16 +312,16 @@ // Handle command switch(cmd) { - case COMMAND_Quit: - case COMMAND_Exit: + case Command_Quit: + case Command_Exit: mQuitNow = true; break; - case COMMAND_List: + case Command_List: CommandList(args, opts); break; - case COMMAND_pwd: + case Command_pwd: { // Simple implementation, so do it here BOX_INFO(GetCurrentDirectoryName() << " (" << @@ -319,47 +329,52 @@ } break; - case COMMAND_cd: + case Command_cd: CommandChangeDir(args, opts); break; - case COMMAND_lcd: + case Command_lcd: CommandChangeLocalDir(args); break; - case COMMAND_sh: + case Command_sh: BOX_ERROR("The command to run must be specified as an argument."); break; - case COMMAND_GetObject: + case Command_GetObject: CommandGetObject(args, opts); break; - case COMMAND_Get: + case Command_Get: CommandGet(args, opts); break; - case COMMAND_Compare: + case Command_Compare: CommandCompare(args, opts); break; - case COMMAND_Restore: + case Command_Restore: CommandRestore(args, opts); break; - case COMMAND_Usage: + case Command_Usage: CommandUsage(); break; - case COMMAND_Help: + case Command_Help: CommandHelp(args); break; - case COMMAND_Undelete: + case Command_Undelete: CommandUndelete(args, opts); break; + case Command_Delete: + CommandDelete(args, opts); + break; + default: + BOX_ERROR("Unknown command: " << Command); break; } } @@ -601,15 +616,18 @@ // -------------------------------------------------------------------------- // // Function -// Name: BackupQueries::FindDirectoryObjectID(const std::string &) -// Purpose: Find the object ID of a directory on the store, or return 0 for not found. -// If pStack != 0, the object is set to the stack of directories. -// Will start from the current directory stack. +// Name: BackupQueries::FindDirectoryObjectID(const +// std::string &) +// Purpose: Find the object ID of a directory on the store, +// or return 0 for not found. If pStack != 0, the +// object is set to the stack of directories. +// Will start from the current directory stack. // Created: 2003/10/10 // // -------------------------------------------------------------------------- -int64_t BackupQueries::FindDirectoryObjectID(const std::string &rDirName, bool AllowOldVersion, - bool AllowDeletedDirs, std::vector > *pStack) +int64_t BackupQueries::FindDirectoryObjectID(const std::string &rDirName, + bool AllowOldVersion, bool AllowDeletedDirs, + std::vector > *pStack) { // Split up string into elements std::vector dirElements; @@ -935,7 +953,118 @@ } +// -------------------------------------------------------------------------- +// +// Function +// Name: BackupQueries::FindFileID(const std::string& +// rNameOrIdString, const bool *options, +// int64_t *pDirIdOut, std::string* pFileNameOut) +// Purpose: Locate a file on the store (either by name or by +// object ID, depending on opts['i'], where name can +// include a path) and return the file ID, placing the +// directory ID in *pDirIdOut and the filename part +// of the path (if not looking up by ID and not NULL) +// in *pFileNameOut. +// Created: 2008-09-12 +// +// -------------------------------------------------------------------------- +int64_t BackupQueries::FindFileID(const std::string& rNameOrIdString, + const bool *opts, int64_t *pDirIdOut, std::string* pFileNameOut, + int16_t flagsInclude, int16_t flagsExclude, int16_t* pFlagsOut) +{ + // Find object ID somehow + int64_t fileId; + int64_t dirId = GetCurrentDirectoryID(); + std::string fileName = rNameOrIdString; + if(!opts['i']) + { + // does this remote filename include a path? + std::string::size_type index = fileName.rfind('/'); + if(index != std::string::npos) + { + std::string dirName(fileName.substr(0, index)); + fileName = fileName.substr(index + 1); + + dirId = FindDirectoryObjectID(dirName); + if(dirId == 0) + { + BOX_ERROR("Directory '" << dirName << + "' not found."); + return 0; + } + } + + if(pFileNameOut) + { + *pFileNameOut = fileName; + } + } + + BackupStoreFilenameClear fn(fileName); + + // Need to look it up in the current directory + mrConnection.QueryListDirectory( + dirId, flagsInclude, flagsExclude, + true /* do want attributes */); + + // Retrieve the directory from the stream following + BackupStoreDirectory dir; + std::auto_ptr dirstream(mrConnection.ReceiveStream()); + dir.ReadFromStream(*dirstream, mrConnection.GetTimeout()); + BackupStoreDirectory::Entry *en; + + if(opts['i']) + { + // Specified as ID. + fileId = ::strtoll(rNameOrIdString.c_str(), 0, 16); + if(fileId == std::numeric_limits::min() || + fileId == std::numeric_limits::max() || + fileId == 0) + { + BOX_ERROR("Not a valid object ID (specified in hex)."); + return 0; + } + + // Check that the item is actually in the directory + en = dir.FindEntryByID(fileId); + if(en == 0) + { + BOX_ERROR("File ID " << + BOX_FORMAT_OBJECTID(fileId) << + " not found in current directory on store.\n" + "(You can only access files by ID from the " + "current directory.)"); + return 0; + } + } + else + { + // Specified by name, find the object in the directory to get the ID + BackupStoreDirectory::Iterator i(dir); + en = i.FindMatchingClearName(fn); + if(en == 0) + { + BOX_ERROR("Filename '" << rNameOrIdString << "' " + "not found in current directory on store.\n" + "(Subdirectories in path not searched.)"); + return 0; + } + + fileId = en->GetObjectID(); + } + + *pDirIdOut = dirId; + + if(pFlagsOut) + { + *pFlagsOut = en->GetFlags(); + } + + return fileId; +} + + // -------------------------------------------------------------------------- // // Function @@ -957,111 +1086,63 @@ } // Find object ID somehow - int64_t fileId; - int64_t dirId = GetCurrentDirectoryID(); + int64_t fileId, dirId; std::string localName; - // BLOCK +#ifdef WIN32 + for (std::vector::iterator + i = args.begin(); i != args.end(); i++) { -#ifdef WIN32 - for (std::vector::iterator - i = args.begin(); i != args.end(); i++) + std::string out; + if(!ConvertConsoleToUtf8(i->c_str(), out)) { - std::string out; - if(!ConvertConsoleToUtf8(i->c_str(), out)) - { - BOX_ERROR("Failed to convert encoding."); - return; - } - *i = out; + BOX_ERROR("Failed to convert encoding."); + return; } + *i = out; + } #endif - std::string fileName(args[0]); + int16_t flagsExclude; - if(!opts['i']) - { - // does this remote filename include a path? - std::string::size_type index = fileName.rfind('/'); - if(index != std::string::npos) - { - std::string dirName(fileName.substr(0, index)); - fileName = fileName.substr(index + 1); + if(opts['i']) + { + // can retrieve anything by ID + flagsExclude = BackupProtocolClientListDirectory::Flags_EXCLUDE_NOTHING; + } + else + { + // only current versions by name + flagsExclude = + BackupProtocolClientListDirectory::Flags_OldVersion | + BackupProtocolClientListDirectory::Flags_Deleted; + } - dirId = FindDirectoryObjectID(dirName); - if(dirId == 0) - { - BOX_ERROR("Directory '" << dirName << - "' not found."); - return; - } - } - } - BackupStoreFilenameClear fn(fileName); + fileId = FindFileID(args[0], opts, &dirId, &localName, + BackupProtocolClientListDirectory::Flags_File, // just files + flagsExclude, NULL /* don't care about flags found */); - // Need to look it up in the current directory - mrConnection.QueryListDirectory( - dirId, - BackupProtocolClientListDirectory::Flags_File, // just files - (opts['i'])?(BackupProtocolClientListDirectory::Flags_EXCLUDE_NOTHING):(BackupProtocolClientListDirectory::Flags_OldVersion | BackupProtocolClientListDirectory::Flags_Deleted), // only current versions - false /* don't want attributes */); + if (fileId == 0) + { + // error already reported + return; + } - // Retrieve the directory from the stream following - BackupStoreDirectory dir; - std::auto_ptr dirstream(mrConnection.ReceiveStream()); - dir.ReadFromStream(*dirstream, mrConnection.GetTimeout()); - - if(opts['i']) + if(opts['i']) + { + // Specified as ID. Must have a local name in the arguments + // (check at beginning of function ensures this) + localName = args[1]; + } + else + { + // Specified by name. Local name already set by FindFileID, + // but may be overridden by user supplying a second argument. + if(args.size() == 2) { - // Specified as ID. - fileId = ::strtoll(args[0].c_str(), 0, 16); - if(fileId == std::numeric_limits::min() || - fileId == std::numeric_limits::max() || - fileId == 0) - { - BOX_ERROR("Not a valid object ID (specified in hex)."); - return; - } - - // Check that the item is actually in the directory - if(dir.FindEntryByID(fileId) == 0) - { - BOX_ERROR("File ID " << - BOX_FORMAT_OBJECTID(fileId) << - " not found in current " - "directory on store.\n" - "(You can only download files by ID " - "from the current directory.)"); - return; - } - - // Must have a local name in the arguments (check at beginning of function ensures this) localName = args[1]; } - else - { - // Specified by name, find the object in the directory to get the ID - BackupStoreDirectory::Iterator i(dir); - BackupStoreDirectory::Entry *en = i.FindMatchingClearName(fn); - - if(en == 0) - { - BOX_ERROR("Filename '" << args[0] << "' " - "not found in current " - "directory on store.\n" - "(Subdirectories in path not " - "searched.)"); - return; - } - - fileId = en->GetObjectID(); - - // Local name is the last argument, which is either - // the looked up filename, or a filename specified - // by the user. - localName = args[args.size() - 1]; - } } // Does local file already exist? (don't want to overwrite) @@ -2210,10 +2291,17 @@ // -------------------------------------------------------------------------- void BackupQueries::CommandUndelete(const std::vector &args, const bool *opts) { + if (!mReadWrite) + { + BOX_ERROR("This command requires a read-write connection. " + "Please reconnect with the -w option."); + return; + } + // Check arguments if(args.size() != 1) { - BOX_ERROR("Incorrect usage. undelete "); + BOX_ERROR("Incorrect usage. undelete or undelete -i "); return; } @@ -2223,23 +2311,133 @@ #else const std::string& storeDirEncoded(args[0]); #endif - - // Get directory ID - int64_t dirID = FindDirectoryObjectID(storeDirEncoded, - false /* no old versions */, true /* find deleted dirs */); - - // Allowable? - if(dirID == 0) + + // Find object ID somehow + int64_t fileId, parentId; + std::string fileName; + int16_t flagsOut; + + fileId = FindFileID(storeDirEncoded, opts, &parentId, &fileName, + /* include files and directories */ + BackupProtocolClientListDirectory::Flags_EXCLUDE_NOTHING, + /* include old and deleted files */ + BackupProtocolClientListDirectory::Flags_EXCLUDE_NOTHING, + &flagsOut); + + if (fileId == 0) { - BOX_ERROR("Directory '" << args[0] << "' not found on server."); + // error already reported return; } - if(dirID == BackupProtocolClientListDirectory::RootDirectory) + + // Undelete it on the store + try { - BOX_ERROR("Cannot undelete the root directory."); + // Undelete object + if(flagsOut & BackupProtocolClientListDirectory::Flags_File) + { + mrConnection.QueryUndeleteFile(parentId, fileId); + } + else + { + mrConnection.QueryUndeleteDirectory(fileId); + } + } + catch (BoxException &e) + { + BOX_ERROR("Failed to undelete object: " << + e.what()); + } + catch(std::exception &e) + { + BOX_ERROR("Failed to undelete object: " << + e.what()); + } + catch(...) + { + BOX_ERROR("Failed to undelete object: unknown error"); + } +} + +// -------------------------------------------------------------------------- +// +// Function +// Name: BackupQueries::CommandDelete(const +// std::vector &, const bool *) +// Purpose: Deletes a file +// Created: 23/11/03 +// +// -------------------------------------------------------------------------- +void BackupQueries::CommandDelete(const std::vector &args, + const bool *opts) +{ + if (!mReadWrite) + { + BOX_ERROR("This command requires a read-write connection. " + "Please reconnect with the -w option."); return; } - // Undelete - mrConnection.QueryUndeleteDirectory(dirID); + // Check arguments + if(args.size() != 1) + { + BOX_ERROR("Incorrect usage. delete "); + return; + } + +#ifdef WIN32 + std::string storeDirEncoded; + if(!ConvertConsoleToUtf8(args[0].c_str(), storeDirEncoded)) return; +#else + const std::string& storeDirEncoded(args[0]); +#endif + + // Find object ID somehow + int64_t fileId, parentId; + std::string fileName; + int16_t flagsOut; + + fileId = FindFileID(storeDirEncoded, opts, &parentId, &fileName, + /* include files and directories */ + BackupProtocolClientListDirectory::Flags_EXCLUDE_NOTHING, + /* exclude old and deleted files */ + BackupProtocolClientListDirectory::Flags_OldVersion | + BackupProtocolClientListDirectory::Flags_Deleted, + &flagsOut); + + if (fileId == 0) + { + // error already reported + return; + } + + BackupStoreFilenameClear fn(fileName); + + // Delete it on the store + try + { + // Delete object + if(flagsOut & BackupProtocolClientListDirectory::Flags_File) + { + mrConnection.QueryDeleteFile(parentId, fn); + } + else + { + mrConnection.QueryDeleteDirectory(fileId); + } + } + catch (BoxException &e) + { + BOX_ERROR("Failed to delete object: " << + e.what()); + } + catch(std::exception &e) + { + BOX_ERROR("Failed to delete object: " << + e.what()); + } + catch(...) + { + BOX_ERROR("Failed to delete object: unknown error"); + } } Modified: box/trunk/bin/bbackupquery/BackupQueries.h =================================================================== --- box/trunk/bin/bbackupquery/BackupQueries.h 2008-09-13 15:29:26 UTC (rev 2282) +++ box/trunk/bin/bbackupquery/BackupQueries.h 2008-09-13 15:31:26 UTC (rev 2283) @@ -30,7 +30,9 @@ class BackupQueries { public: - BackupQueries(BackupProtocolClient &rConnection, const Configuration &rConfiguration); + BackupQueries(BackupProtocolClient &rConnection, + const Configuration &rConfiguration, + bool readWrite); ~BackupQueries(); private: BackupQueries(const BackupQueries &); @@ -54,12 +56,16 @@ void CommandCompare(const std::vector &args, const bool *opts); void CommandRestore(const std::vector &args, const bool *opts); void CommandUndelete(const std::vector &args, const bool *opts); + void CommandDelete(const std::vector &args, + const bool *opts); void CommandUsage(); - void CommandUsageDisplayEntry(const char *Name, int64_t Size, int64_t HardLimit, int32_t BlockSize); + void CommandUsageDisplayEntry(const char *Name, int64_t Size, + int64_t HardLimit, int32_t BlockSize); void CommandHelp(const std::vector &args); // Implementations - void List(int64_t DirID, const std::string &rListRoot, const bool *opts, bool FirstLevel); + void List(int64_t DirID, const std::string &rListRoot, const bool *opts, + bool FirstLevel); public: class CompareParams @@ -105,13 +111,19 @@ private: // Utility functions - int64_t FindDirectoryObjectID(const std::string &rDirName, bool AllowOldVersion = false, - bool AllowDeletedDirs = false, std::vector > *pStack = 0); + int64_t FindDirectoryObjectID(const std::string &rDirName, + bool AllowOldVersion = false, bool AllowDeletedDirs = false, + std::vector > *pStack = 0); + int64_t FindFileID(const std::string& rNameOrIdString, + const bool *opts, int64_t *pDirIdOut, + std::string* pFileNameOut, int16_t flagsInclude, + int16_t flagsExclude, int16_t* pFlagsOut); int64_t GetCurrentDirectoryID(); std::string GetCurrentDirectoryName(); void SetReturnCode(int code) {mReturnCode = code;} private: + bool mReadWrite; BackupProtocolClient &mrConnection; const Configuration &mrConfiguration; bool mQuitNow; Modified: box/trunk/bin/bbackupquery/bbackupquery.cpp =================================================================== --- box/trunk/bin/bbackupquery/bbackupquery.cpp 2008-09-13 15:29:26 UTC (rev 2282) +++ box/trunk/bin/bbackupquery/bbackupquery.cpp 2008-09-13 15:31:26 UTC (rev 2283) @@ -308,7 +308,7 @@ if(!quiet) printf("Login complete.\n\nType \"help\" for a list of commands.\n\n"); // Set up a context for our work - BackupQueries context(connection, conf); + BackupQueries context(connection, conf, readWrite); // Start running commands... first from the command line { Modified: box/trunk/bin/bbackupquery/documentation.txt =================================================================== --- box/trunk/bin/bbackupquery/documentation.txt 2008-09-13 15:29:26 UTC (rev 2282) +++ box/trunk/bin/bbackupquery/documentation.txt 2008-09-13 15:31:26 UTC (rev 2283) @@ -159,6 +159,21 @@ files is near zero. < +> undelete +undelete -i + + Removes the deleted flag from the specified directory name (in the + current directory) or hex object ID. Be careful not to use this + command where a directory already exists with the same name which is + not marked as deleted. +< + +> delete + + Sets the deleted flag on the specified file name (in the current + directory, or with a relative path). +< + > quit End session and exit. From boxbackup-dev at fluffy.co.uk Sun Sep 14 00:43:47 2008 From: boxbackup-dev at fluffy.co.uk (boxbackup-dev at fluffy.co.uk) Date: Sun, 14 Sep 2008 00:43:47 +0100 (BST) Subject: [Box Backup-commit] COMMIT r2284 - box/trunk/bin/bbackupctl Message-ID: <20080913234348.0253832687B@www.boxbackup.org> Author: chris Date: 2008-09-14 00:43:47 +0100 (Sun, 14 Sep 2008) New Revision: 2284 Modified: box/trunk/bin/bbackupctl/bbackupctl.cpp Log: Log which command succeeded or failed, rather than just "Succeeded", which is not very helpful in system logs. Modified: box/trunk/bin/bbackupctl/bbackupctl.cpp =================================================================== --- box/trunk/bin/bbackupctl/bbackupctl.cpp 2008-09-13 15:31:26 UTC (rev 2283) +++ box/trunk/bin/bbackupctl/bbackupctl.cpp 2008-09-13 23:43:47 UTC (rev 2284) @@ -257,7 +257,8 @@ case SyncAndWaitForEnd: { // send a sync command - std::string cmd("force-sync\n"); + commandName = "force-sync"; + std::string cmd = commandName + "\n"; connection.Write(cmd.c_str(), cmd.size()); connection.WriteAllBuffered(); @@ -337,13 +338,17 @@ { if(!quiet) { - BOX_INFO("Succeeded."); + BOX_INFO("Control command " + "succeeded: " << + commandName); } finished = true; } else if(line == "error") { - BOX_ERROR("Check command spelling"); + BOX_ERROR("Control command failed: " << + commandName << ". Check " + "command spelling"); returnCode = 1; finished = true; } From boxbackup-dev at fluffy.co.uk Sun Sep 14 01:26:14 2008 From: boxbackup-dev at fluffy.co.uk (boxbackup-dev at fluffy.co.uk) Date: Sun, 14 Sep 2008 01:26:14 +0100 (BST) Subject: [Box Backup-commit] COMMIT r2285 - in box/trunk: bin/bbackupctl bin/bbackupd bin/bbackupquery bin/bbstoreaccounts lib/win32 Message-ID: <20080914002614.4581F32687B@www.boxbackup.org> Author: chris Date: 2008-09-14 01:26:13 +0100 (Sun, 14 Sep 2008) New Revision: 2285 Modified: box/trunk/bin/bbackupctl/bbackupctl.cpp box/trunk/bin/bbackupd/BackupDaemon.cpp box/trunk/bin/bbackupquery/bbackupquery.cpp box/trunk/bin/bbstoreaccounts/bbstoreaccounts.cpp box/trunk/lib/win32/emu.cpp Log: Prefix event log application name with Box Backup, and remove it from all calls to SetProgramName, for better consistency on Unix. Make bbstoreaccounts and bbackupctl set their program names for logging. Don't override supplied tag with service name when BackupDaemon is run as a service. Modified: box/trunk/bin/bbackupctl/bbackupctl.cpp =================================================================== --- box/trunk/bin/bbackupctl/bbackupctl.cpp 2008-09-13 23:43:47 UTC (rev 2284) +++ box/trunk/bin/bbackupctl/bbackupctl.cpp 2008-09-14 00:26:13 UTC (rev 2285) @@ -62,9 +62,7 @@ MAINHELPER_START -#if defined WIN32 && ! defined NDEBUG - ::openlog("Box Backup (bbackupctl)", 0, 0); -#endif + Logging::SetProgramName("bbackupctl"); // Filename for configuration file? std::string configFilename; Modified: box/trunk/bin/bbackupd/BackupDaemon.cpp =================================================================== --- box/trunk/bin/bbackupd/BackupDaemon.cpp 2008-09-13 23:43:47 UTC (rev 2284) +++ box/trunk/bin/bbackupd/BackupDaemon.cpp 2008-09-14 00:26:13 UTC (rev 2285) @@ -335,6 +335,7 @@ case 'S': { mServiceName = optarg; + Logging::SetProgramName(mServiceName); return 0; } @@ -369,8 +370,6 @@ return RemoveService(mServiceName); } - Logging::SetProgramName("Box Backup (" + mServiceName + ")"); - int returnCode; if (mRunAsService) Modified: box/trunk/bin/bbackupquery/bbackupquery.cpp =================================================================== --- box/trunk/bin/bbackupquery/bbackupquery.cpp 2008-09-13 23:43:47 UTC (rev 2284) +++ box/trunk/bin/bbackupquery/bbackupquery.cpp 2008-09-14 00:26:13 UTC (rev 2285) @@ -109,7 +109,7 @@ // Flags bool readWrite = false; - Logging::SetProgramName("Box Backup (bbackupquery)"); + Logging::SetProgramName("bbackupquery"); #ifdef NDEBUG int masterLevel = Log::NOTICE; // need an int to do math with Modified: box/trunk/bin/bbstoreaccounts/bbstoreaccounts.cpp =================================================================== --- box/trunk/bin/bbstoreaccounts/bbstoreaccounts.cpp 2008-09-13 23:43:47 UTC (rev 2284) +++ box/trunk/bin/bbstoreaccounts/bbstoreaccounts.cpp 2008-09-14 00:26:13 UTC (rev 2285) @@ -459,6 +459,8 @@ MAINHELPER_START + Logging::SetProgramName("bbstoreaccounts"); + // Filename for configuration file? std::string configFilename; Modified: box/trunk/lib/win32/emu.cpp =================================================================== --- box/trunk/lib/win32/emu.cpp 2008-09-13 23:43:47 UTC (rev 2284) +++ box/trunk/lib/win32/emu.cpp 2008-09-14 00:26:13 UTC (rev 2285) @@ -1417,9 +1417,8 @@ { } - char* name = strdup(daemonName); - BOOL success = AddEventSource(name, 0); - free(name); + std::string name = "Box Backup (" + daemonName + ")"; + BOOL success = AddEventSource(name.c_str(), 0); if (!success) { From boxbackup-dev at fluffy.co.uk Sun Sep 14 01:29:32 2008 From: boxbackup-dev at fluffy.co.uk (boxbackup-dev at fluffy.co.uk) Date: Sun, 14 Sep 2008 01:29:32 +0100 (BST) Subject: [Box Backup-commit] COMMIT r2286 - box/trunk/lib/win32 Message-ID: <20080914002932.E8A6532687B@www.boxbackup.org> Author: chris Date: 2008-09-14 01:29:32 +0100 (Sun, 14 Sep 2008) New Revision: 2286 Modified: box/trunk/lib/win32/emu.cpp Log: Compile fix for [2285]. Modified: box/trunk/lib/win32/emu.cpp =================================================================== --- box/trunk/lib/win32/emu.cpp 2008-09-14 00:26:13 UTC (rev 2285) +++ box/trunk/lib/win32/emu.cpp 2008-09-14 00:29:32 UTC (rev 2286) @@ -1417,9 +1417,14 @@ { } - std::string name = "Box Backup (" + daemonName + ")"; - BOOL success = AddEventSource(name.c_str(), 0); + std::string nameStr = "Box Backup ("; + nameStr += daemonName; + nameStr += ")"; + char* name = strdup(nameStr.c_str()); + BOOL success = AddEventSource(name, 0); + free(name); + if (!success) { ::syslog(LOG_ERR, "Failed to add our own event source"); From boxbackup-dev at fluffy.co.uk Sun Sep 14 01:40:23 2008 From: boxbackup-dev at fluffy.co.uk (boxbackup-dev at fluffy.co.uk) Date: Sun, 14 Sep 2008 01:40:23 +0100 (BST) Subject: [Box Backup-commit] COMMIT r2287 - box/trunk/lib/win32 Message-ID: <20080914004023.47B8D32687B@www.boxbackup.org> Author: chris Date: 2008-09-14 01:40:23 +0100 (Sun, 14 Sep 2008) New Revision: 2287 Modified: box/trunk/lib/win32/emu.cpp Log: FIx [2285] properly for Windows. Modified: box/trunk/lib/win32/emu.cpp =================================================================== --- box/trunk/lib/win32/emu.cpp 2008-09-14 00:29:32 UTC (rev 2286) +++ box/trunk/lib/win32/emu.cpp 2008-09-14 00:40:23 UTC (rev 2287) @@ -1408,19 +1408,19 @@ void openlog(const char * daemonName, int, int) { + std::string nameStr = "Box Backup ("; + nameStr += daemonName; + nameStr += ")"; + // register a default event source, so that we can // log errors with the process of adding or registering our own. gSyslogH = RegisterEventSource( NULL, // uses local computer - daemonName); // source name + nameStr.c_str()); // source name if (gSyslogH == NULL) { } - std::string nameStr = "Box Backup ("; - nameStr += daemonName; - nameStr += ")"; - char* name = strdup(nameStr.c_str()); BOOL success = AddEventSource(name, 0); free(name); @@ -1431,7 +1431,7 @@ return; } - HANDLE newSyslogH = RegisterEventSource(NULL, daemonName); + HANDLE newSyslogH = RegisterEventSource(NULL, nameStr.c_str()); if (newSyslogH == NULL) { ::syslog(LOG_ERR, "Failed to register our own event source: " From boxbackup-dev at fluffy.co.uk Sun Sep 14 13:20:18 2008 From: boxbackup-dev at fluffy.co.uk (boxbackup-dev at fluffy.co.uk) Date: Sun, 14 Sep 2008 13:20:18 +0100 (BST) Subject: [Box Backup-commit] COMMIT r2288 - box/boxbackup-web Message-ID: <20080914122018.A18E232687B@www.boxbackup.org> Author: jamesog Date: 2008-09-14 13:20:18 +0100 (Sun, 14 Sep 2008) New Revision: 2288 Modified: box/boxbackup-web/index.html Log: Stop living in the past on the index page! * Debian SSL vuln was 2008, not 2007 (oops) * Update list address Modified: box/boxbackup-web/index.html =================================================================== --- box/boxbackup-web/index.html 2008-09-14 00:40:23 UTC (rev 2287) +++ box/boxbackup-web/index.html 2008-09-14 12:20:18 UTC (rev 2288) @@ -16,7 +16,7 @@

Box Backup

-

SECURITY ANNOUNCEMENT: Please click here to read more on the recent OpenSSL vulnerability in Debian GNU/Linux and how it affects Box Backup. [2007/05/15]

+

SECURITY ANNOUNCEMENT: Please click here to read more on the recent OpenSSL vulnerability in Debian GNU/Linux and how it affects Box Backup. [2008/05/15]

An open source, completely automatic on-line backup system for UNIX.

    @@ -104,7 +104,7 @@

    Mailing list

    -

    Please join the project mailing list, boxbackup at fluffy.co.uk, for announcements of new versions +

    Please join the project mailing list, boxbackup at boxbackup.org, for announcements of new versions and discussion of the system. Join at the sign up page.

    Many thanks to Alaric for hosting this list.

    From boxbackup-dev at fluffy.co.uk Mon Sep 15 21:15:23 2008 From: boxbackup-dev at fluffy.co.uk (boxbackup-dev at fluffy.co.uk) Date: Mon, 15 Sep 2008 21:15:23 +0100 (BST) Subject: [Box Backup-commit] COMMIT r2289 - box/trunk/bin/bbackupctl Message-ID: <20080915201523.BD28332687B@www.boxbackup.org> Author: chris Date: 2008-09-15 21:15:22 +0100 (Mon, 15 Sep 2008) New Revision: 2289 Modified: box/trunk/bin/bbackupctl/bbackupctl.cpp Log: Improve wording of control command message. Modified: box/trunk/bin/bbackupctl/bbackupctl.cpp =================================================================== --- box/trunk/bin/bbackupctl/bbackupctl.cpp 2008-09-14 12:20:18 UTC (rev 2288) +++ box/trunk/bin/bbackupctl/bbackupctl.cpp 2008-09-15 20:15:22 UTC (rev 2289) @@ -337,7 +337,7 @@ if(!quiet) { BOX_INFO("Control command " - "succeeded: " << + "sent: " << commandName); } finished = true; @@ -346,7 +346,7 @@ { BOX_ERROR("Control command failed: " << commandName << ". Check " - "command spelling"); + "command spelling."); returnCode = 1; finished = true; } From boxbackup-dev at fluffy.co.uk Tue Sep 16 23:24:59 2008 From: boxbackup-dev at fluffy.co.uk (boxbackup-dev at fluffy.co.uk) Date: Tue, 16 Sep 2008 23:24:59 +0100 (BST) Subject: [Box Backup-commit] COMMIT r2290 - in box/trunk: . bin/bbackupd/win32 contrib/rpm distribution/boxbackup docs/backup documentation Message-ID: <20080916222459.0593032687B@www.boxbackup.org> Author: jamesog Date: 2008-09-16 23:24:58 +0100 (Tue, 16 Sep 2008) New Revision: 2290 Modified: box/trunk/LICENSE.txt box/trunk/bin/bbackupd/win32/bbackupd.conf box/trunk/configure.ac box/trunk/contrib/rpm/boxbackup.spec box/trunk/distribution/boxbackup/DOCUMENTATION.txt box/trunk/docs/backup/win32_build_on_cygwin_using_mingw.txt box/trunk/docs/backup/win32_build_on_linux_using_mingw.txt box/trunk/documentation/instguide.xml box/trunk/runtest.pl.in Log: s/(bbdev.)?fluffy.co.uk/boxbackup.org/ Modified: box/trunk/LICENSE.txt =================================================================== --- box/trunk/LICENSE.txt 2008-09-15 20:15:22 UTC (rev 2289) +++ box/trunk/LICENSE.txt 2008-09-16 22:24:58 UTC (rev 2290) @@ -1,6 +1,6 @@ -Box Backup, http://www.fluffy.co.uk/boxbackup +Box Backup, http://www.boxbackup.org/ -Copyright (c) 2003-2007 Ben Summers and contributors. All rights reserved. +Copyright (c) 2003-2008 Ben Summers and contributors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions Modified: box/trunk/bin/bbackupd/win32/bbackupd.conf =================================================================== --- box/trunk/bin/bbackupd/win32/bbackupd.conf 2008-09-15 20:15:22 UTC (rev 2289) +++ box/trunk/bin/bbackupd/win32/bbackupd.conf 2008-09-16 22:24:58 UTC (rev 2290) @@ -173,7 +173,7 @@ # If a directive ends in Regex, then it is a regular expression rather than a # explicit full pathname. See: # -# http://bbdev.fluffy.co.uk/trac/wiki/Win32Regex +# http://www.boxbackup.org/trac/wiki/Win32Regex # # for more information about regular expressions on Windows. # Modified: box/trunk/configure.ac =================================================================== --- box/trunk/configure.ac 2008-09-15 20:15:22 UTC (rev 2289) +++ box/trunk/configure.ac 2008-09-16 22:24:58 UTC (rev 2290) @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.59) -AC_INIT([Box Backup], 0.11, [boxbackup at fluffy.co.uk]) +AC_INIT([Box Backup], 0.11, [boxbackup at boxbackup.org]) AC_CONFIG_SRCDIR([lib/common/Box.h]) AC_CONFIG_HEADERS([lib/common/BoxConfig.h]) Modified: box/trunk/contrib/rpm/boxbackup.spec =================================================================== --- box/trunk/contrib/rpm/boxbackup.spec 2008-09-15 20:15:22 UTC (rev 2289) +++ box/trunk/contrib/rpm/boxbackup.spec 2008-09-16 22:24:58 UTC (rev 2290) @@ -17,7 +17,7 @@ # Detect distribution. So far we only special-case SUSE. If you need to make # any distro specific changes to get the package building on your system -# please email them to boxbackup-dev at fluffy.co.uk +# please email them to boxbackup-dev at boxbackup.org #%define is_fc %(test -e %{_sysconfdir}/fedora-release && echo 1 || echo 0) #%define is_mdk %(test -e %{_sysconfdir}/mandrake-release && echo 1 || echo 0) #%define is_rh %(test -e %{_sysconfdir}/redhat-release && echo 1 || echo 0) Modified: box/trunk/distribution/boxbackup/DOCUMENTATION.txt =================================================================== --- box/trunk/distribution/boxbackup/DOCUMENTATION.txt 2008-09-15 20:15:22 UTC (rev 2289) +++ box/trunk/distribution/boxbackup/DOCUMENTATION.txt 2008-09-16 22:24:58 UTC (rev 2290) @@ -1,6 +1,6 @@ For compilation and installation instructions, see the web site at - http://www.fluffy.co.uk/boxbackup/ + http://www.boxbackup.org/ Modified: box/trunk/docs/backup/win32_build_on_cygwin_using_mingw.txt =================================================================== --- box/trunk/docs/backup/win32_build_on_cygwin_using_mingw.txt 2008-09-15 20:15:22 UTC (rev 2289) +++ box/trunk/docs/backup/win32_build_on_cygwin_using_mingw.txt 2008-09-16 22:24:58 UTC (rev 2290) @@ -2,7 +2,7 @@ By Chris Wilson, 2007-05-26 (To read this document online with better formatting, browse to: -http://bbdev.fluffy.co.uk/trac/wiki/CompileWithMinGW) +http://www.boxbackup.org/trac/wiki/CompileWithMinGW) Start by installing Cygwin on your Windows machine [http://www.cygwin.org]. Make sure to select the following packages during installation: Modified: box/trunk/docs/backup/win32_build_on_linux_using_mingw.txt =================================================================== --- box/trunk/docs/backup/win32_build_on_linux_using_mingw.txt 2008-09-15 20:15:22 UTC (rev 2289) +++ box/trunk/docs/backup/win32_build_on_linux_using_mingw.txt 2008-09-16 22:24:58 UTC (rev 2290) @@ -30,7 +30,7 @@ cd openssl-0.9.8b ./Configure --prefix=/usr/local/i386-mingw32 mingw make makefile.one - wget http://bbdev.fluffy.co.uk/svn/box/chris/win32/support/openssl-0.9.8b-mingw-cross.patch + wget http://www.boxbackup.org/svn/box/chris/win32/support/openssl-0.9.8b-mingw-cross.patch patch -p1 < openssl-0.9.8b-mingw-cross.patch make -f makefile.one make -f makefile.one install Modified: box/trunk/documentation/instguide.xml =================================================================== --- box/trunk/documentation/instguide.xml 2008-09-15 20:15:22 UTC (rev 2289) +++ box/trunk/documentation/instguide.xml 2008-09-16 22:24:58 UTC (rev 2290) @@ -579,11 +579,11 @@ You will need to compile OpenSSL using Visual C++. The latest release at this time, OpenSSL 0.9.8a, does not compile with Visual C++ 2005 out of the box, so you need a + url="http://www.boxbackup.org/svn/box/chris/win32/support/openssl-0.9.8a-vc2005.zip">a patched version. The original source and patch + url="http://www.boxbackup.org/svn/box/chris/win32/support/openssl-0.9.8a-win32fix.patch">patch are also available. To compile OpenSSL: @@ -636,12 +636,12 @@ The first version of Box Backup that's known to compile and with Visual C++ 2005 is available on the Subversion + url="http://www.boxbackup.org/svn/box/chris/win32/vc2005-compile-fixes/">Subversion server. However, this version has not been extensively tested and may be out of date. The changes are expected to be merged into the Subversion trunk + url="http://www.boxbackup.org/svn/box/trunk">Subversion trunk at some point, and this page should then be updated. If in doubt, please sign up to the mailing @@ -652,7 +652,7 @@ client for Windows. After installing it, open a new command prompt, go to the base directory, and type: - svn co http://bbdev.fluffy.co.uk/svn/box/chris/win32/vc2005-compile-fixes/ boxbackup + svn co http://www.boxbackup.org/svn/box/chris/win32/vc2005-compile-fixes/ boxbackup This should create a directory called boxbackup inside the base directory. Modified: box/trunk/runtest.pl.in =================================================================== --- box/trunk/runtest.pl.in 2008-09-15 20:15:22 UTC (rev 2289) +++ box/trunk/runtest.pl.in 2008-09-16 22:24:58 UTC (rev 2290) @@ -87,7 +87,7 @@ the speed of the host and your connection to it. After checking all the above, if you still have problems please contact -us on the mailing list, boxbackup\@fluffy.co.uk. Thanks! +us on the mailing list, boxbackup\@boxbackup.org. Thanks! __E } From boxbackup-dev at fluffy.co.uk Fri Sep 26 21:18:14 2008 From: boxbackup-dev at fluffy.co.uk (boxbackup-dev at fluffy.co.uk) Date: Fri, 26 Sep 2008 21:18:14 +0100 (BST) Subject: [Box Backup-commit] COMMIT r2291 - box/trunk/test/bbackupd Message-ID: <20080926201814.98CFD325FD1@www.boxbackup.org> Author: chris Date: 2008-09-26 21:18:13 +0100 (Fri, 26 Sep 2008) New Revision: 2291 Modified: box/trunk/test/bbackupd/testbbackupd.cpp Log: Reinstate and fix the intercept tests for SSL keepalives. Modified: box/trunk/test/bbackupd/testbbackupd.cpp =================================================================== --- box/trunk/test/bbackupd/testbbackupd.cpp 2008-09-16 22:24:58 UTC (rev 2290) +++ box/trunk/test/bbackupd/testbbackupd.cpp 2008-09-26 20:18:13 UTC (rev 2291) @@ -705,11 +705,11 @@ TEST_EQUAL(0, result, "Daemon exit code"); // ensure that no child processes end up running tests! - TEST_EQUAL(own_pid, getpid(), "Forking test problem"); if (getpid() != own_pid) { // abort! - _exit(1); + BOX_INFO("Daemon child finished, exiting now."); + _exit(0); } TEST_THAT(TestFileExists("testfiles/bbackupd.pid")); @@ -743,7 +743,7 @@ bool stop_internal_daemon(int pid) { - bool killed_server = KillServer(pid, true); + bool killed_server = KillServer(pid, false); TEST_THAT(killed_server); return killed_server; } @@ -892,9 +892,8 @@ TEST_THAT(::system("gzip -d < testfiles/spacetest1.tgz " "| ( cd testfiles/TestDir1 && tar xf - )") == 0); #endif - -#if 1 -// #ifdef PLATFORM_CLIB_FNS_INTERCEPTION_IMPOSSIBLE + +#ifdef PLATFORM_CLIB_FNS_INTERCEPTION_IMPOSSIBLE printf("\n==== Skipping intercept-based KeepAlive tests " "on this platform.\n"); #else @@ -2548,7 +2547,7 @@ TEST_THAT(TestGetFileSize("testfiles/TestDir1/f45.df") > 1024); } - + // wait for backup daemon to do it's stuff, and compare again wait_for_backup_operation(); compareReturnValue = ::system(BBACKUPQUERY " -Wwarning " From boxbackup-dev at fluffy.co.uk Fri Sep 26 21:19:30 2008 From: boxbackup-dev at fluffy.co.uk (boxbackup-dev at fluffy.co.uk) Date: Fri, 26 Sep 2008 21:19:30 +0100 (BST) Subject: [Box Backup-commit] COMMIT r2292 - box/trunk/lib/backupclient Message-ID: <20080926201930.8CC12325FD1@www.boxbackup.org> Author: chris Date: 2008-09-26 21:19:30 +0100 (Fri, 26 Sep 2008) New Revision: 2292 Modified: box/trunk/lib/backupclient/BackupStoreFileDiff.cpp Log: Use named timer for MaximumDiffingTime. Modified: box/trunk/lib/backupclient/BackupStoreFileDiff.cpp =================================================================== --- box/trunk/lib/backupclient/BackupStoreFileDiff.cpp 2008-09-26 20:18:13 UTC (rev 2291) +++ box/trunk/lib/backupclient/BackupStoreFileDiff.cpp 2008-09-26 20:19:30 UTC (rev 2292) @@ -463,11 +463,12 @@ BlocksAvailableEntry *pIndex, int64_t NumBlocks, int32_t Sizes[BACKUP_FILE_DIFF_MAX_BLOCK_SIZES], DiffTimer *pDiffTimer) { - Timer maximumDiffingTime(0); + Timer maximumDiffingTime(0, "MaximumDiffingTime"); if(pDiffTimer && pDiffTimer->IsManaged()) { - maximumDiffingTime = Timer(pDiffTimer->GetMaximumDiffingTime()); + maximumDiffingTime = Timer(pDiffTimer->GetMaximumDiffingTime(), + "MaximumDiffingTime"); } std::map goodnessOfFit; From boxbackup-dev at fluffy.co.uk Fri Sep 26 21:20:17 2008 From: boxbackup-dev at fluffy.co.uk (boxbackup-dev at fluffy.co.uk) Date: Fri, 26 Sep 2008 21:20:17 +0100 (BST) Subject: [Box Backup-commit] COMMIT r2293 - box/trunk/lib/server Message-ID: <20080926202017.992CC325FD1@www.boxbackup.org> Author: chris Date: 2008-09-26 21:20:17 +0100 (Fri, 26 Sep 2008) New Revision: 2293 Modified: box/trunk/lib/server/Daemon.cpp Log: Set console and syslog logging levels rather than global logging level, as we may want to do something different when logging to a file. Modified: box/trunk/lib/server/Daemon.cpp =================================================================== --- box/trunk/lib/server/Daemon.cpp 2008-09-26 20:19:30 UTC (rev 2292) +++ box/trunk/lib/server/Daemon.cpp 2008-09-26 20:20:17 UTC (rev 2293) @@ -342,7 +342,8 @@ return 2; } - Logging::SetGlobalLevel((Log::Level)mLogLevel); + Logging::FilterConsole((Log::Level)mLogLevel); + Logging::FilterSyslog ((Log::Level)mLogLevel); return Main(mConfigFileName); } From boxbackup-dev at fluffy.co.uk Fri Sep 26 21:20:35 2008 From: boxbackup-dev at fluffy.co.uk (boxbackup-dev at fluffy.co.uk) Date: Fri, 26 Sep 2008 21:20:35 +0100 (BST) Subject: [Box Backup-commit] COMMIT r2294 - box/trunk/lib/server Message-ID: <20080926202035.E758A325FD1@www.boxbackup.org> Author: chris Date: 2008-09-26 21:20:35 +0100 (Fri, 26 Sep 2008) New Revision: 2294 Modified: box/trunk/lib/server/ServerControl.cpp Log: Log reason for any waitpid() failure. Modified: box/trunk/lib/server/ServerControl.cpp =================================================================== --- box/trunk/lib/server/ServerControl.cpp 2008-09-26 20:20:17 UTC (rev 2293) +++ box/trunk/lib/server/ServerControl.cpp 2008-09-26 20:20:35 UTC (rev 2294) @@ -179,7 +179,7 @@ result = waitpid(pid, &status, 0); if (result != pid) { - BOX_WARNING("waitpid returned " << result); + BOX_LOG_SYS_ERROR("waitpid failed"); } TEST_THAT(result == pid); From boxbackup-dev at fluffy.co.uk Fri Sep 26 21:21:00 2008 From: boxbackup-dev at fluffy.co.uk (boxbackup-dev at fluffy.co.uk) Date: Fri, 26 Sep 2008 21:21:00 +0100 (BST) Subject: [Box Backup-commit] COMMIT r2295 - box/trunk/lib/common Message-ID: <20080926202100.A1185325FD1@www.boxbackup.org> Author: chris Date: 2008-09-26 21:21:00 +0100 (Fri, 26 Sep 2008) New Revision: 2295 Modified: box/trunk/lib/common/Timer.cpp Log: Replace timer name when assigning from another timer. Modified: box/trunk/lib/common/Timer.cpp =================================================================== --- box/trunk/lib/common/Timer.cpp 2008-09-26 20:20:35 UTC (rev 2294) +++ box/trunk/lib/common/Timer.cpp 2008-09-26 20:21:00 UTC (rev 2295) @@ -569,6 +569,7 @@ mExpires = rToCopy.mExpires; mExpired = rToCopy.mExpired; + mName = rToCopy.mName; if (!mExpired && mExpires != 0) { From boxbackup-dev at fluffy.co.uk Fri Sep 26 21:22:26 2008 From: boxbackup-dev at fluffy.co.uk (boxbackup-dev at fluffy.co.uk) Date: Fri, 26 Sep 2008 21:22:26 +0100 (BST) Subject: [Box Backup-commit] COMMIT r2296 - box/trunk/lib/common Message-ID: <20080926202226.763DB325FD1@www.boxbackup.org> Author: chris Date: 2008-09-26 21:22:26 +0100 (Fri, 26 Sep 2008) New Revision: 2296 Modified: box/trunk/lib/common/Logging.cpp box/trunk/lib/common/Logging.h Log: Add file logger class. Modified: box/trunk/lib/common/Logging.cpp =================================================================== --- box/trunk/lib/common/Logging.cpp 2008-09-26 20:21:00 UTC (rev 2295) +++ box/trunk/lib/common/Logging.cpp 2008-09-26 20:22:26 UTC (rev 2296) @@ -222,6 +222,12 @@ Logging::Add(this); } +Logger::Logger(Log::Level Level) +: mCurrentLevel(Level) +{ + Logging::Add(this); +} + Logger::~Logger() { Logging::Remove(this); @@ -400,3 +406,56 @@ ::closelog(); ::openlog(mName.c_str(), LOG_PID, LOG_LOCAL6); } + +bool FileLogger::Log(Log::Level Level, const std::string& rFile, + int line, std::string& rMessage) +{ + if (Level > GetLevel()) + { + return true; + } + + /* avoid infinite loop if this throws an exception */ + Logging::Remove(this); + + std::ostringstream buf; + buf << FormatTime(GetCurrentBoxTime(), false); + buf << " "; + + if (Level <= Log::FATAL) + { + buf << "[FATAL] "; + } + else if (Level <= Log::ERROR) + { + buf << "[ERROR] "; + } + else if (Level <= Log::WARNING) + { + buf << "[WARNING] "; + } + else if (Level <= Log::NOTICE) + { + buf << "[NOTICE] "; + } + else if (Level <= Log::INFO) + { + buf << "[INFO] "; + } + else if (Level <= Log::TRACE) + { + buf << "[TRACE] "; + } + + buf << rMessage << "\n"; + std::string output = buf.str(); + + #ifdef WIN32 + ConvertUtf8ToConsole(output.c_str(), output); + #endif + + mLogFile.Write(output.c_str(), output.length()); + + Logging::Add(this); + return true; +} Modified: box/trunk/lib/common/Logging.h =================================================================== --- box/trunk/lib/common/Logging.h 2008-09-26 20:21:00 UTC (rev 2295) +++ box/trunk/lib/common/Logging.h 2008-09-26 20:22:26 UTC (rev 2296) @@ -15,6 +15,8 @@ #include #include +#include "FileStream.h" + /* #define BOX_LOG(level, stuff) \ { \ @@ -115,6 +117,7 @@ public: Logger(); + Logger(Log::Level level); virtual ~Logger(); virtual bool Log(Log::Level level, const std::string& rFile, @@ -268,4 +271,24 @@ }; }; +class FileLogger : public Logger +{ + private: + FileStream mLogFile; + FileLogger(const FileLogger& forbidden) + : mLogFile("") { /* do not call */ } + + public: + FileLogger(const std::string& rFileName, Log::Level Level) + : Logger(Level), + mLogFile(rFileName, O_WRONLY | O_CREAT | O_APPEND) + { } + + virtual bool Log(Log::Level Level, const std::string& rFile, + int Line, std::string& rMessage); + + virtual const char* GetType() { return "FileLogger"; } + virtual void SetProgramName(const std::string& rProgramName) { } +}; + #endif // LOGGING__H From boxbackup-dev at fluffy.co.uk Fri Sep 26 21:22:47 2008 From: boxbackup-dev at fluffy.co.uk (boxbackup-dev at fluffy.co.uk) Date: Fri, 26 Sep 2008 21:22:47 +0100 (BST) Subject: [Box Backup-commit] COMMIT r2297 - box/trunk/lib/common Message-ID: <20080926202247.DF688325FED@www.boxbackup.org> Author: chris Date: 2008-09-26 21:22:47 +0100 (Fri, 26 Sep 2008) New Revision: 2297 Modified: box/trunk/lib/common/FileStream.cpp Log: Log reason for failing to write to a file. Modified: box/trunk/lib/common/FileStream.cpp =================================================================== --- box/trunk/lib/common/FileStream.cpp 2008-09-26 20:22:26 UTC (rev 2296) +++ box/trunk/lib/common/FileStream.cpp 2008-09-26 20:22:47 UTC (rev 2297) @@ -262,6 +262,7 @@ #else if(::write(mOSFileHandle, pBuffer, NBytes) != NBytes) { + BOX_LOG_SYS_ERROR("Failed to write to file: " << mFileName); THROW_EXCEPTION(CommonException, OSFileWriteError) } #endif From boxbackup-dev at fluffy.co.uk Fri Sep 26 21:23:34 2008 From: boxbackup-dev at fluffy.co.uk (boxbackup-dev at fluffy.co.uk) Date: Fri, 26 Sep 2008 21:23:34 +0100 (BST) Subject: [Box Backup-commit] COMMIT r2298 - box/trunk/lib/common Message-ID: <20080926202334.4C5E4325FD1@www.boxbackup.org> Author: chris Date: 2008-09-26 21:23:34 +0100 (Fri, 26 Sep 2008) New Revision: 2298 Modified: box/trunk/lib/common/FileStream.h Log: Remove #ifdef WIN32 as we now define O_BINARY to 0 on Unixes, so the same code can be used for both. Modified: box/trunk/lib/common/FileStream.h =================================================================== --- box/trunk/lib/common/FileStream.h 2008-09-26 20:22:47 UTC (rev 2297) +++ box/trunk/lib/common/FileStream.h 2008-09-26 20:23:34 UTC (rev 2298) @@ -32,22 +32,14 @@ { public: FileStream(const std::string& rFilename, -#ifdef WIN32 int flags = (O_RDONLY | O_BINARY), -#else - int flags = O_RDONLY, -#endif int mode = (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH)); // Ensure that const char * name doesn't end up as a handle // on Windows! FileStream(const char *pFilename, -#ifdef WIN32 int flags = (O_RDONLY | O_BINARY), -#else - int flags = O_RDONLY, -#endif int mode = (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH)); FileStream(tOSFileHandle FileDescriptor); From boxbackup-dev at fluffy.co.uk Fri Sep 26 21:24:11 2008 From: boxbackup-dev at fluffy.co.uk (boxbackup-dev at fluffy.co.uk) Date: Fri, 26 Sep 2008 21:24:11 +0100 (BST) Subject: [Box Backup-commit] COMMIT r2299 - box/trunk/lib/intercept Message-ID: <20080926202411.7EF5F325FD1@www.boxbackup.org> Author: chris Date: 2008-09-26 21:24:11 +0100 (Fri, 26 Sep 2008) New Revision: 2299 Modified: box/trunk/lib/intercept/intercept.cpp box/trunk/lib/intercept/intercept.h Log: Fix compilation of open64() intercept. Modified: box/trunk/lib/intercept/intercept.cpp =================================================================== --- box/trunk/lib/intercept/intercept.cpp 2008-09-26 20:23:34 UTC (rev 2298) +++ box/trunk/lib/intercept/intercept.cpp 2008-09-26 20:24:11 UTC (rev 2299) @@ -22,6 +22,7 @@ #endif #include +#include #ifdef HAVE_DLFCN_H #include @@ -232,7 +233,11 @@ } extern "C" int -open(const char *path, int flags, mode_t mode) +#ifdef DEFINE_ONLY_OPEN64 + open64(const char *path, int flags, ...) +#else + open(const char *path, int flags, ...) +#endif // DEFINE_ONLY_OPEN64 { if(intercept_count > 0) { @@ -245,6 +250,15 @@ } } + mode_t mode = 0; + if (flags & O_CREAT) + { + va_list ap; + va_start(ap, flags); + mode = va_arg(ap, mode_t); + va_end(ap); + } + #ifdef PLATFORM_NO_SYSCALL int r = TEST_open(path, flags, mode); #else @@ -266,14 +280,27 @@ return r; } +#ifndef DEFINE_ONLY_OPEN64 extern "C" int -open64(const char *path, int flags, mode_t mode) +// open64(const char *path, int flags, mode_t mode) +// open64(const char *path, int flags, ...) +open64 (__const char *path, int flags, ...) { + mode_t mode = 0; + if (flags & O_CREAT) + { + va_list ap; + va_start(ap, flags); + mode = va_arg(ap, mode_t); + va_end(ap); + } + // With _FILE_OFFSET_BITS set to 64 this should really use (flags | // O_LARGEFILE) here, but not actually necessary for the tests and not // worth the trouble finding O_LARGEFILE return open(path, flags, mode); } +#endif // !DEFINE_ONLY_OPEN64 extern "C" int close(int d) Modified: box/trunk/lib/intercept/intercept.h =================================================================== --- box/trunk/lib/intercept/intercept.h 2008-09-26 20:23:34 UTC (rev 2298) +++ box/trunk/lib/intercept/intercept.h 2008-09-26 20:24:11 UTC (rev 2299) @@ -23,14 +23,17 @@ typedef struct dirent *(readdir_t) (DIR *dir); typedef int (closedir_t)(DIR *dir); #if defined __GNUC__ && __GNUC__ >= 2 -#define LINUX_WEIRD_LSTAT -#define STAT_STRUCT struct stat /* should be stat64 */ - typedef int (lstat_t) (int ver, const char *file_name, - STAT_STRUCT *buf); + #if _FILE_OFFSET_BITS == 64 + #define DEFINE_ONLY_OPEN64 + #endif + #define LINUX_WEIRD_LSTAT + #define STAT_STRUCT struct stat /* should be stat64 */ + typedef int (lstat_t) (int ver, const char *file_name, + STAT_STRUCT *buf); #else -#define STAT_STRUCT struct stat - typedef int (lstat_t) (const char *file_name, - STAT_STRUCT *buf); + #define STAT_STRUCT struct stat + typedef int (lstat_t) (const char *file_name, + STAT_STRUCT *buf); #endif } From boxbackup-dev at fluffy.co.uk Fri Sep 26 21:25:01 2008 From: boxbackup-dev at fluffy.co.uk (boxbackup-dev at fluffy.co.uk) Date: Fri, 26 Sep 2008 21:25:01 +0100 (BST) Subject: [Box Backup-commit] COMMIT r2300 - box/trunk/bin/bbackupd Message-ID: <20080926202501.B87AD325FD1@www.boxbackup.org> Author: chris Date: 2008-09-26 21:25:01 +0100 (Fri, 26 Sep 2008) New Revision: 2300 Modified: box/trunk/bin/bbackupd/BackupClientContext.cpp Log: Use named timer for KeepAliveTime. Modified: box/trunk/bin/bbackupd/BackupClientContext.cpp =================================================================== --- box/trunk/bin/bbackupd/BackupClientContext.cpp 2008-09-26 20:24:11 UTC (rev 2299) +++ box/trunk/bin/bbackupd/BackupClientContext.cpp 2008-09-26 20:25:01 UTC (rev 2300) @@ -69,7 +69,7 @@ mStorageLimitExceeded(false), mpExcludeFiles(0), mpExcludeDirs(0), - mKeepAliveTimer(0), + mKeepAliveTimer(0, "KeepAliveTime"), mbIsManaged(false), mrProgressNotifier(rProgressNotifier) { @@ -509,7 +509,7 @@ { mKeepAliveTime = iSeconds < 0 ? 0 : iSeconds; BOX_TRACE("Set keep-alive time to " << mKeepAliveTime << " seconds"); - mKeepAliveTimer = Timer(mKeepAliveTime); + mKeepAliveTimer = Timer(mKeepAliveTime, "KeepAliveTime"); } // -------------------------------------------------------------------------- @@ -569,7 +569,7 @@ BOX_TRACE("KeepAliveTime reached, sending keep-alive message"); mpConnection->QueryGetIsAlive(); - mKeepAliveTimer = Timer(mKeepAliveTime); + mKeepAliveTimer = Timer(mKeepAliveTime, "KeepAliveTime"); } int BackupClientContext::GetMaximumDiffingTime() From boxbackup-dev at fluffy.co.uk Fri Sep 26 21:26:20 2008 From: boxbackup-dev at fluffy.co.uk (boxbackup-dev at fluffy.co.uk) Date: Fri, 26 Sep 2008 21:26:20 +0100 (BST) Subject: [Box Backup-commit] COMMIT r2301 - box/trunk/bin/bbackupd Message-ID: <20080926202620.C1DD8325FD1@www.boxbackup.org> Author: chris Date: 2008-09-26 21:26:20 +0100 (Fri, 26 Sep 2008) New Revision: 2301 Modified: box/trunk/bin/bbackupd/BackupClientDirectoryRecord.cpp Log: Make upload decision messages (logged with LogAllFileAccess) clearer to help automated log processing. Modified: box/trunk/bin/bbackupd/BackupClientDirectoryRecord.cpp =================================================================== --- box/trunk/bin/bbackupd/BackupClientDirectoryRecord.cpp 2008-09-26 20:25:01 UTC (rev 2300) +++ box/trunk/bin/bbackupd/BackupClientDirectoryRecord.cpp 2008-09-26 20:26:20 UTC (rev 2301) @@ -839,13 +839,15 @@ if (pDirOnStore != 0 && en == 0) { doUpload = true; - BOX_TRACE(filename << ": will upload " + BOX_TRACE("Upload decision: " << + filename << ": will upload " "(not on server)"); } else if (modTime >= rParams.mSyncPeriodStart) { doUpload = true; - BOX_TRACE(filename << ": will upload " + BOX_TRACE("Upload decision: " << + filename << ": will upload " "(modified since last sync)"); } } @@ -863,7 +865,8 @@ > rParams.mMaxUploadWait) { doUpload = true; - BOX_TRACE(filename << ": will upload " + BOX_TRACE("Upload decision: " << + filename << ": will upload " "(continually modified)"); } @@ -880,7 +883,8 @@ en->GetModificationTime() != modTime) { doUpload = true; - BOX_TRACE(filename << ": will upload " + BOX_TRACE("Upload decision: " << + filename << ": will upload " "(mod time changed)"); } @@ -892,23 +896,39 @@ rParams.mUploadAfterThisTimeInTheFuture) { doUpload = true; - BOX_TRACE(filename << ": will upload " + BOX_TRACE("Upload decision: " << + filename << ": will upload " "(mod time in the future)"); } } if (en != 0 && en->GetModificationTime() == modTime) { - BOX_TRACE(filename << ": will not upload " + BOX_TRACE("Upload decision: " << + filename << ": will not upload " "(not modified since last upload)"); } else if (!doUpload) { - BOX_TRACE(filename << ": will not upload " - "(mod time is " << modTime << - " which is outside sync window, " - << rParams.mSyncPeriodStart << " to " - << rParams.mSyncPeriodEnd << ")"); + if (modTime > rParams.mSyncPeriodEnd) + { + box_time_t now = GetCurrentBoxTime(); + int age = BoxTimeToSeconds(now - + modTime); + BOX_TRACE("Upload decision: " << + filename << ": will not upload " + "(modified too recently: " + "only " << age << "seconds ago)"); + } + else + { + BOX_TRACE("Upload decision: " << + filename << ": will not upload " + "(mod time is " << modTime << + " which is outside sync window, " + << rParams.mSyncPeriodStart << " to " + << rParams.mSyncPeriodEnd << ")"); + } } bool fileSynced = true; From boxbackup-dev at fluffy.co.uk Fri Sep 26 23:18:36 2008 From: boxbackup-dev at fluffy.co.uk (boxbackup-dev at fluffy.co.uk) Date: Fri, 26 Sep 2008 23:18:36 +0100 (BST) Subject: [Box Backup-commit] COMMIT r2302 - in box/trunk: bin/bbackupd lib/backupclient Message-ID: <20080926221836.A88E4325FD1@www.boxbackup.org> Author: chris Date: 2008-09-26 23:18:35 +0100 (Fri, 26 Sep 2008) New Revision: 2302 Modified: box/trunk/bin/bbackupd/BackupClientDirectoryRecord.cpp box/trunk/bin/bbackupd/BackupClientDirectoryRecord.h box/trunk/bin/bbackupd/BackupDaemon.cpp box/trunk/bin/bbackupd/BackupDaemon.h box/trunk/lib/backupclient/BackupDaemonConfigVerify.cpp Log: Add file logging support (LogFile and LogFileLevel config options). Ensure that backup-finish is always called, and add a new event, backup-ok, which is called just before backup-finish when the backup run was successful. Keep track of the last backup status notification sent (excluding backup-start and backup-finish) and send a notification whenever it changes. Add a new boolean option, NotifyAlways, to override that check and always send notifications to the NotifyScript after every backup run, for notify scripts which do their own state tracking or otherwise require notification on every event. Modified: box/trunk/bin/bbackupd/BackupClientDirectoryRecord.cpp =================================================================== --- box/trunk/bin/bbackupd/BackupClientDirectoryRecord.cpp 2008-09-26 20:26:20 UTC (rev 2301) +++ box/trunk/bin/bbackupd/BackupClientDirectoryRecord.cpp 2008-09-26 22:18:35 UTC (rev 2302) @@ -1530,7 +1530,8 @@ { rContext.UnManageDiffProcess(); - if(e.GetType() == ConnectionException::ExceptionType && e.GetSubType() == ConnectionException::Protocol_UnexpectedReply) + if(e.GetType() == ConnectionException::ExceptionType && + e.GetSubType() == ConnectionException::Protocol_UnexpectedReply) { // Check and see what error the protocol has, // this is more useful to users than the exception. @@ -1541,7 +1542,8 @@ && subtype == BackupProtocolClientError::Err_StorageLimitExceeded) { // The hard limit was exceeded on the server, notify! - rParams.mrSysadminNotifier.NotifySysadmin(BackupDaemon::NotifyEvent_StoreFull); + rParams.mrSysadminNotifier.NotifySysadmin( + SysadminNotifier::StoreFull); // return an error code instead of // throwing an exception that we // can't debug. Modified: box/trunk/bin/bbackupd/BackupClientDirectoryRecord.h =================================================================== --- box/trunk/bin/bbackupd/BackupClientDirectoryRecord.h 2008-09-26 20:26:20 UTC (rev 2301) +++ box/trunk/bin/bbackupd/BackupClientDirectoryRecord.h 2008-09-26 22:18:35 UTC (rev 2302) @@ -36,7 +36,22 @@ { public: virtual ~SysadminNotifier() { } - virtual void NotifySysadmin(int Event) = 0; + + typedef enum + { + StoreFull = 0, + ReadError, + BackupError, + BackupStart, + BackupFinish, + BackupOK, + MAX + // When adding notifications, remember to add + // strings to NotifySysadmin() + } + EventCode; + + virtual void NotifySysadmin(EventCode Event) = 0; }; // -------------------------------------------------------------------------- @@ -194,7 +209,7 @@ bool mHaveLoggedWarningAboutFutureFileTimes; bool StopRun() { return mrRunStatusProvider.StopRun(); } - void NotifySysadmin(int Event) + void NotifySysadmin(SysadminNotifier::EventCode Event) { mrSysadminNotifier.NotifySysadmin(Event); } Modified: box/trunk/bin/bbackupd/BackupDaemon.cpp =================================================================== --- box/trunk/bin/bbackupd/BackupDaemon.cpp 2008-09-26 20:26:20 UTC (rev 2301) +++ box/trunk/bin/bbackupd/BackupDaemon.cpp 2008-09-26 22:18:35 UTC (rev 2302) @@ -123,6 +123,7 @@ : mState(BackupDaemon::State_Initialising), mDeleteRedundantLocationsAfter(0), mpCommandSocketInfo(0), + mLastNotifiedEvent(SysadminNotifier::MAX), mDeleteUnusedRootDirEntriesAfter(0), mClientStoreMarker(BackupClientContext::ClientStoreMarker_NotKnown), mStorageLimitExceeded(false), @@ -148,12 +149,6 @@ // Only ever one instance of a daemon SSLLib::Initialise(); - // Initialise notification sent status - for(int l = 0; l < NotifyEvent__MAX; ++l) - { - mNotificationsSent[l] = false; - } - #ifdef WIN32 // Create the event object to signal from main thread to // worker when new messages are queued to be sent to the @@ -865,6 +860,8 @@ void BackupDaemon::RunSyncNowWithExceptionHandling() { + OnBackupStart(); + // Do sync bool errorOccurred = false; int errorCode = 0, errorSubCode = 0; @@ -894,6 +891,9 @@ // need to be very careful errorOccurred = true; } + + // do not retry immediately without a good reason + mDoSyncForcedByPreviousSyncError = false; if(errorOccurred) { @@ -925,28 +925,30 @@ BOX_NOTICE("Exception (" << errorCode << "/" << errorSubCode << ") due to signal"); + OnBackupFinish(); return; } + NotifySysadmin(SysadminNotifier::BackupError); + // If the Berkely db files get corrupted, // delete them and try again immediately. if(isBerkelyDbFailure) { - BOX_ERROR("Berkely db inode map files corrupted, deleting and restarting scan. Renamed files and directories will not be tracked until after this scan."); + BOX_ERROR("Berkely db inode map files corrupted, " + "deleting and restarting scan. Renamed files " + "and directories will not be tracked until " + "after this scan."); ::sleep(1); } else { // Not restart/terminate, pause and retry // Notify administrator - NotifySysadmin(NotifyEvent_BackupError); SetState(State_Error); - BOX_ERROR("Exception caught (" - << errorString - << " " << errorCode - << "/" << errorSubCode - << "), reset state and " - "waiting to retry..."); + BOX_ERROR("Exception caught (" << errorString << + " " << errorCode << "/" << errorSubCode << + "), reset state and waiting to retry..."); ::sleep(10); mNextSyncTime = mCurrentSyncStartTime + SecondsToBoxTime(100) + @@ -954,45 +956,29 @@ SYNC_PERIOD_RANDOM_EXTRA_TIME_SHIFT_BY); } } + // Notify system administrator about the final state of the backup + else if(mReadErrorsOnFilesystemObjects) + { + NotifySysadmin(SysadminNotifier::ReadError); + } + else if(mStorageLimitExceeded) + { + NotifySysadmin(SysadminNotifier::StoreFull); + } else { - // Unset the read error flag, so the - // error is reported again if it - // happens again - mNotificationsSent[NotifyEvent_BackupError] = false; + NotifySysadmin(SysadminNotifier::BackupOK); } - - // If we were retrying after an error, - // now would be a good time to stop :-) + + // If we were retrying after an error, and this backup succeeded, + // then now would be a good time to stop :-) mDoSyncForcedByPreviousSyncError = errorOccurred; - // Log the stats - BOX_NOTICE("File statistics: total file size uploaded " - << BackupStoreFile::msStats.mBytesInEncodedFiles - << ", bytes already on server " - << BackupStoreFile::msStats.mBytesAlreadyOnServer - << ", encoded size " - << BackupStoreFile::msStats.mTotalFileStreamSize); - BackupStoreFile::ResetStats(); - - // Tell anything connected to the command socket - SendSyncStartOrFinish(false /* finish */); - - // Touch a file to record times in filesystem - TouchFileInWorkingDir("last_sync_finish"); + OnBackupFinish(); } void BackupDaemon::RunSyncNow() { - // Touch a file to record times in filesystem - TouchFileInWorkingDir("last_sync_start"); - - // Tell anything connected to the command socket - SendSyncStartOrFinish(true /* start */); - - // Reset statistics on uploads - BackupStoreFile::ResetStats(); - // Delete the serialised store object file, // so that we don't try to reload it after a // partially completed backup @@ -1011,14 +997,21 @@ // object file again. mDeleteStoreObjectInfoFile = false; - // Notify administrator - NotifySysadmin(NotifyEvent_BackupStart); + const Configuration &conf(GetConfiguration()); - // Set state and log start - SetState(State_Connected); - BOX_NOTICE("Beginning scan of local files"); + std::auto_ptr fileLogger; - const Configuration &conf(GetConfiguration()); + if (conf.KeyExists("LogFile")) + { + Log::Level level = Log::INFO; + if (conf.KeyExists("LogFileLevel")) + { + level = Logging::GetNamedLevel( + conf.GetKeyValue("LogFileLevel")); + } + fileLogger.reset(new FileLogger(conf.GetKeyValue("LogFile"), + level)); + } std::string extendedLogFile; if (conf.KeyExists("ExtendedLogFile")) @@ -1122,18 +1115,13 @@ // use potentially extended end time params.mMaxUploadWait = maxUploadWait; params.mFileTrackingSizeThreshold = - conf.GetKeyValueInt( - "FileTrackingSizeThreshold"); + conf.GetKeyValueInt("FileTrackingSizeThreshold"); params.mDiffingUploadSizeThreshold = - conf.GetKeyValueInt( - "DiffingUploadSizeThreshold"); + conf.GetKeyValueInt("DiffingUploadSizeThreshold"); params.mMaxFileTimeInFuture = - SecondsToBoxTime( - conf.GetKeyValueInt( - "MaxFileTimeInFuture")); + SecondsToBoxTime(conf.GetKeyValueInt("MaxFileTimeInFuture")); mDeleteRedundantLocationsAfter = - conf.GetKeyValueInt( - "DeleteRedundantLocationsAfter"); + conf.GetKeyValueInt("DeleteRedundantLocationsAfter"); mStorageLimitExceeded = false; mReadErrorsOnFilesystemObjects = false; @@ -1205,19 +1193,6 @@ clientContext.SetExcludeLists(0, 0); } - // Errors reading any files? - if(params.mReadErrorsOnFilesystemObjects) - { - // Notify administrator - NotifySysadmin(NotifyEvent_ReadError); - } - else - { - // Unset the read error flag, so the // error is reported again if it - // happens again - mNotificationsSent[NotifyEvent_ReadError] = false; - } - // Perform any deletions required -- these are // delayed until the end to allow renaming to // happen neatly. @@ -1244,47 +1219,12 @@ // Commit the ID Maps CommitIDMapsAfterSync(); - // Log - BOX_NOTICE("Finished scan of local files"); - - - // Errors reading any files? - if(mReadErrorsOnFilesystemObjects) - { - // Notify administrator - NotifySysadmin(NotifyEvent_ReadError); - } - else - { - // Unset the read error flag, so the - // error is reported again if it - // happens again - mNotificationsSent[NotifyEvent_ReadError] = false; - } - - // Check the storage limit - if(mStorageLimitExceeded) - { - // Tell the sysadmin about this - NotifySysadmin(NotifyEvent_StoreFull); - } - else - { - // unflag the storage full notify flag - // so that next time the store is full, - // an alert will be sent - mNotificationsSent[NotifyEvent_StoreFull] = false; - } - // Calculate when the next sync run should be mNextSyncTime = mCurrentSyncStartTime + mUpdateStoreInterval + Random::RandomInt(mUpdateStoreInterval >> SYNC_PERIOD_RANDOM_EXTRA_TIME_SHIFT_BY); - // Notify administrator - NotifySysadmin(NotifyEvent_BackupFinish); - // -------------------------------------------------------------------------------------------- // We had a successful backup, save the store @@ -1298,6 +1238,51 @@ // -------------------------------------------------------------------------------------------- } +void BackupDaemon::OnBackupStart() +{ + // Touch a file to record times in filesystem + TouchFileInWorkingDir("last_sync_start"); + + // Reset statistics on uploads + BackupStoreFile::ResetStats(); + + // Tell anything connected to the command socket + SendSyncStartOrFinish(true /* start */); + + // Notify administrator + NotifySysadmin(SysadminNotifier::BackupStart); + + // Set state and log start + SetState(State_Connected); + BOX_NOTICE("Beginning scan of local files"); +} + +void BackupDaemon::OnBackupFinish() +{ + // Log + BOX_NOTICE("Finished scan of local files"); + + // Notify administrator + NotifySysadmin(SysadminNotifier::BackupFinish); + + // Tell anything connected to the command socket + SendSyncStartOrFinish(false /* finish */); + + // Log the stats + BOX_NOTICE("File statistics: total file size uploaded " + << BackupStoreFile::msStats.mBytesInEncodedFiles + << ", bytes already on server " + << BackupStoreFile::msStats.mBytesAlreadyOnServer + << ", encoded size " + << BackupStoreFile::msStats.mTotalFileStreamSize); + + // Reset statistics again + BackupStoreFile::ResetStats(); + + // Touch a file to record times in filesystem + TouchFileInWorkingDir("last_sync_finish"); +} + // -------------------------------------------------------------------------- // // Function @@ -2439,7 +2424,7 @@ // Created: 25/2/04 // // -------------------------------------------------------------------------- -void BackupDaemon::NotifySysadmin(int Event) +void BackupDaemon::NotifySysadmin(SysadminNotifier::EventCode Event) { static const char *sEventNames[] = { @@ -2448,15 +2433,16 @@ "backup-error", "backup-start", "backup-finish", + "backup-ok", 0 }; // BOX_TRACE("sizeof(sEventNames) == " << sizeof(sEventNames)); // BOX_TRACE("sizeof(*sEventNames) == " << sizeof(*sEventNames)); // BOX_TRACE("NotifyEvent__MAX == " << NotifyEvent__MAX); - ASSERT((sizeof(sEventNames)/sizeof(*sEventNames)) == NotifyEvent__MAX + 1); + ASSERT((sizeof(sEventNames)/sizeof(*sEventNames)) == SysadminNotifier::MAX + 1); - if(Event < 0 || Event >= NotifyEvent__MAX) + if(Event < 0 || Event >= SysadminNotifier::MAX) { BOX_ERROR("BackupDaemon::NotifySysadmin() called for " "invalid event code " << Event); @@ -2467,14 +2453,16 @@ BOX_TRACE("BackupDaemon::NotifySysadmin() called, event = " << sEventNames[Event]); - // Don't send lots of repeated messages - if(mNotificationsSent[Event] && - Event != NotifyEvent_BackupStart && - Event != NotifyEvent_BackupFinish) + if(!GetConfiguration().KeyExists("NotifyAlways") || + !GetConfiguration().GetKeyValueBool("NotifyAlways")) { - BOX_WARNING("Suppressing duplicate notification about " << - sEventNames[Event]); - return; + // Don't send lots of repeated messages + if(mLastNotifiedEvent == Event) + { + BOX_WARNING("Suppressing duplicate notification about " << + sEventNames[Event]); + return; + } } // Is there a notification script? @@ -2482,8 +2470,8 @@ if(!conf.KeyExists("NotifyScript")) { // Log, and then return - if(Event != NotifyEvent_BackupStart && - Event != NotifyEvent_BackupFinish) + if(Event != SysadminNotifier::BackupStart && + Event != SysadminNotifier::BackupFinish) { BOX_ERROR("Not notifying administrator about event " << sEventNames[Event] << " -- set NotifyScript " @@ -2503,15 +2491,16 @@ // Then do it int returnCode = ::system(script.c_str()); - if (returnCode != 0) + if(returnCode != 0) { BOX_ERROR("Notify script returned error code: " << returnCode << " ('" << script << "')"); } - - // Flag that this is done so the administrator isn't constantly - // bombarded with lots of errors - mNotificationsSent[Event] = true; + else if(Event != SysadminNotifier::BackupStart && + Event != SysadminNotifier::BackupFinish) + { + mLastNotifiedEvent = Event; + } } Modified: box/trunk/bin/bbackupd/BackupDaemon.h =================================================================== --- box/trunk/bin/bbackupd/BackupDaemon.h 2008-09-26 20:26:20 UTC (rev 2301) +++ box/trunk/bin/bbackupd/BackupDaemon.h 2008-09-26 22:18:35 UTC (rev 2302) @@ -100,17 +100,7 @@ int GetState() {return mState;} // Allow other classes to call this too - enum - { - NotifyEvent_StoreFull = 0, - NotifyEvent_ReadError, - NotifyEvent_BackupError, - NotifyEvent_BackupStart, - NotifyEvent_BackupFinish, - NotifyEvent__MAX - // When adding notifications, remember to add strings to NotifySysadmin() - }; - void NotifySysadmin(int Event); + void NotifySysadmin(SysadminNotifier::EventCode Event); private: void Run2(); @@ -119,6 +109,8 @@ void InitCrypto(); void RunSyncNowWithExceptionHandling(); void RunSyncNow(); + void OnBackupStart(); + void OnBackupFinish(); private: void DeleteAllLocations(); @@ -213,7 +205,7 @@ CommandSocketInfo *mpCommandSocketInfo; // Stop notifications being repeated. - bool mNotificationsSent[NotifyEvent__MAX]; + SysadminNotifier::EventCode mLastNotifiedEvent; // Unused entries in the root directory wait a while before being deleted box_time_t mDeleteUnusedRootDirEntriesAfter; // time to delete them Modified: box/trunk/lib/backupclient/BackupDaemonConfigVerify.cpp =================================================================== --- box/trunk/lib/backupclient/BackupDaemonConfigVerify.cpp 2008-09-26 20:26:20 UTC (rev 2301) +++ box/trunk/lib/backupclient/BackupDaemonConfigVerify.cpp 2008-09-26 22:18:35 UTC (rev 2302) @@ -97,6 +97,11 @@ ConfigurationVerifyKey("ExtendedLogFile", 0), // extended log to a file ConfigurationVerifyKey("LogAllFileAccess", ConfigTest_IsBool, false), + // enable logging reasons why each file is backed up or not + ConfigurationVerifyKey("LogFile", 0), + // enable logging to a file + ConfigurationVerifyKey("LogFileLevel", 0), + // set the level of verbosity of file logging ConfigurationVerifyKey("CommandSocket", 0), // not compulsory to have this ConfigurationVerifyKey("KeepAliveTime", ConfigTest_IsInt), @@ -106,6 +111,9 @@ ConfigurationVerifyKey("NotifyScript", 0), // optional script to run when backup needs attention, eg store full + ConfigurationVerifyKey("NotifyAlways", ConfigTest_IsBool, false), + // option to disable the suppression of duplicate notifications + ConfigurationVerifyKey("CertificateFile", ConfigTest_Exists), ConfigurationVerifyKey("PrivateKeyFile", ConfigTest_Exists), ConfigurationVerifyKey("TrustedCAsFile", ConfigTest_Exists), From boxbackup-dev at fluffy.co.uk Tue Sep 30 22:07:37 2008 From: boxbackup-dev at fluffy.co.uk (boxbackup-dev at fluffy.co.uk) Date: Tue, 30 Sep 2008 22:07:37 +0100 (BST) Subject: [Box Backup-commit] COMMIT r2303 - box/trunk/lib/server Message-ID: <20080930210737.A9264325FF2@www.boxbackup.org> Author: chris Date: 2008-09-30 22:07:36 +0100 (Tue, 30 Sep 2008) New Revision: 2303 Modified: box/trunk/lib/server/Protocol.cpp box/trunk/lib/server/ProtocolUncertainStream.cpp Log: Additional debugging for protocol stream deadlock reported by Matt Brown. Modified: box/trunk/lib/server/Protocol.cpp =================================================================== --- box/trunk/lib/server/Protocol.cpp 2008-09-26 22:18:35 UTC (rev 2302) +++ box/trunk/lib/server/Protocol.cpp 2008-09-30 21:07:36 UTC (rev 2303) @@ -749,8 +749,10 @@ } // Send final byte to finish the stream + BOX_TRACE("Sending end of stream byte"); uint8_t endOfStream = ProtocolStreamHeader_EndOfStream; mrStream.Write(&endOfStream, 1); + BOX_TRACE("Sent end of stream byte"); } catch(...) { @@ -788,6 +790,7 @@ // Quick sanity check if(BytesInBlock == 0) { + BOX_TRACE("Zero size block, not sending anything"); return 0; } @@ -813,6 +816,8 @@ } } ASSERT(header > 0); + BOX_TRACE("Sending header byte " << header << " plus " << writeSize << + " bytes to stream"); // Store the header Block[-1] = header; @@ -820,6 +825,7 @@ // Write everything out mrStream.Write(Block - 1, writeSize + 1); + BOX_TRACE("Sent " << (writeSize+1) << " bytes to stream"); // move the remainer to the beginning of the block for the next time round if(writeSize != BytesInBlock) { Modified: box/trunk/lib/server/ProtocolUncertainStream.cpp =================================================================== --- box/trunk/lib/server/ProtocolUncertainStream.cpp 2008-09-26 22:18:35 UTC (rev 2302) +++ box/trunk/lib/server/ProtocolUncertainStream.cpp 2008-09-30 21:07:36 UTC (rev 2303) @@ -77,11 +77,15 @@ toRead = mBytesLeftInCurrentBlock; } + BOX_TRACE("Reading " << toRead << " bytes from stream"); + // Read it int r = mrSource.Read(((uint8_t*)pBuffer) + read, toRead, Timeout); // Give up now if it didn't return anything if(r == 0) { + BOX_TRACE("Read " << r << " bytes from " + "stream, returning"); return read; } @@ -92,6 +96,8 @@ // stop now if the stream returned less than we asked for -- avoid blocking if(r != toRead) { + BOX_TRACE("Read " << r << " bytes from " + "stream, returning"); return read; } } @@ -102,6 +108,9 @@ if(mrSource.Read(&header, 1, Timeout) == 0) { // Didn't get the byte, return now + BOX_TRACE("Read 0 bytes of block header, " + "returning with " << read << " bytes " + "read this time"); return read; } @@ -110,6 +119,8 @@ { // All done. mFinished = true; + BOX_TRACE("Stream finished, returning with " << + read << " bytes read this time"); return read; } else if(header <= Protocol::ProtocolStreamHeader_MaxEncodedSizeValue) @@ -127,6 +138,9 @@ // Bad. It used the reserved values. THROW_EXCEPTION(ServerException, ProtocolUncertainStreamBadBlockHeader) } + + BOX_TRACE("Next block has " << + mBytesLeftInCurrentBlock << "bytes"); } }