Finally, configuration management works fine

master
Vladimir Stackov 2015-01-19 17:29:01 +03:00
parent 4a7314cb7e
commit f9fc3c0b52
5 changed files with 66 additions and 50 deletions

View File

@ -1,7 +1,6 @@
// Copyright (c) 2012-2014 Konstantin Isakov <ikm@zbackup.org> and ZBackup contributors, see CONTRIBUTORS
// Part of ZBackup. Licensed under GNU GPLv2 or later + OpenSSL, see LICENSE
#include <sstream>
#include "config.hh"
#include "ex.hh"
#include "debug.hh"
@ -107,13 +106,16 @@ Config::Config()
storable = configInfo;
dPrintf( "Config is instantiated and initialized with default values\n" );
}
Config::Config( ConfigInfo * configInfo )
{
storable = configInfo;
dPrintf( "Config is instantiated and initialized with supplied ConfigInfo\n" );
}
Config::Config( const Config & configIn, ConfigInfo * configInfo )
{
configInfo->MergeFrom( *configIn.storable );
*this = configIn;
storable = configInfo;
dPrintf( "Config is instantiated and initialized with supplied values\n" );
@ -188,7 +190,7 @@ bool Config::parseOption( const char * option, const OptionType type )
Compression::CompressionMethod::selectedCompression = lzma;
}
else
if ( strcmp( optionValue, "lzo" ) == 0 )
if ( strcmp( optionValue, "lzo1x_1" ) == 0 || strcmp( optionValue, "lzo" ) == 0 )
{
const_sptr< Compression::CompressionMethod > lzo =
Compression::CompressionMethod::findCompression( "lzo1x_1" );
@ -208,7 +210,8 @@ bool Config::parseOption( const char * option, const OptionType type )
return false;
}
SET_STORABLE( bundle, compression_method, optionValue );
SET_STORABLE( bundle, compression_method,
Compression::CompressionMethod::selectedCompression->getName() );
dPrintf( "storable[bundle][compression_method] = %s\n", GET_STORABLE( bundle, compression_method ).c_str() );
return true;
@ -382,3 +385,39 @@ bool Config::validate( const string & configData, const string & newConfigData )
ConfigInfo newConfig;
return parse( newConfigData, &newConfig );
}
void Config::show()
{
printf( "%s", toString( *storable ).c_str() );
}
void Config::show( const ConfigInfo & config )
{
printf( "%s", toString( config ).c_str() );
}
bool Config::editInteractively( ZBackupBase * zbb )
{
string configData( toString( *zbb->config.storable ) );
string newConfigData( configData );
if ( !zbb->spawnEditor( newConfigData, &validate ) )
return false;
ConfigInfo newConfig;
if ( !parse( newConfigData, &newConfig ) )
return false;
if ( toString( *zbb->config.storable ) == toString( newConfig ) )
{
verbosePrintf( "No changes made to config\n" );
return false;
}
verbosePrintf( "Updating configuration...\n" );
zbb->config.storable->CopyFrom( newConfig );
verbosePrintf(
"Configuration successfully updated!\n"
"Updated configuration:\n%s", toString( *zbb->config.storable ).c_str() );
return true;
}

View File

@ -22,6 +22,8 @@
using std::string;
using std::bitset;
class ZBackupBase;
class Config
{
public:
@ -69,18 +71,27 @@ public:
static void showHelp( const OptionType );
static string toString( google::protobuf::Message const & message );
// Edit current configuration
// returns true if configuration is changed
static bool editInteractively( ZBackupBase * );
// Print configuration to screen
static void show( const ConfigInfo & );
void show();
OpCodes parseToken( const char * option, const OptionType );
bool parseOption( const char * option, const OptionType );
string toString( google::protobuf::Message const & message );
Config( const Config &, ConfigInfo * );
Config( ConfigInfo * );
Config();
RuntimeConfig runtime;
ConfigInfo * storable;
private:
};
#include "zbackup_base.hh"
#endif

View File

@ -655,21 +655,22 @@ invalid_option:
{
ZBackupBase zbb( ZBackupBase::deriveStorageDirFromBackupsFile( args[ fieldStorage ], true ),
passwords[ 0 ], true );
if ( zbb.editConfigInteractively() )
if ( Config::editInteractively( &zbb ) )
zbb.saveExtendedStorageInfo();
}
else
if ( args.size() > 2 && strcmp( args[ fieldAction ], "set" ) == 0 )
{
ZBackupBase zbb( ZBackupBase::deriveStorageDirFromBackupsFile( args[ fieldStorage ], true ),
passwords[ 0 ], true );
// -o ... like sysctl -w
passwords[ 0 ], config, true );
zbb.config.show();
zbb.saveExtendedStorageInfo();
}
else
{
ZBackupBase zbb( ZBackupBase::deriveStorageDirFromBackupsFile( args[ fieldStorage ], true ),
passwords[ 0 ], true );
zbb.showConfig();
zbb.config.show();
}
}
else

View File

@ -116,11 +116,14 @@ ZBackupBase::ZBackupBase( string const & storageDir, string const & password,
storageDir.c_str() );
}
// Update all internal variables after configuration change
// Dunno why someone need to store duplicate information
// in deduplication utility
void ZBackupBase::propagateUpdate()
{
const_sptr<Compression::CompressionMethod> compression =
const_sptr< Compression::CompressionMethod > compression =
Compression::CompressionMethod::findCompression(
extendedStorageInfo.config().bundle().compression_method() );
config.GET_STORABLE( bundle, compression_method ) );
Compression::CompressionMethod::selectedCompression = compression;
}
@ -396,34 +399,3 @@ end:
return isChanged;
}
void ZBackupBase::showConfig()
{
printf( "%s", config.toString( *config.storable ).c_str() );
}
bool ZBackupBase::editConfigInteractively()
{
string configData( config.toString( extendedStorageInfo.config() ) );
string newConfigData( configData );
if ( !spawnEditor( newConfigData, &config.validate ) )
return false;
ConfigInfo newConfig;
if ( !config.parse( newConfigData, &newConfig ) )
return false;
if ( config.toString( extendedStorageInfo.config() ) == config.toString( newConfig ) )
{
verbosePrintf( "No changes made to config\n" );
return false;
}
verbosePrintf( "Updating configuration...\n" );
extendedStorageInfo.mutable_config()->CopyFrom( newConfig );
verbosePrintf(
"Configuration successfully updated!\n"
"Updated configuration:\n%s", config.toString( extendedStorageInfo.config() ).c_str() );
return true;
}

View File

@ -67,13 +67,6 @@ public:
bool spawnEditor( std::string & data, bool( * validator )
( string const &, string const & ) );
// Print current configuration to screen
void showConfig();
// Edit current configuration
// returns true if configuration is changed
bool editConfigInteractively();
StorageInfo storageInfo;
EncryptionKey encryptionkey;
ExtendedStorageInfo extendedStorageInfo;