mirror of https://github.com/CIRCL/AIL-framework
128 lines
4.1 KiB
Python
Executable File
128 lines
4.1 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# -*-coding:UTF-8 -*
|
|
|
|
import configparser
|
|
from configparser import ConfigParser as cfgP
|
|
import os
|
|
from collections import OrderedDict
|
|
import sys
|
|
import shutil
|
|
|
|
|
|
#return true if the configuration is up-to-date
|
|
def main():
|
|
if len(sys.argv) != 2:
|
|
print('usage:', 'Update-conf.py', 'Automatic (boolean)')
|
|
exit(1)
|
|
else:
|
|
automatic = sys.argv[1]
|
|
if automatic == 'True':
|
|
automatic = True
|
|
else:
|
|
automatic = False
|
|
|
|
configfile = os.path.join(os.environ['AIL_BIN'], 'packages/config.cfg')
|
|
configfileBackup = os.path.join(os.environ['AIL_BIN'], 'packages/config.cfg') + '.backup'
|
|
if not os.path.exists(configfile):
|
|
raise Exception('Unable to find the configuration file. \
|
|
Did you set environment variables? \
|
|
Or activate the virtualenv.')
|
|
configfileSample = os.path.join(os.environ['AIL_BIN'], 'packages/config.cfg.sample')
|
|
|
|
cfg = configparser.ConfigParser()
|
|
cfg.read(configfile)
|
|
cfgSample = configparser.ConfigParser()
|
|
cfgSample.read(configfileSample)
|
|
|
|
sections = cfgP.sections(cfg)
|
|
sectionsSample = cfgP.sections(cfgSample)
|
|
|
|
missingSection = []
|
|
dicoMissingSection = {}
|
|
missingItem = []
|
|
dicoMissingItem = {}
|
|
|
|
for sec in sectionsSample:
|
|
if sec not in sections:
|
|
missingSection += [sec]
|
|
dicoMissingSection[sec] = cfgP.items(cfgSample, sec)
|
|
else:
|
|
setSample = set(cfgP.options(cfgSample, sec))
|
|
setNormal = set(cfgP.options(cfg, sec))
|
|
if setSample != setNormal:
|
|
missing_items = list(setSample.difference(setNormal))
|
|
missingItem += [sec]
|
|
list_items = []
|
|
for i in missing_items:
|
|
list_items.append( (i, cfgSample.get(sec, i)) )
|
|
dicoMissingItem[sec] = list_items
|
|
|
|
if len(missingSection) == 0 and len(missingItem) == 0:
|
|
#print("Configuration up-to-date")
|
|
return True
|
|
print("/!\\ Configuration not complete. Missing following configuration: /!\\")
|
|
print("+--------------------------------------------------------------------+")
|
|
for section in missingSection:
|
|
print("["+section+"]")
|
|
for item in dicoMissingSection[section]:
|
|
print(" - "+item[0])
|
|
for section in missingItem:
|
|
print("["+section+"]")
|
|
for item in dicoMissingItem[section]:
|
|
print(" - "+item[0])
|
|
print("+--------------------------------------------------------------------+")
|
|
|
|
if automatic:
|
|
resp = 'y'
|
|
else:
|
|
resp = input("Do you want to auto fix it? [y/n] ")
|
|
|
|
if resp != 'y':
|
|
return False
|
|
else:
|
|
if automatic:
|
|
resp2 = 'y'
|
|
else:
|
|
resp2 = input("Do you want to keep a backup of the old configuration file? [y/n] ")
|
|
|
|
if resp2 == 'y':
|
|
shutil.move(configfile, configfileBackup)
|
|
|
|
#Do not keep item ordering in section. New items appened
|
|
for section in missingItem:
|
|
for item, value in dicoMissingItem[section]:
|
|
cfg.set(section, item, value)
|
|
|
|
#Keep sections ordering while updating the config file
|
|
new_dico = add_items_to_correct_position(cfgSample._sections, cfg._sections, missingSection, dicoMissingSection)
|
|
cfg._sections = new_dico
|
|
|
|
with open(configfile, 'w') as f:
|
|
cfg.write(f)
|
|
return True
|
|
|
|
|
|
''' Return a new dico with the section ordered as the old configuration with the updated one added '''
|
|
def add_items_to_correct_position(sample_dico, old_dico, missingSection, dicoMissingSection):
|
|
new_dico = OrderedDict()
|
|
|
|
positions = {}
|
|
for pos_i, sec in enumerate(sample_dico):
|
|
if sec in missingSection:
|
|
positions[pos_i] = sec
|
|
|
|
for pos_i, sec in enumerate(old_dico):
|
|
if pos_i in positions:
|
|
missSection = positions[pos_i]
|
|
new_dico[missSection] = sample_dico[missSection]
|
|
|
|
new_dico[sec] = old_dico[sec]
|
|
return new_dico
|
|
|
|
|
|
if __name__ == "__main__":
|
|
if main():
|
|
sys.exit()
|
|
else:
|
|
sys.exit(1)
|