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:
Aravinda VK 2014-01-20 12:23:35 +05:30 committed by Vijay Bellur
parent fcfd2b973c
commit b000b934af
2 changed files with 55 additions and 1 deletions

View File

@ -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"""

View File

@ -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