#!/usr/bin/env python #-*- coding: utf-8 -*- """ utilitaire d'importation de configuration config.eol 2.2 ou config.eol 2.3 vers config.eol 2.4 usage : %prog """ from ConfigParser import ConfigParser from tiramisu.option import SymLinkOption, ChoiceOption from .eosfunc import is_empty from .var_loader import convert_value import re from itertools import product from .i18n import _ # ____ logger utility ____ # log_filename = u'/var/log/creole.log' # try: # from pyeole.log import init_logging # except: # # compatibilité pour Zéphir 2.3 # from pyeole.log import make_logger # log = make_logger(u'creole3.upgrade', # logfile=log_filename, # loglevel='INFO') # else: # log = init_logging(name=u'creoleUpgrade', # level='info', # console=False, # syslog=None, # filename=log_filename) import logging log = logging.getLogger(__name__) KEYS = ['val', 'valprec', 'valdefault'] def migration_23_to_tiramisu(opt, val): if not opt.impl_is_multi(): if (val == [] or val == ['']) and not isinstance(opt, ChoiceOption): val = None else: if val == []: val = None else: try: val = convert_value(opt, val[0]) except ValueError: #s'il y une erreur sur la conversion de la variable #met la valeur incorrect pour que la valeur soit #marquée en erreur dans tiramisu (donc affiché dans #l'interface) val = val[0] else: if val == ['']: val = [] else: new_val = [] for v in val: if v == '': new_val.append(None) else: try: new_val.append(convert_value(opt, v)) except ValueError: #s'il y une erreur sur la conversion de la variable #met la valeur incorrect pour que la valeur soit #marquée en erreur dans tiramisu (donc affiché dans #l'interface) new_val.append(v) val = new_val return val class Dico(ConfigParser): def get_val(self, var, default=''): """ Renvoie la valeur d'une variable """ if self.has_section(var): return self.get(var, 'val') return default def copy(self, old, new, keep=True): """ Renomme ou copie une variable vers une autre """ if self.has_section(old): if not self.has_section(new): self.add_section(new) for key in KEYS: value = self.get(old, key) self.set(new, key, value) if keep: log.info(_(u"Variable {0} has been copied in {1}").format(old, new)) else: self.remove_section(old) log.info(_(u"Variable {0} has been renamed to {1}").format(old, new)) def move(self, old, new): """ Renomme ou copie une variable vers une autre """ self.copy(old, new, keep=False) def remove(self, old): if self.has_section(old): self.remove_section(old) log.info(_(u"Variable {0} has been removed").format(old)) def simple2multi(self, src, new): """ n variables simples => 1 multi """ res = [] for var in src: if self.has_section(var): try: value = eval(self.get(var, 'val'))[0] if value != '': res.append(value) except: log.error(_(u"Source variable {0} invalid").format(var)) if res != []: self.fill_var(new, res) def fill_var(self, var, val, valprec=[], valdefault=[]): """ Crée ou met à jour une variable """ if type(val) != list: val = [val] if not self.has_section(var): self.add_section(var) log.info(_(u"Variable updated: {0} = {1}").format(var, val)) self.set(var, 'val', str(val)) self.set(var, 'valprec', valprec) self.set(var, 'valdefault', valdefault) def save(self, fichier): """ Enregistre le résultat """ fic = file(fichier, 'w') self.write(fic) fic.close() def upgrade(config, configfile): """ Mise à jour d'un fichier .eol de 2.2 vers 2.4 ou de 2.3 vers 2.4 :param dico: configparser instance :param version: config.eol version ('2.3' ou '2.4') """ log.info(_(u"config.eol upgrade started")) dico = Dico() dico.read(configfile) version = get_version(dico) if version == '2.2': upgrade22to23(dico) upgrade23to24(dico) # FIXME do stuff on 2.4 variables # chargement des valeurs par default depuis les dicos XML 2.4 owner = u"upgrade" store_dico = export_to_store(dico, config) return store_dico, version def export_to_store(dico, config): """ exporte depuis un dico vers un dico qui a été mis à jour par les valeurs par défaut creole 2.4:: {"libelle_etab": {"owner": "gen_config", "val": "monchapet"}, {"owner": "gen_config", "val": ["0.0.0.0"]} :param dico: configparser dict :returns: config parser dico """ default_owner = u'upgrade' store = {} # modification des settings pour accéder aux options disabled config.cfgimpl_get_settings().remove('disabled') old_format = False for section in dico.sections(): val = eval(dico.get_val(section)) try: path = config.find_first(byname=section, type_='path', check_properties=False) if not path.startswith('creole.') or path.startswith('creole.containers.'): continue opt = config.unwrap_from_path(path) if isinstance(opt, SymLinkOption): continue val = migration_23_to_tiramisu(opt, val) except AttributeError: log.error(_(u"Unknown variable: {0}").format(section)) old_format = True if val is None or val == []: continue store[section] = {"owner": default_owner, "val": val} if old_format: store[section]['old_format'] = True return store def upgrade22to23(dico): """ Mise à jour d'un fichier .eol de 2.2 vers 2.3 :param dico: configparser instance """ log.info(_(u"Starting {0} to {1} upgrade").format('2.2', '2.3')) # famille General dico.move('proxy', 'activer_proxy_client') dico.move('proxy_server', 'proxy_client_adresse') dico.move('proxy_port', 'proxy_client_port') dico.simple2multi(['serveur_maj', 'serveur_maj2'], 'serveur_maj') # spécifique Amon domaine = dico.get_val('nom_domaine_academique') if domaine != '': if '.' in domaine: ac, dom = eval(domaine)[0].rsplit('.', 1) else: # gère le cas particulier de sphynx ou le suffixe n'était pas # dans le domaine académique (.fr par défaut) ac = eval(domaine)[0] dom = 'fr' dico.fill_var('nom_academie', ac) dico.fill_var('suffixe_domaine_academique', dom) # rien sur Zéphir 2.2 if dico.has_section('ip_ssh_eth0'): # ip/netmask facultatifs sur Scribe-2.2 if 'oui' in dico.get_val('ssh_eth0') and dico.get_val('ip_ssh_eth0') == '[]': dico.fill_var('ip_ssh_eth0', '0.0.0.0') dico.fill_var('netmask_ssh_eth0', '0.0.0.0') # pas de ssh_eth0 sur Horus-2.2 if not dico.has_section('ssh_eth0'): # FIXME ip_ssh_eth0 semble faculatif dico.fill_var('ssh_eth0', 'oui') # familles Interface-X for num in range(0, 5): dico.copy('ssh_eth%s' % num, 'admin_eth%s' % num) dico.copy('ip_ssh_eth%s' % num, 'ip_admin_eth%s' % num) dico.copy('netmask_ssh_eth%s' % num, 'netmask_admin_eth%s' % num) dico.move('agregation', 'activer_agregation') # famille Services dico.move('cups', 'activer_cups') dico.move('ftp_perso', 'activer_proftpd') dico.move('ead_web', 'activer_ead_web') dico.move('apache', 'activer_apache') dico.move('mysql', 'activer_mysql') dico.move('xinet_interbase', 'activer_interbase') if 'oui' in dico.get_val('sso'): dico.fill_var('activer_sso', 'local') else: dico.fill_var('activer_sso', 'non') # migration DHCP dhcp = dico.get_val('dhcp', None) if dhcp is not None: dico.move('dhcp', 'activer_dhcp') if dico.get_val('adresse_network_dhcp', None) is None: #migration d'un Horus 2.2 len_dhcp = len(eval(dico.get_val('ip_basse_dhcp', "[]"))) #recuperation des variables a migrer adresse_network_dhcp = eval(dico.get_val("adresse_network_eth0")) dico.fill_var("adresse_network_dhcp", adresse_network_dhcp * len_dhcp) adresse_netmask_dhcp = eval(dico.get_val("adresse_netmask_eth0")) dico.fill_var("adresse_netmask_dhcp", adresse_netmask_dhcp * len_dhcp) adresse_ip_gw_dhcp = eval(dico.get_val("adresse_ip_gw", "[]")) if adresse_ip_gw_dhcp != []: dico.fill_var("adresse_ip_gw_dhcp", adresse_ip_gw_dhcp * len_dhcp) nom_domaine_dhcp = eval(dico.get_val("nom_domaine_local", "[]")) if nom_domaine_dhcp != []: dico.fill_var("nom_domaine_dhcp", nom_domaine_dhcp * len_dhcp) adresse_ip_dns_dhcp = eval(dico.get_val("adresse_ip_dns", "[]")) if adresse_ip_dns_dhcp != []: dico.fill_var("adresse_ip_dns_dhcp", [adresse_ip_dns_dhcp[0]] * len_dhcp) # famille Messagerie dico.move('passerelle_smtp_aca', 'passerelle_smtp') dico.move('spamassassin', 'activer_spamassassin') if 'oui' in dico.get_val('courier_imap'): if 'oui' in dico.get_val('courier_pop'): dico.fill_var('activer_courier', 'pop - imap') else: dico.fill_var('activer_courier', 'imap') elif 'oui' in dico.get_val('courier_pop'): dico.fill_var('activer_courier', 'pop') else: dico.fill_var('activer_courier', 'non') # Zéphir dico.move('serveur_smtp', 'passerelle_smtp') dico.move('compte_smtp', 'system_mail_from') if '465' in dico.get_val('port_smtp'): dico.fill_var('tls_smtp', 'port 465') # famille Client_ldap dico.move('base_ldap', 'ldap_base_dn') serveur_ldap = dico.get_val('serveur_ldap', '[]') if serveur_ldap != '[]': dico.move('serveur_ldap', 'adresse_ip_ldap') if eval(serveur_ldap)[0] not in ['127.0.0.1', 'localhost']: dico.fill_var('activer_client_ldap', 'distant') # famille Eole-sso dico.move('adresse_ip_sso', 'eolesso_adresse') dico.move('port_sso', 'eolesso_port') # eolesso_ldap (multi) dico.move('ldap_sso', 'eolesso_ldap') dico.move('port_ldap_sso', 'eolesso_port_ldap') dico.move('base_ldap_sso', 'eolesso_base_ldap') dico.move('sso_ldap_label', 'eolesso_ldap_label') dico.move('sso_ldap_reader', 'eolesso_ldap_reader') dico.move('sso_ldap_reader_passfile', 'eolesso_ldap_reader_passfile') # la "suite" dico.move('adresse_sso_parent', 'eolesso_adresse_parent') dico.move('port_sso_parent', 'eolesso_port_parent') dico.move('sso_pam_securid', 'eolesso_pam_securid') dico.move('sso_cert', 'eolesso_cert') dico.move('sso_ca_location', 'eolesso_ca_location') dico.move('sso_session_timeout', 'eolesso_session_timeout') dico.move('sso_css', 'eolesso_css') # famille Applications web dico.move('phpmyadmin', 'activer_phpmyadmin') dico.move('posh', 'activer_envole') dico.move('web_domain', 'web_url') dico.move('web_default', 'web_redirection') posh_path = dico.get_val('posh_path', '[]') if posh_path != '[]' and eval(posh_path)[0] != '': dico.fill_var('alias_envole', '/' + eval(posh_path)[0]) # famille Bacula if 'oui' in "%s%s%s" % (dico.get_val('active_bacula_dir'), dico.get_val('active_bacula_fd'), dico.get_val('active_bacula_sd')): dico.fill_var('activer_bacula', 'oui') dico.move('active_bacula_dir', 'activer_bacula_dir') dico.move('active_bacula_sd', 'activer_bacula_sd') # bacula_fd n'est plus géré else: dico.fill_var('activer_bacula', 'non') # famille Clamav dico.move('enable_clamd', 'dansguardian_clam') # famille Certifs-ssl dico.move('ssl_serveur_name', 'ssl_server_name') # famille Authentification dico.move('active_nufw', 'activer_nufw') dico.move('freeradius', 'activer_freeradius') # famille Logs if 'Oui' in dico.get_val('activate_tls'): dico.fill_var('rsyslog_tls', 'oui') # famille Reverse proxy revprox = dico.get_val('revprox_domainname', '[]') if revprox != '[]' and eval(revprox)[0] != '': dico.fill_var('revprox_activate_http', 'oui') # famille réseau avancé route = dico.get_val('route_adresse', '[]') if route != '[]' and eval(route)[0] != '': dico.fill_var('activer_route', 'oui') # famille Vpn-pki dico.simple2multi(['url_crl1', 'url_crl2'], 'url_crl') def upgrade23to24(dico): """ Mise à jour d'un fichier .eol de 2.3 vers 2.4 :param dico: configparser instance """ log.info(_(u"Starting {0} to {1} upgrade").format('2.3', '2.4')) cache_dir = dico.get_val('cache_dir', '[]') if cache_dir != '[]' and eval(cache_dir)[0] == '/var/spool/squid': dico.fill_var('cache_dir', '') system_mail_to = dico.get_val('system_mail_to', '[]') if system_mail_to != '[]' and eval(system_mail_to)[0] == 'postmaster': dico.fill_var('system_mail_to', '') varname = 'alias_gw_eth0' var = dico.get_val(varname, '[]') if var != '[]' and eval(var)[0] == 'aucun': dico.fill_var(varname, '') for i in range(0, 5): dico.move('adresse_ip_vlan_eth{0}'.format(i), 'vlan_ip_eth{0}'.format(i)) dico.move('adresse_netmask_vlan_eth{0}'.format(i), 'vlan_netmask_eth{0}'.format(i)) dico.move('adresse_network_vlan_eth{0}'.format(i), 'vlan_network_eth{0}'.format(i)) dico.move('adresse_broadcast_vlan_eth{0}'.format(i), 'vlan_broadcast_eth{0}'.format(i)) dico.move('adresse_gw_vlan_eth{0}'.format(i), 'vlan_gw_eth{0}'.format(i)) dico.move('id_vlan_eth{0}'.format(i), 'vlan_id_eth{0}'.format(i)) varname = 'vlan_gw_eth0' var = dico.get_val(varname, '[]') if var != '[]' and eval(var)[0] == 'aucun': dico.fill_var(varname, '') dico.move('proxy_eth0_adresse', 'proxy_eth0_ip') dico.move('proxy_eth0_network', 'proxy_eth0_network') dico.move('nom_interface1', 'nom_zone_eth1') dico.move('era_proxy_bypass', 'era_proxy_bypass_eth1') dico.move('smb_adresse_ip_wins', 'smb_wins_server') dico.remove('http_port') dico.remove('http_port_2') dico.remove('test_nutmaster') dico.remove('test_activer_routage_ipv6') dico.remove('test_activer_kerberos') dico.remove('test_activer_clam_proxy') dico.remove('test_activer_proxy_eth0') dico.remove('revprox_poshadmin') dico.remove('ip_client_logs_udp') dico.remove('adresse_ip_conteneur_dns') dico.simple2multi(['test_distant_domaine1', 'test_distant_domaine2'], 'test_distant_domaine') dico.remove('test_distant_domaine1') dico.remove('test_distant_domaine2') dico.simple2multi(['ssl_subjectaltname_ip', 'ssl_subjectaltname_ns'], 'ssl_subjectaltname') dico.remove('ssl_subjectaltname_ip') dico.remove('ssl_subjectaltname_ns') old_serveur_maj = eval(dico.get_val('serveur_maj', '[]')) if old_serveur_maj != []: serveur_maj = [] for maj in old_serveur_maj: if maj == 'eoleng.ac-dijon.fr': maj = 'eole.ac-dijon.fr' if maj == 'test-eoleng.ac-dijon.fr': maj = 'test-eole.ac-dijon.fr' serveur_maj.append(maj) dico.fill_var('serveur_maj', serveur_maj) ssl_country_name = eval(dico.get_val('ssl_country_name', '[""]'))[0].upper() dico.fill_var('ssl_country_name', ssl_country_name) tmp_short_name = [] tmp_long_name = [] tmp_ip = [] nom_domaine_local = eval(dico.get_val('nom_domaine_local', "['']"))[0] def _append_tmp_name(ip, long_name, short_name="NONE"): splitted_labels = long_name.split('.') if short_name == "NONE": short_name = splitted_labels[0] # ajout si non déjà défini dans Réseau avancé if long_name not in tmp_long_name: if short_name not in tmp_short_name: #le nom court n'existe pas dans la liste, donc l'ajoute tmp_short_name.append(short_name) else: if '.'.join(splitted_labels[1:]) == nom_domaine_local: # le nom court est déjà présent # privilégie le nom court pour le nom de domaine local tmp_short_name[tmp_short_name.index(short_name)] = None tmp_short_name.append(short_name) else: # ne pas doublonner le nom court tmp_short_name.append(None) if len(splitted_labels) > 1: tmp_long_name.append(long_name) else: # si nom court, transforme en nom long tmp_long_name.append(long_name + '.' + nom_domaine_local) tmp_ip.append(ip) if eval(dico.get_val('activer_ajout_hosts', '["non"]'))[0] == 'oui': # récupération et passage en minuscules des # nom_court_hosts et nom_long_hosts existants #11473 ips = eval(dico.get_val('adresse_ip_hosts', '[]').lower()) long_names = eval(dico.get_val('nom_long_hosts', '[]').lower()) for idx, short_name in enumerate(eval(dico.get_val('nom_court_hosts', '[]').lower())): _append_tmp_name(ips[idx], long_names[idx], short_name) # Migration des variables hosts #2795 # noms d'hôtes forcés en minuscules #9790 nom_host_dns = eval(dico.get_val('nom_host_dns', '[]').lower()) if not is_empty(nom_host_dns): ips = eval(dico.get_val('ip_host_dns')) # transforme les nom_host_dns en nom_court_hosts et nom_long_hosts # donc force activer_ajout_hosts à oui dico.fill_var('activer_ajout_hosts', 'oui') for idx, long_name in enumerate(nom_host_dns): _append_tmp_name(ips[idx], long_name) if not is_empty(tmp_short_name): dico.fill_var('adresse_ip_hosts', tmp_ip) dico.fill_var('nom_court_hosts', tmp_short_name) dico.fill_var('nom_long_hosts', tmp_long_name) dico.remove('nom_host_dns') dico.remove('ip_host_dns') # Ajout du point devant chaque zone #7008 old_nom_zone_dns_cache = eval(dico.get_val('nom_zone_dns_cache', '[]')) if not is_empty(old_nom_zone_dns_cache): nom_zone_dns_cache = [] for old in old_nom_zone_dns_cache: nom_zone_dns_cache.append('.' + old) dico.fill_var('nom_zone_dns_cache', nom_zone_dns_cache) # Modification du chemin de la corbeille Samba #7463 smb_trash_dir = eval(dico.get_val('smb_trash_dir', '["/"]'))[0] if not smb_trash_dir.startswith('/'): dico.fill_var('smb_trash_dir', 'perso/{0}'.format(smb_trash_dir)) # antivirus temps réel => remis à default #19833 if dico.get_val('smb_vscan', "['non']") == "['oui']": dico.remove('smb_vscan') # Famille Proxy parent #7823 if not is_empty(eval(dico.get_val('nom_cache_pere', '[]'))): dico.fill_var('activer_cache_pere', 'oui') if not is_empty(eval(dico.get_val('nom_cache_pere_zone', '[]'))): dico.fill_var('activer_cache_pere_zone', 'oui') if not is_empty(eval(dico.get_val('proxy_sibling_ip', '[]'))): dico.fill_var('activer_proxy_sibling', 'oui') # Autorisation proxy eth0 #8167 if not is_empty(eval(dico.get_val('proxy_eth0_ip', '[]'))): dico.fill_var('activer_supp_proxy_eth0', 'oui') # Famille Rvp #8164 if not is_empty(eval(dico.get_val('adresse_network_zone_rvp', '[]'))): dico.fill_var('acces_proxy_zone_rvp', 'oui') # half_closed_clients => remise à default #19813 if dico.get_val('half_closed_clients', "['off']") == "['on']": dico.remove('half_closed_clients') ## ## Modification de la configuration exim ## # passerelle SMTP log.info(_(u"Migrating SMTP parameters")) passerelle_smtp = dico.get_val('passerelle_smtp', '[]') dico.move('passerelle_smtp', 'exim_relay_smtp') if is_empty(passerelle_smtp): # No SMTP gateway dico.fill_var('activer_exim_relay_smtp', u'non') # Type de serveur SMTP exim_mail_type = eval(dico.get_val('exim_mail_type', '["satellite"]'))[0] log.info("Migration de exim_mail_type: '{0}'".format(exim_mail_type)) dico.remove('exim_mail_type') if exim_mail_type == 'satellite': # Nothing to do pass elif exim_mail_type == 'local': # Local is smarthost without relay, should not happen dico.fill_var('exim_smarthost', u'oui') elif exim_mail_type == 'smarthost': dico.fill_var('exim_smarthost', u'oui') elif exim_mail_type == 'mailhub': dico.fill_var('exim_relay', u'oui') dico.fill_var('exim_relay_manual_routes', u'oui') elif exim_mail_type == 'internet': dico.fill_var('activer_exim_relay_smtp', u'non') dico.fill_var('exim_relay', u'oui') dico.fill_var('exim_relay_manual_routes', u'oui') else: log.warn(_(u'Mail configuration not recognised, not processed')) # Réécriture mail_rewrite_domain = eval(dico.get_val('mail_rewrite_domain', '["non"]'))[0] dico.remove('mail_rewrite_domain') if mail_rewrite_domain == 'oui': dico.fill_var('exim_qualify_domain', 'nom de domaine local') # Modèle Era utilisé (#9082) mapping = {'2zones-amonecole-nginx' : u'2zones-amonecole', '3zones-scribe-nginx' : u'3zones-dmz', '3zones-scribe' : u'3zones-dmz', '4zones-scribe-nginx' : u'4zones', '4zones-scribe-nufw' : u'4zones', '4zones-scribe' : u'4zones', '5zones-scribe-nginx' : u'5zones', '5zones-scribe' : u'5zones', } model = eval(dico.get_val('type_amon', '[""]'))[0] if model in mapping: dico.fill_var('type_amon', mapping[model]) # Migration des modules ecdl if dico.get_val('ecdl_regles_filtrage_supplementaires', 'Pas un eCDL') != 'Pas un eCDL': dico.move('ecdl_ldap_machine_suffix', 'ldap_machine_suffix') dico.move('ecdl_ldap_group_suffix', 'ldap_group_suffix') dico.move('ecdl_smb_share_model', 'smb_share_model') dico.move('ecdl_smb_vscan', 'smb_vscan') dico.move('ecdl_smb_ports', 'smb_ports') dico.move('ecdl_smb_server_string', 'smb_server_string') dico.move('ecdl_smb_trash', 'smb_trash') dico.move('ecdl_smb_trash_dir', 'smb_trash_dir') dico.move('ecdl_smb_trash_purge', 'smb_trash_purge') dico.move('ecdl_smb_quotawarn' , 'smb_quotawarn') dico.move('ecdl_smb_guest', 'smb_guest') dico.move('ecdl_smb_wins_support', 'smb_wins_support') dico.move('ecdl_smb_adresse_ip_wins', 'smb_wins_server') dico.move('ecdl_smb_dns_proxy', 'smb_dns_proxy') dico.move('ecdl_smb_oplocks', 'smb_oplocks') dico.move('ecdl_smb_dos_attributes', 'smb_dos_attributes') dico.move('ecdl_smb_unixextensions', 'smb_unixextensions') dico.move('ecdl_smb_partage_nom', 'smb_partage_nom') dico.move('ecdl_smb_partage_path', 'smb_partage_path') dico.move('ecdl_smb_partage_visibilite', 'smb_partage_visibilite') dico.move('ecdl_smb_partage_ecriture', 'smb_partage_ecriture') dico.move('ecdl_regles_filtrage_supplementaires', 'activer_regles_filtrage_port_source') dico.move('ecdl_smb_os_level', 'smb_os_level') dico.move('ecdl_smb_domain_master', 'smb_domain_master') dico.move('ecdl_ca_cert', 'ldap_ca_cert') dico.move('meddtl_suffixe_ldap_nss_base_passwd', 'ldap_nss_base_passwd_filter') dico.move('meddtl_suffixe_ldap_nss_base_group', 'ldap_nss_base_group_filter') dico.move('ecdl_ldap_timeout', 'ldap_timeout') dico.move('ecdl_smb_netbios_name', 'smb_netbios_name') dico.move('ecdl_smb_workgroup', 'smb_workgroup') dico.move('ecdl_smb_usershare_max_shares', 'smb_usershare_max_shares') dico.move('ecdl_smb_activer_partages', 'smb_activer_partages') dico.remove('ecdl_smb_log_level') # fin de migration des modules ecdl # migration des modules esbl if dico.get_val('activer_lister_repertoires_apache', 'Pas un eSBL') != 'Pas un eSBL': dico.fill_var('smb_log_level', 0) smb_activer_ordre_resolution_nom = dico.get_val('smb_activer_ordre_resolution_nom', 'non') if smb_activer_ordre_resolution_nom == 'oui': smb_name_resolve_order = " ".join(eval(dico.get_val('smb_procede_recherche_nom'))) dico.fill_var('smb_name_resolve_order', smb_name_resolve_order) smb_ad_nom_long_controleur = dico.get_val('smb_ad_nom_long_controleur', "['']") if smb_ad_nom_long_controleur != "['']": dico.fill_var('smb_ad_server', smb_ad_nom_long_controleur) smb_ad_realm = dico.get_val('smb_ad_realm', "['']") if smb_ad_realm != "['']": dico.fill_var('smb_realm', smb_ad_realm) dico.move('activer_lister_repertoires_apache', 'apache_lister_repertoires') # répartition des variables pour les répertoires ftp ftps = {} for ftp_rep, ftp_anon in zip(eval(dico.get_val('acces_ftp', '[]')), eval(dico.get_val('acces_ftp_anonymous', '[]'))): ftps[ftp_anon] = ftps.get(ftp_anon, []) + [ftp_rep] # si len(ftps['oui']) > 1, pas de reprise automatique # sinon ftps['oui'] -> ftp_anonymous_directory # ftps['non'] -> ftp_access_directory if 'oui' in ftps and len(ftps['oui']) == 1: dico.fill_var('ftp_anonymous_directory', ftps['oui'][0]) dico.fill_var('activer_ftp_anonymous_access', 'oui') if 'non' in ftps: dico.fill_var('ftp_access_directory', ftps['non']) dico.fill_var('activer_ftp_access', 'oui') ftp_maxretrievefilesize = dico.get_val('ftp_maxretrievefilesize', '') if ftp_maxretrievefilesize != '': ftp_maxretrievefilesize = re.search(r'[0-9]+', ftp_maxretrievefilesize).group() dico.fill_var('ftp_maxretrievefilesize', ftp_maxretrievefilesize) ftp_maxstorefilesize = dico.get_val('ftp_maxstorefilesize', '') if ftp_maxstorefilesize != '': ftp_maxstorefilesize = re.search(r'[0-9]+', ftp_maxstorefilesize).group() dico.fill_var('ftp_maxstorefilesize', ftp_maxstorefilesize) dico.move('activer_pare_feu', 'activer_firewall') # fin de migration des modules esbl # migration des modules essl if dico.get_val('ecdl_serveurs_ip', "Pas un eSSL") != "Pas un eSSL": # variables ftp_max* ftp_maxretrievefilesize = dico.get_val('ftp_maxretrievefilesize', '') if ftp_maxretrievefilesize != '': ftp_maxretrievefilesize = re.search(r'[0-9]+', ftp_maxretrievefilesize).group() dico.fill_var('ftp_maxretrievefilesize', ftp_maxretrievefilesize) ftp_maxstorefilesize = dico.get_val('ftp_maxstorefilesize', '') if ftp_maxstorefilesize != '': ftp_maxstorefilesize = re.search(r'[0-9]+', ftp_maxstorefilesize).group() dico.fill_var('ftp_maxstorefilesize', ftp_maxstorefilesize) # variables renommées dico.move('sites_distants_morea_ip', 'sites_distants_ip') dico.move('sites_distants_morea_netmask', 'sites_distants_netmask') dico.move('nagios_morea_ip', 'nagios_dist_ip') dico.move('nagios_morea_netmask', 'nagios_dist_netmask') dico.move('morea_routeur_ip', 'wan_routeur_ip') dico.move('morea_interface', 'wan_interface') dico.move('surf_lan_ip', 'sites_dist_ip') dico.move('surf_lan_netmask', 'sites_dist_netmask') dico.move('morea_route_adresse', 'wan_route_adresse') dico.move('morea_route_netmask', 'wan_route_netmask') # conversions de valeurs variante_type_mapping = {'standard': 'production', 'Applis Web': 'Applis_Web', 'eSSL Morea': 'eSSL', 'eSSL Internet': 'eSSL_Internet', 'eSSL SPC': 'eSSL_SPC', 'ppp': 'PPP', '': 'production'} variante_type = eval(dico.get_val('variante_type', "['']"))[0] dico.fill_var('variante_type', variante_type_mapping[variante_type]) # migration des variables dhcp exxl_dhcp = dico.has_section('dhcp_lease_max') if dico.get_val('activer_dhcp', "['non']") == "['oui']" and exxl_dhcp: # récupération des valeurs de la multi ip_basse = eval(dico.get_val('ip_basse_dhcp', '[""]')) ip_haute = eval(dico.get_val('ip_haute_dhcp', '[""]')) restriction = eval(dico.get_val('activer_dhcp_hotes_autorises', "['']")) lease_default = eval(dico.get_val('dhcp_lease_default', "['']")) lease_max = eval(dico.get_val('dhcp_lease_max', "['']")) # récupération des valeurs communes simples network = [eval(dico.get_val('adresse_network_dhcp', "['']"))[0]] netmask = [eval(dico.get_val('adresse_netmask_dhcp', "['']"))[0]] nom_domaine_dhcp = [eval(dico.get_val('nom_domaine_dhcp', "['']"))[0]] gateway_dhcp = [eval(dico.get_val('adresse_ip_gw_dhcp', "['']"))[0]] # récupération des valeurs communes multiples dns_dhcp = eval(dico.get_val('adresse_ip_dns_dhcp', "['']")) wins = eval(dico.get_val('adresse_ip_wins_dhcp', "['']")) wins_primaire = wins[0] if len(wins) > 1: wins_secondaire = wins[1] else: wins_secondaire = wins_primaire ntp_dhcp = eval(dico.get_val('adresse_ip_ntp_dhcp', "['']")) # création des nouvelles listes, produit cartésien ranges, dns_dhcp, ntp_dhcp = zip(*list(product(zip(ip_basse, ip_haute, restriction, lease_default, lease_max), dns_dhcp, ntp_dhcp))) dns_dhcp = list(dns_dhcp) ntp_dhcp = list(ntp_dhcp) ip_basse, ip_haute, restriction, lease_default, lease_max = [list(l) for l in zip(*ranges)] nb_ranges = len(ip_basse) nom_domaine_dhcp = nom_domaine_dhcp*nb_ranges gateway_dhcp = gateway_dhcp*nb_ranges wins_primaire = [wins_primaire]*nb_ranges wins_secondaire = [wins_secondaire]*nb_ranges network = network*nb_ranges netmask = netmask*nb_ranges # chargement des valeurs dans le dictionnaire dico.fill_var('adresse_network_dhcp', network) dico.fill_var('adresse_netmask_dhcp',netmask) dico.fill_var('ip_basse_dhcp', ip_basse) dico.fill_var('ip_haute_dhcp', ip_haute) dico.fill_var('nom_domaine_dhcp', nom_domaine_dhcp) dico.fill_var('adresse_ip_gw_dhcp', gateway_dhcp) dico.fill_var('adresse_ip_dns_dhcp', dns_dhcp) dico.fill_var('adresse_ip_wins_primaire_dhcp', wins_primaire) dico.fill_var('adresse_ip_wins_secondaire_dhcp', wins_secondaire) dico.fill_var('adresse_ip_ntp_dhcp', ntp_dhcp) dico.fill_var('interdire_hotes_inconnus', restriction) dico.fill_var('dhcp_lease_default', lease_default) dico.fill_var('dhcp_lease_max', lease_max) #envole if dico.get_val('activer_envole', "['non']") == "['oui']" and dico.get_val('force_envole', "['non']") == "['oui']": alias_envole = eval(dico.get_val('alias_envole'))[0] if alias_envole != '/': dico.fill_var('web_redirection', alias_envole) dico.remove('alias_envole') def get_version(dico): """ recupère la version en fonction de la présence ou non de la variable 'serveur_maj2' :param dico: ConfigParser object :return version: '2.2' ou '2.3' """ # ________ version du config.eol ________ if dico.has_section('serveur_maj2') and not \ dico.has_section('activer_bash_completion'): version = '2.2' else: version = '2.3' return version def main(config_file): """main entry point""" pass if __name__ == '__main__': import sys if len(sys.argv) != 2: print __doc__ sys.exit(1) main(sys.argv[1])