geo-rep: Config file upgrade
When old config file is used with new geo-rep, config item like 'georep_session_working_dir' was missing in old config file. With this patch geo-rep sets the default value for new items. Following config options supported: - georep_session_working_dir - gluster_params - ssh_command_tar BUG: 1036539 Change-Id: I389c62e749f3b567f9ecf96d4b41367ef962c025 Signed-off-by: Aravinda VK <avishwan@redhat.com> Reviewed-on: http://review.gluster.org/6934 Reviewed-by: Venky Shankar <vshankar@redhat.com> Tested-by: Gluster Build System <jenkins@build.gluster.com>
This commit is contained in:
parent
fcfd2b973c
commit
b000b934af
@ -9,6 +9,8 @@ import os
|
||||
import errno
|
||||
import sys
|
||||
from stat import ST_DEV, ST_INO, ST_MTIME
|
||||
import tempfile
|
||||
import shutil
|
||||
|
||||
from syncdutils import escape, unescape, norm, update_file, GsyncdError
|
||||
|
||||
@ -19,6 +21,56 @@ config_version = 2.0
|
||||
re_type = type(re.compile(''))
|
||||
|
||||
|
||||
|
||||
# (SECTION, OPTION, OLD VALUE, NEW VALUE)
|
||||
CONFIGS = (
|
||||
("peersrx . .", "georep_session_working_dir", "", "/var/lib/glusterd/geo-replication/${mastervol}_${remotehost}_${slavevol}/"),
|
||||
("peersrx .", "gluster_params", "aux-gfid-mount xlator-option=\*-dht.assert-no-child-down=true", "aux-gfid-mount"),
|
||||
("peersrx . .", "ssh_command_tar", "", "ssh -oPasswordAuthentication=no -oStrictHostKeyChecking=no -i /var/lib/glusterd/geo-replication/tar_ssh.pem"),
|
||||
)
|
||||
|
||||
def upgrade_config_file(path):
|
||||
config_change = False
|
||||
config = ConfigParser.RawConfigParser()
|
||||
config.read(path)
|
||||
|
||||
for sec, opt, oldval, newval in CONFIGS:
|
||||
try:
|
||||
val = config.get(sec, opt)
|
||||
except ConfigParser.NoOptionError:
|
||||
# if new config opt not exists
|
||||
config_change = True
|
||||
config.set(sec, opt, newval)
|
||||
continue
|
||||
except ConfigParser.Error:
|
||||
"""
|
||||
When gsyncd invoked at the time of create, config file
|
||||
will not be their. Ignore any ConfigParser errors
|
||||
"""
|
||||
continue
|
||||
|
||||
if val == newval:
|
||||
# value is same as new val
|
||||
continue
|
||||
|
||||
if val == oldval:
|
||||
# config value needs update
|
||||
config_change = True
|
||||
config.set(sec, opt, newval)
|
||||
|
||||
if config_change:
|
||||
tempConfigFile = tempfile.NamedTemporaryFile(mode="wb", delete=False)
|
||||
with open(tempConfigFile.name, 'wb') as configFile:
|
||||
config.write(configFile)
|
||||
|
||||
# If src and dst are two different file system, then os.rename
|
||||
# fails, In this case if temp file created in /tmp and if /tmp is
|
||||
# seperate fs then os.rename gives following error, so use shutil
|
||||
# OSError: [Errno 18] Invalid cross-device link
|
||||
# mail.python.org/pipermail/python-list/2005-February/342893.html
|
||||
shutil.move(tempConfigFile.name, path)
|
||||
|
||||
|
||||
class MultiDict(object):
|
||||
"""a virtual dict-like class which functions as the union of underlying dicts"""
|
||||
|
||||
|
@ -20,7 +20,7 @@ from ipaddr import IPAddress, IPNetwork
|
||||
from gconf import gconf
|
||||
from syncdutils import FreeObject, norm, grabpidfile, finalize, log_raise_exception
|
||||
from syncdutils import GsyncdError, select, set_term_handler, privileged, update_file
|
||||
from configinterface import GConffile
|
||||
from configinterface import GConffile, upgrade_config_file
|
||||
import resource
|
||||
from monitor import monitor
|
||||
|
||||
@ -371,6 +371,8 @@ def main_i():
|
||||
namedict['remotehost'] = x.remotehost
|
||||
if not 'config_file' in rconf:
|
||||
rconf['config_file'] = os.path.join(os.path.dirname(sys.argv[0]), "conf/gsyncd_template.conf")
|
||||
|
||||
upgrade_config_file(rconf['config_file'])
|
||||
gcnf = GConffile(rconf['config_file'], canon_peers, defaults.__dict__, opts.__dict__, namedict)
|
||||
|
||||
checkpoint_change = False
|
||||
|
Loading…
x
Reference in New Issue
Block a user